diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe0770424..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..fe0d820eca --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,134 @@ +# Contributing to runelite + +We'd love for you to contribute to our source code and to make runelite even better than it is +today! + +Check out the Developer's Guide on the [wiki](https://github.com/runelite/runelite/wiki) for setup instructions, and general tips and tricks. + +Here are the guidelines we'd like you to follow: + + - [Question or Problem?](#question) + - [Issues and Bugs](#issue) + - [Submission Guidelines](#submit) + - [Coding Format](#format) + +## Got a Question or Problem? + +If you have questions about how to contribute to runelite, please join our [Discord](https://discord.gg/HN5gf3m) server. + +## Found an Issue? + +If you find a bug in the source code or a mistake in the documentation, you can help us by +submitting an issue to our [GitHub Repository][github]. Even better you can submit a Pull Request +with a fix. + +**Please see the [Submission Guidelines](#submit) below.** + +## Submission Guidelines + +### Submitting an Issue +Before you submit your issue search the archive, maybe your question was already answered. + +If your issue appears to be a bug and hasn't been reported, open a new issue. Help us to maximize +the effort we can spend fixing issues and adding new features, by not reporting duplicate issues. +Providing the following information will increase the chances of your issue being dealt with +quickly: + +* **Overview of the Issue** - if an error is being thrown a non-minified stack trace helps +* **Java Version and Operating System** - is this a problem with a specific setup? +* **Reproduce the Error** - provide details, if possible, on how to reproduce the error +* **Related Issues** - has a similar issue been reported before? +* **Suggest a Fix** - if you can't fix the bug yourself, perhaps you can point to what might be causing the problem (line of code or commit) + +### Submitting a Pull Request +Before you submit your pull request consider the following guidelines: + +* Search [GitHub](https://github.com/runelite-extended/runelite/pulls) for an open or closed Pull Request + that relates to your submission. You don't want to duplicate effort. +* [Fork](https://help.github.com/articles/fork-a-repo/) this repo. +* [Clone](https://help.github.com/articles/cloning-a-repository/) your copy. + ```shell + git clone https://github.com/YOUR_USERNAME/runelite.git + cd runelite/ + ``` +* After cloning, set a new remote [upstream](https://help.github.com/articles/configuring-a-remote-for-a-fork/) (this helps to keep your fork up to date) + + ```shell + git remote add upstream https://github.com/runelite-extended/runelite.git + ``` + +* Make your changes in a new git branch: + + ```shell + git checkout -b my-fix-branch master + ``` + +* Create your patch and run appropriate tests. +* Follow our [Coding Format](#format). +* Commit your changes using a descriptive commit message that uses the imperative, present tense: "change" not "changed" nor "changes". + + ```shell + git commit -a + ``` + Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files. + +* Push your branch to GitHub: + + ```shell + git push origin my-fix-branch + ``` + +In GitHub, send a pull request to `runelite:master`. +If we suggest changes, then: + +* Make the required updates. +* Re-run runelite and make sure any and all tests are still passing. +* Commit your changes to your branch (e.g. `my-fix-branch`). +* Push the changes to your GitHub repository (this will update your Pull Request). + +If the PR gets too outdated we may ask you to rebase and force push to update the PR: + +```shell +git fetch upstream +git rebase upstream/master +git push origin my-fix-branch -f +``` + +That's it! Thank you for your contribution! + +#### After your pull request is merged + +After your pull request is merged, you can safely delete your branch and pull the changes +from the main (upstream) repository: + +* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows: + + ```shell + git push origin --delete my-fix-branch + ``` + +* Check out the master branch: + + ```shell + git checkout master -f + ``` + +* Delete the local branch: + + ```shell + git branch -D my-fix-branch + ``` + +* Update your master with the latest upstream version: + + ```shell + git pull --ff upstream master + ``` + +## Coding Format + +To ensure consistency throughout the source code, review our [code conventions](https://github.com/runelite/runelite/wiki/Code-Conventions). + + +[github]: https://github.com/runelite-extended/runelite +[discord]: https://discord.gg/HN5gf3m diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md new file mode 100644 index 0000000000..219706327f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -0,0 +1,32 @@ +--- +name: "\U0001F41B Bug report" +about: Create a report to help us improve + +--- + +Please check if your issue is not a duplicate by [searching existing issues](https://github.com/runelite/runelite/search?type=Issues) + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Environment (please complete the following information):** + - OS: [e.g. Windows, Ubuntu, macOS] + - RuneLite version: [e.g 1.4.6] + - Launcher version: [e.g 1.5.2] + +**Additional context** +Add any other context about the problem here, e.g. logs. Your client logs can usually be found in +`C:\Users\\.runelite\logs` on Windows and `~/.runelite/logs` on Linux and macOS. diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md new file mode 100644 index 0000000000..57cf66a8dd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Feature_request.md @@ -0,0 +1,19 @@ +--- +name: "\U0001F680 Feature Request" +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always +frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've +considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.gitignore b/.gitignore index 9b27729015..51854a9d2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,15 @@ -*.jar +target +nbactions.xml +nb-configuration.xml +/nbproject/ +project.properties *.iml - .idea/ -dependency-reduced-pom.xml -**/target/* \ No newline at end of file +.project +.settings/ +.classpath +runelite-client/src/main/resources/META-INF/MANIFEST.MF +git +classes/artifacts/client_jar/run.bat +classes/artifacts/client_jar/client.jar +*.jar diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 0000000000..67bd169f31 --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1 @@ +-Xmx512m diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..9f3f35a358 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: java +sudo: false +dist: trusty +cache: + directories: + - $HOME/.m2 +jdk: +- oraclejdk8 +install: true +script: ./travis/build.sh +before_install: +- chmod +x ./travis/build.sh + diff --git a/LICENSE b/LICENSE index 8410c20079..9426de9b87 100644 --- a/LICENSE +++ b/LICENSE @@ -1,661 +1,25 @@ -GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. \ No newline at end of file +BSD 2-Clause License + +Copyright (c) 2016-2017, Adam +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..a1edf80b7e --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +![](https://i.imgur.com/OVRdQBz.png) + + + +# RuneLitePlus +[![forthebadge](https://forthebadge.com/images/badges/built-by-developers.svg)](https://forthebadge.com) + +[![Build Status](https://travis-ci.org/runelite-extended/runelite.svg?branch=master)](https://travis-ci.org/runelite-extended/runelite) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![HitCount](http://hits.dwyl.io/runelite-extended/runelite.svg)](http://hits.dwyl.io/runelite-extended/runelite) [![saythanks](https://img.shields.io/badge/say-thanks-32cd32.svg)](https://www.patreon.com/RuneLitePlus) + +[RuneLitePlus](https://runelitepl.us) is a extended version of [RuneLite](https://github.com/runelite/runelite) that provides more functionality and less restrictions while staying more open-source. + + + +## Discord +![[Discord]](https://discordapp.com/api/guilds/373382904769675265/widget.png?style=banner2) + +## Project Layout + +- [cache](cache/src/main/java/net/runelite/cache) - Libraries used for reading/writing cache files, as well as the data in it +- [http-api](http-api/src/main/java/net/runelite/http/api) - API for runelite and runeliteplus +- [http-service](http-service/src/main/java/net/runelite/http/service) - Service for https://api.runelitepl.us +- [runelite-api](runelite-api/src/main/java/net/runelite/api) - RuneLite API, interfaces for accessing the client +- [runelite-mixins](runelite-mixins/src/main/java/net/runelite) - Mixins which are injected into the injected client's classes +- [runescape-api](runescape-api/src/main/java/net/runelite) - Mappings correspond to these interfaces, runelite-api is a subset of this +- [runelite-client](runelite-client/src/main/java/net/runelite/client) - Game client with plugins + +## License + +RuneLitePlus is licensed under the BSD 2-clause license. See the license header in the respective file to be sure. + +## Contribute and Develop + +We've set up a separate document for our [contribution guidelines](https://github.com/runelite-extended/runelite/blob/master/.github/CONTRIBUTING.md). diff --git a/RuneLitePlus/Test.java b/RuneLitePlus/Test.java deleted file mode 100644 index bffdcb6707..0000000000 --- a/RuneLitePlus/Test.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.runeswag.client.plugins; - -import api.Client; -import api.events.ChatMessage; -import api.events.ClientTick; -import api.events.GameTick; -import api.events.MenuOpened; -import api.events.VarbitChanged; -import com.google.common.eventbus.Subscribe; -import com.google.inject.Binder; -import javax.inject.Inject; -import javax.inject.Singleton; - -import com.google.inject.Provides; -import com.runeswag.client.config.ConfigManager; -import com.runeswag.client.misc.Plugin; -import com.runeswag.client.misc.PluginDescriptor; -import com.runeswag.client.ui.OverlayManager; -import lombok.extern.slf4j.Slf4j; - -/** - * Authors gazivodag longstreet - */ -@PluginDescriptor( - name = "Test", - description = "Testing plugin for building functionality", - tags = {} -) -@Singleton -@Slf4j -public class Test extends Plugin -{ - - @Provides - TestConfig getConfig(ConfigManager configManager) - { - return configManager.getConfig(TestConfig.class); - } - - @Inject - private TestOverlay testOverlay; - - @Inject - private TestConfig config; - - @Inject - private Client client; - - @Inject - private OverlayManager overlayManager; - - @Override - public void configure(Binder binder) - { - } - - @Override - protected void startUp() throws Exception - { - overlayManager.add(testOverlay); - System.out.println("Test Plugin started"); - } - - @Override - protected void shutDown() throws Exception - { - - } - - @Subscribe - public void onMenuOpened(MenuOpened event) - { - System.out.println("[Test Plugin] Menu Opened"); - } - - @Subscribe - public void onChatMessage(ChatMessage chatMessage) - { - System.out.println("[Test Plugin] Chat Message"); - } - - @Subscribe - public void onVarbitChanged(VarbitChanged event) - { - System.out.println("[Test Plugin] Varbit Changed"); - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/config/RuneLiteConfig.java deleted file mode 100644 index eed832ae25..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (c) 2017, Tyler - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.config; - -import api.config.Constants; -import java.awt.Dimension; - -@ConfigGroup("runelite") -public interface RuneLiteConfig extends Config -{ - @ConfigItem( - keyName = "gameSize", - name = "Game size", - description = "The game will resize to this resolution upon starting the client", - position = 10 - ) - default Dimension gameSize() - { - return Constants.GAME_FIXED_SIZE; - } - - @ConfigItem( - keyName = "automaticResizeType", - name = "Resize type", - description = "Choose how the window should resize when opening and closing panels", - position = 11 - ) - default ExpandResizeType automaticResizeType() - { - return ExpandResizeType.KEEP_GAME_SIZE; - } - - @ConfigItem( - keyName = "lockWindowSize", - name = "Lock window size", - description = "Determines if the window resizing is allowed or not", - position = 12 - ) - default boolean lockWindowSize() - { - return false; - } - - @ConfigItem( - keyName = "enablePlugins", - name = "Enable loading of external plugins", - description = "Enable loading of external plugins", - position = 10 - ) - default boolean enablePlugins() - { - return true; - } - - @ConfigItem( - keyName = "containInScreen", - name = "Contain in screen", - description = "Makes the client stay contained in the screen when attempted to move out of it.
Note: Only works if custom chrome is enabled.", - position = 13 - ) - default boolean containInScreen() - { - return false; - } - - @ConfigItem( - keyName = "rememberScreenBounds", - name = "Remember client position", - description = "Save the position and size of the client after exiting", - position = 14 - ) - default boolean rememberScreenBounds() - { - return true; - } - - @ConfigItem( - keyName = "uiEnableCustomChrome", - name = "Enable custom window chrome", - description = "Use Runelite's custom window title and borders.", - warning = "Please restart your client after changing this setting", - position = 15 - ) - default boolean enableCustomChrome() - { - return true; - } - - @ConfigItem( - keyName = "gameAlwaysOnTop", - name = "Enable client always on top", - description = "The game will always be on the top of the screen", - position = 16 - ) - default boolean gameAlwaysOnTop() - { - return false; - } - - @ConfigItem( - keyName = "warningOnExit", - name = "Display warning on exit", - description = "Toggles a warning popup when trying to exit the client", - position = 17 - ) - default WarningOnExit warningOnExit() - { - return WarningOnExit.LOGGED_IN; - } - - @ConfigItem( - keyName = "usernameInTitle", - name = "Show display name in title", - description = "Toggles displaying of local player's display name in client title", - position = 18 - ) - default boolean usernameInTitle() - { - return true; - } - - @ConfigItem( - keyName = "notificationTray", - name = "Enable tray notifications", - description = "Enables tray notifications", - position = 20 - ) - default boolean enableTrayNotifications() - { - return true; - } - - @ConfigItem( - keyName = "notificationRequestFocus", - name = "Request focus on notification", - description = "Toggles window focus request", - position = 21 - ) - default boolean requestFocusOnNotification() - { - return true; - } - - @ConfigItem( - keyName = "notificationSound", - name = "Enable sound on notifications", - description = "Enables the playing of a beep sound when notifications are displayed", - position = 22 - ) - default boolean enableNotificationSound() - { - return true; - } - - @ConfigItem( - keyName = "notificationGameMessage", - name = "Enable game message notifications", - description = "Puts a notification message in the chatbox", - position = 23 - ) - default boolean enableGameMessageNotification() - { - return false; - } - - @ConfigItem( - keyName = "notificationFlash", - name = "Enable flash notification", - description = "Flashes the game frame as a notification", - position = 24 - ) - default boolean enableFlashNotification() - { - return false; - } - - @ConfigItem( - keyName = "notificationFocused", - name = "Send notifications when focused", - description = "Toggles all notifications for when the client is focused", - position = 25 - ) - default boolean sendNotificationsWhenFocused() - { - return false; - } - - @ConfigItem( - keyName = "fontType", - name = "Dynamic Overlay Font", - description = "Configures what font type is used for in-game overlays such as player name, ground items, etc.", - position = 30 - ) - default FontType fontType() - { - return FontType.SMALL; - } - - @ConfigItem( - keyName = "tooltipFontType", - name = "Tooltip Font", - description = "Configures what font type is used for in-game tooltips such as food stats, NPC names, etc.", - position = 31 - ) - default FontType tooltipFontType() - { - return FontType.SMALL; - } - - @ConfigItem( - keyName = "interfaceFontType", - name = "Interface Overlay Font", - description = "Configures what font type is used for in-game interface overlays such as panels, opponent info, clue scrolls etc.", - position = 32 - ) - default FontType interfaceFontType() - { - return FontType.REGULAR; - } - - @ConfigItem( - keyName = "menuEntryShift", - name = "Require Shift for overlay menu", - description = "Overlay right-click menu will require shift to be added", - position = 33 - ) - default boolean menuEntryShift() - { - return true; - } - - @ConfigItem( - keyName = "infoBoxVertical", - name = "Display infoboxes vertically", - description = "Toggles the infoboxes to display vertically", - position = 40 - ) - default boolean infoBoxVertical() - { - return false; - } - - @ConfigItem( - keyName = "infoBoxWrap", - name = "Infobox wrap count", - description = "Configures the amount of infoboxes shown before wrapping", - position = 41 - ) - default int infoBoxWrap() - { - return 4; - } - - @ConfigItem( - keyName = "infoBoxSize", - name = "Infobox size (px)", - description = "Configures the size of each infobox in pixels", - position = 42 - ) - default int infoBoxSize() - { - return 35; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningConfig.java deleted file mode 100644 index 539c6ca132..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningConfig.java +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * All rights reserved. - * - * Modified by farhan1666 - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.aoewarnings; - -import java.awt.Color; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; -import net.runelite.client.config.Stub; - -@ConfigGroup("aoe") -public interface AoeWarningConfig extends Config -{ - @ConfigItem( - keyName = "overlayStub", - name = "Overlay", - description = "", - position = 1 - ) - default Stub overlayStub() - { - return new Stub(); - } - - @ConfigItem( - position = 2, - keyName = "overlayColor", - name = "Overlay Color", - description = "Configures the color of the AoE Projectile Warnings overlay" - ) - default Color overlayColor() - { - return new Color(0, 150, 200); - } - - @ConfigItem( - keyName = "outline", - name = "Display Outline", - description = "Configures whether or not AoE Projectile Warnings have an outline", - parent = "overlayStub", - position = 3 - ) - default boolean isOutlineEnabled() - { - return true; - } - - @ConfigItem( - keyName = "delay", - name = "Fade Delay", - description = "Configures the amount of time in milliseconds that the warning lingers for after the projectile has touched the ground", - parent = "overlayStub", - position = 4 - ) - default int delay() - { - return 300; - } - - @ConfigItem( - keyName = "fade", - name = "Fade Warnings", - description = "Configures whether or not AoE Projectile Warnings fade over time", - parent = "overlayStub", - position = 5 - ) - default boolean isFadeEnabled() - { - return true; - } - - @ConfigItem( - keyName = "npcStub", - name = "NPC's", - description = "", - position = 6 - ) - default Stub npcStub() - { - return new Stub(); - } - - @ConfigItem( - keyName = "lizardmanaoe", - name = "Lizardman Shamans", - description = "Configures whether or not AoE Projectile Warnings for Lizardman Shamans is displayed", - parent = "npcStub", - position = 7 - ) - default boolean isShamansEnabled() - { - return true; - } - - @ConfigItem( - keyName = "archaeologistaoe", - name = "Crazy Archaeologist", - description = "Configures whether or not AoE Projectile Warnings for Archaeologist is displayed", - parent = "npcStub", - position = 8 - ) - default boolean isArchaeologistEnabled() - { - return true; - } - - @ConfigItem( - keyName = "icedemon", - name = "Ice Demon", - description = "Configures whether or not AoE Projectile Warnings for Ice Demon is displayed", - parent = "npcStub", - position = 9 - ) - default boolean isIceDemonEnabled() - { - return true; - } - - @ConfigItem( - keyName = "vasa", - name = "Vasa", - description = "Configures whether or not AoE Projectile Warnings for Vasa is displayed", - parent = "npcStub", - position = 10 - ) - default boolean isVasaEnabled() - { - return true; - } - - @ConfigItem( - keyName = "tekton", - name = "Tekton", - description = "Configures whether or not AoE Projectile Warnings for Tekton is displayed", - parent = "npcStub", - position = 11 - ) - default boolean isTektonEnabled() - { - return true; - } - - @ConfigItem( - keyName = "vorkath", - name = "Vorkath", - description = "Configures whether or not AoE Projectile Warnings for Vorkath are displayed", - parent = "npcStub", - position = 12 - ) - default boolean isVorkathEnabled() - { - return true; - } - - @ConfigItem( - keyName = "galvek", - name = "Galvek", - description = "Configures whether or not AoE Projectile Warnings for Galvek are displayed", - parent = "npcStub", - position = 13 - ) - default boolean isGalvekEnabled() - { - return true; - } - - @ConfigItem( - keyName = "gargboss", - name = "Gargoyle Boss", - description = "Configs whether or not AoE Projectile Warnings for Dawn/Dusk are displayed", - parent = "npcStub", - position = 14 - ) - default boolean isGargBossEnabled() - { - return true; - } - - @ConfigItem( - keyName = "vetion", - name = "Vet'ion", - description = "Configures whether or not AoE Projectile Warnings for Vet'ion are displayed", - parent = "npcStub", - position = 15 - ) - default boolean isVetionEnabled() - { - return true; - } - - @ConfigItem( - keyName = "chaosfanatic", - name = "Chaos Fanatic", - description = "Configures whether or not AoE Projectile Warnings for Chaos Fanatic are displayed", - parent = "npcStub", - position = 16 - ) - default boolean isChaosFanaticEnabled() - { - return true; - } - - @ConfigItem( - keyName = "olm", - name = "Olm", - description = "Configures whether or not AoE Projectile Warnings for The Great Olm are displayed", - parent = "npcStub", - position = 17 - ) - default boolean isOlmEnabled() - { - return true; - } - - @ConfigItem( - keyName = "bombDisplay", - name = "Olm Bombs", - description = "Display a timer and colour-coded AoE for Olm's crystal-phase bombs.", - parent = "npcStub", - position = 18 - ) - default boolean bombDisplay() - { - return true; - } - - @ConfigItem( - keyName = "corp", - name = "Corporeal Beast", - description = "Configures whether or not AoE Projectile Warnings for the Corporeal Beast are displayed", - parent = "npcStub", - position = 19 - ) - default boolean isCorpEnabled() - { - return true; - } - - @ConfigItem( - keyName = "wintertodt", - name = "Wintertodt Snow Fall", - description = "Configures whether or not AOE Projectile Warnings for the Wintertodt snow fall are displayed", - parent = "npcStub", - position = 20 - ) - default boolean isWintertodtEnabled() - { - return true; - } - - @ConfigItem( - keyName = "isXarpusEnabled", - name = "Xarpus", - description = "Configures whether or not AOE Projectile Warnings for Xarpus are displayed", - parent = "npcStub", - position = 21 - ) - default boolean isXarpusEnabled() - { - return true; - } - - @ConfigItem( - keyName = "lightning", - name = "Olm Lightning Trails", - description = "Show Lightning Trails", - parent = "npcStub", - position = 22 - ) - default boolean LightningTrail() - { - return true; - } - - @ConfigItem( - keyName = "addyDrags", - name = "Addy Drags", - description = "Show Bad Areas", - parent = "npcStub", - position = 23 - ) - default boolean addyDrags() - { - return true; - } - - @ConfigItem( - keyName = "drake", name = "Drakes Breath", - description = "Configures if Drakes Breath tile markers are displayed", - parent = "npcStub", - position = 24 - ) - default boolean isDrakeEnabled() - { - return true; - } - - @ConfigItem( - keyName = "cerbFire", - name = "Cerberus Fire", - description = "Configures if Cerberus fire tile markers are displayed", - parent = "npcStub", - position = 25 - ) - default boolean isCerbFireEnabled() - { - return true; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java deleted file mode 100644 index f2d1269bb7..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.barbarianassault; - -import java.awt.Color; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup("barbarianAssault") -public interface BarbarianAssaultConfig extends Config -{ - @ConfigItem( - keyName = "showTimer", - name = "Show call change timer", - description = "Show time to next call change", - position = 0 - ) - default boolean showTimer() - { - return true; - } - - @ConfigItem( - keyName = "waveTimes", - name = "Show wave and game duration", - description = "Displays wave and game duration", - position = 1 - ) - default boolean waveTimes() - { - return true; - } - - @ConfigItem( - keyName = "showEggCountMessage", - name = "Show count of eggs collected as collector.", - description = "Display egg count as collector after each wave", - position = 2 - ) - default boolean showEggCount() - { - return false; - } - - @ConfigItem( - keyName = "showEggCountOverlay", - name = "Overlay of eggs counted", - description = "Display current egg count as collector", - position = 3 - ) - default boolean showEggCountOverlay() - { - return false; - } - - @ConfigItem( - keyName = "showHpCountMessage", - name = "Show count of Hp healed as healer.", - description = "Display healed count as healer after each wave", - position = 4 - ) - default boolean showHpCount() - { - return false; - } - - @ConfigItem( - keyName = "showHpCountOverlay", - name = "Overlay of Hp counted", - description = "Display current healed count as healer", - position = 5 - ) - default boolean showHpCountOverlay() - { - return false; - } - - @ConfigItem( - keyName = "highlightCollectorEggs", - name = "Highlight collector eggs", - description = "Highlight called egg colors", - position = 6 - ) - default boolean highlightCollectorEggs() - { - return false; - } - - @ConfigItem( - keyName = "showTotalRewards", - name = "Summarize total reward points", - description = "Displays total eggs/healed hp and missed attacks/lost runners", - position = 7 - ) - default boolean showTotalRewards() - { - return false; - } - - @ConfigItem( - keyName = "showSummaryOfPoints", - name = "Display summary of advanced points", - description = "Gives summary of advanced points breakdown in chat log", - position = 8 - ) - default boolean showSummaryOfPoints() - { - return false; - } - - @ConfigItem( - keyName = "wrongPoisonFoodTextColor", - name = "Change healer wrong poison pack color", - description = "Change healer wrong poison pack color", - position = 9 - ) - default Color wrongPoisonFoodTextColor() - { - return Color.BLACK; - } - - @ConfigItem( - keyName = "highlightItems", - name = "Highlight called poison/bait", - description = "Highlights the poison or bait that was called by your teammate", - position = 10 - ) - default boolean highlightItems() - { - return false; - } - - @ConfigItem( - keyName = "highlightColor", - name = "Highlight color", - description = "Configures the color to highlight the called poison/bait", - position = 11 - ) - default Color highlightColor() - { - return Color.GREEN; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultOverlay.java deleted file mode 100644 index 9cbdfe8bfa..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultOverlay.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.barbarianassault; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.Rectangle; -import java.awt.Stroke; -import java.awt.image.BufferedImage; -import java.util.Map; -import javax.inject.Inject; -import lombok.Getter; -import lombok.Setter; -import api.Client; -import api.GameState; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Perspective; -import api.Player; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetItem; -import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; -import net.runelite.client.ui.overlay.OverlayMenuEntry; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.OverlayUtil; -import net.runelite.client.util.ImageUtil; - - -class BarbarianAssaultOverlay extends Overlay -{ - private static final int MAX_EGG_DISTANCE = 2500; - private static final int HEALTH_BAR_HEIGHT = 20; - private final Color HEALTH_BAR_COLOR = new Color(225, 35, 0, 125); - private static final Color BACKGROUND = new Color(0, 0, 0, 150); - private static final int OFFSET_Z = 20; - - private final Client client; - private final ItemManager itemManager; - private final BarbarianAssaultPlugin plugin; - private final BarbarianAssaultConfig config; - - @Getter - @Setter - private Round currentRound; - - - @Inject - private BarbarianAssaultOverlay(Client client, ItemManager itemManager, BarbarianAssaultPlugin plugin, BarbarianAssaultConfig config) - { - super(plugin); - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_WIDGETS); - this.client = client; - this.itemManager = itemManager; - this.plugin = plugin; - this.config = config; - getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "B.A. overlay")); - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (client.getGameState() != GameState.LOGGED_IN || currentRound == null) - { - return null; - } - - Role role = currentRound.getRoundRole(); - if (role == null) - { - return null; - } - - Widget roleText = client.getWidget(role.getRoleText()); - Widget roleSprite = client.getWidget(role.getRoleSprite()); - - if (config.showTimer() && roleText != null && roleSprite != null) - { - if (config.showEggCountOverlay() && role.equals(Role.COLLECTOR)) - { - roleText.setText(String.format("(%d) 00:%02d", plugin.getCollectedEggCount(), currentRound.getTimeToChange())); - } - else if (config.showHpCountOverlay() && role.equals(Role.HEALER)) - { - roleText.setText(String.format("(%d) 00:%02d", plugin.getHpHealed(), currentRound.getTimeToChange())); - } - else - { - roleText.setText(String.format("00:%02d", currentRound.getTimeToChange())); - } - Rectangle spriteBounds = roleSprite.getBounds(); - roleSprite.setHidden(true); - graphics.drawImage(plugin.getClockImage(), spriteBounds.x, spriteBounds.y, null); - } - - if (role == Role.COLLECTOR && config.highlightCollectorEggs()) - { - String heardCall = plugin.getCollectorHeardCall(); - Color highlightColor = BarbarianAssaultPlugin.getEggColor(heardCall); - Map calledEggMap = plugin.getCalledEggMap(); - Map yellowEggMap = plugin.getYellowEggs(); - - if (calledEggMap != null) - { - renderEggLocations(graphics, calledEggMap, highlightColor); - } - - // Always show yellow eggs - renderEggLocations(graphics, yellowEggMap, Color.YELLOW); - } - Widget inventory = client.getWidget(WidgetInfo.INVENTORY); - - if (config.highlightItems() && inventory != null && !inventory.isHidden() && ((role == Role.DEFENDER || role == Role.HEALER))) - { - int listenItemId = plugin.getListenItemId(role.getListen()); - - if (listenItemId != -1) - { - Color color = config.highlightColor(); - BufferedImage highlight = ImageUtil.fillImage(itemManager.getImage(listenItemId), new Color(color.getRed(), color.getGreen(), color.getBlue(), 150)); - - for (WidgetItem item : inventory.getWidgetItems()) - { - if (item.getId() == listenItemId) - { - OverlayUtil.renderImageLocation(graphics, item.getCanvasLocation(), highlight); - } - } - } - } - - if (role == Role.HEALER) - { - for (HealerTeam teammate : HealerTeam.values()) - { - Widget widget = client.getWidget(teammate.getTeammate()); - if (widget == null) - { - continue; - } - - String[] teammateHealth = widget.getText().split(" / "); - final int curHealth = Integer.parseInt(teammateHealth[0]); - final int maxHealth = Integer.parseInt(teammateHealth[1]); - - int width = teammate.getWidth(); - final int filledWidth = getBarWidth(maxHealth, curHealth, width); - - int offsetX = teammate.getOffset().getX(); - int offsetY = teammate.getOffset().getY(); - int x = widget.getCanvasLocation().getX() - offsetX; - int y = widget.getCanvasLocation().getY() - offsetY; - - graphics.setColor(HEALTH_BAR_COLOR); - graphics.fillRect(x, y, filledWidth, HEALTH_BAR_HEIGHT); - } - } - - return null; - } - - private static int getBarWidth(int base, int current, int size) - { - final double ratio = (double) current / base; - - if (ratio >= 1) - { - return size; - } - - return (int) Math.round(ratio * size); - } - - private void renderEggLocations(Graphics2D graphics, Map eggMap, Color color) - { - Player player = client.getLocalPlayer(); - - if (player == null) - { - return; - } - - final Stroke originalStroke = graphics.getStroke(); - - for (WorldPoint worldPoint : eggMap.keySet()) - { - LocalPoint groundPoint = LocalPoint.fromWorld(client, worldPoint); - - if (groundPoint == null) - { - continue; - } - if (player.getLocalLocation().distanceTo(groundPoint) > MAX_EGG_DISTANCE) - { - continue; - } - - Polygon poly = Perspective.getCanvasTilePoly(client, groundPoint); - - if (poly == null) - { - continue; - } - - int quantity = eggMap.get(worldPoint); - String quantityText = "x" + quantity; - Point textPoint = Perspective.getCanvasTextLocation(client, graphics, groundPoint, quantityText, OFFSET_Z); - graphics.setColor(color); - graphics.setStroke(new BasicStroke(2)); - graphics.drawPolygon(poly); - OverlayUtil.renderTextLocation(graphics, textPoint, quantityText, Color.WHITE); - } - - graphics.setStroke(originalStroke); - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java deleted file mode 100644 index 1e431fed39..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java +++ /dev/null @@ -1,628 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.barbarianassault; - -import com.google.inject.Provides; -import java.awt.Color; -import java.awt.Font; -import java.awt.Image; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import javax.inject.Inject; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.ItemID; -import api.MenuEntry; -import api.MessageNode; -import api.Player; -import api.Tile; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.ChatMessage; -import api.events.GameStateChanged; -import api.events.ItemDespawned; -import api.events.ItemSpawned; -import api.events.MenuEntryAdded; -import api.events.VarbitChanged; -import api.events.WidgetLoaded; -import api.kit.KitType; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; -import net.runelite.client.chat.ChatColorType; -import net.runelite.client.chat.ChatMessageBuilder; -import net.runelite.client.chat.ChatMessageManager; -import net.runelite.client.chat.QueuedMessage; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.FontManager; -import net.runelite.client.ui.overlay.OverlayManager; -import net.runelite.client.util.ColorUtil; -import net.runelite.client.util.ImageUtil; -import net.runelite.client.util.Text; - -@Slf4j - - -@PluginDescriptor( - name = "Barbarian Assault+", - description = "Custom barbarian assault plugin, use along with BA Tools", - tags = {"minigame", "overlay", "timer"}, - type = PluginType.PVM // don't remove this, added this because our barbarian assault plugin is big time modified -) -public class BarbarianAssaultPlugin extends Plugin -{ - private static final int BA_WAVE_NUM_INDEX = 2; - private static final String START_WAVE = "1"; - private static final String ENDGAME_REWARD_NEEDLE_TEXT = "
5"; - - @Getter - private int collectedEggCount = 0; - - @Getter - private int positiveEggCount = 0; - - @Getter - private int wrongEggs = 0; - - @Getter - private int HpHealed = 0; - - @Getter - private int totalCollectedEggCount = 0; - - @Getter - private int totalHpHealed = 0; - - private boolean hasAnnounced; - private Font font; - private final Image clockImage = ImageUtil.getResourceStreamFromClass(getClass(), "clock.png"); - private int inGameBit = 0; - private String currentWave = START_WAVE; - private GameTimer gameTime; - - @Getter(AccessLevel.PACKAGE) - private final HashMap redEggs = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private final HashMap greenEggs = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private final HashMap blueEggs = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private final HashMap yellowEggs = new HashMap<>(); - - @Inject - @Getter - private Client client; - - @Inject - private ChatMessageManager chatMessageManager; - - @Inject - private OverlayManager overlayManager; - - @Inject - private BarbarianAssaultConfig config; - - @Inject - private BarbarianAssaultOverlay overlay; - - @Provides - BarbarianAssaultConfig provideConfig(ConfigManager configManager) - { - return configManager.getConfig(BarbarianAssaultConfig.class); - } - - private Game game; - - @Override - protected void startUp() throws Exception - { - overlayManager.add(overlay); - font = FontManager.getRunescapeFont() - .deriveFont(Font.BOLD, 24); - } - - @Override - protected void shutDown() throws Exception - { - overlayManager.remove(overlay); - gameTime = null; - currentWave = START_WAVE; - inGameBit = 0; - collectedEggCount = 0; - positiveEggCount = 0; - wrongEggs = 0; - HpHealed = 0; - clearAllEggMaps(); - } - - @Subscribe - public void onGameStateChanged(final GameStateChanged event) - { - if (event.getGameState() == GameState.LOADING) - { - clearAllEggMaps(); - } - } - - @Subscribe - public void onWidgetLoaded(WidgetLoaded event) - { - switch (event.getGroupId()) - { - case WidgetID.BA_REWARD_GROUP_ID: - { - Wave wave = new Wave(client); - Widget rewardWidget = client.getWidget(WidgetInfo.BA_REWARD_TEXT); - if (rewardWidget != null && rewardWidget.getText().contains(ENDGAME_REWARD_NEEDLE_TEXT) && gameTime != null) - { - if (config.waveTimes()) - { - announceTime("Game finished, duration: ", gameTime.getTime(false)); - } - if (config.showTotalRewards()) - { - announceSomething(game.getGameSummary()); - } - } - Widget pointsWidget = client.getWidget(WidgetInfo.BA_RUNNERS_PASSED); - if (rewardWidget != null && !rewardWidget.getText().contains(ENDGAME_REWARD_NEEDLE_TEXT) && pointsWidget != null - && config.showSummaryOfPoints() && !hasAnnounced && client.getVar(Varbits.IN_GAME_BA) == 0) - { - wave.setWaveAmounts(); - wave.setWavePoints(); - game.getWaves().add(wave); - announceSomething(wave.getWaveSummary()); - } - - break; - } - case WidgetID.BA_ATTACKER_GROUP_ID: - { - setOverlayRound(Role.ATTACKER); - break; - } - case WidgetID.BA_DEFENDER_GROUP_ID: - { - setOverlayRound(Role.DEFENDER); - break; - } - case WidgetID.BA_HEALER_GROUP_ID: - { - setOverlayRound(Role.HEALER); - break; - } - case WidgetID.BA_COLLECTOR_GROUP_ID: - { - setOverlayRound(Role.COLLECTOR); - break; - } - } - } - - @Subscribe - public void onChatMessage(ChatMessage chatMessage) - { - if (chatMessage.getMessage().toLowerCase().contains("testing")) - { - ArrayList waves = new ArrayList<>(); - for (int i = 0; i < 1; i++) - { - Wave wave1 = new Wave(client); - int[] amounts = {4, 0, 30, 10, 1, 38}; - int[] points = {-3, -2, 6, -4, -8, -11}; - int[] otherPoints = {38, 35, 33, 30}; - wave1.setWaveAmounts(amounts); - wave1.setWavePoints(points, otherPoints); - waves.add(wave1); - announceSomething(wave1.getWaveSummary()); - } - Game game1 = new Game(client, waves); - announceSomething(game1.getGameSummary()); - } - if (chatMessage.getMessage().toLowerCase().startsWith("wave points")) - { - hasAnnounced = true; - } - if (!chatMessage.getType().equals(ChatMessageType.GAMEMESSAGE)) - { - return; - } - int inGame = client.getVar(Varbits.IN_GAME_BA); - if (inGameBit != inGame) - { - return; - } - final String message = chatMessage.getMessage().toLowerCase(); - final MessageNode messageNode = chatMessage.getMessageNode(); - final String nodeValue = Text.removeTags(messageNode.getValue()); - String recolored = null; - if (chatMessage.getMessage().startsWith("---- Wave:")) - { - String[] tempMessage = chatMessage.getMessage().split(" "); - currentWave = tempMessage[BA_WAVE_NUM_INDEX]; - collectedEggCount = 0; - HpHealed = 0; - positiveEggCount = 0; - wrongEggs = 0; - if (currentWave.equals(START_WAVE)) - { - gameTime = new GameTimer(); - totalHpHealed = 0; - totalCollectedEggCount = 0; - game = new Game(client); - } - else if (gameTime != null) - { - gameTime.setWaveStartTime(); - } - } - if (chatMessage.getMessage().contains("exploded")) - { - wrongEggs++; - positiveEggCount--; - } - if (chatMessage.getMessage().contains("You healed")) - { - String[] tokens = message.split(" "); - if (Integer.parseInt(tokens[2]) > 0) - { - int Hp = Integer.parseInt(tokens[2]); - HpHealed += Hp; - } - } - - if (message.contains("the wrong type of poisoned food to use")) - { - recolored = ColorUtil.wrapWithColorTag(nodeValue, config.wrongPoisonFoodTextColor()); - } - if (recolored != null) - { - messageNode.setValue(recolored); - chatMessageManager.update(messageNode); - } - } - - @Subscribe - public void onVarbitChanged(VarbitChanged event) - { - int inGame = client.getVar(Varbits.IN_GAME_BA); - - if (inGameBit != inGame) - { - if (inGameBit == 1) - { - overlay.setCurrentRound(null); - - if (config.waveTimes() && gameTime != null) - { - announceTime("Wave " + currentWave + " duration: ", gameTime.getTime(true)); - } - } - else - { - hasAnnounced = false; - } - } - - inGameBit = inGame; - } - - @Subscribe - public void onItemSpawned(ItemSpawned itemSpawned) - { - int itemId = itemSpawned.getItem().getId(); - WorldPoint worldPoint = itemSpawned.getTile().getWorldLocation(); - HashMap eggMap = getEggMap(itemId); - if (eggMap != null) - { - Integer existingQuantity = eggMap.putIfAbsent(worldPoint, 1); - if (existingQuantity != null) - { - eggMap.put(worldPoint, existingQuantity + 1); - } - } - } - - @Subscribe - public void onItemDespawned(ItemDespawned itemDespawned) - { - int itemId = itemDespawned.getItem().getId(); - WorldPoint worldPoint = itemDespawned.getTile().getWorldLocation(); - HashMap eggMap = getEggMap(itemId); - - if (eggMap != null && eggMap.containsKey(worldPoint)) - { - int quantity = eggMap.get(worldPoint); - if (quantity > 1) - { - eggMap.put(worldPoint, quantity - 1); - } - else - { - eggMap.remove(worldPoint); - } - } - if (client.getVar(Varbits.IN_GAME_BA) == 0 || !isEgg(itemDespawned.getItem().getId())) - { - return; - } - if (isUnderPlayer(itemDespawned.getTile())) - { - if (client.getLocalPlayer().getPlayerAppearance().getEquipmentId(KitType.CAPE) == ItemID.COLLECTOR_ICON) - { - positiveEggCount++; - if (positiveEggCount > 60) - { - positiveEggCount = 60; - } - collectedEggCount = positiveEggCount - wrongEggs; //true positive - negative egg count - } - } - } - - @Subscribe - public void onMenuEntryAdded(MenuEntryAdded event) - { - if (!config.highlightCollectorEggs()) - { - return; - } - if (overlay.getCurrentRound() == null) - { - return; - } - if (overlay.getCurrentRound().getRoundRole() != Role.COLLECTOR) - { - return; - } - - String calledEgg = getCollectorHeardCall(); - String target = event.getTarget(); - String option = event.getOption(); - String targetClean = target.substring(target.indexOf('>') + 1); - String optionClean = option.substring(option.indexOf('>') + 1); - - if ("Take".equals(optionClean)) - { - Color highlightColor = null; - - if (calledEgg != null && calledEgg.startsWith(targetClean)) - { - highlightColor = getEggColor(targetClean); - } - else if ("Yellow egg".equals(targetClean)) - { - // Always show yellow egg - highlightColor = Color.YELLOW; - } - - if (highlightColor != null) - { - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry last = menuEntries[menuEntries.length - 1]; - last.setTarget(ColorUtil.prependColorTag(targetClean, highlightColor)); - client.setMenuEntries(menuEntries); - } - } - } - - private void setOverlayRound(Role role) - { - if (overlay.getCurrentRound() != null) - { - return; - } - - overlay.setCurrentRound(new Round(role)); - } - - private void announceSomething(final ChatMessageBuilder chatMessage) - { - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.CONSOLE) - .runeLiteFormattedMessage(chatMessage.build()) - .build()); - } - - String getCollectorHeardCall() - { - Widget widget = client.getWidget(WidgetInfo.BA_COLL_LISTEN_TEXT); - String call = null; - - if (widget != null) - { - call = widget.getText(); - } - - return call; - } - - Map getCalledEggMap() - { - Map map; - String calledEgg = getCollectorHeardCall(); - - if (calledEgg == null) - { - return null; - } - - switch (calledEgg) - { - case "Red eggs": - map = redEggs; - break; - case "Green eggs": - map = greenEggs; - break; - case "Blue eggs": - map = blueEggs; - break; - default: - map = null; - } - - return map; - } - - static Color getEggColor(String str) - { - Color color; - - if (str == null) - { - return null; - } - - if (str.startsWith("Red")) - { - color = Color.RED; - } - else if (str.startsWith("Green")) - { - color = Color.GREEN; - } - else if (str.startsWith("Blue")) - { - color = Color.CYAN; - } - else if (str.startsWith("Yellow")) - { - color = Color.YELLOW; - } - else - { - color = null; - } - - return color; - } - - private HashMap getEggMap(int itemID) - { - switch (itemID) - { - case ItemID.RED_EGG: - return redEggs; - case ItemID.GREEN_EGG: - return greenEggs; - case ItemID.BLUE_EGG: - return blueEggs; - case ItemID.YELLOW_EGG: - return yellowEggs; - default: - return null; - } - } - - - private void announceTime(String preText, String time) - { - final String chatMessage = new ChatMessageBuilder() - .append(ChatColorType.NORMAL) - .append(preText) - .append(ChatColorType.HIGHLIGHT) - .append(time) - .build(); - - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.CONSOLE) - .runeLiteFormattedMessage(chatMessage) - .build()); - } - - private boolean isEgg(int itemID) - { - return itemID == ItemID.RED_EGG || itemID == ItemID.GREEN_EGG - || itemID == ItemID.BLUE_EGG || itemID == ItemID.YELLOW_EGG; - } - - private boolean isUnderPlayer(Tile tile) - { - Player local = client.getLocalPlayer(); - if (local == null) - { - return false; - } - - return (tile.getWorldLocation().equals(local.getWorldLocation())); - } - - private void clearAllEggMaps() - { - redEggs.clear(); - greenEggs.clear(); - blueEggs.clear(); - yellowEggs.clear(); - } - - public Font getFont() - { - return font; - } - - Image getClockImage() - { - return clockImage; - } - - int getListenItemId(WidgetInfo listenInfo) - { - Widget listenWidget = client.getWidget(listenInfo); - - if (listenWidget != null) - { - switch (listenWidget.getText()) - { - case "Tofu": - return ItemID.TOFU; - case "Crackers": - return ItemID.CRACKERS; - case "Worms": - return ItemID.WORMS; - case "Pois. Worms": - return ItemID.POISONED_WORMS; - case "Pois. Tofu": - return ItemID.POISONED_TOFU; - case "Pois. Meat": - return ItemID.POISONED_MEAT; - } - } - - return -1; - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsConfig.java deleted file mode 100644 index b2d7a8aeba..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsConfig.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.batools; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup("BATools") -public interface BAToolsConfig extends Config -{ - @ConfigItem( - keyName = "defTimer", - name = "Defender Tick Timer", - description = "Shows the current cycle tick of runners." - ) - default boolean defTimer() - { - return false; - } - - @ConfigItem( - keyName = "calls", - name = "Remove Incorrect Calls", - description = "Remove incorrect calls." - ) - default boolean calls() - { - return false; - } - - @ConfigItem( - keyName = "swapLadder", - name = "Swap ladder option", - description = "Swap Climb-down with Quick-start in the wave lobbies" - ) - default boolean swapLadder() - { - return true; - } - - @ConfigItem( - keyName = "healerCodes", - name = "Healer Codes", - description = "Overlay to show healer codes" - ) - default boolean healerCodes() - { - return false; - } - - @ConfigItem( - keyName = "healerMenuOption", - name = "Healer menu options", - description = "asd" - ) - default boolean healerMenuOption() - { - return false; - } - - @ConfigItem( - keyName = "eggBoi", - name = "Collector helper", - description = "asd" - ) - default boolean eggBoi() - { - return false; - } - - @ConfigItem( - keyName = "osHelp", - name = "Shift OS", - description = "asd" - ) - default boolean osHelp() - { - return false; - } - - @ConfigItem( - keyName = "prayerMetronome", - name = "Prayer Metronome", - description = "asd" - ) - default boolean prayerMetronome() - { - return false; - } - - @ConfigItem( - keyName = "prayerMetronomeVolume", - name = "Prayer Metronome Volume", - description = "asd" - ) - default int prayerMetronomeVolume() - { - return 1; - } - - @ConfigItem( - keyName = "attackStyles", - name = "Attack Styles", - description = "Hide attack styles depending on weapon." - ) - default boolean attackStyles() - { - return false; - } - - @ConfigItem( - keyName = "removeBA", - name = "*Barbarian Assault Helper*", - description = "Remove unnecessary menu options in Barbarian Assault depending on role
Examples: Remove attack options when not attacker
Remove take options when not collector" - ) - default boolean removeBA() - { - return true; - } - - @ConfigItem( - keyName = "removeWrongEggs", - name = "Remove wrong eggs - *Barbarian Assault Helper*", - description = "Remove unnecessary menu options in Barbarian Assault depending on role
Examples: Remove attack options when not attacker
Remove take options when not collector" - ) - default boolean removeWrongEggs() - { - return false; - } - - @ConfigItem( - keyName = "removeWrongHealFood", - name = "Remove wrong Heal Food - *Barbarian Assault Helper*", - description = "Remove unnecessary menu options in Barbarian Assault depending on role
Examples: Remove attack options when not attacker
Remove take options when not collector" - ) - default boolean removeHealWrongFood() - { - return false; - } - -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsPlugin.java deleted file mode 100644 index e4ffc03af0..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsPlugin.java +++ /dev/null @@ -1,806 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.batools; - -import com.google.common.collect.ImmutableMap; -import com.google.inject.Provides; -import java.awt.event.KeyEvent; -import java.awt.image.BufferedImage; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.inject.Inject; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.ChatMessageType; -import api.Client; -import api.ItemID; -import api.MenuEntry; -import api.NPC; -import api.NpcID; -import api.Prayer; -import api.SoundEffectID; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.HitsplatApplied; -import api.events.InteractingChanged; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.VarbitChanged; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import static api.widgets.WidgetID.BA_REWARD_GROUP_ID; -import api.widgets.WidgetInfo; -import static api.widgets.WidgetInfo.BA_ATK_CALL_TEXT; -import static api.widgets.WidgetInfo.BA_ATK_LISTEN_TEXT; -import static api.widgets.WidgetInfo.BA_ATK_ROLE_TEXT; -import static api.widgets.WidgetInfo.BA_COLL_CALL_TEXT; -import static api.widgets.WidgetInfo.BA_COLL_LISTEN_TEXT; -import static api.widgets.WidgetInfo.BA_COLL_ROLE_TEXT; -import static api.widgets.WidgetInfo.BA_DEF_CALL_TEXT; -import static api.widgets.WidgetInfo.BA_DEF_ROLE_TEXT; -import static api.widgets.WidgetInfo.BA_HEAL_CALL_TEXT; -import static api.widgets.WidgetInfo.BA_HEAL_LISTEN_TEXT; -import static api.widgets.WidgetInfo.BA_REWARD_TEXT; -import static api.widgets.WidgetInfo.COMBAT_STYLE_FOUR; -import static api.widgets.WidgetInfo.COMBAT_STYLE_ONE; -import static api.widgets.WidgetInfo.COMBAT_STYLE_THREE; -import static api.widgets.WidgetInfo.COMBAT_STYLE_TWO; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.game.ItemManager; -import net.runelite.client.input.KeyListener; -import net.runelite.client.input.KeyManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.overlay.OverlayManager; -import net.runelite.client.ui.overlay.infobox.InfoBoxManager; -import static net.runelite.client.util.MenuUtil.swap; -import net.runelite.client.util.Text; -import org.apache.commons.lang3.ArrayUtils; - -@Slf4j -@PluginDescriptor( - name = "BA Tools", - description = "Custom tools for Barbarian Assault", - tags = {"minigame", "overlay", "timer"}, - type = PluginType.PVM -) -public class BAToolsPlugin extends Plugin implements KeyListener -{ - private boolean inGame; - private int tickNum; - private int pastCall = 0; - private int currentWave = 1; - private static final int BA_WAVE_NUM_INDEX = 2; - private static final WorldPoint healerSpawnPoint = new WorldPoint(1898, 1586, 0); - private final List entries = new ArrayList<>(); - private ImmutableMap originalAttackStyles; - private HashMap foodPressed = new HashMap<>(); - private CycleCounter counter; - private Actor lastInteracted; - - private boolean shiftDown; - - @Inject - private Client client; - - @Inject - private OverlayManager overlayManager; - - @Inject - private BAToolsConfig config; - - @Inject - private ItemManager itemManager; - - @Inject - private InfoBoxManager infoBoxManager; - - @Inject - private BAToolsOverlay overlay; - - @Getter - private Map healers; - - @Getter - private Instant wave_start; - - @Inject - private KeyManager keyManager; - - - @Provides - BAToolsConfig provideConfig(ConfigManager configManager) - { - return configManager.getConfig(BAToolsConfig.class); - } - - @Override - protected void startUp() throws Exception - { - overlayManager.add(overlay); - healers = new HashMap<>(); - wave_start = Instant.now(); - lastInteracted = null; - foodPressed.clear(); - keyManager.registerKeyListener(this); - } - - @Override - protected void shutDown() throws Exception - { - removeCounter(); - healers.clear(); - inGame = false; - lastInteracted = null; - overlayManager.remove(overlay); - keyManager.unregisterKeyListener(this); - shiftDown = false; - } - - @Subscribe - public void onWidgetLoaded(WidgetLoaded event) - { - if (event.getGroupId() == BA_REWARD_GROUP_ID) - { - Widget rewardWidget = client.getWidget(BA_REWARD_TEXT); - if (rewardWidget != null && rewardWidget.getText().contains("
5")) - { - tickNum = 0; - } - } - } - - @Subscribe - public void onGameTick(GameTick event) - { - Widget callWidget = getWidget(); - - if (callWidget != null) - { - if (callWidget.getTextColor() != pastCall && callWidget.getTextColor() == 16316664) - { - tickNum = 0; - } - pastCall = callWidget.getTextColor(); - } - if (inGame && config.defTimer()) - { - if (tickNum > 9) - { - tickNum = 0; - } - - if (counter == null) - { - addCounter(); - } - counter.setCount(tickNum); - - tickNum++; - } - - Widget weapon = client.getWidget(593, 1); - - if (config.attackStyles() - && weapon != null - && inGame - && weapon.getText().contains("Crystal halberd") || weapon.getText().contains("Dragon claws") - && client.getWidget(BA_ATK_LISTEN_TEXT) != null) - { - if (originalAttackStyles == null) - { - ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); - - builder.put(COMBAT_STYLE_ONE, client.getWidget(COMBAT_STYLE_ONE).isHidden()); - builder.put(COMBAT_STYLE_TWO, client.getWidget(COMBAT_STYLE_TWO).isHidden()); - builder.put(COMBAT_STYLE_THREE, client.getWidget(COMBAT_STYLE_THREE).isHidden()); - builder.put(COMBAT_STYLE_FOUR, client.getWidget(COMBAT_STYLE_FOUR).isHidden()); - - originalAttackStyles = builder.build(); - } - - String style = client.getWidget(BA_ATK_LISTEN_TEXT).getText(); - - if (style.contains("Defensive")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(true); - client.getWidget(COMBAT_STYLE_TWO).setHidden(true); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(false); - } - else if (style.contains("Aggressive")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(true); - client.getWidget(COMBAT_STYLE_TWO).setHidden(false); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(true); - } - else if (style.contains("Controlled")) - { - if (weapon.getText().contains("Crystal halberd")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(false); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - } - else - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(true); - client.getWidget(COMBAT_STYLE_THREE).setHidden(false); - } - client.getWidget(COMBAT_STYLE_TWO).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(true); - } - else if (style.contains("Accurate") && weapon.getText().contains("Dragon claws")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(false); - client.getWidget(COMBAT_STYLE_TWO).setHidden(true); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(true); - } - else - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(false); - client.getWidget(COMBAT_STYLE_TWO).setHidden(false); - client.getWidget(COMBAT_STYLE_THREE).setHidden(false); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(false); - } - - } - else if (originalAttackStyles != null) - { - originalAttackStyles.forEach((w, b) -> client.getWidget(w).setHidden(b)); - } - - if (config.prayerMetronome() && isAnyPrayerActive()) - { - for (int i = 0; i < config.prayerMetronomeVolume(); i++) - { - client.playSoundEffect(SoundEffectID.GE_INCREMENT_PLOP); - } - } - } - - private Widget getWidget() - { - if (client.getWidget(BA_DEF_CALL_TEXT) != null) - { - return client.getWidget(BA_DEF_CALL_TEXT); - } - else if (client.getWidget(BA_ATK_CALL_TEXT) != null) - { - return client.getWidget(BA_ATK_CALL_TEXT); - } - else if (client.getWidget(BA_COLL_CALL_TEXT) != null) - { - return client.getWidget(BA_COLL_CALL_TEXT); - } - else if (client.getWidget(BA_HEAL_CALL_TEXT) != null) - { - return client.getWidget(BA_HEAL_CALL_TEXT); - } - return null; - } - - @Subscribe - public void onVarbitChanged(VarbitChanged event) - { - int inGameBit = client.getVar(Varbits.IN_GAME_BA); - - if (inGameBit == 1 && !inGame || - inGameBit == 0 && inGame) - { - inGame = inGameBit == 1; - - if (!inGame) - { - pastCall = 0; - removeCounter(); - foodPressed.clear(); - } - else - { - addCounter(); - } - } - } - - @Subscribe - public void onChatMessage(ChatMessage event) - { - if (event.getType() == ChatMessageType.GAMEMESSAGE - && event.getMessage().startsWith("---- Wave:")) - { - String[] message = event.getMessage().split(" "); - currentWave = Integer.parseInt(message[BA_WAVE_NUM_INDEX]); - wave_start = Instant.now(); - healers.clear(); - } - } - - @Subscribe - public void onNpcSpawned(NpcSpawned event) - { - NPC npc = event.getNpc(); - - if (inGame && isNpcHealer(npc.getId())) - { - if (checkNewSpawn(npc) || Duration.between(wave_start, Instant.now()).getSeconds() < 16) - { - int spawnNumber = healers.size(); - healers.put(npc, new Healer(npc, spawnNumber, currentWave)); - } - } - } - - @Subscribe - public void onHitsplatApplied(HitsplatApplied hitsplatApplied) - { - Actor actor = hitsplatApplied.getActor(); - - if (healers.isEmpty() && !(actor instanceof NPC) && lastInteracted == null) - { - return; - } - - for (Healer healer : healers.values()) - { - if (healer.getNpc() == actor && actor == lastInteracted) - { - healer.setFoodRemaining(healer.getFoodRemaining() - 1); - } - } - } - - @Subscribe - public void onNpcDespawned(NpcDespawned event) - { - healers.remove(event.getNpc()); - } - - @Subscribe - public void onInteractingChanged(InteractingChanged event) - { - Actor opponent = event.getTarget(); - - if (opponent instanceof NPC && isNpcHealer(((NPC) opponent).getId()) && event.getSource() != client.getLocalPlayer()) - { - lastInteracted = opponent; - } - } - - private static boolean isNpcHealer(int npcId) - { - return npcId == NpcID.PENANCE_HEALER || - npcId == NpcID.PENANCE_HEALER_5766 || - npcId == NpcID.PENANCE_HEALER_5767 || - npcId == NpcID.PENANCE_HEALER_5768 || - npcId == NpcID.PENANCE_HEALER_5769 || - npcId == NpcID.PENANCE_HEALER_5770 || - npcId == NpcID.PENANCE_HEALER_5771 || - npcId == NpcID.PENANCE_HEALER_5772 || - npcId == NpcID.PENANCE_HEALER_5773 || - npcId == NpcID.PENANCE_HEALER_5774; - } - - @Subscribe - public void onMenuEntryAdded(MenuEntryAdded event) - { - if (config.calls() && getWidget() != null && event.getTarget().endsWith("horn") && !event.getTarget().contains("Unicorn")) - { - MenuEntry[] menuEntries = client.getMenuEntries(); - Widget callWidget = getWidget(); - String call = Calls.getOption(callWidget.getText()); - MenuEntry correctCall = null; - - entries.clear(); - for (MenuEntry entry : menuEntries) - { - String option = entry.getOption(); - if (option.equals(call)) - { - correctCall = entry; - } - else if (!option.startsWith("Tell-")) - { - entries.add(entry); - } - } - - if (correctCall != null) //&& callWidget.getTextColor()==16316664) - { - entries.add(correctCall); - client.setMenuEntries(entries.toArray(new MenuEntry[0])); - } - } - - final int itemId = event.getIdentifier(); - String option = Text.removeTags(event.getOption()).toLowerCase(); - String target = Text.removeTags(event.getTarget()).toLowerCase(); - - - if (config.swapLadder() && option.equals("climb-down") && target.equals("ladder")) - { - swap(client, "quick-start", option, target); - } - else if (config.removeBA() && client.getVar(Varbits.IN_GAME_BA) == 1 && !option.contains("tell-"))//if in barbarian assault and menu isnt from a horn - { - if (itemId == ItemID.LOGS && !target.contains("healing vial")) - { - if (client.getWidget(BA_DEF_ROLE_TEXT) == null) - { - remove(new String[]{"take", "light"}, target); - } - else //remove "Light" option (and "Take" option if not defender). - { - remove("light", target); - } - } - else if (option.equals("use")) - { - if (config.removeHealWrongFood()) - { - Widget healer = client.getWidget(BA_HEAL_LISTEN_TEXT); - if (healer != null) - { - String item = target.split("-")[0].trim(); - List poison = Arrays.asList("poisoned tofu", "poisoned meat", "poisoned worms"); - List vials = Arrays.asList("healing vial", "healing vial(1)", "healing vial(2)", "healing vial(3)", "healing vial(4)");//"healing vial(4)" - if (poison.contains(item)) - { - //if item is a poison item - int calledPoison = 0; - switch (healer.getText())//choose which poison to hide the use/destroy option for - { - case "Pois. Tofu": - calledPoison = ItemID.POISONED_TOFU; - break; - case "Pois. Meat": - calledPoison = ItemID.POISONED_MEAT; - break; - case "Pois. Worms": - calledPoison = ItemID.POISONED_WORMS; - break; - } - if (target.equals(item))//if targeting the item itself - { - if (calledPoison != 0 && itemId != calledPoison)//if no call or chosen item is not the called one - { - remove(new String[]{"use", "destroy", "examine"}, target);//remove options - } - } - else if (!target.contains("penance healer")) - { - remove(option, target); - } - } - else if (vials.contains(item))//if item is the healer's healing vial - { - - if (!target.equals(item))//if target is not the vial itself - { - - if (!target.contains("level") || target.contains("penance") || target.contains("queen spawn"))//if someone has "penance" or "queen spawn" in their name, gg... - { - remove(option, target); - } - } - } - } - } - } - else if (option.equals("attack") && client.getWidget(BA_ATK_ROLE_TEXT) == null && !target.equals("queen spawn"))//if not attacker - { - //remove attack option from everything but queen spawns - remove(option, target); - } - else if ((option.equals("fix") || (option.equals("block") && target.equals("penance cave"))) && client.getWidget(BA_DEF_ROLE_TEXT) == null)//if not defender - { - //the check for option requires checking target as well because defensive attack style option is also called "block". - remove(option, target); - } - else if ((option.equals("load")) && client.getWidget(BA_COLL_ROLE_TEXT) == null)//if not collector, remove hopper options - { - remove(new String[]{option, "look-in"}, target); - } - else if (config.removeWrongEggs() && option.equals("take")) - { - Widget eggToColl = client.getWidget(BA_COLL_LISTEN_TEXT); - if (eggToColl != null)//if we're a collector - { - List eggsToHide = new ArrayList<>(); - eggsToHide.add(ItemID.HAMMER); - switch (eggToColl.getText())//choose which eggs to hide take option for - { - case "Red eggs": - eggsToHide.add(ItemID.BLUE_EGG); - eggsToHide.add(ItemID.GREEN_EGG); - break; - case "Blue eggs": - eggsToHide.add(ItemID.RED_EGG); - eggsToHide.add(ItemID.GREEN_EGG); - break; - case "Green eggs": - eggsToHide.add(ItemID.RED_EGG); - eggsToHide.add(ItemID.BLUE_EGG); - break; - } - if (eggsToHide.contains(itemId)) - { - remove(option, target);//hide wrong eggs - } - } - else - { - List defenderItems = Arrays.asList(ItemID.HAMMER, ItemID.TOFU, ItemID.CRACKERS, ItemID.WORMS);//logs are handled separately due to hiding "light" option too. - if (client.getWidget(BA_DEF_ROLE_TEXT) == null || !defenderItems.contains(itemId))//if not defender, or item is not a defenderItem - { - remove(option, target);//hide everything except hammer/logs and bait if Defender - } - } - } - } - - - if (inGame && config.healerMenuOption() && event.getTarget().contains("Penance Healer")) - { - - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry lastEntry = menuEntries[menuEntries.length - 1]; - String targett = lastEntry.getTarget(); - - if (foodPressed.containsKey(lastEntry.getIdentifier())) - { - lastEntry.setTarget(lastEntry.getTarget().split("\\(")[0] + "(" + Duration.between(foodPressed.get(lastEntry.getIdentifier()), Instant.now()).getSeconds() + ")"); - if (Duration.between(foodPressed.get(lastEntry.getIdentifier()), Instant.now()).getSeconds() > 20) - { - lastEntry.setTarget(lastEntry.getTarget().replace("", "")); - } - } - else - { - lastEntry.setTarget(targett.replace("", "")); - - } - - client.setMenuEntries(menuEntries); - } - - if (client.getWidget(BA_COLL_LISTEN_TEXT) != null && inGame && config.eggBoi() && event.getTarget().endsWith("egg") && shiftDown) - { - String[] currentCall = client.getWidget(BA_COLL_LISTEN_TEXT).getText().split(" "); - - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry correctEgg = null; - entries.clear(); - - for (MenuEntry entry : menuEntries) - { - if (entry.getTarget().contains(currentCall[0]) && entry.getOption().equals("Take")) - { - correctEgg = entry; - } - else if (!entry.getOption().startsWith("Take")) - { - entries.add(entry); - } - } - if (correctEgg != null) - { - entries.add(correctEgg); - } - client.setMenuEntries(entries.toArray(new MenuEntry[0])); - } - - if (client.getWidget(BA_HEAL_LISTEN_TEXT) != null && inGame && config.osHelp() && event.getTarget().equals("Healer item machine") && shiftDown) - { - String[] currentCall = client.getWidget(BA_HEAL_LISTEN_TEXT).getText().split(" "); - - if (!currentCall[0].contains("Pois.")) - { - return; - } - - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry correctEgg = null; - entries.clear(); - - for (MenuEntry entry : menuEntries) - { - if (entry.getOption().equals("Take-" + currentCall[1])) - { - correctEgg = entry; - } - } - if (correctEgg != null) - { - entries.add(correctEgg); - client.setMenuEntries(entries.toArray(new MenuEntry[0])); - } - } - - } - - @Subscribe - public void onMenuOptionClicked(MenuOptionClicked event) - { - if (!config.healerMenuOption() || !event.getMenuTarget().contains("Penance Healer") || client.getWidget(BA_HEAL_CALL_TEXT) == null) - { - return; - } - - String currentCall = client.getWidget(BA_HEAL_CALL_TEXT).getText(); - String target = event.getMenuTarget(); - - if ((currentCall.equals("Pois. Worms") && (target.contains("Poisoned worms") && target.contains("->") && target.contains("Penance Healer"))) - || (currentCall.equals("Pois. Meat") && (target.contains("Poisoned meat") && target.contains("->") && target.contains("Penance Healer"))) - || (currentCall.equals("Pois. Tofu") && (target.contains("Poisoned tofu") && target.contains("->") && target.contains("Penance Healer")))) - { - foodPressed.put(event.getId(), Instant.now()); - } - - if (target.contains("->") && target.contains("Penance Healer")) - { - foodPressed.put(event.getId(), Instant.now()); - } - } - - public void onConfigChanged(ConfigChanged event) - { - if (counter != null && !config.defTimer()) - { - removeCounter(); - } - } - - private void addCounter() - { - if (!config.defTimer() || counter != null) - { - return; - } - - int itemSpriteId = ItemID.FIGHTER_TORSO; - - BufferedImage taskImg = itemManager.getImage(itemSpriteId); - counter = new CycleCounter(taskImg, this, tickNum); - - infoBoxManager.addInfoBox(counter); - } - - private void removeCounter() - { - if (counter == null) - { - return; - } - - infoBoxManager.removeInfoBox(counter); - counter = null; - } - - private void remove(String option, String target) - { - MenuEntry[] entries = client.getMenuEntries(); - int idx = searchIndex(entries, option, target); - if (idx >= 0 && entries[idx] != null) - { - entries = ArrayUtils.removeElement(entries, entries[idx]); - client.setMenuEntries(entries); - } - } - - private void remove(String[] options, String target) - { - MenuEntry[] entries = client.getMenuEntries(); - for (String option : options) - { - int idx = searchIndex(entries, option, target); - if (idx >= 0 && entries[idx] != null) - { - entries = ArrayUtils.removeElement(entries, entries[idx]); - } - } - - client.setMenuEntries(entries); - } - - private int searchIndex(MenuEntry[] entries, String option, String target) - { - for (int i = entries.length - 1; i >= 0; i--) - { - MenuEntry entry = entries[i]; - String entryOption = Text.removeTags(entry.getOption()).toLowerCase(); - String entryTarget = Text.removeTags(entry.getTarget()).toLowerCase(); - - if (entryOption.equals(option) && entryTarget.equals(target)) - { - return i; - } - } - - return -1; - } - - private boolean checkNewSpawn(NPC npc) - { - for (WorldPoint p : WorldPoint.toLocalInstance(client, healerSpawnPoint)) - { - if (p.distanceTo(npc.getWorldLocation()) < 5) - { - return true; - } - } - return false; - } - - @Override - public void keyTyped(KeyEvent e) - { - } - - @Override - public void keyPressed(KeyEvent e) - { - if (e.getKeyCode() == KeyEvent.VK_SHIFT) - { - shiftDown = true; - } - } - - @Override - public void keyReleased(KeyEvent e) - { - if (e.getKeyCode() == KeyEvent.VK_SHIFT) - { - shiftDown = false; - } - } - - private boolean isAnyPrayerActive() - { - for (Prayer pray : Prayer.values())//Check if any prayers are active - { - if (client.isPrayerActive(pray)) - { - return true; - } - } - - return false; - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/Healer.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/Healer.java deleted file mode 100644 index 38cb2598a9..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/Healer.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.batools; - - -import lombok.Getter; -import lombok.Setter; -import api.NPC; - - -class Healer -{ - - @Getter - private NPC npc; - - @Getter - @Setter - private int wave; - - @Getter - @Setter - private int spawnNumber; - - @Getter - @Setter - private int foodRemaining; - - @Getter - @Setter - private int lastFoodTime; - - @Getter - @Setter - private int firstCallFood; - - @Getter - @Setter - private int secondCallFood; - - Healer(NPC npc, int spawnNumber, int wave) - { - this.npc = npc; - this.wave = wave; - this.spawnNumber = spawnNumber; - this.firstCallFood = getCode(wave).getFirstCallFood()[spawnNumber]; - this.secondCallFood = getCode(wave).getSecondCallFood()[spawnNumber]; - this.foodRemaining = firstCallFood + secondCallFood; - this.lastFoodTime = getCode(wave).getSpacing()[spawnNumber]; - } - - private HealerCode getCode(int wave) - { - switch (wave) - { - case 1: - return HealerCode.WAVEONE; - case 2: - return HealerCode.WAVETWO; - case 3: - return HealerCode.WAVETHREE; - case 4: - return HealerCode.WAVEFOUR; - case 5: - return HealerCode.WAVEFIVE; - case 6: - return HealerCode.WAVESIX; - case 7: - return HealerCode.WAVESEVEN; - case 8: - return HealerCode.WAVEEIGHT; - case 9: - return HealerCode.WAVENINE; - case 10: - return HealerCode.WAVETEN; - default: - return null; - } - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/HealerCode.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/HealerCode.java deleted file mode 100644 index a604239045..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/HealerCode.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.batools; - -import lombok.Getter; - - -enum HealerCode -{ - - WAVEONE(new int[]{1, 1}, new int[]{0, 0}, new int[]{0, 0}), - WAVETWO(new int[]{1, 1, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 21}), - WAVETHREE(new int[]{1, 6, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 0}), - WAVEFOUR(new int[]{2, 5, 2, 0}, new int[]{0, 0, 7, 10}, new int[]{0, 0, 0, 0}), - WAVEFIVE(new int[]{2, 5, 2, 3, 0}, new int[]{0, 0, 0, 0, 7}, new int[]{0, 0, 21, 30, 0}), - WAVESIX(new int[]{3, 5, 2, 2, 0, 0}, new int[]{0, 0, 0, 2, 9, 10}, new int[]{12, 18, 21, 0, 0, 0}), - WAVESEVEN(new int[]{3, 7, 1, 1, 0, 0, 0}, new int[]{2, 0, 1, 1, 2, 4, 10}, new int[]{0, 21, 0, 0, 30, 45, 0}), - WAVEEIGHT(new int[]{1, 9, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 2, 10}, new int[]{0, 0, 0, 0, 33, 42, 0}), - WAVENINE(new int[]{2, 8, 1, 1, 0, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 1, 1, 10}, new int[]{0, 21, 0, 0, 0, 0, 0, 0, 0}), - WAVETEN(new int[]{2, 5, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 4, 4, 8}, new int[]{21, 33, 0, 33, 30, 45, 0}); - - - @Getter - private final int[] firstCallFood; - @Getter - private final int[] secondCallFood; - @Getter - private final int[] spacing; - - HealerCode(int[] firstCallFood, int[] secondCallFood, int[] spacing) - { - this.firstCallFood = firstCallFood; - this.secondCallFood = secondCallFood; - this.spacing = spacing; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blackjack/BlackjackPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/blackjack/BlackjackPlugin.java deleted file mode 100644 index acc543bae7..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blackjack/BlackjackPlugin.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.blackjack; - -import com.google.inject.Binder; -import javax.inject.Inject; -import javax.inject.Singleton; -import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import static api.Varbits.QUEST_THE_FEUD; -import api.events.ChatMessage; -import api.events.GameTick; -import api.events.MenuEntryAdded; -import api.events.VarbitChanged; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.menus.MenuManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import static net.runelite.client.util.MenuUtil.swap; - -/** - * Authors gazivodag longstreet - */ -@PluginDescriptor( - name = "Blackjack", - description = "Uses chat messages and tick timers instead of animations to read", - tags = {"blackjack", "thieving"}, - type = PluginType.SKILLING -) -@Singleton -@Slf4j -public class BlackjackPlugin extends Plugin -{ - private static final String PICKPOCKET = "Pickpocket"; - private static final String KNOCK_OUT = "Knock-out"; - private static final String LURE = "Lure"; - private static final String BANDIT = "Bandit"; - private static final String MENAPHITE = "Menaphite Thug"; - - @Inject - private Client client; - - @Inject - private MenuManager menuManager; - - private int lastKnockout; - private boolean pickpocketing; - private boolean ableToBlackJack; - - @Override - public void configure(Binder binder) - { - } - - @Override - protected void startUp() throws Exception - { - menuManager.addPriorityEntry(LURE, BANDIT); - menuManager.addPriorityEntry(LURE, MENAPHITE); - - menuManager.addPriorityEntry(KNOCK_OUT, BANDIT); - menuManager.addPriorityEntry(KNOCK_OUT, MENAPHITE); - } - - @Override - protected void shutDown() throws Exception - { - menuManager.removePriorityEntry(LURE, BANDIT); - menuManager.removePriorityEntry(LURE, MENAPHITE); - - menuManager.removePriorityEntry(PICKPOCKET, BANDIT); - menuManager.removePriorityEntry(PICKPOCKET, MENAPHITE); - - menuManager.removePriorityEntry(KNOCK_OUT, BANDIT); - menuManager.removePriorityEntry(KNOCK_OUT, MENAPHITE); - } - - @Subscribe - public void onGameTick(GameTick gameTick) - { - if (ableToBlackJack && pickpocketing && client.getTickCount() >= lastKnockout + 4) - { - pickpocketing = false; - - menuManager.removePriorityEntry(PICKPOCKET, BANDIT); - menuManager.removePriorityEntry(PICKPOCKET, MENAPHITE); - - menuManager.addPriorityEntry(KNOCK_OUT, BANDIT); - menuManager.addPriorityEntry(KNOCK_OUT, MENAPHITE); - } - } - - @Subscribe - public void onMenuEntryAdded(MenuEntryAdded event) - { - // Lure has higher priority than knock-out - if (event.getTarget().contains(MENAPHITE) || event.getTarget().contains(BANDIT) - && event.getOption().equals(LURE)) - { - swap(client, KNOCK_OUT, LURE, event.getTarget(), false); - } - } - - @Subscribe - public void onChatMessage(ChatMessage chatMessage) - { - if (chatMessage.getType() == ChatMessageType.SPAM) - { - if (chatMessage.getMessage().equals("You smack the bandit over the head and render them unconscious.") - || chatMessage.getMessage().equals("Your blow only glances off the bandit's head.")) - { - menuManager.removePriorityEntry(KNOCK_OUT, BANDIT); - menuManager.removePriorityEntry(KNOCK_OUT, MENAPHITE); - - menuManager.addPriorityEntry(PICKPOCKET, BANDIT); - menuManager.addPriorityEntry(PICKPOCKET, MENAPHITE); - - lastKnockout = client.getTickCount(); - pickpocketing = true; - } - } - } - - @Subscribe - public void onVarbitChanged(VarbitChanged event) - { - ableToBlackJack = client.getVar(QUEST_THE_FEUD) >= 13; - - if (!ableToBlackJack) - { - menuManager.removePriorityEntry(LURE, BANDIT); - menuManager.removePriorityEntry(LURE, MENAPHITE); - - menuManager.removePriorityEntry(KNOCK_OUT, BANDIT); - menuManager.removePriorityEntry(KNOCK_OUT, MENAPHITE); - - menuManager.removePriorityEntry(PICKPOCKET, BANDIT); - menuManager.removePriorityEntry(PICKPOCKET, MENAPHITE); - } - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java deleted file mode 100644 index 99288092ae..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2019, Lucas C - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.cooking; - -import com.google.inject.Inject; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.time.Duration; -import java.time.Instant; -import lombok.extern.slf4j.Slf4j; -import static api.AnimationID.COOKING_WINE; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import net.runelite.client.ui.overlay.Overlay; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; -import net.runelite.client.ui.overlay.OverlayMenuEntry; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -import net.runelite.client.ui.overlay.components.TitleComponent; - -@Slf4j -class FermentTimerOverlay extends Overlay -{ - private static final int INITIAL_TIME = 12; - - private final Client client; - private final CookingPlugin plugin; - private final PanelComponent panelComponent = new PanelComponent(); - - @Inject - private FermentTimerOverlay(final Client client, final CookingPlugin plugin) - { - super(plugin); - setPosition(OverlayPosition.TOP_LEFT); - this.client = client; - this.plugin = plugin; - getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Fermenting Timer overlay")); - } - - @Override - public Dimension render(Graphics2D graphics) - { - FermentTimerSession session = plugin.getFermentTimerSession(); - if (session == null) - { - return null; - } - - panelComponent.getChildren().clear(); - - if (isMakingWine() || Duration.between(session.getLastWineMakingAction(), Instant.now()).getSeconds() < INITIAL_TIME) - { - panelComponent.getChildren().add(TitleComponent.builder() - .text("Making Wine") - .color(Color.GREEN) - .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Ferments in: ") - .right(String.valueOf(INITIAL_TIME - Duration.between(session.getLastWineMakingAction(), Instant.now()).getSeconds())) - .build()); - } - else - { - panelComponent.getChildren().add(TitleComponent.builder() - .text("Wine Fermented") - .color(Color.ORANGE) - .build()); - } - - return panelComponent.render(graphics); - } - - private boolean isMakingWine() - { - return (client.getLocalPlayer().getAnimation() == COOKING_WINE); - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java deleted file mode 100644 index b60e9f1cb2..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright (c) 2019, xzact - * Copyright (c) 2019, ganom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package net.runelite.client.plugins.coxhelper; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.Polygon; -import java.util.Iterator; -import java.util.List; -import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.OverlayUtil; - -public class CoxOverlay extends Overlay -{ - private final Client client; - - - private final CoxPlugin plugin; - private final CoxConfig config; - - @Inject - private CoxOverlay(Client client, CoxPlugin plugin, CoxConfig config) - { - this.client = client; - this.plugin = plugin; - this.config = config; - setPosition(OverlayPosition.DYNAMIC); - setPriority(OverlayPriority.HIGH); - setLayer(OverlayLayer.ABOVE_SCENE); - } - - @Override - public Dimension render(Graphics2D graphics) - { - for (WorldPoint point : plugin.getOlm_Heal()) - { - client.setHintArrow(point); - drawTile(graphics, point, config.tpColor(), 2, 150, 50); - } - - for (WorldPoint point : plugin.getOlm_TP()) - { - client.setHintArrow(point); - drawTile(graphics, point, config.tpColor(), 2, 150, 50); - } - - if (plugin.isRunMutta()) - { - if (config.Muttadile()) - { - NPC boss = plugin.getMomma_NPC(); - NPC baby = plugin.getMutta_NPC(); - if (boss != null) - { - int size = 1; - NPCDefinition composition = boss.getTransformedDefinition(); - { - size = composition.getSize(); - } - List meleeRangeMom = getHitSquares(boss.getWorldLocation(), size, 1, false); - for (WorldPoint p : meleeRangeMom) - { - drawTile(graphics, p, config.muttaColor(), 0, 0, 50); - } - } - if (baby != null) - { - int size = 1; - NPCDefinition compositionbaby = baby.getTransformedDefinition(); - { - size = compositionbaby.getSize(); - } - List meleeRange = getHitSquares(baby.getWorldLocation(), size, 1, false); - for (WorldPoint p : meleeRange) - { - drawTile(graphics, p, config.muttaColor(), 0, 0, 50); - } - } - } - } - - if (plugin.isRunGuard()) - { - if (config.Guardians()) - { - NPC G1 = plugin.getGuard1_NPC(); - NPC G2 = plugin.getGuard2_NPC(); - int tick = plugin.getGuardTick(); - if (tick == 5) - { - if (G1 != null) - { - int size = 1; - NPCDefinition composition = G1.getTransformedDefinition(); - { - size = composition.getSize(); - } - List meleeRange = getHitSquares(G1.getWorldLocation(), size, 1, true); - for (WorldPoint p : meleeRange) - { - drawTile(graphics, p, config.guardColor(), 0, 0, 50); - } - } - if (G2 != null) - { - int size = 1; - NPCDefinition composition = G2.getTransformedDefinition(); - { - size = composition.getSize(); - } - List meleeRange = getHitSquares(G2.getWorldLocation(), size, 1, true); - for (WorldPoint p : meleeRange) - { - drawTile(graphics, p, config.guardColor(), 0, 0, 50); - } - } - } - } - } - - - if (plugin.isRunTekton()) - { - if (config.Tekton()) - { - NPC boss = plugin.getTekton_NPC(); - if (boss != null) - { - int size = 1; - NPCDefinition composition = boss.getTransformedDefinition(); - { - size = composition.getSize(); - } - List meleeRange = getHitSquares(boss.getWorldLocation(), size, 1, false); - for (WorldPoint p : meleeRange) - { - drawTile(graphics, p, config.tektonColor(), 0, 0, 50); - } - } - } - } - - if (plugin.isRunOlm()) - { - NPC boss = plugin.getOlm_NPC(); - - if (config.OlmTick()) - { - if (boss != null) - { - int tick = plugin.getOlm_TicksUntilAction(); - int cycle = plugin.getOlm_ActionCycle(); - int spec = plugin.getOlm_NextSpec(); - final String tickStr = String.valueOf(tick); - String cycleStr = "?"; - switch (cycle) - { - case 1: - switch (spec) - { - case 1: - cycleStr = "Portals"; - break; - case 2: - cycleStr = "lightning"; - break; - case 3: - cycleStr = "Crystals"; - break; - case 4: - cycleStr = "Heal"; - break; - case -1: - cycleStr = "??"; - break; - } - break; - case 2: - cycleStr = "Sauto"; - break; - case 3: - cycleStr = "Null"; - break; - case 4: - cycleStr = "Nauto"; - break; - case -1: - cycleStr = "??"; - break; - } - final String combinedStr = cycleStr + ":" + tickStr; - Point canvasPoint = boss.getCanvasTextLocation(graphics, combinedStr, 130); - renderTextLocation(graphics, combinedStr, config.textSize(), config.fontStyle().getFont(), Color.WHITE, canvasPoint); - } - } - } - return null; - } - - private void drawTile(Graphics2D graphics, WorldPoint point, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) - { - WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); - if (point.distanceTo(playerLocation) >= 32) - { - return; - } - LocalPoint lp = LocalPoint.fromWorld(client, point); - if (lp == null) - { - return; - } - - Polygon poly = Perspective.getCanvasTilePoly(client, lp); - if (poly == null) - { - return; - } - //OverlayUtil.renderPolygon(graphics, poly, color); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); - graphics.setStroke(new BasicStroke(strokeWidth)); - graphics.draw(poly); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); - graphics.fill(poly); - } - - private void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha) - { - int size = 1; - NPCDefinition composition = actor.getTransformedDefinition(); - if (composition != null) - { - size = composition.getSize(); - } - LocalPoint lp = actor.getLocalLocation(); - Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); - - if (tilePoly != null) - { - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); - graphics.setStroke(new BasicStroke(outlineWidth)); - graphics.draw(tilePoly); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); - graphics.fill(tilePoly); - } - } - - private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) - { - graphics.setFont(new Font("Arial", fontStyle, fontSize)); - if (canvasPoint != null) - { - final Point canvasCenterPoint = new Point( - canvasPoint.getX(), - canvasPoint.getY()); - final Point canvasCenterPoint_shadow = new Point( - canvasPoint.getX() + 1, - canvasPoint.getY() + 1); - if (config.shadows()) - { - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); - } - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); - } - } - - private List getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder) - { - List little = new WorldArea(npcLoc, npcSize, npcSize).toWorldPointList(); - List big = new WorldArea(npcLoc.getX() - thickness, npcLoc.getY() - thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList(); - if (!includeUnder) - { - for (Iterator it = big.iterator(); it.hasNext(); ) - { - WorldPoint p = it.next(); - if (little.contains(p)) - { - it.remove(); - } - } - } - return big; - } - - private void renderPoly(Graphics2D graphics, Color color, Polygon polygon) - { - if (polygon != null) - { - graphics.setColor(color); - graphics.setStroke(new BasicStroke(2)); - graphics.draw(polygon); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); - graphics.fill(polygon); - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/TimersOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/TimersOverlay.java deleted file mode 100644 index 314695ab2a..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/TimersOverlay.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2019, ganom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.coxhelper; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.Polygon; -import javax.inject.Inject; -import api.Actor; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.OverlayUtil; - -public class TimersOverlay extends Overlay -{ - - private CoxPlugin plugin; - private CoxConfig config; - private Client client; - - @Inject - TimersOverlay(CoxPlugin plugin, CoxConfig config, Client client) - { - this.plugin = plugin; - this.config = config; - this.client = client; - setPosition(OverlayPosition.DYNAMIC); - setPriority(OverlayPriority.HIGHEST); - setLayer(OverlayLayer.ALWAYS_ON_TOP); - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (config.tektonTickCounter()) - { - Actor actor = plugin.getTekton_NPC(); - final int ticksLeft = plugin.getTektonTicks(); - final int attackTicksleft = plugin.getTektonAttackTicks(); - String attacksLeftStr; - Color tickcolor; - Color attackcolor; - if (ticksLeft > 0) - { - if (ticksLeft == 1) - { - tickcolor = new Color(255, 0, 0, 255); - } - else - { - tickcolor = new Color(255, 255, 255, 255); - } - final String ticksLeftStr = String.valueOf(ticksLeft); - Point canvasPoint = actor.getCanvasTextLocation(graphics, ticksLeftStr, 0); - renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), tickcolor, canvasPoint); - } - if (attackTicksleft >= 0 && plugin.getTektonAttacks() > 0) - { - if (attackTicksleft <= 1) - { - attackcolor = new Color(255, 0, 0, 255); - attacksLeftStr = "Phase Over"; - } - else - { - attackcolor = new Color(255, 255, 255, 255); - attacksLeftStr = String.valueOf(attackTicksleft); - } - - if (actor != null) - { - Point canvasPoint = actor.getCanvasTextLocation(graphics, attacksLeftStr, 0); - renderTextLocationAbove(graphics, attacksLeftStr, config.textSize(), config.fontStyle().getFont(), attackcolor, canvasPoint); - } - } - } - - if (config.timers()) - { - if (plugin.getBurnTarget().size() > 0) - { - for (Actor actor : plugin.getBurnTarget()) - { - renderNpcOverlay(graphics, actor, config.burnColor(), 2, 100, 10); - final int ticksLeft = plugin.getBurnTicks(); - String ticksLeftStr = String.valueOf(ticksLeft); - Color tickcolor = new Color(255, 255, 255, 255); - if (ticksLeft >= 0) - { - if (ticksLeft == 34 || - ticksLeft == 33 || - ticksLeft == 26 || - ticksLeft == 25 || - ticksLeft == 18 || - ticksLeft == 17 || - ticksLeft == 10 || - ticksLeft == 9 || - ticksLeft == 2 || - ticksLeft == 1) - { - tickcolor = new Color(255, 0, 0, 255); - ticksLeftStr = "GAP"; - } - else - { - tickcolor = new Color(255, 255, 255, 255); - } - Point canvasPoint = actor.getCanvasTextLocation(graphics, ticksLeftStr, 0); - renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), tickcolor, canvasPoint); - } - } - } - - if (plugin.getAcidTarget() != null) - { - Actor actor = plugin.getAcidTarget(); - renderNpcOverlay(graphics, actor, config.acidColor(), 2, 100, 10); - final int ticksLeft = plugin.getAcidTicks(); - Color tickcolor = new Color(255, 255, 255, 255); - if (ticksLeft > 0) - { - if (ticksLeft > 1) - { - tickcolor = new Color(69, 241, 44, 255); - } - else - { - tickcolor = new Color(255, 255, 255, 255); - } - final String ticksLeftStr = String.valueOf(ticksLeft); - Point canvasPoint = actor.getCanvasTextLocation(graphics, ticksLeftStr, 0); - renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), tickcolor, canvasPoint); - } - } - } - - if (config.tpOverlay()) - { - if (plugin.getTeleportTarget() != null) - { - renderNpcOverlay(graphics, plugin.getTeleportTarget(), new Color(193, 255, 245, 255), 2, 100, 10); - } - } - - return null; - } - - private void renderNpcOverlay(Graphics2D graphics, Actor actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha) - { - int size = 1; - LocalPoint lp = actor.getLocalLocation(); - Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); - - if (tilePoly != null) - { - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); - graphics.setStroke(new BasicStroke(outlineWidth)); - graphics.draw(tilePoly); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); - graphics.fill(tilePoly); - } - } - - private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) - { - graphics.setFont(new Font("Arial", fontStyle, fontSize)); - if (canvasPoint != null) - { - final Point canvasCenterPoint = new Point( - canvasPoint.getX(), - canvasPoint.getY()); - final Point canvasCenterPoint_shadow = new Point( - canvasPoint.getX() + 1, - canvasPoint.getY() + 1); - if (config.shadows()) - { - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); - } - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); - } - } - - private void renderTextLocationAbove(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) - { - graphics.setFont(new Font("Arial", fontStyle, fontSize)); - if (canvasPoint != null) - { - final Point canvasCenterPoint = new Point( - canvasPoint.getX(), - canvasPoint.getY() + 20); - final Point canvasCenterPoint_shadow = new Point( - canvasPoint.getX() + 1, - canvasPoint.getY() + 21); - if (config.shadows()) - { - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); - } - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsHighlight.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsHighlight.java deleted file mode 100644 index f8d3692a84..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsHighlight.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2019, lyzrds - * Copyright (c) 2019, ganom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.coxhelper; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Polygon; -import javax.inject.Inject; -import api.Client; -import api.NPC; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; - -public class VanguardsHighlight extends Overlay -{ - - private final Client client; - private final CoxPlugin plugin; - private final CoxConfig config; - - @Inject - VanguardsHighlight(Client client, CoxPlugin plugin, CoxConfig config) - { - super(plugin); - setLayer(OverlayLayer.ABOVE_MAP); - this.client = client; - this.plugin = plugin; - this.config = config; - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (plugin.isRunVanguards()) - { - if (config.vangHighlight()) - { - if (plugin.getRangeVang() != null) - { - renderNpcOverlay(graphics, plugin.getRangeVang(), "Range", Color.GREEN); - } - if (plugin.getMageVang() != null) - { - renderNpcOverlay(graphics, plugin.getMageVang(), "Mage", Color.BLUE); - } - if (plugin.getMeleeVang() != null) - { - renderNpcOverlay(graphics, plugin.getMeleeVang(), "Melee", Color.RED); - } - } - } - return null; - } - - - private void renderNpcOverlay(Graphics2D graphics, NPC actor, String name, Color color) - { - Polygon objectClickbox = actor.getConvexHull(); - renderPoly(graphics, color, objectClickbox); - } - - private void renderPoly(Graphics2D graphics, Color color, Polygon polygon) - { - if (polygon != null) - { - graphics.setColor(color); - graphics.setStroke(new BasicStroke(2)); - graphics.draw(polygon); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); - graphics.fill(polygon); - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatListener.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatListener.java deleted file mode 100644 index 502500c634..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatListener.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Abexlry - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.entertochat; - -import com.google.common.base.Strings; -import java.awt.event.KeyEvent; -import java.util.HashMap; -import java.util.Map; -import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.VarClientStr; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.input.KeyListener; -import net.runelite.client.input.MouseAdapter; - -class EnterToChatListener extends MouseAdapter implements KeyListener -{ - @Inject - private EnterToChatPlugin plugin; - - @Inject - private Client client; - - @Inject - private ClientThread clientThread; - - private final Map modified = new HashMap<>(); - - @Override - public void keyTyped(KeyEvent e) - { - } - - @Override - public void keyPressed(KeyEvent e) - { - if (client.getGameState() != GameState.LOGGED_IN || !plugin.chatboxFocused()) - { - return; - } - - if (!plugin.isTyping()) - { - switch (e.getKeyCode()) - { - case KeyEvent.VK_ENTER: - case KeyEvent.VK_SLASH: - case KeyEvent.VK_COLON: - // refocus chatbox - plugin.setTyping(true); - clientThread.invoke(() -> - { - plugin.unlockChat(); - }); - break; - } - } - else - { - switch (e.getKeyCode()) - { - case KeyEvent.VK_ENTER: - plugin.setTyping(false); - clientThread.invoke(() -> - { - plugin.lockChat(); - }); - break; - case KeyEvent.VK_ESCAPE: - plugin.setTyping(false); - clientThread.invoke(() -> - { - client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); - plugin.lockChat(); - }); - break; - case KeyEvent.VK_BACK_SPACE: - if (Strings.isNullOrEmpty(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT))) - { - plugin.setTyping(false); - clientThread.invoke(() -> plugin.lockChat()); - } - } - } - } - - @Override - public void keyReleased(KeyEvent e) - { - if (client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - if (plugin.chatboxFocused() && !plugin.isTyping()) - { - modified.remove(e.getKeyCode()); - - } - else - { - // press d + enter + release d - causes the right arrow to never be released - Integer m = modified.get(e.getKeyCode()); - if (m != null) - { - modified.remove(e.getKeyCode()); - e.setKeyCode(m); - } - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatPlugin.java deleted file mode 100644 index b200f3bc0e..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatPlugin.java +++ /dev/null @@ -1,206 +0,0 @@ -/*' - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Abexlry - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.entertochat; - -import java.awt.Color; -import javax.inject.Inject; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import api.Client; -import api.GameState; -import api.IconID; -import api.VarClientInt; -import api.VarClientStr; -import api.Varbits; -import api.events.ScriptCallbackEvent; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.input.KeyManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.JagexColors; -import net.runelite.client.util.ColorUtil; - -@PluginDescriptor( - name = "Press Enter to Chat", - description = "'Press Enter to Chat'", - tags = {"enter", "chat"}, - enabledByDefault = false, - type = PluginType.UTILITY -) -public class EnterToChatPlugin extends Plugin -{ - private static final String PRESS_ENTER_TO_CHAT = "Press Enter to Chat..."; - private static final String SCRIPT_EVENT_SET_CHATBOX_INPUT = "setChatboxInput"; - private static final String SCRIPT_EVENT_BLOCK_CHAT_INPUT = "blockChatInput"; - - @Inject - private Client client; - - @Inject - private ClientThread clientThread; - - @Inject - private ConfigManager configManager; - - @Inject - private KeyManager keyManager; - - @Inject - private EnterToChatListener inputListener; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private boolean typing; - - @Override - protected void startUp() throws Exception - { - configManager.setConfiguration("runelite", "wasdcameraplugin", false); - typing = false; - keyManager.registerKeyListener(inputListener); - - clientThread.invoke(() -> - { - if (client.getGameState() == GameState.LOGGED_IN) - { - lockChat(); - } - }); - } - - @Override - protected void shutDown() throws Exception - { - clientThread.invoke(() -> - { - if (client.getGameState() == GameState.LOGGED_IN) - { - unlockChat(); - } - }); - - keyManager.unregisterKeyListener(inputListener); - } - - - boolean chatboxFocused() - { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent == null || chatboxParent.getOnKeyListener() == null) - { - return false; - } - - // the search box on the world map can be focused, and chat input goes there, even - // though the chatbox still has its key listener. - Widget worldMapSearch = client.getWidget(WidgetInfo.WORLD_MAP_SEARCH); - return worldMapSearch == null || client.getVar(VarClientInt.WORLD_MAP_SEARCH_FOCUSED) != 1; - - } - - @Subscribe - public void onScriptCallbackEvent(ScriptCallbackEvent scriptCallbackEvent) - { - switch (scriptCallbackEvent.getEventName()) - { - case SCRIPT_EVENT_SET_CHATBOX_INPUT: - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) - { - if (chatboxFocused() && !typing) - { - chatboxInput.setText(PRESS_ENTER_TO_CHAT); - } - } - break; - case SCRIPT_EVENT_BLOCK_CHAT_INPUT: - if (!typing) - { - int[] intStack = client.getIntStack(); - int intStackSize = client.getIntStackSize(); - intStack[intStackSize - 1] = 1; - } - break; - } - } - - void lockChat() - { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent != null && chatboxParent.getOnKeyListener() != null) - { - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) - { - chatboxInput.setText(PRESS_ENTER_TO_CHAT); - } - } - } - - void unlockChat() - { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent != null) - { - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) - { - if (client.getGameState() == GameState.LOGGED_IN) - { - final boolean isChatboxTransparent = client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1; - final Color textColor = isChatboxTransparent ? JagexColors.CHAT_TYPED_TEXT_TRANSPARENT_BACKGROUND : JagexColors.CHAT_TYPED_TEXT_OPAQUE_BACKGROUND; - chatboxInput.setText(getPlayerNameWithIcon() + ": " + ColorUtil.wrapWithColorTag(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT) + "*", textColor)); - } - } - } - } - - private String getPlayerNameWithIcon() - { - IconID icon; - switch (client.getAccountType()) - { - case IRONMAN: - icon = IconID.IRONMAN; - break; - case ULTIMATE_IRONMAN: - icon = IconID.ULTIMATE_IRONMAN; - break; - case HARDCORE_IRONMAN: - icon = IconID.HARDCORE_IRONMAN; - break; - default: - return client.getLocalPlayer().getName(); - } - return icon + client.getLocalPlayer().getName(); - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/TimersOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/TimersOverlay.java deleted file mode 100644 index 4b24655d31..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/TimersOverlay.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2019, Ganom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package net.runelite.client.plugins.fightcave; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.Polygon; -import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.OverlayUtil; - -public class TimersOverlay extends Overlay -{ - private FightCavePlugin plugin; - private Client client; - - @Inject - TimersOverlay(FightCavePlugin plugin, Client client) - { - this.plugin = plugin; - this.client = client; - setPosition(OverlayPosition.DYNAMIC); - setPriority(OverlayPriority.HIGHEST); - setLayer(OverlayLayer.ALWAYS_ON_TOP); - } - - @Override - public Dimension render(Graphics2D graphics) - { - for (NPCContainer npc : plugin.getDrainers().values()) - { - renderNpcOverlay(graphics, npc.getNpc(), Color.RED, 255, 20); - String str = "drainer"; - Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, str, 0); - renderTextLocation(graphics, str, 12, Color.WHITE, canvasPoint); - } - - for (NPCContainer npc : plugin.getIgnore().values()) - { - renderNpcOverlay(graphics, npc.getNpc(), Color.BLACK, 50, 5); - String str = "ignore"; - Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, str, 0); - renderTextLocation(graphics, str, 10, Color.WHITE, canvasPoint); - } - - Color tickcolor; - - for (NPCContainer npc : plugin.getRangers().values()) - { - renderNpcOverlay(graphics, npc.getNpc(), Color.GREEN, 100, 10); - final int ticksLeft = npc.getTicksUntilAttack(); - if (ticksLeft > 0) - { - if (ticksLeft == 1) - { - tickcolor = Color.GREEN; - } - else - { - tickcolor = Color.WHITE; - } - final String ticksLeftStr = String.valueOf(ticksLeft); - Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, ticksLeftStr, 0); - renderTextLocation(graphics, ticksLeftStr, 32, tickcolor, canvasPoint); - } - } - - for (NPCContainer npc : plugin.getMagers().values()) - { - renderNpcOverlay(graphics, npc.getNpc(), Color.CYAN, 100, 10); - final int ticksLeft = npc.getTicksUntilAttack(); - if (ticksLeft > 0) - { - if (ticksLeft == 1) - { - tickcolor = Color.CYAN; - } - else - { - - tickcolor = Color.WHITE; - } - final String ticksLeftStr = String.valueOf(ticksLeft); - Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, ticksLeftStr, 0); - renderTextLocation(graphics, ticksLeftStr, 32, tickcolor, canvasPoint); - } - } - - for (NPCContainer npc : plugin.getMeleers().values()) - { - renderNpcOverlay(graphics, npc.getNpc(), Color.RED, 100, 10); - final int ticksLeft = npc.getTicksUntilAttack(); - if (ticksLeft > 0) - { - if (ticksLeft == 1) - { - tickcolor = Color.RED; - } - else - { - - tickcolor = Color.WHITE; - } - final String ticksLeftStr = String.valueOf(ticksLeft); - Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, ticksLeftStr, 0); - renderTextLocation(graphics, ticksLeftStr, 32, tickcolor, canvasPoint); - } - } - - return null; - } - - private void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineAlpha, int fillAlpha) - { - int size = 1; - NPCDefinition composition = actor.getTransformedDefinition(); - if (composition != null) - { - size = composition.getSize(); - } - LocalPoint lp = actor.getLocalLocation(); - Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); - - if (tilePoly != null) - { - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); - graphics.setStroke(new BasicStroke(2)); - graphics.draw(tilePoly); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); - graphics.fill(tilePoly); - } - } - - private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, Color fontColor, Point canvasPoint) - { - graphics.setFont(new Font("Arial", Font.BOLD, fontSize)); - if (canvasPoint != null) - { - final Point canvasCenterPoint = new Point( - canvasPoint.getX(), - canvasPoint.getY()); - final Point canvasCenterPoint_shadow = new Point( - canvasPoint.getX() + 1, - canvasPoint.getY() + 1); - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java deleted file mode 100644 index c39bf1ef97..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2017, Devin French - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.idlenotifier; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup("idlenotifier") -public interface IdleNotifierConfig extends Config -{ - @ConfigItem( - keyName = "animationidle", - name = "Idle Animation Notifications", - description = "Configures if idle animation notifications are enabled", - position = 1 - ) - default boolean animationIdle() - { - return true; - } - - @ConfigItem( - keyName = "interactionidle", - name = "Idle Interaction Notifications", - description = "Configures if idle interaction notifications are enabled e.g. combat, fishing", - position = 2 - ) - default boolean interactionIdle() - { - return true; - } - - @ConfigItem( - keyName = "logoutidle", - name = "Idle Logout Notifications", - description = "Configures if the idle logout notifications are enabled", - position = 3 - ) - default boolean logoutIdle() - { - return true; - } - - @ConfigItem( - position = 4, - keyName = "skullNotification", - name = "Skull Notification", - description = "Receive a notification when you skull." - ) - default boolean showSkullNotification() - { - return false; - } - - @ConfigItem( - position = 5, - keyName = "unskullNotification", - name = "Unskull Notification", - description = "Receive a notification when you unskull." - ) - default boolean showUnskullNotification() - { - return false; - } - - @ConfigItem( - keyName = "timeout", - name = "Idle Notification Delay (ms)", - description = "The notification delay after the player is idle", - position = 6 - ) - default int getIdleNotificationDelay() - { - return 5000; - } - - @ConfigItem( - keyName = "hitpoints", - name = "Hitpoints Notification Threshold", - description = "The amount of hitpoints to send a notification at. A value of 0 will disable notification.", - position = 7 - ) - default int getHitpointsThreshold() - { - return 0; - } - - @ConfigItem( - keyName = "prayer", - name = "Prayer Notification Threshold", - description = "The amount of prayer points to send a notification at. A value of 0 will disable notification.", - position = 8 - ) - default int getPrayerThreshold() - { - return 0; - } - - @ConfigItem( - keyName = "oxygen", - name = "Oxygen Notification Threshold", - position = 9, - description = "The amount of remaining oxygen to send a notification at. A value of 0 will disable notification." - ) - default int getOxygenThreshold() - { - return 0; - } - - @ConfigItem( - keyName = "spec", - name = "Special Attack Energy Notification Threshold", - position = 10, - description = "The amount of spec energy reached to send a notification at. A value of 0 will disable notification." - ) - default int getSpecEnergyThreshold() - { - return 0; - } - - @ConfigItem( - keyName = "pkers", - name = "PKer Notifier", - position = 9, - description = "Notifies if an attackable player based on your level range appears on screen.", - group = "PvP", - warning = "This will not notify you if the player is in your cc or is online on your friends list." - ) - default boolean notifyPkers() - { - return false; - } - -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightConfig.java deleted file mode 100644 index 1cf5a673a1..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.runelite.client.plugins.inventoryhighlight; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; -import net.runelite.client.config.Stub; - -@ConfigGroup("inventoryHighlight") -public interface InventoryHighlightConfig extends Config -{ - @ConfigItem( - keyName = "showItem", - name = "Show the item", - description = "Show a preview of the item in the new slot" - ) - default boolean showItem() - { - return true; - } - - @ConfigItem( - keyName = "gridStub", - name = "Grid", - description = "", - position = 1 - ) - default Stub gridStub() - { - return new Stub(); - } - - @ConfigItem( - keyName = "showGrid", - name = "Show a grid", - description = "Show a grid on the inventory while dragging", - parent = "gridStub" - ) - default boolean showGrid() - { - return false; - } - - @ConfigItem( - keyName = "showHighlight", - name = "Show background highlight", - description = "Show a green background highlight in the new slot", - parent = "gridStub" - ) - default boolean showHighlight() - { - return false; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightInputListener.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightInputListener.java deleted file mode 100644 index 6aa50f8515..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightInputListener.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2018, Jeremy Plsek - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.inventoryhighlight; - -import com.google.inject.Inject; -import java.awt.event.MouseEvent; -import api.Client; -import api.GameState; -import api.Point; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetItem; -import net.runelite.client.input.MouseListener; - -public class InventoryHighlightInputListener implements MouseListener -{ - private final InventoryHighlightPlugin plugin; - private final Client client; - - @Inject - public InventoryHighlightInputListener(InventoryHighlightPlugin plugin, Client client) - { - this.plugin = plugin; - this.client = client; - } - - @Override - public MouseEvent mouseDragged(MouseEvent mouseEvent) - { - plugin.setDragging(true); - return mouseEvent; - } - - @Override - public MouseEvent mouseMoved(MouseEvent mouseEvent) - { - return mouseEvent; - } - - @Override - public MouseEvent mouseClicked(MouseEvent mouseEvent) - { - return mouseEvent; - } - - @Override - public MouseEvent mousePressed(MouseEvent mouseEvent) - { - if (client.getGameState() != GameState.LOGGED_IN) - { - return mouseEvent; - } - - final Widget inventoryWidget = client.getWidget(WidgetInfo.INVENTORY); - final Widget bankInventoryWidget = client.getWidget(WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER); - - if ((inventoryWidget == null || inventoryWidget.isSelfHidden()) && - (inventoryWidget == null || bankInventoryWidget == null || bankInventoryWidget.isSelfHidden())) - { - return mouseEvent; - } - - final Point mouse = client.getMouseCanvasPosition(); - - for (WidgetItem item : inventoryWidget.getWidgetItems()) - { - if (item.getCanvasBounds().contains(mouse.getX(), mouse.getY())) - { - plugin.setDraggingItem(item.getId()); - break; - } - } - - return mouseEvent; - } - - @Override - public MouseEvent mouseReleased(MouseEvent mouseEvent) - { - plugin.setDragging(false); - plugin.setDraggingItem(-1); - - return mouseEvent; - } - - @Override - public MouseEvent mouseEntered(MouseEvent mouseEvent) - { - return mouseEvent; - } - - @Override - public MouseEvent mouseExited(MouseEvent mouseEvent) - { - return mouseEvent; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightOverlay.java deleted file mode 100644 index 83e4393b7e..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightOverlay.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2018, Jeremy Plsek - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.inventoryhighlight; - -import com.google.inject.Inject; -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.image.BufferedImage; -import api.Client; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; - -public class InventoryHighlightOverlay extends Overlay -{ - private final InventoryHighlightPlugin plugin; - private final InventoryHighlightConfig config; - private final Client client; - private final ItemManager itemManager; - - // the inventory widget location is slightly off - private static final int FIXED_MARGIN_X = -10; - private static final int FIXED_MARGIN_Y = -25; - private static final int RESIZEABLE_MARGIN_X = -6; - private static final int RESIZEABLE_MARGIN_Y = -21; - - private static final int ITEM_WIDTH = 32; - private static final int ITEM_HEIGHT = 32; - private static final int ITEM_MARGIN_X = 10; - private static final int ITEM_MARGIN_Y = 4; - - private static final Color HIGHLIGHT = new Color(0, 255, 0, 45); - private static final Color GRID = new Color(255, 255, 255, 45); - - @Inject - public InventoryHighlightOverlay(InventoryHighlightPlugin plugin, InventoryHighlightConfig config, Client client, ItemManager itemManager) - { - this.plugin = plugin; - this.itemManager = itemManager; - this.client = client; - this.config = config; - - setLayer(OverlayLayer.ABOVE_WIDGETS); - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (plugin.getDraggingItem() == -1 || !plugin.isDragging()) - { - return null; - } - - int marginX, marginY; - if (client.isResized()) - { - marginX = RESIZEABLE_MARGIN_X; - marginY = RESIZEABLE_MARGIN_Y; - } - else - { - marginX = FIXED_MARGIN_X; - marginY = FIXED_MARGIN_Y; - } - - final api.Point mouse = client.getMouseCanvasPosition(); - final Point updatedMouse = new Point(mouse.getX() + marginX, mouse.getY() + marginY); - - // null checks for inventory are checked during dragging events - final Widget inventoryWidget = client.getWidget(WidgetInfo.INVENTORY); - - final int inventoryX = inventoryWidget.getCanvasLocation().getX() + marginX; - final int inventoryY = inventoryWidget.getCanvasLocation().getY() + marginY; - - final BufferedImage draggedItemImage = itemManager.getImage(plugin.getDraggingItem()); - - for (int i = 0; i < 4; i++) - { - for (int j = 0; j < 7; j++) - { - final int x = (ITEM_WIDTH + ITEM_MARGIN_X) * i + inventoryX; - final int y = (ITEM_HEIGHT + ITEM_MARGIN_Y) * j + inventoryY; - final Rectangle bounds = new Rectangle(x, y, ITEM_WIDTH, ITEM_HEIGHT); - - if (config.showItem() && bounds.contains(updatedMouse)) - { - graphics.setComposite(AlphaComposite.SrcOver.derive(0.3f)); - graphics.drawImage(draggedItemImage, x, y, null); - graphics.setComposite(AlphaComposite.SrcOver); - } - - if (config.showHighlight() && bounds.contains(updatedMouse)) - { - graphics.setColor(HIGHLIGHT); - graphics.fill(bounds); - } - - if (config.showGrid()) - { - // don't set color on highlighted slot - if (!config.showHighlight() || !(config.showHighlight() && bounds.contains(updatedMouse))) - { - graphics.setColor(GRID); - graphics.fill(bounds); - } - } - } - } - - return null; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightPlugin.java deleted file mode 100644 index e1735fe1a0..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryhighlight/InventoryHighlightPlugin.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2018, Jeremy Plsek - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.inventoryhighlight; - -import com.google.inject.Inject; -import com.google.inject.Provides; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import api.events.FocusChanged; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.input.MouseManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.overlay.OverlayManager; - -@PluginDescriptor( - name = "Inventory Highlight", - description = "Shows a preview of where items will be dragged", - tags = {"items", "overlay"}, - enabledByDefault = false, - type = PluginType.UTILITY -) -public class InventoryHighlightPlugin extends Plugin -{ - @Inject - private InventoryHighlightOverlay overlay; - - @Inject - private InventoryHighlightInputListener inputListener; - - @Inject - private MouseManager mouseManager; - - @Inject - private OverlayManager overlayManager; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private int draggingItem = -1; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private boolean dragging = false; - - @Override - public void startUp() - { - overlayManager.add(overlay); - mouseManager.registerMouseListener(inputListener); - } - - @Override - public void shutDown() - { - mouseManager.unregisterMouseListener(inputListener); - overlayManager.remove(overlay); - } - - @Provides - InventoryHighlightConfig getConfig(ConfigManager configManager) - { - return configManager.getConfig(InventoryHighlightConfig.class); - } - - @Subscribe - public void onFocusChanged(FocusChanged focusChanged) - { - if (!focusChanged.isFocused()) - { - dragging = false; - draggingItem = -1; - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java deleted file mode 100644 index b471a69dd8..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java +++ /dev/null @@ -1,628 +0,0 @@ -/* - * Copyright (c) 2016-2018, Adam - * Copyright (c) 2018, Jordan Atwood - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemstats; - -import com.google.inject.Singleton; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import lombok.extern.slf4j.Slf4j; -import static api.ItemID.ADMIRAL_PIE; -import static api.ItemID.AGILITY_POTION1; -import static api.ItemID.AGILITY_POTION2; -import static api.ItemID.AGILITY_POTION3; -import static api.ItemID.AGILITY_POTION4; -import static api.ItemID.ANCHOVIES; -import static api.ItemID.ANCHOVY_PIZZA; -import static api.ItemID.ANGLERFISH; -import static api.ItemID.APPLE_PIE; -import static api.ItemID.ATTACK_POTION1; -import static api.ItemID.ATTACK_POTION2; -import static api.ItemID.ATTACK_POTION3; -import static api.ItemID.ATTACK_POTION4; -import static api.ItemID.AUTUMN_SQIRKJUICE; -import static api.ItemID.BAGUETTE; -import static api.ItemID.BAKED_POTATO; -import static api.ItemID.BANANA; -import static api.ItemID.BANDAGES; -import static api.ItemID.BASS; -import static api.ItemID.BASTION_POTION1; -import static api.ItemID.BASTION_POTION2; -import static api.ItemID.BASTION_POTION3; -import static api.ItemID.BASTION_POTION4; -import static api.ItemID.BATTLEMAGE_POTION1; -import static api.ItemID.BATTLEMAGE_POTION2; -import static api.ItemID.BATTLEMAGE_POTION3; -import static api.ItemID.BATTLEMAGE_POTION4; -import static api.ItemID.BAT_SHISH; -import static api.ItemID.BOTANICAL_PIE; -import static api.ItemID.BOTTLE_OF_WINE; -import static api.ItemID.BRAWK_FISH_3; -import static api.ItemID.BREAD; -import static api.ItemID.CABBAGE; -import static api.ItemID.CABBAGE_1967; -import static api.ItemID.CAKE; -import static api.ItemID.CAVE_EEL; -import static api.ItemID.CAVIAR; -import static api.ItemID.CHEESE; -import static api.ItemID.CHEESETOM_BATTA; -import static api.ItemID.CHILLI_CON_CARNE; -import static api.ItemID.CHILLI_POTATO; -import static api.ItemID.CHOCCHIP_CRUNCHIES; -import static api.ItemID.CHOCICE; -import static api.ItemID.CHOCOLATEY_MILK; -import static api.ItemID.CHOCOLATE_BAR; -import static api.ItemID.CHOCOLATE_BOMB; -import static api.ItemID.CHOCOLATE_CAKE; -import static api.ItemID.CHOCOLATE_SLICE; -import static api.ItemID.CHOC_SATURDAY; -import static api.ItemID.CHOPPED_ONION; -import static api.ItemID.CHOPPED_TOMATO; -import static api.ItemID.CHOPPED_TUNA; -import static api.ItemID.COATED_FROGS_LEGS; -import static api.ItemID.COD; -import static api.ItemID.COMBAT_POTION1; -import static api.ItemID.COMBAT_POTION2; -import static api.ItemID.COMBAT_POTION3; -import static api.ItemID.COMBAT_POTION4; -import static api.ItemID.COOKED_CHICKEN; -import static api.ItemID.COOKED_CHOMPY; -import static api.ItemID.COOKED_CRAB_MEAT; -import static api.ItemID.COOKED_FISHCAKE; -import static api.ItemID.COOKED_JUBBLY; -import static api.ItemID.COOKED_KARAMBWAN; -import static api.ItemID.COOKED_MEAT; -import static api.ItemID.COOKED_RABBIT; -import static api.ItemID.COOKED_SLIMY_EEL; -import static api.ItemID.COOKED_SWEETCORN; -import static api.ItemID.CURRY; -import static api.ItemID.DARK_CRAB; -import static api.ItemID.DEFENCE_POTION1; -import static api.ItemID.DEFENCE_POTION2; -import static api.ItemID.DEFENCE_POTION3; -import static api.ItemID.DEFENCE_POTION4; -import static api.ItemID.DRUNK_DRAGON; -import static api.ItemID.DWELLBERRIES; -import static api.ItemID.EASTER_EGG; -import static api.ItemID.EDIBLE_SEAWEED; -import static api.ItemID.EEL_SUSHI; -import static api.ItemID.EGG_AND_TOMATO; -import static api.ItemID.EGG_POTATO; -import static api.ItemID.ELDER_1; -import static api.ItemID.ELDER_1_20921; -import static api.ItemID.ELDER_2; -import static api.ItemID.ELDER_2_20922; -import static api.ItemID.ELDER_3; -import static api.ItemID.ELDER_3_20923; -import static api.ItemID.ELDER_4; -import static api.ItemID.ELDER_4_20924; -import static api.ItemID.ELDER_POTION_1; -import static api.ItemID.ELDER_POTION_2; -import static api.ItemID.ELDER_POTION_3; -import static api.ItemID.ELDER_POTION_4; -import static api.ItemID.ENERGY_POTION1; -import static api.ItemID.ENERGY_POTION2; -import static api.ItemID.ENERGY_POTION3; -import static api.ItemID.ENERGY_POTION4; -import static api.ItemID.FAT_SNAIL_MEAT; -import static api.ItemID.FIELD_RATION; -import static api.ItemID.FILLETS; -import static api.ItemID.FINGERS; -import static api.ItemID.FISHING_POTION1; -import static api.ItemID.FISHING_POTION2; -import static api.ItemID.FISHING_POTION3; -import static api.ItemID.FISHING_POTION4; -import static api.ItemID.FISH_PIE; -import static api.ItemID.FRIED_MUSHROOMS; -import static api.ItemID.FRIED_ONIONS; -import static api.ItemID.FROGBURGER; -import static api.ItemID.FROGSPAWN_GUMBO; -import static api.ItemID.FROG_SPAWN; -import static api.ItemID.FRUIT_BATTA; -import static api.ItemID.FRUIT_BLAST; -import static api.ItemID.GARDEN_PIE; -import static api.ItemID.GIANT_CARP; -import static api.ItemID.GIRAL_BAT_2; -import static api.ItemID.GOUT_TUBER; -import static api.ItemID.GREEN_GLOOP_SOUP; -import static api.ItemID.GRUBS__LA_MODE; -import static api.ItemID.GUANIC_BAT_0; -import static api.ItemID.GUTHIX_REST1; -import static api.ItemID.GUTHIX_REST2; -import static api.ItemID.GUTHIX_REST3; -import static api.ItemID.GUTHIX_REST4; -import static api.ItemID.HALF_AN_ADMIRAL_PIE; -import static api.ItemID.HALF_AN_APPLE_PIE; -import static api.ItemID.HALF_A_BOTANICAL_PIE; -import static api.ItemID.HALF_A_FISH_PIE; -import static api.ItemID.HALF_A_GARDEN_PIE; -import static api.ItemID.HALF_A_MEAT_PIE; -import static api.ItemID.HALF_A_MUSHROOM_PIE; -import static api.ItemID.HALF_A_REDBERRY_PIE; -import static api.ItemID.HALF_A_SUMMER_PIE; -import static api.ItemID.HALF_A_WILD_PIE; -import static api.ItemID.HERRING; -import static api.ItemID.HUNTER_POTION1; -import static api.ItemID.HUNTER_POTION2; -import static api.ItemID.HUNTER_POTION3; -import static api.ItemID.HUNTER_POTION4; -import static api.ItemID.IMBUED_HEART; -import static api.ItemID.JANGERBERRIES; -import static api.ItemID.JUG_OF_WINE; -import static api.ItemID.KODAI_1; -import static api.ItemID.KODAI_1_20945; -import static api.ItemID.KODAI_2; -import static api.ItemID.KODAI_2_20946; -import static api.ItemID.KODAI_3; -import static api.ItemID.KODAI_3_20947; -import static api.ItemID.KODAI_4; -import static api.ItemID.KODAI_4_20948; -import static api.ItemID.KODAI_POTION_1; -import static api.ItemID.KODAI_POTION_2; -import static api.ItemID.KODAI_POTION_3; -import static api.ItemID.KODAI_POTION_4; -import static api.ItemID.KRYKET_BAT_4; -import static api.ItemID.KYREN_FISH_6; -import static api.ItemID.LAVA_EEL; -import static api.ItemID.LECKISH_FISH_2; -import static api.ItemID.LEMON; -import static api.ItemID.LEMON_CHUNKS; -import static api.ItemID.LEMON_SLICES; -import static api.ItemID.LIME; -import static api.ItemID.LIME_CHUNKS; -import static api.ItemID.LIME_SLICES; -import static api.ItemID.LOACH; -import static api.ItemID.LOBSTER; -import static api.ItemID.MACKEREL; -import static api.ItemID.MAGIC_ESSENCE1; -import static api.ItemID.MAGIC_ESSENCE2; -import static api.ItemID.MAGIC_ESSENCE3; -import static api.ItemID.MAGIC_ESSENCE4; -import static api.ItemID.MAGIC_POTION1; -import static api.ItemID.MAGIC_POTION2; -import static api.ItemID.MAGIC_POTION3; -import static api.ItemID.MAGIC_POTION4; -import static api.ItemID.MANTA_RAY; -import static api.ItemID.MEAT_PIE; -import static api.ItemID.MEAT_PIZZA; -import static api.ItemID.MINT_CAKE; -import static api.ItemID.MONKFISH; -import static api.ItemID.MOONLIGHT_MEAD; -import static api.ItemID.MURNG_BAT_5; -import static api.ItemID.MUSHROOMS; -import static api.ItemID.MUSHROOM_PIE; -import static api.ItemID.MUSHROOM_POTATO; -import static api.ItemID.MUSHROOM__ONION; -import static api.ItemID.MYCIL_FISH_4; -import static api.ItemID.ONION; -import static api.ItemID.ORANGE; -import static api.ItemID.ORANGE_CHUNKS; -import static api.ItemID.ORANGE_SLICES; -import static api.ItemID.OVERLOAD_1; -import static api.ItemID.OVERLOAD_1_20985; -import static api.ItemID.OVERLOAD_1_20989; -import static api.ItemID.OVERLOAD_1_20993; -import static api.ItemID.OVERLOAD_2; -import static api.ItemID.OVERLOAD_2_20986; -import static api.ItemID.OVERLOAD_2_20990; -import static api.ItemID.OVERLOAD_2_20994; -import static api.ItemID.OVERLOAD_3; -import static api.ItemID.OVERLOAD_3_20987; -import static api.ItemID.OVERLOAD_3_20991; -import static api.ItemID.OVERLOAD_3_20995; -import static api.ItemID.OVERLOAD_4; -import static api.ItemID.OVERLOAD_4_20988; -import static api.ItemID.OVERLOAD_4_20992; -import static api.ItemID.OVERLOAD_4_20996; -import static api.ItemID.PAPAYA_FRUIT; -import static api.ItemID.PEACH; -import static api.ItemID.PHLUXIA_BAT_3; -import static api.ItemID.PIKE; -import static api.ItemID.PINEAPPLE_CHUNKS; -import static api.ItemID.PINEAPPLE_PIZZA; -import static api.ItemID.PINEAPPLE_PUNCH; -import static api.ItemID.PINEAPPLE_RING; -import static api.ItemID.PLAIN_PIZZA; -import static api.ItemID.POISON_KARAMBWAN; -import static api.ItemID.POTATO; -import static api.ItemID.POTATO_WITH_BUTTER; -import static api.ItemID.POTATO_WITH_CHEESE; -import static api.ItemID.POT_OF_CREAM; -import static api.ItemID.PRAEL_BAT_1; -import static api.ItemID.PRAYER_POTION1; -import static api.ItemID.PRAYER_POTION2; -import static api.ItemID.PRAYER_POTION3; -import static api.ItemID.PRAYER_POTION4; -import static api.ItemID.PREMADE_CHOC_BOMB; -import static api.ItemID.PREMADE_CHOC_SDY; -import static api.ItemID.PREMADE_CH_CRUNCH; -import static api.ItemID.PREMADE_CT_BATTA; -import static api.ItemID.PREMADE_DR_DRAGON; -import static api.ItemID.PREMADE_FRT_BATTA; -import static api.ItemID.PREMADE_FR_BLAST; -import static api.ItemID.PREMADE_P_PUNCH; -import static api.ItemID.PREMADE_SGG; -import static api.ItemID.PREMADE_SY_CRUNCH; -import static api.ItemID.PREMADE_TD_BATTA; -import static api.ItemID.PREMADE_TD_CRUNCH; -import static api.ItemID.PREMADE_TTL; -import static api.ItemID.PREMADE_VEG_BALL; -import static api.ItemID.PREMADE_VEG_BATTA; -import static api.ItemID.PREMADE_WIZ_BLZD; -import static api.ItemID.PREMADE_WM_BATTA; -import static api.ItemID.PREMADE_WM_CRUN; -import static api.ItemID.PREMADE_WORM_HOLE; -import static api.ItemID.PSYKK_BAT_6; -import static api.ItemID.PUMPKIN; -import static api.ItemID.PURPLE_SWEETS_10476; -import static api.ItemID.PYSK_FISH_0; -import static api.ItemID.RAINBOW_FISH; -import static api.ItemID.RANGING_POTION1; -import static api.ItemID.RANGING_POTION2; -import static api.ItemID.RANGING_POTION3; -import static api.ItemID.RANGING_POTION4; -import static api.ItemID.REDBERRY_PIE; -import static api.ItemID.RESTORE_POTION1; -import static api.ItemID.RESTORE_POTION2; -import static api.ItemID.RESTORE_POTION3; -import static api.ItemID.RESTORE_POTION4; -import static api.ItemID.REVITALISATION_1_20957; -import static api.ItemID.REVITALISATION_2_20958; -import static api.ItemID.REVITALISATION_3_20959; -import static api.ItemID.REVITALISATION_4_20960; -import static api.ItemID.ROAST_BEAST_MEAT; -import static api.ItemID.ROAST_BIRD_MEAT; -import static api.ItemID.ROAST_FROG; -import static api.ItemID.ROAST_RABBIT; -import static api.ItemID.ROE; -import static api.ItemID.ROLL; -import static api.ItemID.ROQED_FISH_5; -import static api.ItemID.SALMON; -import static api.ItemID.SANFEW_SERUM1; -import static api.ItemID.SANFEW_SERUM2; -import static api.ItemID.SANFEW_SERUM3; -import static api.ItemID.SANFEW_SERUM4; -import static api.ItemID.SARADOMIN_BREW1; -import static api.ItemID.SARADOMIN_BREW2; -import static api.ItemID.SARADOMIN_BREW3; -import static api.ItemID.SARADOMIN_BREW4; -import static api.ItemID.SARDINE; -import static api.ItemID.SEA_TURTLE; -import static api.ItemID.SHARK; -import static api.ItemID.SHORT_GREEN_GUY; -import static api.ItemID.SHRIMPS; -import static api.ItemID.SLICED_BANANA; -import static api.ItemID.SLICE_OF_CAKE; -import static api.ItemID.SPICY_CRUNCHIES; -import static api.ItemID.SPICY_SAUCE; -import static api.ItemID.SPICY_STEW; -import static api.ItemID.SPINACH_ROLL; -import static api.ItemID.SPRING_SQIRKJUICE; -import static api.ItemID.SQUARE_SANDWICH; -import static api.ItemID.STAMINA_POTION1; -import static api.ItemID.STAMINA_POTION2; -import static api.ItemID.STAMINA_POTION3; -import static api.ItemID.STAMINA_POTION4; -import static api.ItemID.STEW; -import static api.ItemID.STRANGE_FRUIT; -import static api.ItemID.STRAWBERRY; -import static api.ItemID.STRENGTH_POTION1; -import static api.ItemID.STRENGTH_POTION2; -import static api.ItemID.STRENGTH_POTION3; -import static api.ItemID.STRENGTH_POTION4; -import static api.ItemID.STUFFED_SNAKE; -import static api.ItemID.SUMMER_PIE; -import static api.ItemID.SUMMER_SQIRKJUICE; -import static api.ItemID.SUPER_ATTACK1; -import static api.ItemID.SUPER_ATTACK2; -import static api.ItemID.SUPER_ATTACK3; -import static api.ItemID.SUPER_ATTACK4; -import static api.ItemID.SUPER_COMBAT_POTION1; -import static api.ItemID.SUPER_COMBAT_POTION2; -import static api.ItemID.SUPER_COMBAT_POTION3; -import static api.ItemID.SUPER_COMBAT_POTION4; -import static api.ItemID.SUPER_DEFENCE1; -import static api.ItemID.SUPER_DEFENCE2; -import static api.ItemID.SUPER_DEFENCE3; -import static api.ItemID.SUPER_DEFENCE4; -import static api.ItemID.SUPER_ENERGY1; -import static api.ItemID.SUPER_ENERGY2; -import static api.ItemID.SUPER_ENERGY3; -import static api.ItemID.SUPER_ENERGY4; -import static api.ItemID.SUPER_MAGIC_POTION_1; -import static api.ItemID.SUPER_MAGIC_POTION_2; -import static api.ItemID.SUPER_MAGIC_POTION_3; -import static api.ItemID.SUPER_MAGIC_POTION_4; -import static api.ItemID.SUPER_RANGING_1; -import static api.ItemID.SUPER_RANGING_2; -import static api.ItemID.SUPER_RANGING_3; -import static api.ItemID.SUPER_RANGING_4; -import static api.ItemID.SUPER_RESTORE1; -import static api.ItemID.SUPER_RESTORE2; -import static api.ItemID.SUPER_RESTORE3; -import static api.ItemID.SUPER_RESTORE4; -import static api.ItemID.SUPER_STRENGTH1; -import static api.ItemID.SUPER_STRENGTH2; -import static api.ItemID.SUPER_STRENGTH3; -import static api.ItemID.SUPER_STRENGTH4; -import static api.ItemID.SUPHI_FISH_1; -import static api.ItemID.SWEETCORN_7088; -import static api.ItemID.SWORDFISH; -import static api.ItemID.TANGLED_TOADS_LEGS; -import static api.ItemID.THIN_SNAIL_MEAT; -import static api.ItemID.TOAD_BATTA; -import static api.ItemID.TOAD_CRUNCHIES; -import static api.ItemID.TOMATO; -import static api.ItemID.TRIANGLE_SANDWICH; -import static api.ItemID.TROUT; -import static api.ItemID.TUNA; -import static api.ItemID.TUNA_AND_CORN; -import static api.ItemID.TUNA_POTATO; -import static api.ItemID.TWISTED_1; -import static api.ItemID.TWISTED_1_20933; -import static api.ItemID.TWISTED_2; -import static api.ItemID.TWISTED_2_20934; -import static api.ItemID.TWISTED_3; -import static api.ItemID.TWISTED_3_20935; -import static api.ItemID.TWISTED_4; -import static api.ItemID.TWISTED_4_20936; -import static api.ItemID.TWISTED_POTION_1; -import static api.ItemID.TWISTED_POTION_2; -import static api.ItemID.TWISTED_POTION_3; -import static api.ItemID.TWISTED_POTION_4; -import static api.ItemID.UGTHANKI_KEBAB; -import static api.ItemID.UGTHANKI_KEBAB_1885; -import static api.ItemID.VEGETABLE_BATTA; -import static api.ItemID.VEG_BALL; -import static api.ItemID.WATERMELON_SLICE; -import static api.ItemID.WHITE_TREE_FRUIT; -import static api.ItemID.WILD_PIE; -import static api.ItemID.WINTER_SQIRKJUICE; -import static api.ItemID.WIZARD_BLIZZARD; -import static api.ItemID.WORM_BATTA; -import static api.ItemID.WORM_CRUNCHIES; -import static api.ItemID.WORM_HOLE; -import static api.ItemID.XERICS_AID_1_20981; -import static api.ItemID.XERICS_AID_2_20982; -import static api.ItemID.XERICS_AID_3_20983; -import static api.ItemID.XERICS_AID_4_20984; -import static api.ItemID.ZAMORAK_BREW1; -import static api.ItemID.ZAMORAK_BREW2; -import static api.ItemID.ZAMORAK_BREW3; -import static api.ItemID.ZAMORAK_BREW4; -import static api.ItemID._12_ANCHOVY_PIZZA; -import static api.ItemID._12_MEAT_PIZZA; -import static api.ItemID._12_PINEAPPLE_PIZZA; -import static api.ItemID._12_PLAIN_PIZZA; -import static api.ItemID._23_CAKE; -import static api.ItemID._23_CHOCOLATE_CAKE; -import static net.runelite.client.plugins.itemstats.Builders.boost; -import static net.runelite.client.plugins.itemstats.Builders.combo; -import static net.runelite.client.plugins.itemstats.Builders.dec; -import static net.runelite.client.plugins.itemstats.Builders.food; -import static net.runelite.client.plugins.itemstats.Builders.heal; -import static net.runelite.client.plugins.itemstats.Builders.perc; -import static net.runelite.client.plugins.itemstats.Builders.range; -import net.runelite.client.plugins.itemstats.food.Anglerfish; -import net.runelite.client.plugins.itemstats.potions.PrayerPotion; -import net.runelite.client.plugins.itemstats.potions.SaradominBrew; -import net.runelite.client.plugins.itemstats.potions.SuperRestore; -import net.runelite.client.plugins.itemstats.special.CastleWarsBandage; -import net.runelite.client.plugins.itemstats.special.SpicyStew; -import static net.runelite.client.plugins.itemstats.stats.Stats.AGILITY; -import static net.runelite.client.plugins.itemstats.stats.Stats.ATTACK; -import static net.runelite.client.plugins.itemstats.stats.Stats.CRAFTING; -import static net.runelite.client.plugins.itemstats.stats.Stats.DEFENCE; -import static net.runelite.client.plugins.itemstats.stats.Stats.FARMING; -import static net.runelite.client.plugins.itemstats.stats.Stats.FISHING; -import static net.runelite.client.plugins.itemstats.stats.Stats.HERBLORE; -import static net.runelite.client.plugins.itemstats.stats.Stats.HITPOINTS; -import static net.runelite.client.plugins.itemstats.stats.Stats.HUNTER; -import static net.runelite.client.plugins.itemstats.stats.Stats.MAGIC; -import static net.runelite.client.plugins.itemstats.stats.Stats.PRAYER; -import static net.runelite.client.plugins.itemstats.stats.Stats.RANGED; -import static net.runelite.client.plugins.itemstats.stats.Stats.RUN_ENERGY; -import static net.runelite.client.plugins.itemstats.stats.Stats.SLAYER; -import static net.runelite.client.plugins.itemstats.stats.Stats.STRENGTH; -import static net.runelite.client.plugins.itemstats.stats.Stats.THIEVING; - -@Singleton -@Slf4j -public class ItemStatChanges -{ - ItemStatChanges() - { - init(); - } - - private void init() - { - add(food(-5), POISON_KARAMBWAN); - add(food(1), POTATO, ONION, CABBAGE, POT_OF_CREAM, CHOPPED_ONION, ANCHOVIES); - add(food(2), TOMATO, CHOPPED_TOMATO, BANANA, SLICED_BANANA, ORANGE, ORANGE_SLICES, ORANGE_CHUNKS, - PINEAPPLE_RING, PINEAPPLE_CHUNKS, SPICY_SAUCE, CHEESE, SPINACH_ROLL, LEMON, LEMON_CHUNKS, LEMON_SLICES, - LIME, LIME_CHUNKS, LIME_SLICES, DWELLBERRIES); - add(food(3), SHRIMPS, COOKED_MEAT, COOKED_CHICKEN, ROE, CHOCOLATE_BAR); - add(food(4), SARDINE, CAKE, _23_CAKE, SLICE_OF_CAKE, CHOCOLATEY_MILK, BAKED_POTATO, EDIBLE_SEAWEED, MOONLIGHT_MEAD); - add(food(5), BREAD, HERRING, CHOCOLATE_CAKE, _23_CHOCOLATE_CAKE, CHOCOLATE_SLICE, COOKED_RABBIT, CHILLI_CON_CARNE, - FRIED_MUSHROOMS, FRIED_ONIONS, REDBERRY_PIE, HALF_A_REDBERRY_PIE, CAVIAR, PYSK_FISH_0); - add(food(6), CHOCICE, MACKEREL, MEAT_PIE, HALF_A_MEAT_PIE, GUANIC_BAT_0, ROAST_BIRD_MEAT, - SQUARE_SANDWICH, ROLL, BAGUETTE, TRIANGLE_SANDWICH, GIANT_CARP); - add(food(7), TROUT, COD, PLAIN_PIZZA, _12_PLAIN_PIZZA, APPLE_PIE, HALF_AN_APPLE_PIE, ROAST_RABBIT, - PREMADE_CH_CRUNCH, CHOCCHIP_CRUNCHIES, PREMADE_SY_CRUNCH, SPICY_CRUNCHIES); - add(food(8), PIKE, ROAST_BEAST_MEAT, MEAT_PIZZA, _12_MEAT_PIZZA, PREMADE_WM_CRUN, WORM_CRUNCHIES, PREMADE_TD_CRUNCH, - TOAD_CRUNCHIES, EGG_AND_TOMATO, PRAEL_BAT_1, PEACH, SUPHI_FISH_1); - add(food(9), PREMADE_P_PUNCH, PINEAPPLE_PUNCH, PREMADE_FR_BLAST, FRUIT_BLAST, SALMON, ANCHOVY_PIZZA, - _12_ANCHOVY_PIZZA); - add(food(10), TUNA, COOKED_CRAB_MEAT, CHOPPED_TUNA, COOKED_CHOMPY, FIELD_RATION); - add(food(11), RAINBOW_FISH, STEW, PINEAPPLE_PIZZA, _12_PINEAPPLE_PIZZA, COOKED_FISHCAKE, - PREMADE_VEG_BATTA, VEGETABLE_BATTA, PREMADE_WM_BATTA, WORM_BATTA, PREMADE_TD_BATTA, TOAD_BATTA, PREMADE_CT_BATTA, - CHEESETOM_BATTA, PREMADE_FRT_BATTA, FRUIT_BATTA, MUSHROOM__ONION, GIRAL_BAT_2, LAVA_EEL, LECKISH_FISH_2); - add(food(12), LOBSTER, PREMADE_WORM_HOLE, WORM_HOLE, PREMADE_VEG_BALL, VEG_BALL); - add(food(13), BASS, TUNA_AND_CORN); - add(food(14), POTATO_WITH_BUTTER, CHILLI_POTATO, SWORDFISH, PHLUXIA_BAT_3, PUMPKIN, EASTER_EGG, BRAWK_FISH_3); - add(food(15), PREMADE_TTL, TANGLED_TOADS_LEGS, PREMADE_CHOC_BOMB, CHOCOLATE_BOMB, COOKED_JUBBLY); - add(food(16), MONKFISH, POTATO_WITH_CHEESE, EGG_POTATO); - add(food(17), MYCIL_FISH_4, KRYKET_BAT_4); - add(food(18), COOKED_KARAMBWAN); - add(food(19), CURRY, UGTHANKI_KEBAB, UGTHANKI_KEBAB_1885); - add(food(20), MUSHROOM_POTATO, SHARK, ROQED_FISH_5, MURNG_BAT_5, STUFFED_SNAKE); - add(food(21), SEA_TURTLE); - add(food(22), MANTA_RAY, DARK_CRAB, TUNA_POTATO); - add(food(23), KYREN_FISH_6, PSYKK_BAT_6); - add(new Anglerfish(), ANGLERFISH); - add(food(maxHP -> (int) Math.ceil(maxHP * .06)), STRAWBERRY); - add(food(maxHP -> (int) Math.ceil(maxHP * .05)), WATERMELON_SLICE); - add(food(perc(.1, 1)), COOKED_SWEETCORN, SWEETCORN_7088 /* Bowl of cooked sweetcorn */); - add(combo(food(1), boost(DEFENCE, perc(.02, 1))), CABBAGE_1967 /* Draynor Manor */); - add(combo(2, food(8), heal(RUN_ENERGY, 5)), PAPAYA_FRUIT); - add(range(food(5), food(7)), THIN_SNAIL_MEAT); - add(range(food(7), food(9)), FAT_SNAIL_MEAT); - - // Dorgeshuun Cuisine - add(food(2), BAT_SHISH, COATED_FROGS_LEGS, FILLETS, FINGERS, FROGBURGER, FROGSPAWN_GUMBO, GREEN_GLOOP_SOUP, - GRUBS__LA_MODE, MUSHROOMS, ROAST_FROG); - add(food(3), LOACH); - add(range(food(3), food(6)), FROG_SPAWN); - add(range(food(6), food(10)), COOKED_SLIMY_EEL); - add(range(food(8), food(12)), CAVE_EEL); - add(food(10), EEL_SUSHI); - - // Alcoholic Beverages - add(combo(food(11), dec(ATTACK, 2)), JUG_OF_WINE); - add(combo(food(14), dec(ATTACK, 3)), BOTTLE_OF_WINE); - add(combo(2, food(5), boost(STRENGTH, 6), heal(ATTACK, -4)), PREMADE_WIZ_BLZD, WIZARD_BLIZZARD); - add(combo(2, food(5), boost(STRENGTH, 4), heal(ATTACK, -3)), PREMADE_SGG, SHORT_GREEN_GUY); - add(combo(2, food(5), boost(STRENGTH, 7), heal(ATTACK, -4)), PREMADE_DR_DRAGON, DRUNK_DRAGON); - add(combo(2, food(5), boost(STRENGTH, 7), heal(ATTACK, -4)), PREMADE_CHOC_SDY, CHOC_SATURDAY); - - // Sq'irk Juice - add(heal(RUN_ENERGY, 5), WINTER_SQIRKJUICE); - add(combo(heal(RUN_ENERGY, 10), boost(THIEVING, 1)), SPRING_SQIRKJUICE); - add(combo(heal(RUN_ENERGY, 15), boost(THIEVING, 2)), AUTUMN_SQIRKJUICE); - add(combo(heal(RUN_ENERGY, 20), boost(THIEVING, 3)), SUMMER_SQIRKJUICE); - - // Combat potions - add(boost(ATTACK, perc(.10, 3)), ATTACK_POTION1, ATTACK_POTION2, ATTACK_POTION3, ATTACK_POTION4); - add(boost(STRENGTH, perc(.10, 3)), STRENGTH_POTION1, STRENGTH_POTION2, STRENGTH_POTION3, STRENGTH_POTION4); - add(boost(DEFENCE, perc(.10, 3)), DEFENCE_POTION1, DEFENCE_POTION2, DEFENCE_POTION3, DEFENCE_POTION4); - add(boost(MAGIC, 4), MAGIC_POTION1, MAGIC_POTION2, MAGIC_POTION3, MAGIC_POTION4); - add(boost(RANGED, perc(.10, 4)), RANGING_POTION1, RANGING_POTION2, RANGING_POTION3, RANGING_POTION4); - add(combo(2, boost(ATTACK, perc(.10, 3)), boost(STRENGTH, perc(.10, 3))), COMBAT_POTION1, COMBAT_POTION2, COMBAT_POTION3, COMBAT_POTION4); - add(boost(ATTACK, perc(.15, 5)), SUPER_ATTACK1, SUPER_ATTACK2, SUPER_ATTACK3, SUPER_ATTACK4); - add(boost(STRENGTH, perc(.15, 5)), SUPER_STRENGTH1, SUPER_STRENGTH2, SUPER_STRENGTH3, SUPER_STRENGTH4); - add(boost(DEFENCE, perc(.15, 5)), SUPER_DEFENCE1, SUPER_DEFENCE2, SUPER_DEFENCE3, SUPER_DEFENCE4); - add(boost(MAGIC, 3), MAGIC_ESSENCE1, MAGIC_ESSENCE2, MAGIC_ESSENCE3, MAGIC_ESSENCE4); - add(combo(3, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5))), SUPER_COMBAT_POTION1, SUPER_COMBAT_POTION2, SUPER_COMBAT_POTION3, SUPER_COMBAT_POTION4); - add(combo(3, boost(ATTACK, perc(.20, 2)), boost(STRENGTH, perc(.12, 2)), heal(PRAYER, perc(.10, 0)), heal(DEFENCE, perc(.10, -2)), new BoostedStatBoost(HITPOINTS, false, perc(-.12, 0))), ZAMORAK_BREW1, ZAMORAK_BREW2, ZAMORAK_BREW3, ZAMORAK_BREW4); - add(new SaradominBrew(0.15, 0.2, 0.1, 2, 2), SARADOMIN_BREW1, SARADOMIN_BREW2, SARADOMIN_BREW3, SARADOMIN_BREW4); - add(boost(RANGED, perc(.15, 5)), SUPER_RANGING_1, SUPER_RANGING_2, SUPER_RANGING_3, SUPER_RANGING_4); - add(boost(MAGIC, perc(.15, 5)), SUPER_MAGIC_POTION_1, SUPER_MAGIC_POTION_2, SUPER_MAGIC_POTION_3, SUPER_MAGIC_POTION_4); - add(combo(2, boost(RANGED, perc(0.1, 4)), boost(DEFENCE, perc(0.15, 5))), BASTION_POTION1, BASTION_POTION2, BASTION_POTION3, BASTION_POTION4); - add(combo(2, boost(MAGIC, 4), boost(DEFENCE, perc(0.15, 5))), BATTLEMAGE_POTION1, BATTLEMAGE_POTION2, BATTLEMAGE_POTION3, BATTLEMAGE_POTION4); - - // Regular overload (NMZ) - add(combo(5, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5)), boost(RANGED, perc(.15, 5)), boost(MAGIC, perc(.15, 5)), heal(HITPOINTS, -50)), OVERLOAD_1, OVERLOAD_2, OVERLOAD_3, OVERLOAD_4); - - // Bandages (Castle Wars) - add(new CastleWarsBandage(), BANDAGES); - - // Recovery potions - add(combo(5, heal(ATTACK, perc(.30, 10)), heal(STRENGTH, perc(.30, 10)), heal(DEFENCE, perc(.30, 10)), heal(RANGED, perc(.30, 10)), heal(MAGIC, perc(.30, 10))), RESTORE_POTION1, RESTORE_POTION2, RESTORE_POTION3, RESTORE_POTION4); - add(heal(RUN_ENERGY, 10), ENERGY_POTION1, ENERGY_POTION2, ENERGY_POTION3, ENERGY_POTION4); - add(new PrayerPotion(7), PRAYER_POTION1, PRAYER_POTION2, PRAYER_POTION3, PRAYER_POTION4); - add(heal(RUN_ENERGY, 20), SUPER_ENERGY1, SUPER_ENERGY2, SUPER_ENERGY3, SUPER_ENERGY4); - add(new SuperRestore(.25, 8), SUPER_RESTORE1, SUPER_RESTORE2, SUPER_RESTORE3, SUPER_RESTORE4); - add(new SuperRestore(.25, 9), SANFEW_SERUM1, SANFEW_SERUM2, SANFEW_SERUM3, SANFEW_SERUM4); - add(heal(RUN_ENERGY, 20), STAMINA_POTION1, STAMINA_POTION2, STAMINA_POTION3, STAMINA_POTION4); - - // Raids potions (+) - add(combo(5, boost(ATTACK, perc(.16, 6)), boost(STRENGTH, perc(.16, 6)), boost(DEFENCE, perc(.16, 6)), boost(RANGED, perc(.16, 6)), boost(MAGIC, perc(.16, 6)), heal(HITPOINTS, -50)), OVERLOAD_1_20993, OVERLOAD_2_20994, OVERLOAD_3_20995, OVERLOAD_4_20996); - add(combo(3, boost(ATTACK, perc(.16, 6)), boost(STRENGTH, perc(.16, 6)), boost(DEFENCE, perc(.16, 6))), ELDER_1_20921, ELDER_2_20922, ELDER_3_20923, ELDER_4_20924); - add(combo(2, boost(RANGED, perc(.16, 6)), boost(DEFENCE, perc(.16, 6))), TWISTED_1_20933, TWISTED_2_20934, TWISTED_3_20935, TWISTED_4_20936); - add(combo(2, boost(MAGIC, perc(.16, 6)), boost(DEFENCE, perc(.16, 6))), KODAI_1_20945, KODAI_2_20946, KODAI_3_20947, KODAI_4_20948); - add(new SuperRestore(.30, 11), REVITALISATION_1_20957, REVITALISATION_2_20958, REVITALISATION_3_20959, REVITALISATION_4_20960); - add(new SaradominBrew(0.15, 0.2, 0.1, 5, 4), XERICS_AID_1_20981, XERICS_AID_2_20982, XERICS_AID_3_20983, XERICS_AID_4_20984); - - // Raids potions - add(combo(5, boost(ATTACK, perc(.13, 5)), boost(STRENGTH, perc(.13, 5)), boost(DEFENCE, perc(.13, 5)), boost(RANGED, perc(.13, 5)), boost(MAGIC, perc(.13, 5)), heal(HITPOINTS, -50)), OVERLOAD_1_20989, OVERLOAD_2_20990, OVERLOAD_3_20991, OVERLOAD_4_20992); - add(combo(3, boost(ATTACK, perc(.13, 5)), boost(STRENGTH, perc(.13, 5)), boost(DEFENCE, perc(.13, 5))), ELDER_POTION_1, ELDER_POTION_2, ELDER_POTION_3, ELDER_POTION_4); - add(combo(2, boost(RANGED, perc(.13, 5)), boost(DEFENCE, perc(.13, 5))), TWISTED_POTION_1, TWISTED_POTION_2, TWISTED_POTION_3, TWISTED_POTION_4); - add(combo(2, boost(MAGIC, perc(.13, 5)), boost(DEFENCE, perc(.13, 5))), KODAI_POTION_1, KODAI_POTION_2, KODAI_POTION_3, KODAI_POTION_4); - - // Raids potions (-) - add(combo(5, boost(ATTACK, perc(.10, 4)), boost(STRENGTH, perc(.10, 4)), boost(DEFENCE, perc(.10, 4)), boost(RANGED, perc(.10, 4)), boost(MAGIC, perc(.10, 4)), heal(HITPOINTS, -50)), OVERLOAD_1_20985, OVERLOAD_2_20986, OVERLOAD_3_20987, OVERLOAD_4_20988); - add(combo(3, boost(ATTACK, perc(.10, 4)), boost(STRENGTH, perc(.10, 4)), boost(DEFENCE, perc(.10, 4))), ELDER_1, ELDER_2, ELDER_3, ELDER_4); - add(combo(3, boost(RANGED, perc(.10, 4)), boost(DEFENCE, perc(.10, 4))), TWISTED_1, TWISTED_2, TWISTED_3, TWISTED_4); - add(combo(3, boost(MAGIC, perc(.10, 4)), boost(DEFENCE, perc(.10, 4))), KODAI_1, KODAI_2, KODAI_3, KODAI_4); - - // Skill potions - add(boost(AGILITY, 3), AGILITY_POTION1, AGILITY_POTION2, AGILITY_POTION3, AGILITY_POTION4); - add(boost(FISHING, 3), FISHING_POTION1, FISHING_POTION2, FISHING_POTION3, FISHING_POTION4); - add(boost(HUNTER, 3), HUNTER_POTION1, HUNTER_POTION2, HUNTER_POTION3, HUNTER_POTION4); - add(combo(2, boost(HITPOINTS, 5), heal(RUN_ENERGY, 5)), GUTHIX_REST1, GUTHIX_REST2, GUTHIX_REST3, GUTHIX_REST4); - - // Misc/run energy - add(heal(RUN_ENERGY, 10), WHITE_TREE_FRUIT); - add(heal(RUN_ENERGY, 30), STRANGE_FRUIT); - add(heal(RUN_ENERGY, 50), MINT_CAKE); - add(combo(food(12), heal(RUN_ENERGY, 50)), GOUT_TUBER); - - // Pies - add(combo(2, heal(HITPOINTS, 6), boost(FARMING, 3)), GARDEN_PIE, HALF_A_GARDEN_PIE); - add(combo(2, heal(HITPOINTS, 6), boost(FISHING, 3)), FISH_PIE, HALF_A_FISH_PIE); - add(combo(2, heal(HITPOINTS, 7), boost(HERBLORE, 4)), BOTANICAL_PIE, HALF_A_BOTANICAL_PIE); - add(combo(2, heal(HITPOINTS, 8), boost(CRAFTING, 4)), MUSHROOM_PIE, HALF_A_MUSHROOM_PIE); - add(combo(2, heal(HITPOINTS, 8), boost(FISHING, 5)), ADMIRAL_PIE, HALF_AN_ADMIRAL_PIE); - add(combo(2, heal(HITPOINTS, 11), boost(SLAYER, 5), boost(RANGED, 4)), WILD_PIE, HALF_A_WILD_PIE); - add(combo(2, heal(HITPOINTS, 11), boost(AGILITY, 5), heal(RUN_ENERGY, 10)), SUMMER_PIE, HALF_A_SUMMER_PIE); - - // Other - add(combo(range(food(1), food(3)), heal(RUN_ENERGY, 10)), PURPLE_SWEETS_10476); - add(new SpicyStew(), SPICY_STEW); - add(boost(MAGIC, perc(.10, 1)), IMBUED_HEART); - add(combo(boost(ATTACK, 2), boost(STRENGTH, 1), heal(DEFENCE, -1)), JANGERBERRIES); - - log.debug("{} items; {} behaviours loaded", effects.size(), new HashSet<>(effects.values()).size()); - } - - private final Map effects = new HashMap<>(); - - private void add(Effect effect, int... items) - { - assert items.length > 0; - for (int item : items) - { - Effect prev = effects.put(item, effect); - assert prev == null : "Item already added"; - } - } - - public Effect get(int id) - { - return effects.get(id); - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/ActuallyTradeableItem.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/ActuallyTradeableItem.java deleted file mode 100644 index 17e9354f0e..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/ActuallyTradeableItem.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (c) 2018, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.keptondeath; - -import java.util.HashSet; -import static api.ItemID.ADAMANT_FIRE_ARROWS; -import static api.ItemID.ADAMANT_FIRE_ARROWS_2539; -import static api.ItemID.AIR_RUNE_PACK; -import static api.ItemID.AMETHYST_FIRE_ARROWS; -import static api.ItemID.AMETHYST_FIRE_ARROWS_21330; -import static api.ItemID.AMULET_OF_GLORY1; -import static api.ItemID.AMULET_OF_GLORY2; -import static api.ItemID.AMULET_OF_GLORY3; -import static api.ItemID.AMULET_OF_GLORY5; -import static api.ItemID.AMULET_OF_GLORY_T1; -import static api.ItemID.AMULET_OF_GLORY_T2; -import static api.ItemID.AMULET_OF_GLORY_T3; -import static api.ItemID.AMULET_OF_GLORY_T5; -import static api.ItemID.APPLES1; -import static api.ItemID.APPLES2; -import static api.ItemID.APPLES3; -import static api.ItemID.APPLES4; -import static api.ItemID.BANANAS1; -import static api.ItemID.BANANAS2; -import static api.ItemID.BANANAS3; -import static api.ItemID.BANANAS4; -import static api.ItemID.BASKET_PACK; -import static api.ItemID.BLACK_MASK_1; -import static api.ItemID.BLACK_MASK_2; -import static api.ItemID.BLACK_MASK_3; -import static api.ItemID.BLACK_MASK_4; -import static api.ItemID.BLACK_MASK_5; -import static api.ItemID.BLACK_MASK_6; -import static api.ItemID.BLACK_MASK_7; -import static api.ItemID.BLACK_MASK_8; -import static api.ItemID.BLACK_MASK_9; -import static api.ItemID.BLACK_SATCHEL; -import static api.ItemID.BRONZE_FIRE_ARROWS; -import static api.ItemID.BRONZE_FIRE_ARROWS_942; -import static api.ItemID.BURNING_AMULET1; -import static api.ItemID.BURNING_AMULET2; -import static api.ItemID.BURNING_AMULET3; -import static api.ItemID.BURNING_AMULET4; -import static api.ItemID.CAKE; -import static api.ItemID.CHAOS_RUNE_PACK; -import static api.ItemID.CHOCOLATE_CAKE; -import static api.ItemID.CHOCOLATE_SLICE; -import static api.ItemID.COMBAT_BRACELET1; -import static api.ItemID.COMBAT_BRACELET2; -import static api.ItemID.COMBAT_BRACELET3; -import static api.ItemID.COMBAT_BRACELET5; -import static api.ItemID.DRAGON_FIRE_ARROWS; -import static api.ItemID.DRAGON_FIRE_ARROWS_11222; -import static api.ItemID.EARTH_RUNE_PACK; -import static api.ItemID.FEATHER_PACK; -import static api.ItemID.FIRE_RUNE_PACK; -import static api.ItemID.GAMES_NECKLACE1; -import static api.ItemID.GAMES_NECKLACE2; -import static api.ItemID.GAMES_NECKLACE3; -import static api.ItemID.GAMES_NECKLACE4; -import static api.ItemID.GAMES_NECKLACE5; -import static api.ItemID.GAMES_NECKLACE6; -import static api.ItemID.GAMES_NECKLACE7; -import static api.ItemID.GOLD_SATCHEL; -import static api.ItemID.GREEN_SATCHEL; -import static api.ItemID.HALF_AN_ADMIRAL_PIE; -import static api.ItemID.HALF_AN_APPLE_PIE; -import static api.ItemID.HALF_A_BOTANICAL_PIE; -import static api.ItemID.HALF_A_FISH_PIE; -import static api.ItemID.HALF_A_GARDEN_PIE; -import static api.ItemID.HALF_A_MEAT_PIE; -import static api.ItemID.HALF_A_MUSHROOM_PIE; -import static api.ItemID.HALF_A_REDBERRY_PIE; -import static api.ItemID.HALF_A_SUMMER_PIE; -import static api.ItemID.HALF_A_WILD_PIE; -import static api.ItemID.IRON_FIRE_ARROWS; -import static api.ItemID.IRON_FIRE_ARROWS_2533; -import static api.ItemID.MIND_RUNE_PACK; -import static api.ItemID.MITHRIL_FIRE_ARROWS; -import static api.ItemID.MITHRIL_FIRE_ARROWS_2537; -import static api.ItemID.NECKLACE_OF_PASSAGE1; -import static api.ItemID.NECKLACE_OF_PASSAGE2; -import static api.ItemID.NECKLACE_OF_PASSAGE3; -import static api.ItemID.NECKLACE_OF_PASSAGE4; -import static api.ItemID.ORANGES1; -import static api.ItemID.ORANGES2; -import static api.ItemID.ORANGES3; -import static api.ItemID.ORANGES4; -import static api.ItemID.PLAIN_SATCHEL; -import static api.ItemID.PLANT_POT_PACK; -import static api.ItemID.RED_SATCHEL; -import static api.ItemID.RING_OF_DUELING1; -import static api.ItemID.RING_OF_DUELING2; -import static api.ItemID.RING_OF_DUELING3; -import static api.ItemID.RING_OF_DUELING4; -import static api.ItemID.RING_OF_DUELING5; -import static api.ItemID.RING_OF_DUELING6; -import static api.ItemID.RING_OF_DUELING7; -import static api.ItemID.RING_OF_WEALTH_1; -import static api.ItemID.RING_OF_WEALTH_2; -import static api.ItemID.RING_OF_WEALTH_3; -import static api.ItemID.RING_OF_WEALTH_4; -import static api.ItemID.RING_OF_WEALTH_I; -import static api.ItemID.RING_OF_WEALTH_I1; -import static api.ItemID.RING_OF_WEALTH_I2; -import static api.ItemID.RING_OF_WEALTH_I3; -import static api.ItemID.RING_OF_WEALTH_I4; -import static api.ItemID.RING_OF_WEALTH_I5; -import static api.ItemID.RUNE_FIRE_ARROWS; -import static api.ItemID.RUNE_FIRE_ARROWS_2541; -import static api.ItemID.RUNE_SATCHEL; -import static api.ItemID.SACK_PACK; -import static api.ItemID.SKILLS_NECKLACE1; -import static api.ItemID.SKILLS_NECKLACE2; -import static api.ItemID.SKILLS_NECKLACE3; -import static api.ItemID.SKILLS_NECKLACE5; -import static api.ItemID.SLICE_OF_CAKE; -import static api.ItemID.STEEL_FIRE_ARROWS; -import static api.ItemID.STEEL_FIRE_ARROWS_2535; -import static api.ItemID.STRAWBERRIES1; -import static api.ItemID.STRAWBERRIES2; -import static api.ItemID.STRAWBERRIES3; -import static api.ItemID.STRAWBERRIES4; -import static api.ItemID.TOMATOES1; -import static api.ItemID.TOMATOES2; -import static api.ItemID.TOMATOES3; -import static api.ItemID.TOMATOES4; -import static api.ItemID.TZHAAR_AIR_RUNE_PACK; -import static api.ItemID.TZHAAR_EARTH_RUNE_PACK; -import static api.ItemID.TZHAAR_FIRE_RUNE_PACK; -import static api.ItemID.TZHAAR_WATER_RUNE_PACK; -import static api.ItemID.UNFINISHED_BROAD_BOLT_PACK; -import static api.ItemID.WATER_RUNE_PACK; -import static api.ItemID._12_ANCHOVY_PIZZA; -import static api.ItemID._12_MEAT_PIZZA; -import static api.ItemID._12_PINEAPPLE_PIZZA; -import static api.ItemID._12_PLAIN_PIZZA; -import static api.ItemID._23_CAKE; -import static api.ItemID._23_CHOCOLATE_CAKE; - -/** - * Certain items aren't tradeable via the GE but can be traded between players. - * The {@link api.ItemDefinition}'s `isTradeable` value is based on GE trade-ability so we need - * to account for these items. These items should only be kept if protected based on item value. - */ -public enum ActuallyTradeableItem -{ - // Item Packs - RUNE_PACKS(AIR_RUNE_PACK, WATER_RUNE_PACK, EARTH_RUNE_PACK, FIRE_RUNE_PACK, CHAOS_RUNE_PACK, MIND_RUNE_PACK), - TZHAAR_PACKS(TZHAAR_AIR_RUNE_PACK, TZHAAR_WATER_RUNE_PACK, TZHAAR_EARTH_RUNE_PACK, TZHAAR_FIRE_RUNE_PACK), - OTHER_PACKS(BASKET_PACK, FEATHER_PACK, PLANT_POT_PACK, SACK_PACK, UNFINISHED_BROAD_BOLT_PACK), - // Equipment - BLACK_MASK(BLACK_MASK_1, BLACK_MASK_2, BLACK_MASK_3, BLACK_MASK_4, BLACK_MASK_5, BLACK_MASK_6, BLACK_MASK_7, BLACK_MASK_8, BLACK_MASK_9), - SATCHELS(BLACK_SATCHEL, GOLD_SATCHEL, GREEN_SATCHEL, PLAIN_SATCHEL, RED_SATCHEL, RUNE_SATCHEL), - FIRE_ARROWS(BRONZE_FIRE_ARROWS, IRON_FIRE_ARROWS, STEEL_FIRE_ARROWS, MITHRIL_FIRE_ARROWS, ADAMANT_FIRE_ARROWS, RUNE_FIRE_ARROWS, AMETHYST_FIRE_ARROWS, DRAGON_FIRE_ARROWS), - FIRE_ARROWS_2(BRONZE_FIRE_ARROWS_942, IRON_FIRE_ARROWS_2533, STEEL_FIRE_ARROWS_2535, MITHRIL_FIRE_ARROWS_2537, ADAMANT_FIRE_ARROWS_2539, RUNE_FIRE_ARROWS_2541, AMETHYST_FIRE_ARROWS_21330, DRAGON_FIRE_ARROWS_11222), - // Food Items - HALF_A(HALF_A_GARDEN_PIE, HALF_A_MEAT_PIE, HALF_A_MUSHROOM_PIE, HALF_A_REDBERRY_PIE, HALF_A_BOTANICAL_PIE, HALF_A_FISH_PIE, HALF_A_SUMMER_PIE, HALF_A_WILD_PIE, HALF_AN_ADMIRAL_PIE, HALF_AN_APPLE_PIE), - PIZZA(_12_ANCHOVY_PIZZA, _12_MEAT_PIZZA, _12_PINEAPPLE_PIZZA, _12_PLAIN_PIZZA), - CAKES(CAKE, _23_CAKE, SLICE_OF_CAKE, CHOCOLATE_CAKE, _23_CHOCOLATE_CAKE, CHOCOLATE_SLICE), - BASKETS(APPLES1, APPLES2, APPLES3, APPLES4, BANANAS1, BANANAS2, BANANAS3, BANANAS4, ORANGES1, ORANGES2, ORANGES3, ORANGES4, STRAWBERRIES1, STRAWBERRIES2, STRAWBERRIES3, STRAWBERRIES4, TOMATOES1, TOMATOES2, TOMATOES3, TOMATOES4), - // Charged Jewelery - BURNING_AMULET(BURNING_AMULET1, BURNING_AMULET2, BURNING_AMULET3, BURNING_AMULET4), - NECKLACE_OF_PASSAGE(NECKLACE_OF_PASSAGE1, NECKLACE_OF_PASSAGE2, NECKLACE_OF_PASSAGE3, NECKLACE_OF_PASSAGE4), - RING_OF_DUELING(RING_OF_DUELING1, RING_OF_DUELING2, RING_OF_DUELING3, RING_OF_DUELING4, RING_OF_DUELING5, RING_OF_DUELING6, RING_OF_DUELING7), - GAMES_NECKLACE(GAMES_NECKLACE1, GAMES_NECKLACE2, GAMES_NECKLACE3, GAMES_NECKLACE4, GAMES_NECKLACE5, GAMES_NECKLACE6, GAMES_NECKLACE7), - COMBAT_BRACELET(COMBAT_BRACELET1, COMBAT_BRACELET2, COMBAT_BRACELET3, COMBAT_BRACELET5), - RING_OF_WEALTH(RING_OF_WEALTH_I, RING_OF_WEALTH_1, RING_OF_WEALTH_I1, RING_OF_WEALTH_2, RING_OF_WEALTH_I2, RING_OF_WEALTH_3, RING_OF_WEALTH_I3, RING_OF_WEALTH_4, RING_OF_WEALTH_I4, RING_OF_WEALTH_I5), - AMULET_OF_GLORY(AMULET_OF_GLORY1, AMULET_OF_GLORY2, AMULET_OF_GLORY3, AMULET_OF_GLORY5), - AMULET_OF_GLORY_T(AMULET_OF_GLORY_T1, AMULET_OF_GLORY_T2, AMULET_OF_GLORY_T3, AMULET_OF_GLORY_T5), - SKILLS_NECKLACE(SKILLS_NECKLACE1, SKILLS_NECKLACE2, SKILLS_NECKLACE3, SKILLS_NECKLACE5), - ; - - private final int[] ids; - - private static final HashSet ID_SET; - - static - { - ID_SET = new HashSet<>(); - for (ActuallyTradeableItem p : values()) - { - for (int id : p.ids) - { - ID_SET.add(id); - } - } - } - - ActuallyTradeableItem(int... ids) - { - this.ids = ids; - } - - public static Boolean check(int id) - { - return ID_SET.contains(id); - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/KeptOnDeathPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/KeptOnDeathPlugin.java deleted file mode 100644 index 4d7ae58a93..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/KeptOnDeathPlugin.java +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Copyright (c) 2018, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.keptondeath; - -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; - -@PluginDescriptor( - name = "Kept on Death", - description = "Reworks the Items Kept on Death interface to be more accurate", - enabledByDefault = false, - type = PluginType.UTILITY -) -@Slf4j -public class KeptOnDeathPlugin extends Plugin -{ -} -//todo once bytecodes work again, re-enable -/* -{ - // Handles Clicking on items in Kept on Death Interface - private static final int SCRIPT_ID = ScriptID.KEPT_LOST_ITEM_EXAMINE; - private static final double HIGH_ALCH = 0.6; - - // Item Container helpers - private static final int MAX_ROW_ITEMS = 8; - private static final int STARTING_X = 5; - private static final int STARTING_Y = 25; - private static final int X_INCREMENT = 40; - private static final int Y_INCREMENT = 38; - private static final int ORIGINAL_WIDTH = 36; - private static final int ORIGINAL_HEIGHT = 32; - private static final int ORIGINAL_LOST_HEIGHT = 209; - private static final int ORIGINAL_LOST_Y = 107; - - // Information panel text helpers - private static final DecimalFormat NUMBER_FORMAT = new DecimalFormat("#,###"); - private static final String MAX_KEPT_ITEMS_FORMAT = "Max items kept on death :

~ %s ~"; - private static final String ACTION_TEXT = "Item: %s"; - private static final String DEFAULT = "3 items protected by default"; - private static final String IS_SKULLED = "PK skull -3"; - private static final String PROTECTING_ITEM = "Protect Item prayer +1"; - private static final String ACTUAL = "Actually protecting %s items"; - private static final String WHITE_OUTLINE = "Items with a white outline will always be lost."; - private static final String CHANGED_MECHANICS = "Untradeable items are kept on death in non-pvp scenarios."; - private static final String NON_PVP = "You will have 1 hour to retrieve your lost items."; - private static final String LINE_BREAK = "
"; - private static final String UIM_DEFAULT = "You are an UIM which means 0 items are protected by default"; - private static final int ORIGINAL_INFO_HEIGHT = 183; - private static final int FONT_COLOR = 0xFF981F; - - // Button Names and Images - private static final String PROTECT_ITEM_BUTTON_NAME = "Protect Item Prayer"; - private static final String SKULLED_BUTTON_NAME = "Skulled"; - private static final String LOW_WILDY_BUTTON_NAME = "Low Wildy (1-20)"; - private static final String DEEP_WILDY_BUTTON_NAME = "Deep Wildy (21+)"; - private static final int PROTECT_ITEM_SPRITE_ID = SpriteID.PRAYER_PROTECT_ITEM; - private static final int SKULL_SPRITE_ID = SpriteID.PLAYER_KILLER_SKULL_523; - private static final int SWORD_SPRITE_ID = SpriteID.MULTI_COMBAT_ZONE_CROSSED_SWORDS; - private static final int SKULL_2_SPRITE_ID = SpriteID.FIGHT_PITS_WINNER_SKULL_RED; - - @Inject - private Client client; - - @Inject - private ItemManager itemManager; - - @Getter - private boolean widgetVisible = false; - - private LinkedHashMap buttonMap = new LinkedHashMap<>(); - private boolean isSkulled = false; - private boolean protectingItem = false; - private boolean hasAlwaysLost = false; - private int wildyLevel = -1; - - @Subscribe - protected void onScriptCallbackEvent(ScriptCallbackEvent event) - { - if (event.getEventName().equals("deathKeepBuild")) - { - // The script in charge of building the Items Kept on Death interface has finished running. - // Make all necessary changes now. - - // Players inside Safe Areas (POH/Clan Wars) & playing DMM see the default interface - if (isInSafeArea() || client.getWorldType().contains(WorldType.DEADMAN)) - { - return; - } - - syncSettings(); - createWidgetButtons(); - recreateItemsKeptOnDeathWidget(); - } - } - - // Sync user settings - private void syncSettings() - { - SkullIcon s = client.getLocalPlayer().getSkullIcon(); - // Ultimate iron men deaths are treated like they are always skulled - isSkulled = (s != null && s.equals(SkullIcon.SKULL)) || isUltimateIronman(); - protectingItem = client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 1; - syncCurrentWildyLevel(); - } - - private void syncCurrentWildyLevel() - { - if (client.getVar(Varbits.IN_WILDERNESS) != 1) - { - // if they are in a PvP world and not in a safe zone act like in lvl 1 wildy - if (isInPvpWorld() && !isInPvPSafeZone()) - { - wildyLevel = 1; - return; - } - wildyLevel = -1; - return; - } - - int y = client.getLocalPlayer().getWorldLocation().getY(); - - // Credits to atomicint_#5069 (Discord) - int underLevel = ((y - 9920) / 8) + 1; - int upperLevel = ((y - 3520) / 8) + 1; - wildyLevel = (y > 6400 ? underLevel : upperLevel); - } - - private boolean isInPvpWorld() - { - EnumSet world = client.getWorldType(); - return world.contains(WorldType.PVP) || world.contains(WorldType.HIGH_RISK); - } - - private boolean isInPvPSafeZone() - { - Widget w = client.getWidget(WidgetInfo.PVP_WORLD_SAFE_ZONE); - return w != null && !w.isHidden(); - } - - private boolean isInSafeArea() - { - Widget w = client.getWidget(WidgetInfo.ITEMS_KEPT_SAFE_ZONE_CONTAINER); - return w != null && !w.isHidden(); - } - - private boolean isUltimateIronman() - { - return client.getAccountType().equals(AccountType.ULTIMATE_IRONMAN); - } - - private int getDefaultItemsKept() - { - int count = isSkulled ? 0 : 3; - - if (protectingItem) - { - count++; - } - - return count; - } - - private void recreateItemsKeptOnDeathWidget() - { - // Text flags based on items should be reset everytime the widget is recreated - hasAlwaysLost = false; - - Widget lost = client.getWidget(WidgetInfo.ITEMS_LOST_ON_DEATH_CONTAINER); - Widget kept = client.getWidget(WidgetInfo.ITEMS_KEPT_ON_DEATH_CONTAINER); - if (lost != null && kept != null) - { - // Grab all items on player and sort by price. - List items = new ArrayList<>(); - ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); - Item[] inv = inventory == null ? new Item[0] : inventory.getItems(); - ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT); - Item[] equip = equipment == null ? new Item[0] : equipment.getItems(); - Collections.addAll(items, inv); - Collections.addAll(items, equip); - // Sort by item price - items.sort((o1, o2) -> - { - int o1ID = ItemVariationMapping.map(itemManager.canonicalize(o1.getId())); - int o2ID = ItemVariationMapping.map(itemManager.canonicalize(o2.getId())); - ItemDefinition c1 = itemManager.getItemDefinition(o1ID); - ItemDefinition c2 = itemManager.getItemDefinition(o2ID); - int exchangePrice1 = c1.isTradeable() ? itemManager.getItemPrice(c1.getId()) : c1.getPrice(); - int exchangePrice2 = c2.isTradeable() ? itemManager.getItemPrice(c2.getId()) : c2.getPrice(); - return exchangePrice2 - exchangePrice1; - }); - - int keepCount = getDefaultItemsKept(); - - List keptItems = new ArrayList<>(); - List lostItems = new ArrayList<>(); - for (Item i : items) - { - int id = i.getId(); - if (id == -1) - { - continue; - } - - ItemDefinition c = itemManager.getItemDefinition(i.getId()); - Widget itemWidget = createItemWidget(i.getQuantity(), c); - - // Bonds are always kept and do not count towards the limit. - if (id == ItemID.OLD_SCHOOL_BOND || id == ItemID.OLD_SCHOOL_BOND_UNTRADEABLE) - { - keptItems.add(itemWidget); - continue; - } - - // Certain items are always lost on death and have a white outline which we need to readd - AlwaysLostItem item = AlwaysLostItem.getByItemID(i.getId()); - if (item != null) - { - // Some of these items are kept on death (outside wildy), like the Rune pouch. Ignore them - if (!item.isKept() || wildyLevel > 0) - { - itemWidget.setOnOpListener(SCRIPT_ID, 0, i.getQuantity(), c.getName()); - itemWidget.setBorderType(2); - lostItems.add(itemWidget); - hasAlwaysLost = true; - continue; - } - } - - // Keep most valuable items regardless of trade-ability. - if (keepCount > 0) - { - if (i.getQuantity() > keepCount) - { - keptItems.add(createItemWidget(keepCount, c)); - itemWidget.setItemQuantity(i.getQuantity() - keepCount); - keepCount = 0; - } - else - { - keptItems.add(itemWidget); - keepCount -= i.getQuantity(); - continue; - } - } - - - if (!checkTradeable(i.getId(), c) && wildyLevel < 21) - { - // Certain items are turned into broken variants inside the wilderness. - if (BrokenOnDeathItem.check(i.getId())) - { - keptItems.add(itemWidget); - continue; - } - - // Ignore all non tradeables in wildy except for the above case(s). - if (wildyLevel > 0) - { - lostItems.add(itemWidget); - continue; - } - - keptItems.add(itemWidget); - } - else - { - itemWidget.setOnOpListener(SCRIPT_ID, 0, i.getQuantity(), c.getName()); - lostItems.add(itemWidget); - } - } - - int rows = keptItems.size() > MAX_ROW_ITEMS ? keptItems.size() / MAX_ROW_ITEMS : 0; - // Adjust items lost container position if new rows were added to kept items container - lost.setOriginalY(ORIGINAL_LOST_Y + (rows * Y_INCREMENT)); - lost.setOriginalHeight(ORIGINAL_LOST_HEIGHT - (rows * Y_INCREMENT)); - setWidgetChildren(kept, keptItems); - setWidgetChildren(lost, lostItems); - - updateKeptWidgetInfoText(); - } - } - - */ -/** - * Wrapper for widget.setChildren() but updates the child index and original positions - * Used for Items Kept and Lost containers - * - * @param parent Widget to override children - * @param widgets Children to set on parent - *

- * Creates the text to be displayed in the right side of the interface based on current selections - *

- * Corrects the Information panel based on the item containers - *

- * Creates an Item Widget for use inside the Kept on Death Interface - * @param qty Amount of item - * @param c Items Composition - * @return - *//* - - private void setWidgetChildren(Widget parent, List widgets) - { - Widget[] children = parent.getChildren(); - if (children == null) - { - // Create a child so we can copy the returned Widget[] and avoid hn casting issues from creating a new Widget[] - parent.createChild(0, WidgetType.GRAPHIC); - children = parent.getChildren(); - } - Widget[] itemsArray = Arrays.copyOf(children, widgets.size()); - - int parentId = parent.getId(); - int startingIndex = 0; - for (Widget w : widgets) - { - int originalX = STARTING_X + ((startingIndex % MAX_ROW_ITEMS) * X_INCREMENT); - int originalY = STARTING_Y + ((startingIndex / MAX_ROW_ITEMS) * Y_INCREMENT); - - w.setParentId(parentId); - w.setId(parentId); - w.setIndex(startingIndex); - - w.setOriginalX(originalX); - w.setOriginalY(originalY); - w.revalidate(); - - itemsArray[startingIndex] = w; - startingIndex++; - } - - parent.setChildren(itemsArray); - parent.revalidate(); - } - - */ -/** - * Creates the text to be displayed in the right side of the interface based on current selections - *//* - - private String getUpdatedInfoText() - { - String textToAdd = DEFAULT; - - if (isUltimateIronman()) - { - textToAdd = UIM_DEFAULT; - } - else - { - if (isSkulled) - { - textToAdd += LINE_BREAK + IS_SKULLED; - } - - if (protectingItem) - { - textToAdd += LINE_BREAK + PROTECTING_ITEM; - } - - textToAdd += LINE_BREAK + String.format(ACTUAL, getDefaultItemsKept()); - } - - - if (wildyLevel < 1) - { - textToAdd += LINE_BREAK + LINE_BREAK + NON_PVP; - } - - if (hasAlwaysLost) - { - textToAdd += LINE_BREAK + LINE_BREAK + WHITE_OUTLINE; - } - - textToAdd += LINE_BREAK + LINE_BREAK + CHANGED_MECHANICS; - - return textToAdd; - } - - */ -/** - * Corrects the Information panel based on the item containers - *//* - - private void updateKeptWidgetInfoText() - { - // Add Information text widget - createNewTextWidget(); - - // Update Items lost total value - Widget lost = client.getWidget(WidgetInfo.ITEMS_LOST_ON_DEATH_CONTAINER); - double total = 0; - for (Widget w : lost.getChildren()) - { - if (w.getItemId() == -1) - { - continue; - } - double price = itemManager.getItemPrice(w.getItemId()); - if (price == 0) - { - // Default to alch price - price = itemManager.getItemDefinition(w.getItemId()).getPrice() * HIGH_ALCH; - } - total += price; - } - Widget lostValue = client.getWidget(WidgetInfo.ITEMS_LOST_VALUE); - lostValue.setText(NUMBER_FORMAT.format(total) + " gp"); - - // Update Max items kept - Widget kept = client.getWidget(WidgetInfo.ITEMS_KEPT_ON_DEATH_CONTAINER); - Widget max = client.getWidget(WidgetInfo.ITEMS_KEPT_MAX); - max.setText(String.format(MAX_KEPT_ITEMS_FORMAT, kept.getChildren().length)); - } - - // isTradeable checks if they are traded on the grand exchange, some items are trade-able but not via GE - private boolean checkTradeable(int id, ItemDefinition c) - { - // If the item is a note check the unnoted variants trade ability - if (c.getNote() != -1) - { - return checkTradeable(c.getLinkedNoteId(), itemManager.getItemDefinition(c.getLinkedNoteId())); - } - - switch (id) - { - case ItemID.COINS_995: - case ItemID.PLATINUM_TOKEN: - return true; - default: - if (ActuallyTradeableItem.check(id)) - { - return true; - } - } - - return c.isTradeable(); - } - - private void createNewTextWidget() - { - // The text use to be put inside this container but since we can't create LAYER widgets - // We needed to edit this to be a layer for adding buttons - Widget old = client.getWidget(WidgetInfo.ITEMS_KEPT_INFORMATION_CONTAINER); - - // Update the existing TEXT container if it exists. It should be the last child of the old text widget - // client.getWidget() seems to not find indexed child widgets - Widget[] children = old.getChildren(); - if (children != null && children.length > 0) - { - Widget x = old.getChild(children.length - 1); - if (x.getId() == WidgetInfo.ITEMS_KEPT_CUSTOM_TEXT_CONTAINER.getId()) - { - x.setText(getUpdatedInfoText()); - x.revalidate(); - return; - } - } - - Widget w = old.createChild(-1, WidgetType.TEXT); - // Position under buttons taking remaining space - w.setOriginalWidth(old.getOriginalWidth()); - w.setOriginalHeight(ORIGINAL_INFO_HEIGHT - old.getOriginalHeight()); - w.setOriginalY(old.getOriginalHeight()); - - w.setFontId(FontID.PLAIN_11); - w.setTextShadowed(true); - w.setTextColor(FONT_COLOR); - - w.setText(getUpdatedInfoText()); - w.setId(WidgetInfo.ITEMS_KEPT_CUSTOM_TEXT_CONTAINER.getId()); - w.revalidate(); - - // Need to reset height so text is visible? - old.setOriginalHeight(ORIGINAL_INFO_HEIGHT); - old.revalidate(); - } - - private void createWidgetButtons() - { - buttonMap.clear(); - - // Ultimate Iron men are always skulled and can't use the protect item prayer - if (!isUltimateIronman()) - { - createButton(PROTECT_ITEM_BUTTON_NAME, PROTECT_ITEM_SPRITE_ID, protectingItem); - createButton(SKULLED_BUTTON_NAME, SKULL_SPRITE_ID, isSkulled); - } - createButton(LOW_WILDY_BUTTON_NAME, SWORD_SPRITE_ID, wildyLevel > 0 && wildyLevel <= 20); - createButton(DEEP_WILDY_BUTTON_NAME, SKULL_2_SPRITE_ID, wildyLevel > 20); - - Widget parent = client.getWidget(WidgetInfo.ITEMS_KEPT_INFORMATION_CONTAINER); - parent.setType(WidgetType.LAYER); - parent.revalidate(); - WidgetButton.addButtonsToContainerWidget(parent, buttonMap.values()); - } - - private void createButton(String name, int spriteID, boolean startingFlag) - { - WidgetButton button = new WidgetButton(name, spriteID, startingFlag, this::buttonCallback, client); - buttonMap.put(name, button); - } - - private void buttonCallback(String name, boolean selected) - { - log.debug("Clicked Widget Button {}. New value: {}", name, selected); - switch (name) - { - case PROTECT_ITEM_BUTTON_NAME: - protectingItem = selected; - break; - case SKULLED_BUTTON_NAME: - isSkulled = selected; - break; - case LOW_WILDY_BUTTON_NAME: - if (!selected) - { - syncCurrentWildyLevel(); - break; - } - wildyLevel = 1; - buttonMap.get(DEEP_WILDY_BUTTON_NAME).setSelected(false); - break; - case DEEP_WILDY_BUTTON_NAME: - if (!selected) - { - syncCurrentWildyLevel(); - break; - } - wildyLevel = 21; - buttonMap.get(LOW_WILDY_BUTTON_NAME).setSelected(false); - break; - default: - log.warn("Unhandled Button Name: {}", name); - return; - } - - recreateItemsKeptOnDeathWidget(); - } - - */ -/** - * Creates an Item Widget for use inside the Kept on Death Interface - * - * @param qty Amount of item - * @param c Items Composition - * @return - *//* - - private Widget createItemWidget(int qty, ItemDefinition c) - { - Widget itemWidget = client.createWidget(); - itemWidget.setType(WidgetType.GRAPHIC); - itemWidget.setItemId(c.getId()); - itemWidget.setItemQuantity(qty); - itemWidget.setHasListener(true); - itemWidget.setIsIf3(true); - itemWidget.setOriginalWidth(ORIGINAL_WIDTH); - itemWidget.setOriginalHeight(ORIGINAL_HEIGHT); - itemWidget.setBorderType(1); - - itemWidget.setAction(1, String.format(ACTION_TEXT, c.getName())); - itemWidget.setOnOpListener(SCRIPT_ID, 1, qty, c.getName()); - - return itemWidget; - } -}*/ diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java deleted file mode 100644 index 75a225589c..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.runelite.client.plugins.menuentryswapper; - -import com.google.common.base.Splitter; - -public class Parse -{ - public static boolean parse(String value) - { - try - { - Splitter NEWLINE_SPLITTER = Splitter - .on("\n") - .omitEmptyStrings() - .trimResults(); - - NEWLINE_SPLITTER.withKeyValueSeparator(':').split(value); - return true; - } - catch (IllegalArgumentException ex) - { - return false; - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java deleted file mode 100644 index 59ef3a6c1a..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2018, SomeoneWithAnInternetConnection - * Copyright (c) 2018, oplosthee - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.metronome; - -import com.google.inject.Provides; -import javax.inject.Inject; -import api.Client; -import api.SoundEffectID; -import api.events.GameTick; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; - -@PluginDescriptor( - name = "Metronome", - description = "Play a sound on a specified tick to aid in efficient skilling", - tags = {"skilling", "tick", "timers"}, - enabledByDefault = false -) -public class MetronomePlugin extends Plugin -{ - @Inject - private Client client; - - @Inject - private MetronomePluginConfiguration config; - - private int tickCounter = 0; - private boolean shouldTock = false; - - @Provides - MetronomePluginConfiguration provideConfig(ConfigManager configManager) - { - return configManager.getConfig(MetronomePluginConfiguration.class); - } - - @Subscribe - public void onGameTick(GameTick tick) - { - if (config.tickCount() == 0) - { - return; - } - - if (++tickCounter % config.tickCount() == 0) - { - if (config.enableTock() && shouldTock) - { - client.playSoundEffect(SoundEffectID.GE_DECREMENT_PLOP); - } - else - { - client.playSoundEffect(SoundEffectID.GE_INCREMENT_PLOP); - } - shouldTock = !shouldTock; - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java deleted file mode 100644 index 1e4dda5bd4..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2018, Seth - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.mining; - -import com.google.common.collect.ImmutableSet; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.time.Duration; -import java.time.Instant; -import java.util.Set; -import javax.inject.Inject; -import static api.AnimationID.MINING_MOTHERLODE_ADAMANT; -import static api.AnimationID.MINING_MOTHERLODE_BLACK; -import static api.AnimationID.MINING_MOTHERLODE_BRONZE; -import static api.AnimationID.MINING_MOTHERLODE_DRAGON; -import static api.AnimationID.MINING_MOTHERLODE_DRAGON_ORN; -import static api.AnimationID.MINING_MOTHERLODE_INFERNAL; -import static api.AnimationID.MINING_MOTHERLODE_IRON; -import static api.AnimationID.MINING_MOTHERLODE_MITHRIL; -import static api.AnimationID.MINING_MOTHERLODE_RUNE; -import static api.AnimationID.MINING_MOTHERLODE_STEEL; -import api.Client; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -import net.runelite.client.ui.overlay.components.TitleComponent; - -class MiningOverlay extends Overlay -{ - private static final Set MINING_ANIMATION_IDS = ImmutableSet.of( - MINING_MOTHERLODE_BRONZE, MINING_MOTHERLODE_IRON, MINING_MOTHERLODE_STEEL, - MINING_MOTHERLODE_BLACK, MINING_MOTHERLODE_MITHRIL, MINING_MOTHERLODE_ADAMANT, - MINING_MOTHERLODE_RUNE, MINING_MOTHERLODE_DRAGON, MINING_MOTHERLODE_DRAGON_ORN, - MINING_MOTHERLODE_INFERNAL - ); - - private final Client client; - private final MiningPlugin plugin; - private final MiningConfig config; - private final PanelComponent panelComponent = new PanelComponent(); - - @Inject - MiningOverlay(Client client, MiningPlugin plugin, MiningConfig config) - { - setPosition(OverlayPosition.TOP_LEFT); - this.client = client; - this.plugin = plugin; - this.config = config; - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (!plugin.isInMlm() || !config.showMiningStats()) - { - return null; - } - - MiningSession session = plugin.getSession(); - - if (session.getLastPayDirtMined() == null) - { - return null; - } - - Duration statTimeout = Duration.ofMinutes(config.statTimeout()); - Duration sinceCut = Duration.between(session.getLastPayDirtMined(), Instant.now()); - - if (sinceCut.compareTo(statTimeout) >= 0) - { - return null; - } - - panelComponent.getChildren().clear(); - - if (config.showMiningState()) - { - if (MINING_ANIMATION_IDS.contains(client.getLocalPlayer().getAnimation())) - { - panelComponent.getChildren().add(TitleComponent.builder() - .text("Mining") - .color(Color.GREEN) - .build()); - } - else - { - panelComponent.getChildren().add(TitleComponent.builder() - .text("NOT mining") - .color(Color.RED) - .build()); - } - } - - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt mined:") - .right(Integer.toString(session.getTotalMined())) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt/hr:") - .right(session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : "") - .build()); - - return panelComponent.render(graphics); - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningPlugin.java deleted file mode 100644 index c5256691b2..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningPlugin.java +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright (c) 2018, Seth - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Lars - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.mining; - -import com.google.common.collect.ImmutableSet; -import com.google.inject.Provides; -import java.time.temporal.ChronoUnit; -import java.util.HashSet; -import java.util.Set; -import javax.inject.Inject; -import lombok.AccessLevel; -import lombok.Getter; -import api.Client; -import api.GameObject; -import api.GameState; -import api.ItemID; -import static api.ObjectID.ORE_VEIN_26661; -import static api.ObjectID.ORE_VEIN_26662; -import static api.ObjectID.ORE_VEIN_26663; -import static api.ObjectID.ORE_VEIN_26664; -import api.WallObject; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.task.Schedule; -import net.runelite.client.ui.overlay.OverlayManager; - -@PluginDescriptor( - name = "Mining", - description = "Show helpful information about Mining", - tags = {"mining", "skilling", "overlay"}, - type = PluginType.SKILLING, - enabledByDefault = false -) -public class MiningPlugin extends Plugin -{ - private static final Set MOTHERLODE_MAP_REGIONS = ImmutableSet.of(14679, 14680, 14681, 14935, 14936, 14937, 15191, 15192, 15193); - private static final Set MINE_SPOTS = ImmutableSet.of(ORE_VEIN_26661, ORE_VEIN_26662, ORE_VEIN_26663, ORE_VEIN_26664); - private static final Set MLM_ORE_TYPES = ImmutableSet.of(ItemID.RUNITE_ORE, ItemID.ADAMANTITE_ORE, - ItemID.MITHRIL_ORE, ItemID.GOLD_ORE, ItemID.COAL, ItemID.GOLDEN_NUGGET); - private static final Set MINING_ROCKS = ImmutableSet.of( - // another website says depleted rocks are 7468, 7469 - // website says stoney 2902, 2962, 2963, 2964, - 2231, 2257, 2584, 2704, 3722, 3723, 3748, 3790, 3791, 3803, 3804, 3805, 3806, 3807, 3808, 4437, 4438, 4676, 6669, 6670, 6671, 6672, 6673, 7453, 7454, 7455, 7456, 7457, 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7467, 7470, 7484, 7485, 7486, 7487, 7488, 7489, 7490, 7491, 7492, 7493, 7494, 7495, 8727, 8828, 8829, 8830, 10079, 10080, 10081, 11441, 11924, 12590, 15127, 15128, 15213, 16464, 16514, 16515, 16521, 16522, 16523, 16524, 16534, 16535, 16545, 16549, 16550, 16998, 16999, 17042, 17043, 17064, 17065, 18817, 18840, 18952, 18953, 18954, 18961, 19849, 19969, 19970, 19971, 19972, 19973, 22665, 22667, 23280, 23281, 23640, 24146, 24147, 24148, 24557, 26873, 26874, 27984, 27985, 27987, 27988, 28596, 28597, 28752, 28753, 28890 - //2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2231, 2257, 2328, 3042, 3043, 3722, 3723, 3748, 3790, 3791, 3803, 3804, 4676, 6943, 6944, 6945, 6946, 6947, 6948, 9296, 9297, 9303, 9304, 9305, 9306, 9316, 9317, 9331, 9332, 9335, 9336, 9708, 9709, 9710, 9711, 9712, 9713, 9714, 9715, 9716, 9717, 9718, 9719, 9720, 9721, 9722, 9723, 9724, 9725, 9726, 9727, 9728, 9729, 9730, 9731, 9732, 9733, 9734, 9735, 9736, 9737, 10583, 10584, 10585, 10586, 10587, 10944, 10945, 10946, 10947, 10948, 10949, 11165, 11166, 11167, 11168, 11169, 11170, 11171, 11172, 11173, 11174, 11175, 11176, 11177, 11178, 11179, 11180, 11181, 11182, 11183, 11184, 11185, 11186, 11187, 11188, 11189, 11190, 11191, 11192, 11193, 11194, 11195, 11424, 11425, 11426, 11427, 11428, 11429, 11430, 11431, 11432, 11433, 11434, 11435, 11436, 11437, 11438, 11439, 11440, 11441, 11442, 11443, 11444, 11552, 11553, 11554, 11555, 11556, 11557, 11915, 11916, 11917, 11918, 11919, 11920, 11921, 11922, 11923, 11924, 11925, 11926, 11927, 11928, 11929, 11930, 11931, 11932, 11933, 11934, 11935, 11936, 11937, 11938, 11939, 11940, 11941, 11942, 11943, 11944, 11945, 11946, 11947, 11948, 11949, 11950, 11951, 11952, 11953, 11954, 11955, 11956, 11957, 11958, 11959, 11960, 11961, 11962, 11963, 11964, 11965 - //968, 1480, 1855, 4043, 4487, 7533, 9716, 21250, 1997, 2581, 2582, 2694, 2695, 2696, 2697, 2835, 2836, 2837, 2901, 2965, 3339, 3364, 4526, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4887, 5604, 5605, 5606, 5844, 5845, 5896, 5985, 5987, 6622, 6623, 6707, 6708, 6709, 7466, 8725, 8726, 8950, 8951, 8952, 9031, 9032, 10036, 10782, 10783, 10784, 10785, 10786, 10787, 10788, 11097, 11098, 11182, 11183, 11424, 11425, 12564, 12565, 12566, 12567, 12588, 12589, 12774, 14814, 14815, 14816, 14817, 15198, 15199, 15217, 15218, 15219, 15410, 15536, 15537, 16077, 16078, 16079, 16080, 16115, 16136, 16284, 16303, 17350, 17351, 17352, 17353, 17354, 17355, 17356, 17357, 17358, 17364, 17365, 17366, 17679, 17958, 17959, 17960, 17970, 17971, 17972, 18871, 18872, 18873, 19131, 21571, 21572, 21573, 22549, 22550, 22551, 23124, 23125, 23126, 23127, 23165, 23976, 23977, 23978, 23979, 23980, 23981, 24693, 24694, 24695, 24696, 24697, 24698, 24699, 24700, 24701, 24781, 25158, 25159, 25160, 25422, 25423, 26372, 26373, 26376, 26377, 26850, 26856, 28580, 29102, 29883, 29884, 29885, 30344, 30519, 30521, 30522, 30857, 30858, 31045, 31781, 31782, 31783, 31784, 31785, 31786, 31787, 31788, 31789 - ); - private static final int MAX_INVENTORY_SIZE = 28; - -// private static final int SACK_LARGE_SIZE = 162; -// private static final int SACK_SIZE = 81; -// -// private static final int UPPER_FLOOR_HEIGHT = -500; - - @Inject - private OverlayManager overlayManager; - - @Inject - private MiningOverlay overlay; - - @Inject - private MiningRocksOverlay rocksOverlay; - - @Inject - private MiningConfig config; - - @Inject - private Client client; - - @Inject - private ClientThread clientThread; - - @Getter(AccessLevel.PACKAGE) - private boolean inMlm; - - @Getter(AccessLevel.PACKAGE) - private int curSackSize; - @Getter(AccessLevel.PACKAGE) - private int maxSackSize; - @Getter(AccessLevel.PACKAGE) - private Integer depositsLeft; - - private MiningSession session; - - @Getter(AccessLevel.PACKAGE) - private final Set veins = new HashSet<>(); - @Getter(AccessLevel.PACKAGE) - private final Set rocks = new HashSet<>(); - - @Provides - MiningConfig getConfig(ConfigManager configManager) - { - return configManager.getConfig(MiningConfig.class); - } - - @Override - protected void startUp() - { - overlayManager.add(overlay); - overlayManager.add(rocksOverlay); -// overlayManager.add(motherlodeGemOverlay); -// overlayManager.add(motherlodeSackOverlay); - - session = new MiningSession(); - //inMlm = checkInMlm(); - -// if (inMlm) -// { -// clientThread.invokeLater(this::refreshSackValues); -// } - } - - @Override - protected void shutDown() throws Exception - { - overlayManager.remove(overlay); - overlayManager.remove(rocksOverlay); -// overlayManager.remove(motherlodeGemOverlay); -// overlayManager.remove(motherlodeSackOverlay); - session = null; -// veins.clear(); - rocks.clear(); - -// Widget sack = client.getWidget(WidgetInfo.MOTHERLODE_MINE); - -// clientThread.invokeLater(() -> -// { -// if (sack != null && sack.isHidden()) -// { -// sack.setHidden(false); -// } -// }); - } - - public MiningSession getSession() - { - return session; - } - -// @Subscribe -// public void onVarbitChanged(VarbitChanged event) -// { -// if (inMlm) -// { -// refreshSackValues(); -// } -// } - -// @Subscribe -// public void onChatMessage(ChatMessage event) -// { -// if (!inMlm || event.getType() != ChatMessageType.FILTERED) -// { -// return; -// } -// -// String chatMessage = event.getMessage(); -// -// switch (chatMessage) -// { -// case "You manage to mine some pay-dirt.": -// session.incrementPayDirtMined(); -// break; -// -// case "You just found a Diamond!": -// session.incrementGemFound(ItemID.UNCUT_DIAMOND); -// break; -// -// case "You just found a Ruby!": -// session.incrementGemFound(ItemID.UNCUT_RUBY); -// break; -// -// case "You just found an Emerald!": -// session.incrementGemFound(ItemID.UNCUT_EMERALD); -// break; -// -// case "You just found a Sapphire!": -// session.incrementGemFound(ItemID.UNCUT_SAPPHIRE); -// break; -// } -// } - - @Schedule( - period = 1, - unit = ChronoUnit.SECONDS - ) -// public void checkMining() -// { -// if (!inMlm) -// { -// return; -// } -// -// depositsLeft = calculateDepositsLeft(); -// -// Instant lastPayDirtMined = session.getLastPayDirtMined(); -// if (lastPayDirtMined == null) -// { -// return; -// } -// -// // reset recentPayDirtMined if you haven't mined anything recently -// Duration statTimeout = Duration.ofMinutes(config.statTimeout()); -// Duration sinceMined = Duration.between(lastPayDirtMined, Instant.now()); -// -// if (sinceMined.compareTo(statTimeout) >= 0) -// { -// session.resetRecent(); -// } -// } - - @Subscribe - public void onGameObjectSpawned(GameObjectSpawned event) - { - GameObject gameObject = event.getGameObject(); - if (MINING_ROCKS.contains(gameObject.getId())) - { - rocks.add(gameObject); - } - } - - @Subscribe - public void onGameObjectChanged(GameObjectChanged event) - { - GameObject previous = event.getPrevious(); - GameObject gameObject = event.getGameObject(); - rocks.remove(previous); - if (MINING_ROCKS.contains(gameObject.getId())) - { - rocks.add(gameObject); - } - } - - @Subscribe - public void onGameObjectDespawned(GameObjectDespawned event) - { - GameObject gameObject = event.getGameObject(); - rocks.remove(gameObject); - } - - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - if (event.getGameState() == GameState.LOADING) - { - // on region changes the tiles get set to null - rocks.clear(); - } - } - -// private Integer calculateDepositsLeft() -// { -// if (maxSackSize == 0) // check if maxSackSize has been initialized -// { -// refreshSackValues(); -// } -// -// double depositsLeft = 0; -// int nonPayDirtItems = 0; -// -// ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); -// if (inventory == null) -// { -// return null; -// } -// -// Item[] result = inventory.getItems(); -// assert result != null; -// -// for (Item item : result) -// { -// // Assume that MLM ores are being banked and exclude them from the check, -// // so the user doesn't see the Overlay switch between deposits left and N/A. -// // -// // Count other items at nonPayDirtItems so depositsLeft is calculated accordingly. -// if (item.getId() != ItemID.PAYDIRT && item.getId() != -1 && !MLM_ORE_TYPES.contains(item.getId())) -// { -// nonPayDirtItems += 1; -// } -// } -// -// double inventorySpace = MAX_INVENTORY_SIZE - nonPayDirtItems; -// double sackSizeRemaining = maxSackSize - curSackSize; -// -// if (inventorySpace > 0 && sackSizeRemaining > 0) -// { -// depositsLeft = Math.ceil(sackSizeRemaining / inventorySpace); -// } -// else if (inventorySpace == 0) -// { -// return null; -// } -// -// return (int) depositsLeft; -// } -// -// private boolean checkInMlm() -// { -// if (client.getGameState() != GameState.LOGGED_IN) -// { -// return false; -// } -// -// int[] currentMapRegions = client.getMapRegions(); -// -// // Verify that all regions exist in MOTHERLODE_MAP_REGIONS -// for (int region : currentMapRegions) -// { -// if (!MOTHERLODE_MAP_REGIONS.contains(region)) -// { -// return false; -// } -// } -// -// return true; -// } -// -// private void refreshSackValues() -// { -// curSackSize = client.getVar(Varbits.SACK_NUMBER); -// boolean sackUpgraded = client.getVar(Varbits.SACK_UPGRADED) == 1; -// maxSackSize = sackUpgraded ? SACK_LARGE_SIZE : SACK_SIZE; -// } -// -// /** -// * Checks if the given point is "upstairs" in the mlm. -// * The upper floor is actually on z=0. -// * @param localPoint -// * @return -// */ -// boolean isUpstairs(LocalPoint localPoint) -// { -// return Perspective.getTileHeight(client, localPoint, 0) < UPPER_FLOOR_HEIGHT; -// } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningRocksOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningRocksOverlay.java deleted file mode 100644 index 9225d59c5b..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningRocksOverlay.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2018, Seth - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Lars - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.mining; - -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import javax.inject.Inject; -import api.Client; -import api.GameObject; -import api.Perspective; -import api.Player; -import api.Point; -import api.Skill; -import api.coords.LocalPoint; -import net.runelite.client.game.SkillIconManager; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import net.runelite.client.ui.overlay.OverlayPosition; - -class MiningRocksOverlay extends Overlay -{ - private static final int MAX_DISTANCE = 2350; - - private final Client client; - private final MiningPlugin plugin; - private final MiningConfig config; - - private final BufferedImage miningIcon; - - @Inject - MiningRocksOverlay(Client client, MiningPlugin plugin, MiningConfig config, SkillIconManager iconManager) - { - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_SCENE); - this.client = client; - this.plugin = plugin; - this.config = config; - - miningIcon = iconManager.getSkillImage(Skill.MINING); - } - - @Override - public Dimension render(Graphics2D graphics) - { - Player local = client.getLocalPlayer(); - - renderTiles(graphics, local); - - return null; - } - - private void renderTiles(Graphics2D graphics, Player local) - { - LocalPoint localLocation = local.getLocalLocation(); - - if (config.showMiningRocks()) - { - for (GameObject rock : plugin.getRocks()) - { - - LocalPoint location = rock.getLocalLocation(); - if (localLocation.distanceTo(location) <= MAX_DISTANCE) - { - renderMiningRock(graphics, rock); - } - } - } - - } - - private void renderMiningRock(Graphics2D graphics, GameObject rock) - { - Point canvasLoc = Perspective.getCanvasImageLocation(client, rock.getLocalLocation(), miningIcon, 0); - if (canvasLoc != null) - { - graphics.drawImage(miningIcon, canvasLoc.getX(), canvasLoc.getY(), null); - } - } - -// private void renderMiningRockSquare(Graphics2D graphics, GameObject rock) -// { -// Polygon poly = Perspective.getCanvasTilePoly(client, rock.getLocalLocation()); -// -// if (poly != null) -// { -// OverlayUtil.renderPolygon(graphics, poly, Color.red); -// } -// } - -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningSession.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningSession.java deleted file mode 100644 index b245268e8c..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningSession.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2018, Seth - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.mining; - -import java.time.Duration; -import java.time.Instant; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import api.ItemID; - -@Slf4j -public class MiningSession -{ - private static final Duration HOUR = Duration.ofHours(1); - - private int perHour; - - private Instant lastPayDirtMined; - private int totalMined; - - private Instant recentPayDirtMined; - private int recentMined; - - @Getter(AccessLevel.PACKAGE) - private Instant lastGemFound; - - @Getter(AccessLevel.PACKAGE) - private int diamondsFound; - - @Getter(AccessLevel.PACKAGE) - private int rubiesFound; - - @Getter(AccessLevel.PACKAGE) - private int emeraldsFound; - - @Getter(AccessLevel.PACKAGE) - private int sapphiresFound; - - public void incrementGemFound(int gemID) - { - lastGemFound = Instant.now(); - - switch (gemID) - { - case ItemID.UNCUT_DIAMOND: - diamondsFound++; - break; - - case ItemID.UNCUT_RUBY: - rubiesFound++; - break; - - case ItemID.UNCUT_EMERALD: - emeraldsFound++; - break; - - case ItemID.UNCUT_SAPPHIRE: - sapphiresFound++; - break; - - default: - log.error("Invalid gem type specified. The gem count will not be incremented."); - } - } - - public void incrementPayDirtMined() - { - Instant now = Instant.now(); - - lastPayDirtMined = now; - ++totalMined; - - if (recentMined == 0) - { - recentPayDirtMined = now; - } - ++recentMined; - - Duration timeSinceStart = Duration.between(recentPayDirtMined, now); - if (!timeSinceStart.isZero()) - { - perHour = (int) ((double) recentMined * (double) HOUR.toMillis() / (double) timeSinceStart.toMillis()); - } - } - - public void resetRecent() - { - recentPayDirtMined = null; - recentMined = 0; - } - - public int getPerHour() - { - return perHour; - } - - public Instant getLastPayDirtMined() - { - return lastPayDirtMined; - } - - public int getTotalMined() - { - return totalMined; - } - - public Instant getRecentPayDirtMined() - { - return recentPayDirtMined; - } - - public int getRecentMined() - { - return recentMined; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohIcons.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohIcons.java deleted file mode 100644 index 4985fe5f67..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohIcons.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (c) 2018, Seth - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.poh; - -import com.google.common.collect.ImmutableMap; -import java.awt.image.BufferedImage; -import java.util.Map; -import lombok.Getter; -import static api.NullObjectID.NULL_13615; -import static api.NullObjectID.NULL_13618; -import static api.NullObjectID.NULL_13620; -import static api.NullObjectID.NULL_13622; -import static api.NullObjectID.NULL_13625; -import static api.NullObjectID.NULL_13627; -import static api.NullObjectID.NULL_13629; -import static api.NullObjectID.NULL_13632; -import static api.NullObjectID.NULL_13634; -import static api.NullObjectID.NULL_29228; -import static api.NullObjectID.NULL_29229; -import static api.ObjectID.ALTAR_13179; -import static api.ObjectID.ALTAR_13180; -import static api.ObjectID.ALTAR_13181; -import static api.ObjectID.ALTAR_13182; -import static api.ObjectID.ALTAR_13183; -import static api.ObjectID.ALTAR_13184; -import static api.ObjectID.ALTAR_13185; -import static api.ObjectID.ALTAR_13186; -import static api.ObjectID.ALTAR_13187; -import static api.ObjectID.ALTAR_13188; -import static api.ObjectID.ALTAR_13189; -import static api.ObjectID.ALTAR_13190; -import static api.ObjectID.ALTAR_13191; -import static api.ObjectID.ALTAR_13192; -import static api.ObjectID.ALTAR_13193; -import static api.ObjectID.ALTAR_13194; -import static api.ObjectID.ALTAR_13196; -import static api.ObjectID.ALTAR_13197; -import static api.ObjectID.ALTAR_13198; -import static api.ObjectID.ALTAR_13199; -import static api.ObjectID.ALTAR_OF_THE_OCCULT; -import static api.ObjectID.AMULET_OF_GLORY; -import static api.ObjectID.ANCIENT_ALTAR; -import static api.ObjectID.ANNAKARL_PORTAL; -import static api.ObjectID.ANNAKARL_PORTAL_29349; -import static api.ObjectID.ANNAKARL_PORTAL_29357; -import static api.ObjectID.ARDOUGNE_PORTAL; -import static api.ObjectID.ARDOUGNE_PORTAL_13626; -import static api.ObjectID.ARDOUGNE_PORTAL_13633; -import static api.ObjectID.ARMOUR_REPAIR_STAND; -import static api.ObjectID.BASIC_JEWELLERY_BOX; -import static api.ObjectID.CARRALLANGAR_PORTAL; -import static api.ObjectID.CARRALLANGAR_PORTAL_33437; -import static api.ObjectID.CARRALLANGAR_PORTAL_33440; -import static api.ObjectID.CATHERBY_PORTAL; -import static api.ObjectID.CATHERBY_PORTAL_33435; -import static api.ObjectID.CATHERBY_PORTAL_33438; -import static api.ObjectID.DARK_ALTAR; -import static api.ObjectID.DIGSITE_PENDANT; -import static api.ObjectID.DIGSITE_PENDANT_33417; -import static api.ObjectID.DIGSITE_PENDANT_33418; -import static api.ObjectID.DIGSITE_PENDANT_33420; -import static api.ObjectID.FALADOR_PORTAL; -import static api.ObjectID.FALADOR_PORTAL_13624; -import static api.ObjectID.FALADOR_PORTAL_13631; -import static api.ObjectID.FANCY_JEWELLERY_BOX; -import static api.ObjectID.FANCY_REJUVENATION_POOL; -import static api.ObjectID.FISHING_GUILD_PORTAL; -import static api.ObjectID.FISHING_GUILD_PORTAL_29351; -import static api.ObjectID.FISHING_GUILD_PORTAL_29359; -import static api.ObjectID.GHORROCK_PORTAL; -import static api.ObjectID.GHORROCK_PORTAL_33436; -import static api.ObjectID.GHORROCK_PORTAL_33439; -import static api.ObjectID.KHARYRLL_PORTAL; -import static api.ObjectID.KHARYRLL_PORTAL_29346; -import static api.ObjectID.KHARYRLL_PORTAL_29354; -import static api.ObjectID.KOUREND_PORTAL; -import static api.ObjectID.KOUREND_PORTAL_29353; -import static api.ObjectID.KOUREND_PORTAL_29361; -import static api.ObjectID.LUMBRIDGE_PORTAL; -import static api.ObjectID.LUMBRIDGE_PORTAL_13623; -import static api.ObjectID.LUMBRIDGE_PORTAL_13630; -import static api.ObjectID.LUNAR_ALTAR; -import static api.ObjectID.LUNAR_ISLE_PORTAL; -import static api.ObjectID.LUNAR_ISLE_PORTAL_29347; -import static api.ObjectID.LUNAR_ISLE_PORTAL_29355; -import static api.ObjectID.MARIM_PORTAL; -import static api.ObjectID.MARIM_PORTAL_29352; -import static api.ObjectID.MARIM_PORTAL_29360; -import static api.ObjectID.OBELISK_31554; -import static api.ObjectID.ORNATE_JEWELLERY_BOX; -import static api.ObjectID.ORNATE_REJUVENATION_POOL; -import static api.ObjectID.POOL_OF_REJUVENATION; -import static api.ObjectID.POOL_OF_RESTORATION; -import static api.ObjectID.POOL_OF_REVITALISATION; -import static api.ObjectID.PORTAL_4525; -import static api.ObjectID.PORTAL_NEXUS; -import static api.ObjectID.PORTAL_NEXUS_33355; -import static api.ObjectID.PORTAL_NEXUS_33356; -import static api.ObjectID.PORTAL_NEXUS_33357; -import static api.ObjectID.PORTAL_NEXUS_33358; -import static api.ObjectID.PORTAL_NEXUS_33359; -import static api.ObjectID.PORTAL_NEXUS_33360; -import static api.ObjectID.PORTAL_NEXUS_33361; -import static api.ObjectID.PORTAL_NEXUS_33362; -import static api.ObjectID.PORTAL_NEXUS_33363; -import static api.ObjectID.PORTAL_NEXUS_33364; -import static api.ObjectID.PORTAL_NEXUS_33365; -import static api.ObjectID.PORTAL_NEXUS_33366; -import static api.ObjectID.PORTAL_NEXUS_33367; -import static api.ObjectID.PORTAL_NEXUS_33368; -import static api.ObjectID.PORTAL_NEXUS_33369; -import static api.ObjectID.PORTAL_NEXUS_33370; -import static api.ObjectID.PORTAL_NEXUS_33371; -import static api.ObjectID.PORTAL_NEXUS_33372; -import static api.ObjectID.PORTAL_NEXUS_33373; -import static api.ObjectID.PORTAL_NEXUS_33374; -import static api.ObjectID.PORTAL_NEXUS_33375; -import static api.ObjectID.PORTAL_NEXUS_33376; -import static api.ObjectID.PORTAL_NEXUS_33377; -import static api.ObjectID.PORTAL_NEXUS_33378; -import static api.ObjectID.PORTAL_NEXUS_33379; -import static api.ObjectID.PORTAL_NEXUS_33380; -import static api.ObjectID.PORTAL_NEXUS_33381; -import static api.ObjectID.PORTAL_NEXUS_33382; -import static api.ObjectID.PORTAL_NEXUS_33383; -import static api.ObjectID.PORTAL_NEXUS_33384; -import static api.ObjectID.PORTAL_NEXUS_33385; -import static api.ObjectID.PORTAL_NEXUS_33386; -import static api.ObjectID.PORTAL_NEXUS_33387; -import static api.ObjectID.PORTAL_NEXUS_33388; -import static api.ObjectID.PORTAL_NEXUS_33389; -import static api.ObjectID.PORTAL_NEXUS_33390; -import static api.ObjectID.PORTAL_NEXUS_33391; -import static api.ObjectID.PORTAL_NEXUS_33392; -import static api.ObjectID.PORTAL_NEXUS_33393; -import static api.ObjectID.PORTAL_NEXUS_33394; -import static api.ObjectID.PORTAL_NEXUS_33395; -import static api.ObjectID.PORTAL_NEXUS_33396; -import static api.ObjectID.PORTAL_NEXUS_33397; -import static api.ObjectID.PORTAL_NEXUS_33398; -import static api.ObjectID.PORTAL_NEXUS_33399; -import static api.ObjectID.PORTAL_NEXUS_33400; -import static api.ObjectID.PORTAL_NEXUS_33401; -import static api.ObjectID.PORTAL_NEXUS_33402; -import static api.ObjectID.PORTAL_NEXUS_33403; -import static api.ObjectID.PORTAL_NEXUS_33404; -import static api.ObjectID.PORTAL_NEXUS_33405; -import static api.ObjectID.PORTAL_NEXUS_33406; -import static api.ObjectID.PORTAL_NEXUS_33407; -import static api.ObjectID.PORTAL_NEXUS_33408; -import static api.ObjectID.PORTAL_NEXUS_33409; -import static api.ObjectID.PORTAL_NEXUS_33410; -import static api.ObjectID.PORTAL_NEXUS_33423; -import static api.ObjectID.PORTAL_NEXUS_33424; -import static api.ObjectID.PORTAL_NEXUS_33425; -import static api.ObjectID.PORTAL_NEXUS_33426; -import static api.ObjectID.PORTAL_NEXUS_33427; -import static api.ObjectID.PORTAL_NEXUS_33428; -import static api.ObjectID.PORTAL_NEXUS_33429; -import static api.ObjectID.PORTAL_NEXUS_33430; -import static api.ObjectID.PORTAL_NEXUS_33431; -import static api.ObjectID.SENNTISTEN_PORTAL; -import static api.ObjectID.SENNTISTEN_PORTAL_29348; -import static api.ObjectID.SENNTISTEN_PORTAL_29356; -import static api.ObjectID.SPIRIT_TREE_29227; -import static api.ObjectID.TROLL_STRONGHOLD_PORTAL; -import static api.ObjectID.TROLL_STRONGHOLD_PORTAL_33180; -import static api.ObjectID.TROLL_STRONGHOLD_PORTAL_33181; -import static api.ObjectID.WATERBIRTH_ISLAND_PORTAL; -import static api.ObjectID.WATERBIRTH_ISLAND_PORTAL_29350; -import static api.ObjectID.WATERBIRTH_ISLAND_PORTAL_29358; -import static api.ObjectID.XERICS_TALISMAN; -import static api.ObjectID.XERICS_TALISMAN_33412; -import static api.ObjectID.XERICS_TALISMAN_33413; -import static api.ObjectID.XERICS_TALISMAN_33414; -import static api.ObjectID.XERICS_TALISMAN_33415; -import static api.ObjectID.XERICS_TALISMAN_33419; -import net.runelite.client.util.ImageUtil; - -public enum PohIcons -{ - EXITPORTAL("exitportal", PORTAL_4525), - VARROCK("varrock", NULL_13615, NULL_13622, NULL_13629), - FALADOR("falador", FALADOR_PORTAL, FALADOR_PORTAL_13624, FALADOR_PORTAL_13631), - LUMBRIDGE("lumbridge", LUMBRIDGE_PORTAL, LUMBRIDGE_PORTAL_13623, LUMBRIDGE_PORTAL_13630), - ARDOUGNE("ardougne", ARDOUGNE_PORTAL, ARDOUGNE_PORTAL_13626, ARDOUGNE_PORTAL_13633), - YANILLE("yanille", NULL_13620, NULL_13627, NULL_13634), - CAMELOT("camelot", NULL_13618, NULL_13625, NULL_13632), - LUNARISLE("lunarisle", LUNAR_ISLE_PORTAL, LUNAR_ISLE_PORTAL_29347, LUNAR_ISLE_PORTAL_29355), - WATERBIRTH("waterbirth", WATERBIRTH_ISLAND_PORTAL, WATERBIRTH_ISLAND_PORTAL_29350, WATERBIRTH_ISLAND_PORTAL_29358), - FISHINGGUILD("fishingguild", FISHING_GUILD_PORTAL, FISHING_GUILD_PORTAL_29351, FISHING_GUILD_PORTAL_29359), - SENNTISTEN("senntisten", SENNTISTEN_PORTAL, SENNTISTEN_PORTAL_29348, SENNTISTEN_PORTAL_29356), - KHARYLL("kharyll", KHARYRLL_PORTAL, KHARYRLL_PORTAL_29346, KHARYRLL_PORTAL_29354), - ANNAKARL("annakarl", ANNAKARL_PORTAL, ANNAKARL_PORTAL_29349, ANNAKARL_PORTAL_29357), - KOUREND("kourend", KOUREND_PORTAL, KOUREND_PORTAL_29353, KOUREND_PORTAL_29361), - MARIM("marim", MARIM_PORTAL, MARIM_PORTAL_29352, MARIM_PORTAL_29360), - TROLLSTRONGHOLD("trollheim", TROLL_STRONGHOLD_PORTAL, TROLL_STRONGHOLD_PORTAL_33180, TROLL_STRONGHOLD_PORTAL_33181), - GHORROCK("ghorrock", GHORROCK_PORTAL, GHORROCK_PORTAL_33436, GHORROCK_PORTAL_33439), - CARRALLANGAR("carrallangar", CARRALLANGAR_PORTAL, CARRALLANGAR_PORTAL_33437, CARRALLANGAR_PORTAL_33440), - CATHERBY("catherby", CATHERBY_PORTAL, CATHERBY_PORTAL_33435, CATHERBY_PORTAL_33438), - ALTAR("altar", - ALTAR_13179, ALTAR_13180, ALTAR_13181, ALTAR_13182, ALTAR_13183, ALTAR_13184, ALTAR_13185, ALTAR_13186, - ALTAR_13187, ALTAR_13188, ALTAR_13189, ALTAR_13190, ALTAR_13191, ALTAR_13192, ALTAR_13193, ALTAR_13194, - ALTAR_13196, ALTAR_13197, ALTAR_13198, ALTAR_13199 - ), - POOLS("pool", POOL_OF_RESTORATION, POOL_OF_REVITALISATION, POOL_OF_REJUVENATION, FANCY_REJUVENATION_POOL, ORNATE_REJUVENATION_POOL), - GLORY("glory", AMULET_OF_GLORY), - REPAIR("repair", ARMOUR_REPAIR_STAND), - SPELLBOOKALTAR("spellbook", ANCIENT_ALTAR, LUNAR_ALTAR, DARK_ALTAR, ALTAR_OF_THE_OCCULT), - JEWELLERYBOX("jewellery", BASIC_JEWELLERY_BOX, FANCY_JEWELLERY_BOX, ORNATE_JEWELLERY_BOX), - MAGICTRAVEL("transportation", SPIRIT_TREE_29227, NULL_29228, NULL_29229, OBELISK_31554), - PORTALNEXUS("portalnexus", - PORTAL_NEXUS, PORTAL_NEXUS_33355, PORTAL_NEXUS_33356, PORTAL_NEXUS_33357, PORTAL_NEXUS_33358, PORTAL_NEXUS_33359, PORTAL_NEXUS_33360, - PORTAL_NEXUS_33361, PORTAL_NEXUS_33362, PORTAL_NEXUS_33363, PORTAL_NEXUS_33364, PORTAL_NEXUS_33365, PORTAL_NEXUS_33366, PORTAL_NEXUS_33367, - PORTAL_NEXUS_33368, PORTAL_NEXUS_33369, PORTAL_NEXUS_33370, PORTAL_NEXUS_33371, PORTAL_NEXUS_33372, PORTAL_NEXUS_33373, PORTAL_NEXUS_33374, - PORTAL_NEXUS_33375, PORTAL_NEXUS_33376, PORTAL_NEXUS_33377, PORTAL_NEXUS_33378, PORTAL_NEXUS_33379, PORTAL_NEXUS_33380, PORTAL_NEXUS_33381, - PORTAL_NEXUS_33382, PORTAL_NEXUS_33383, PORTAL_NEXUS_33384, PORTAL_NEXUS_33385, PORTAL_NEXUS_33386, PORTAL_NEXUS_33387, PORTAL_NEXUS_33388, - PORTAL_NEXUS_33389, PORTAL_NEXUS_33390, PORTAL_NEXUS_33391, PORTAL_NEXUS_33392, PORTAL_NEXUS_33393, PORTAL_NEXUS_33394, PORTAL_NEXUS_33395, - PORTAL_NEXUS_33396, PORTAL_NEXUS_33397, PORTAL_NEXUS_33398, PORTAL_NEXUS_33399, PORTAL_NEXUS_33400, PORTAL_NEXUS_33401, PORTAL_NEXUS_33402, - PORTAL_NEXUS_33403, PORTAL_NEXUS_33404, PORTAL_NEXUS_33405, PORTAL_NEXUS_33406, PORTAL_NEXUS_33407, PORTAL_NEXUS_33408, PORTAL_NEXUS_33409, - PORTAL_NEXUS_33410, PORTAL_NEXUS_33423, PORTAL_NEXUS_33424, PORTAL_NEXUS_33425, PORTAL_NEXUS_33426, PORTAL_NEXUS_33427, PORTAL_NEXUS_33428, - PORTAL_NEXUS_33429, PORTAL_NEXUS_33430, PORTAL_NEXUS_33431 - ), - XERICSTALISMAN("xericstalisman", - XERICS_TALISMAN, XERICS_TALISMAN_33412, XERICS_TALISMAN_33413, XERICS_TALISMAN_33414, XERICS_TALISMAN_33415, XERICS_TALISMAN_33419 - ), - DIGSITEPENDANT("digsitependant", - DIGSITE_PENDANT, DIGSITE_PENDANT_33417, DIGSITE_PENDANT_33418, DIGSITE_PENDANT_33420 - ); - - private static final Map minimapIcons; - - @Getter - private final String imageResource; - @Getter - private final int[] Ids; - - private BufferedImage image; - - static - { - ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); - - for (PohIcons icon : values()) - { - for (Integer spotId : icon.getIds()) - { - builder.put(spotId, icon); - } - } - - minimapIcons = builder.build(); - } - - PohIcons(String imageResource, int... ids) - { - this.imageResource = imageResource; - this.Ids = ids; - } - - public static PohIcons getIcon(int id) - { - return minimapIcons.get(id); - } - - public BufferedImage getImage() - { - if (image != null) - { - return image; - } - - image = ImageUtil.getResourceStreamFromClass(getClass(), getImageResource() + ".png"); - - return image; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuConfig.java deleted file mode 100644 index ddfc69a4dd..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuConfig.java +++ /dev/null @@ -1,111 +0,0 @@ -package net.runelite.client.plugins.runedoku; - -import java.awt.Color; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup("runedoku") -public interface RunedokuConfig extends Config -{ - - @ConfigItem( - position = 0, - keyName = "mindRuneColor", - name = "Mind Rune Color", - description = "Color used to highlight Mind runes." - ) - default Color mindRuneColor() - { - return Color.PINK; - } - - @ConfigItem( - position = 1, - keyName = "fireRuneColor", - name = "Fire Rune Color", - description = "Color used to highlight Fire runes." - ) - default Color fireRuneColor() - { - return Color.RED; - } - - @ConfigItem( - position = 2, - keyName = "bodyRuneColor", - name = "Body Rune Color", - description = "Color used to highlight Body runes." - ) - default Color bodyRuneColor() - { - return Color.MAGENTA; - } - - @ConfigItem( - position = 3, - keyName = "airRuneColor", - name = "Air Rune Color", - description = "Color used to highlight Air runes." - ) - default Color airRuneColor() - { - return Color.WHITE; - } - - @ConfigItem( - position = 4, - keyName = "deathRuneColor", - name = "Death Rune Color", - description = "Color used to highlight Death runes." - ) - default Color deathRuneColor() - { - return Color.BLACK; - } - - @ConfigItem( - position = 5, - keyName = "waterRuneColor", - name = "Water Rune Color", - description = "Color used to highlight Water runes." - ) - default Color waterRuneColor() - { - return Color.BLUE; - } - - @ConfigItem( - position = 6, - keyName = "chaosRuneColor", - name = "Chaos Rune Color", - description = "Color used to highlight Chaos runes." - ) - default Color chaosRuneColor() - { - return Color.YELLOW; - } - - @ConfigItem( - position = 7, - keyName = "earthRuneColor", - name = "Earth Rune Color", - description = "Color used to highlight Earth runes." - ) - default Color earthRuneColor() - { - return Color.GREEN; - } - - @ConfigItem( - position = 8, - keyName = "lawRuneColor", - name = "Law Rune Color", - description = "Color used to highlight Law runes." - ) - default Color lawRuneColor() - { - return Color.CYAN; - } - -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java deleted file mode 100644 index c2908f8107..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (c) 2018, Jos - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.statusbars; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Image; -import javax.inject.Inject; -import api.Client; -import api.MenuEntry; -import api.Point; -import api.Skill; -import api.VarPlayer; -import api.Varbits; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import net.runelite.client.game.SkillIconManager; -import net.runelite.client.plugins.itemstats.Effect; -import net.runelite.client.plugins.itemstats.ItemStatChangesService; -import net.runelite.client.plugins.itemstats.StatChange; -import net.runelite.client.plugins.itemstats.StatsChanges; -import net.runelite.client.ui.FontManager; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.TextComponent; -import net.runelite.client.util.ImageUtil; - -class StatusBarsOverlay extends Overlay -{ - private static final Color PRAYER_COLOR = new Color(50, 200, 200, 175); - private static final Color QUICK_PRAYER_COLOR = new Color(57, 255, 186, 225); - private static final Color BACKGROUND = new Color(0, 0, 0, 150); - private static final Color HEALTH_COLOR = new Color(225, 35, 0, 125); - private static final Color POISONED_COLOR = new Color(0, 145, 0, 150); - private static final Color VENOMED_COLOR = new Color(0, 65, 0, 150); - private static final Color HEAL_COLOR = new Color(255, 112, 6, 150); - private static final Color PRAYER_HEAL_COLOR = new Color(57, 255, 186, 75); - private static final Color OVERHEAL_COLOR = new Color(216, 255, 139, 150); - private static final int HEIGHT = 252; - private static final int RESIZED_BOTTOM_HEIGHT = 272; - private static final int WIDTH = 20; - private static final int PADDING = 1; - private static final int IMAGE_SIZE = 17; - private static final int HEALTH_LOCATION_X = 0; - private static final int PRAYER_LOCATION_X = 1; - private static final int RESIZED_BOTTOM_OFFSET_Y = 12; - private static final int RESIZED_BOTTOM_OFFSET_X = 10; - private static final int OVERHEAL_OFFSET = 2; - private static final int HEAL_OFFSET = 3; - private static final int ICON_AND_COUNTER_OFFSET_X = 1; - private static final int ICON_AND_COUNTER_OFFSET_Y = 21; - private static final int SKILL_ICON_HEIGHT = 35; - private static final int COUNTER_ICON_HEIGHT = 18; - private static final int OFFSET = 2; - - private final Client client; - private final StatusBarsConfig config; - private final SkillIconManager skillIconManager; - private final TextComponent textComponent = new TextComponent(); - private final ItemStatChangesService itemStatService; - - private final Image prayerImage; - - @Inject - private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice) - { - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_WIDGETS); - this.client = client; - this.config = config; - this.skillIconManager = skillIconManager; - this.itemStatService = itemstatservice; - - prayerImage = ImageUtil.resizeImage(skillIconManager.getSkillImage(Skill.PRAYER, true), IMAGE_SIZE, IMAGE_SIZE); - } - - @Override - public Dimension render(Graphics2D g) - { - final Widget widgetBankTitleBar = client.getWidget(WidgetInfo.BANK_TITLE_BAR); - if (widgetBankTitleBar != null && !widgetBankTitleBar.isHidden()) - { - return null; - } - - Viewport curViewport = null; - Widget curWidget = null; - - for (Viewport viewport : Viewport.values()) - { - final Widget viewportWidget = client.getWidget(viewport.getViewport()); - if (viewportWidget != null && !viewportWidget.isHidden()) - { - curViewport = viewport; - curWidget = viewportWidget; - break; - } - } - - if (curViewport == null || curWidget.isHidden()) - { - return null; - } - - final Point offsetLeft = curViewport.getOffsetLeft(); - final Point offsetRight = curViewport.getOffsetRight(); - final Point location = curWidget.getCanvasLocation(); - final int height, offsetHealthX, offsetHealthY, offsetPrayerX, offsetPrayerY; - - if (curViewport == Viewport.RESIZED_BOTTOM) - { - height = RESIZED_BOTTOM_HEIGHT; - offsetHealthX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetLeft.getX()); - offsetHealthY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); - offsetPrayerX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetRight.getX()); - offsetPrayerY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); - } - else - { - height = HEIGHT; - offsetHealthX = (location.getX() - offsetLeft.getX()); - offsetHealthY = (location.getY() - offsetLeft.getY()); - offsetPrayerX = (location.getX() - offsetRight.getX()) + curWidget.getWidth(); - offsetPrayerY = (location.getY() - offsetRight.getY()); - } - - final int poisonState = client.getVar(VarPlayer.IS_POISONED); - final Color healthBar; - - if (poisonState >= 1000000) - { - healthBar = VENOMED_COLOR; - } - else if (poisonState > 0) - { - healthBar = POISONED_COLOR; - } - else - { - healthBar = HEALTH_COLOR; - } - - final int maxHealth = client.getRealSkillLevel(Skill.HITPOINTS); - final int maxPrayer = client.getRealSkillLevel(Skill.PRAYER); - final int currentHealth = client.getBoostedSkillLevel(Skill.HITPOINTS); - final int currentPrayer = client.getBoostedSkillLevel(Skill.PRAYER); - final int quickPrayerState = client.getVar(Varbits.QUICK_PRAYER); - final Color prayerBar = quickPrayerState == 1 ? QUICK_PRAYER_COLOR : PRAYER_COLOR; - - renderBar(g, offsetHealthX, offsetHealthY, - maxHealth, currentHealth, height, healthBar); - - renderBar(g, offsetPrayerX, offsetPrayerY, - maxPrayer, currentPrayer, height, prayerBar); - - if (config.enableRestorationBars()) - { - final MenuEntry[] menu = client.getMenuEntries(); - final int menuSize = menu.length; - final MenuEntry entry = menuSize > 0 ? menu[menuSize - 1] : null; - int prayerHealValue = 0; - int foodHealValue = 0; - if (entry != null && entry.getParam1() == WidgetInfo.INVENTORY.getId()) - { - final Effect change = itemStatService.getItemStatChanges(entry.getIdentifier()); - - if (change != null) - { - final StatsChanges statsChanges = change.calculate(client); - - for (final StatChange c : statsChanges.getStatChanges()) - { - final int theoreticalBoost = c.getTheoretical(); - - if (c.getStat().getName().equals(Skill.HITPOINTS.getName())) - { - foodHealValue = theoreticalBoost; - } - - if (c.getStat().getName().equals(Skill.PRAYER.getName())) - { - prayerHealValue = theoreticalBoost; - } - - if (foodHealValue != 0 && prayerHealValue != 0) - { - break; - } - } - } - } - - renderHealingBar(g, offsetHealthX, offsetHealthY, - maxHealth, currentHealth, height, - foodHealValue, HEAL_COLOR); - - renderHealingBar(g, offsetPrayerX, offsetPrayerY, - maxPrayer, currentPrayer, height, - prayerHealValue, PRAYER_HEAL_COLOR); - } - - if (config.enableSkillIcon() || config.enableCounter()) - { - final Image healthImage = skillIconManager.getSkillImage(Skill.HITPOINTS, true); - final int counterHealth = client.getBoostedSkillLevel(Skill.HITPOINTS); - final int counterPrayer = client.getBoostedSkillLevel(Skill.PRAYER); - final String counterHealthText = Integer.toString(counterHealth); - final String counterPrayerText = Integer.toString(counterPrayer); - - renderIconsAndCounters(g, offsetPrayerX, offsetPrayerY, prayerImage, counterPrayerText, PRAYER_LOCATION_X); - renderIconsAndCounters(g, offsetHealthX, offsetHealthY, healthImage, counterHealthText, HEALTH_LOCATION_X); - } - - return null; - } - - private static void renderBar(Graphics2D graphics, int x, int y, int max, int current, int height, Color filled) - { - graphics.setColor(BACKGROUND); - graphics.drawRect(x, y, WIDTH - PADDING, height - PADDING); - graphics.fillRect(x, y, WIDTH, height); - - final int filledHeight = getBarHeight(max, current, height); - graphics.setColor(filled); - graphics.fillRect(x + PADDING, - y + PADDING + (height - filledHeight), - WIDTH - PADDING * OFFSET, - filledHeight - PADDING * OFFSET); - } - - private static void renderHealingBar(Graphics2D graphics, int x, int y, int max, int current, int height, int heal, Color color) - { - if (heal <= 0) - { - return; - } - - final int filledCurrentHeight = getBarHeight(max, current, height); - int filledHeight = getBarHeight(max, heal, height); - graphics.setColor(color); - - if (filledHeight + filledCurrentHeight > height) - { - final int overHeal = filledHeight + filledCurrentHeight - height; - filledHeight = filledHeight - overHeal + OVERHEAL_OFFSET; - graphics.setColor(OVERHEAL_COLOR); - graphics.fillRect(x + PADDING, - y - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, - WIDTH - PADDING * OVERHEAL_OFFSET, - filledHeight - PADDING * OVERHEAL_OFFSET); - } - else - { - graphics.fillRect(x + PADDING, - y - OVERHEAL_OFFSET - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, - WIDTH - PADDING * OVERHEAL_OFFSET, - filledHeight + OVERHEAL_OFFSET - PADDING * OVERHEAL_OFFSET); - } - } - - private static int getBarHeight(int base, int current, int size) - { - final double ratio = (double) current / base; - - if (ratio >= 1) - { - return size; - } - - return (int) Math.round(ratio * size); - } - - private void renderIconsAndCounters(Graphics2D graphics, int x, int y, Image image, String counterText, int counterPadding) - { - final int widthOfCounter = graphics.getFontMetrics().stringWidth(counterText); - final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2); - - if (config.enableCounter()) - { - graphics.setFont(FontManager.getRunescapeSmallFont()); - textComponent.setColor(Color.WHITE); - textComponent.setText(counterText); - textComponent.setPosition(new java.awt.Point(x + centerText + counterPadding, y + COUNTER_ICON_HEIGHT)); - } - else - { - textComponent.setText(""); - } - - if (config.enableSkillIcon()) - { - graphics.drawImage(image, x + ICON_AND_COUNTER_OFFSET_X + PADDING, y + ICON_AND_COUNTER_OFFSET_Y - image.getWidth(null), null); - textComponent.setPosition(new java.awt.Point(x + centerText + counterPadding, y + SKILL_ICON_HEIGHT)); - } - - textComponent.render(graphics); - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/test/Test.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/test/Test.java deleted file mode 100644 index c6772da865..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/test/Test.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.test; - -import api.Client; -import api.events.ChatMessage; -import api.events.ClientTick; -import api.events.GameTick; -import api.events.MenuOpened; -import api.events.VarbitChanged; -import com.google.common.eventbus.Subscribe; -import com.google.inject.Binder; -import javax.inject.Inject; -import javax.inject.Singleton; - -import com.google.inject.Provides; -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.ui.overlay.OverlayManager; - -/** - * Authors gazivodag longstreet - */ -@PluginDescriptor( - name = "Test", - description = "Testing plugin for building functionality", - tags = {} -) -@Singleton -@Slf4j -public class Test extends Plugin -{ - - @Provides - TestConfig getConfig(ConfigManager configManager) - { - return configManager.getConfig(TestConfig.class); - } - - @Inject - private TestOverlay testOverlay; - - @Inject - private TestConfig config; - - @Inject - private Client client; - - @Inject - private OverlayManager overlayManager; - - @Override - public void configure(Binder binder) - { - } - - @Override - protected void startUp() throws Exception - { - overlayManager.add(testOverlay); - System.out.println("Test Plugin started"); - } - - @Override - protected void shutDown() throws Exception - { - - } - - @Subscribe - public void onMenuOpened(MenuOpened event) - { - System.out.println("[Test Plugin] Menu Opened"); - } - - @Subscribe - public void onChatMessage(ChatMessage chatMessage) - { - System.out.println("[Test Plugin] Chat Message"); - } - - @Subscribe - public void onVarbitChanged(VarbitChanged event) - { - System.out.println("[Test Plugin] Varbit Changed"); - } -} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterConfig.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterConfig.java deleted file mode 100644 index ef349f58d1..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterConfig.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2018, James Munson - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.tickcounter; - -import java.awt.Color; -import net.runelite.client.config.Alpha; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup("tickcounter") -public interface TickCounterConfig extends Config -{ - @ConfigItem( - keyName = "resetInstance", - name = "Reset on new instances", - description = "", - position = 1 - ) - default boolean instance() - { - return true; - } - - @Alpha - @ConfigItem( - keyName = "selfColor", - name = "Your color", - description = "", - position = 4 - ) - default Color selfColor() - { - return Color.green; - } - - @Alpha - @ConfigItem( - keyName = "totalColor", - name = "Total color", - description = "", - position = 6 - ) - default Color totalColor() - { - return Color.RED; - } - - @Alpha - @ConfigItem( - keyName = "otherColor", - name = "Other players color", - description = "", - position = 5 - ) - default Color otherColor() - { - return Color.white; - } - - @Alpha - @ConfigItem( - keyName = "bgColor", - name = "Background color", - description = "", - position = 3 - ) - default Color bgColor() - { - return new Color(70, 61, 50, 156); - } - - @Alpha - @ConfigItem( - keyName = "titleColor", - name = "Title color", - description = "", - position = 2 - ) - default Color titleColor() - { - return Color.white; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterOverlay.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterOverlay.java deleted file mode 100644 index cb6821ec72..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterOverlay.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2018, James Munson - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.tickcounter; - -/*public class TickCounterOverlay extends Overlay -{ - - private TickCounterPlugin plugin; - private TickCounterConfig config; - private Client client; - private PanelComponent panelComponent = new PanelComponent(); - - @Inject - public TickCounterOverlay(TickCounterPlugin plugin, Client client, TickCounterConfig config) - { - super(plugin); - setPosition(OverlayPosition.DYNAMIC); - setPosition(OverlayPosition.DETACHED); - setPosition(OverlayPosition.BOTTOM_RIGHT); - this.plugin = plugin; - this.client = client; - this.config = config; - } - - @Override - public Dimension render(Graphics2D g) - { - List elems = panelComponent.getChildren(); - elems.clear(); - panelComponent.setBackgroundColor(config.bgColor()); - elems.add(TitleComponent.builder().text("Combat counter").color(config.titleColor()).build()); - List> list = new ArrayList<>(plugin.activity.entrySet()); - list.sort((o1, o2) -> - { - int value = -Integer.compare(o1.getValue(), o2.getValue()); - if (value == 0) - { - value = o1.getKey().compareTo(o2.getKey()); - } - return value; - }); - int total = 0; - for (Entry e : list) - { - total += e.getValue(); - if (e.getKey().equals(client.getLocalPlayer().getName())) - { - elems.add(LineComponent.builder().leftColor(config.selfColor()).rightColor(config.selfColor()).left(e.getKey()).right(e.getValue().toString()).build()); - } - else - { - elems.add(LineComponent.builder().left(e.getKey()).right(e.getValue().toString()).leftColor(config.otherColor()).rightColor(config.otherColor()).build()); - - } - } - elems.add(LineComponent.builder().left("Total").leftColor(config.totalColor()).rightColor(config.totalColor()).right(String.valueOf(total)).build()); - return this.panelComponent.render(g); - } - -}*/ diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterPlugin.java deleted file mode 100644 index 74c7c3a612..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tickcounter/TickCounterPlugin.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2018, James Munson - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.tickcounter; - -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; - -@PluginDescriptor(name = "Tick Counter", - description = "Counts combat activity for nearby players", - enabledByDefault = false, - type = PluginType.PVP -) -public class TickCounterPlugin extends Plugin -{ - //todo once bytecodes work again, re-enable -/* - @Inject - private OverlayManager overlayManager; - - @Inject - private TickCounterConfig config; - - @Inject - private Client client; - - @Provides - TickCounterConfig provideConfig(ConfigManager configManager) - { - return configManager.getConfig(TickCounterConfig.class); - } - - @Inject - private TickCounterOverlay overlay; - - Map activity = new HashMap<>(); - - private List blowpiping = new ArrayList<>(); - private boolean instanced = false; - - @Override - protected void startUp() throws Exception - { - overlayManager.add(overlay); - } - - @Override - protected void shutDown() throws Exception - { - overlayManager.remove(overlay); - activity.clear(); - } - - @Subscribe - public void onAnimationChanged(AnimationChanged e) - { - if (!(e.getActor() instanceof Player)) - { - return; - } - Player p = (Player) e.getActor(); - int weapon = -1; - if (p.getPlayerAppearance() != null) - { - weapon = p.getPlayerAppearance().getEquipmentId(KitType.WEAPON); - } - int delta = 0; - switch (p.getAnimation()) - { - case 7617: // rune knife - case 8194: // dragon knife - case 8291: // dragon knife spec - case 5061: // blowpipe - if (weapon == 12926) - { - blowpiping.add(p); - } - else - { - delta = 2; - } - break; - case 2323: // rpg - case 7618: // chin - delta = 3; - break; - case 426: // bow shoot - if (weapon == 20997) // twisted bow - { - delta = 5; - } - else // shortbow - { - delta = 3; - } - break; - case 376: // dds poke - case 377: // dds slash - case 422: // punch - case 423: // kick - case 386: // lunge - case 390: // generic slash - case 1062: // dds spec - case 1067: // claw stab - case 1074: // msb spec - case 1167: // trident cast - case 1658: // whip - case 2890: // arclight spec - case 3294: // abby dagger slash - case 3297: // abby dagger poke - case 3298: // bludgeon attack - case 3299: // bludgeon spec - case 3300: // abby dagger spec - case 7514: // claw spec - case 7515: // d sword spec - case 8145: // rapier stab - case 8288: // dhl stab - case 8289: // dhl slash - case 8290: // dhl crush - delta = 4; - break; - case 393: // staff bash - if (weapon == 13652) - { // claw scratch - delta = 4; - break; - } - case 395: // axe autos - case 400: // pick smash - case 1379: //burst or blitz - case 1979: // barrage spell cast - case 1162: // strike/bolt spells - case 7552: // generic crossbow - case 7855: // surge spells - case 8056: // scythe swing - delta = 5; - break; - case 401: - if (weapon == 13576) // dwh bop - { - delta = 6; - } - else // used by pickaxe and axe - { - delta = 5; - } - break; - case 1378: - case 7045: - case 7054: - case 7055: // godsword autos - case 7511: // dinh's attack - case 7516: // maul attack - case 7555: // ballista attack - case 7638: // zgs spec - case 7640: // sgs spec - case 7642: // bgs spec - case 7643: // bgs spec - case 7644: // ags spec - delta = 6; - break; - case 428: // chally swipe - case 440: // chally jab - case 1203: // chally spec - delta = 7; - break; - case -1: - blowpiping.remove(p); - break; - } - if (delta > 0) - { - String name = p.getName(); - this.activity.put(name, this.activity.getOrDefault(name, 0) + delta); - } - } - - @Subscribe - public void onClientTick(ClientTick e) - { - *//* - * Hack for blowpipe since the AnimationChanged event doesn't fire when using a - * blowpipe because of its speed. If blowpipe animation restarts, then add 2 - *//* - for (Player p : blowpiping) - { - if (p.getActionFrame() == 0 && p.getActionFrameCycle() == 1) - { - String name = p.getName(); - int activity = this.activity.getOrDefault(name, 0); - this.activity.put(name, activity + 2); - } - } - } - - @Subscribe - public void onGameTick(GameTick tick) - { - if (!config.instance()) - { - return; - } - boolean prevInstance = instanced; - instanced = client.isInInstancedRegion(); - if (!prevInstance && instanced) - { - activity.clear(); - } - }*/ -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java deleted file mode 100644 index 2472b26277..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.vorkath; - -import java.awt.image.BufferedImage; -import javax.inject.Inject; -import lombok.Getter; -import api.AnimationID; -import api.Client; -import api.GameState; -import api.NPC; -import api.NpcID; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.overlay.OverlayManager; -import net.runelite.client.util.ImageUtil; - -@PluginDescriptor( - name = "Vorkath Helper", - description = "Count vorkath attacks, and which phase is coming next", - tags = {"combat", "overlay", "pve", "pvm"}, - type = PluginType.PVM -) -public class VorkathPlugin extends Plugin -{ - @Inject - private Client client; - - @Inject - private OverlayManager overlayManager; - - @Inject - private VorkathOverlay overlay; - - @Inject - private ZombifiedSpawnOverlay SpawnOverlay; - - @Inject - private ClientThread clientThread; - - @Getter - private Vorkath vorkath; - - @Getter - private ZombifiedSpawn spawn; - - static final BufferedImage ACID; - static final BufferedImage ICE; - static final BufferedImage MAGERANGE; - - static - { - ACID = ImageUtil.getResourceStreamFromClass(VorkathPlugin.class, "acid.png"); - ICE = ImageUtil.getResourceStreamFromClass(VorkathPlugin.class, "ice.png"); - MAGERANGE = ImageUtil.getResourceStreamFromClass(VorkathPlugin.class, "magerange.png"); - } - - @Override - protected void startUp() - { - overlayManager.add(overlay); - overlayManager.add(SpawnOverlay); - clientThread.invoke(this::reset); - } - - @Override - protected void shutDown() - { - overlayManager.remove(overlay); - overlayManager.remove(SpawnOverlay); - } - - private void reset() - { - this.vorkath = null; - for (NPC npc : client.getNpcs()) - { - if (isNpcVorkath(npc.getId())) - { - this.vorkath = new Vorkath(npc); - } - else if (isNpcZombifiedSpawn(npc.getId())) - { - this.spawn = new ZombifiedSpawn(npc); - } - } - } - - private static boolean isNpcVorkath(int npcId) - { - return npcId == NpcID.VORKATH || - npcId == NpcID.VORKATH_8058 || - npcId == NpcID.VORKATH_8059 || - npcId == NpcID.VORKATH_8060 || - npcId == NpcID.VORKATH_8061; - } - - private static boolean isNpcZombifiedSpawn(int id) - { - return id == NpcID.ZOMBIFIED_SPAWN || - id == NpcID.ZOMBIFIED_SPAWN_8063; - } - - @Subscribe - public void onNpcSpawned(NpcSpawned event) - { - NPC npc = event.getNpc(); - if (isNpcVorkath(npc.getId())) - { - this.vorkath = new Vorkath(npc); - } - else if (isNpcZombifiedSpawn(npc.getId())) - { - this.spawn = new ZombifiedSpawn(npc); - } - } - - @Subscribe - public void onNpcDespawned(NpcDespawned npcDespawned) - { - final NPC npc = npcDespawned.getNpc(); - if (this.vorkath != null) - { - if (npc.getId() == this.vorkath.getNpc().getId()) - { - this.vorkath = null; - reset(); - } - } - - if (this.spawn != null) - { - if (npc.getId() == this.spawn.getNpc().getId()) - { - this.spawn = null; - } - } - } - - - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - GameState gs = event.getGameState(); - if (gs == GameState.LOGGING_IN || - gs == GameState.CONNECTION_LOST || - gs == GameState.HOPPING) - { - reset(); - } - } - - @Subscribe - public void onGameTick(GameTick event) - { - if (vorkath != null) - { - int animationId = vorkath.getNpc().getAnimation(); - - if (animationId != vorkath.getLastTickAnimation()) - { - if (animationId == AnimationID.VORKATH_ACID_ATTACK) - { - vorkath.setPhase(2); - vorkath.setAttacksUntilSwitch(Vorkath.ATTACKS_PER_SWITCH); - } - else if (animationId == AnimationID.VORKATH_ATTACK && vorkath.getAttacksUntilSwitch() == 0) - { - vorkath.setPhase(1); - vorkath.setAttacksUntilSwitch(Vorkath.ATTACKS_PER_SWITCH); - //Vorkath does a bomb animation after the ice dragon breathe, we need to account for it - vorkath.setIcePhaseAttack(true); - } - else if (animationId == AnimationID.VORKATH_ATTACK || animationId == AnimationID.VORKATH_FIRE_BOMB_ATTACK) - { - if (vorkath.isIcePhaseAttack()) - { - vorkath.setIcePhaseAttack(false); - } - else - { - vorkath.setAttacksUntilSwitch(vorkath.getAttacksUntilSwitch() - 1); - } - } - } - - vorkath.setLastTickAnimation(animationId); - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraListener.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraListener.java deleted file mode 100644 index ee6181b55d..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraListener.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Abexlry - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.wasdcamera; - -import com.google.common.base.Strings; -import java.awt.event.KeyEvent; -import java.util.HashMap; -import java.util.Map; -import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.VarClientStr; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.input.KeyListener; -import net.runelite.client.input.MouseAdapter; - -class WASDCameraListener extends MouseAdapter implements KeyListener -{ - @Inject - private WASDCameraPlugin plugin; - - @Inject - private WASDCameraConfig config; - - @Inject - private Client client; - - @Inject - private ClientThread clientThread; - - private final Map modified = new HashMap<>(); - - @Override - public void keyTyped(KeyEvent e) - { - } - - @Override - public void keyPressed(KeyEvent e) - { - if (client.getGameState() != GameState.LOGGED_IN || !plugin.chatboxFocused()) - { - return; - } - - if (!plugin.isTyping()) - { - if (config.up().matches(e)) - { - modified.put(e.getKeyCode(), KeyEvent.VK_UP); - e.setKeyCode(KeyEvent.VK_UP); - } - else if (config.down().matches(e)) - { - modified.put(e.getKeyCode(), KeyEvent.VK_DOWN); - e.setKeyCode(KeyEvent.VK_DOWN); - } - else if (config.left().matches(e)) - { - modified.put(e.getKeyCode(), KeyEvent.VK_LEFT); - e.setKeyCode(KeyEvent.VK_LEFT); - } - else if (config.right().matches(e)) - { - modified.put(e.getKeyCode(), KeyEvent.VK_RIGHT); - e.setKeyCode(KeyEvent.VK_RIGHT); - } - else - { - switch (e.getKeyCode()) - { - case KeyEvent.VK_ENTER: - case KeyEvent.VK_SLASH: - case KeyEvent.VK_COLON: - // refocus chatbox - plugin.setTyping(true); - clientThread.invoke(() -> - { - plugin.unlockChat(); - }); - break; - } - } - } - else - { - switch (e.getKeyCode()) - { - case KeyEvent.VK_ENTER: - plugin.setTyping(false); - clientThread.invoke(() -> - { - plugin.lockChat(); - }); - break; - case KeyEvent.VK_ESCAPE: - plugin.setTyping(false); - clientThread.invoke(() -> - { - client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); - plugin.lockChat(); - }); - break; - case KeyEvent.VK_BACK_SPACE: - if (Strings.isNullOrEmpty(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT))) - { - plugin.setTyping(false); - clientThread.invoke(() -> plugin.lockChat()); - } - } - } - } - - @Override - public void keyReleased(KeyEvent e) - { - if (client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - if (plugin.chatboxFocused() && !plugin.isTyping()) - { - modified.remove(e.getKeyCode()); - - if (config.up().matches(e)) - { - e.setKeyCode(KeyEvent.VK_UP); - } - else if (config.down().matches(e)) - { - e.setKeyCode(KeyEvent.VK_DOWN); - } - else if (config.left().matches(e)) - { - e.setKeyCode(KeyEvent.VK_LEFT); - } - else if (config.right().matches(e)) - { - e.setKeyCode(KeyEvent.VK_RIGHT); - } - } - else - { - // press d + enter + release d - causes the right arrow to never be released - Integer m = modified.get(e.getKeyCode()); - if (m != null) - { - modified.remove(e.getKeyCode()); - e.setKeyCode(m); - } - } - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java b/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java deleted file mode 100644 index e1e8ec2e8d..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2018, John James Hamilton - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.worldmap; - -import lombok.Getter; -import api.coords.WorldPoint; - -enum QuestStartLocation -{ - //Free Quests - COOKS_ASSISTANT_RFD("Cook's Assistant", new WorldPoint(3211, 3216, 0)), - THE_CORSAIR_CURSE("The Corsair Curse", new WorldPoint(3029, 3273, 0)), - DEMON_SLAYER("Demon Slayer", new WorldPoint(3204, 3424, 0)), - DORICS_QUEST("Doric's Quest", new WorldPoint(2952, 3450, 0)), - DRAGON_SLAYER("Dragon Slayer", new WorldPoint(3190, 3362, 0)), - ERNEST_THE_CHICKEN("Ernest the Chicken", new WorldPoint(3109, 3330, 0)), - GOBLIN_DIPLOMACY("Goblin Diplomacy", new WorldPoint(2957, 3509, 0)), - IMP_CATCHER("Imp Catcher", new WorldPoint(3108, 3160, 0)), - THE_KNIGHTS_SWORD("The Knight's Sword", new WorldPoint(2976, 3342, 0)), - MISTHALIN_MYSTERY("Misthalin Mystery", new WorldPoint(3234, 3155, 0)), - PIRATES_TREASURE("Pirate's Treasure", new WorldPoint(3051, 3252, 0)), - PRINCE_ALI_RESCUE("Prince Ali Rescue", new WorldPoint(3301, 3163, 0)), - THE_RESTLESS_GHOST("The Restless Ghost", new WorldPoint(3240, 3210, 0)), - RUNE_MYSTERIES("Rune Mysteries", new WorldPoint(3210, 3220, 0)), - SHEEP_SHEARER("Sheep Shearer", new WorldPoint(3190, 3272, 0)), - SHIELD_OF_ARRAV_PHOENIX_GANG("Shield of Arrav (Phoenix Gang)", new WorldPoint(3208, 3495, 0)), - SHIELD_OF_ARRAV_BLACK_ARM_GANG("Shield of Arrav (Black Arm Gang)", new WorldPoint(3208, 3392, 0)), - VAMPIRE_SLAYER("Vampire Slayer", new WorldPoint(3096, 3266, 0)), - WITCHS_POTION("Witch's Potion", new WorldPoint(2967, 3203, 0)), - X_MARKS_THE_SPOT("X Marks the Spot", new WorldPoint(3227, 3242, 0)), - - //Members' Quests - ANIMAL_MAGNETISM("Animal Magnetism", new WorldPoint(3094, 3360, 0)), - ANOTHER_SLICE_OF_HAM("Another Slice of H.A.M.", new WorldPoint(2799, 5428, 0)), - THE_ASCENT_OF_ARCEUUS("The Ascent of Arceuus", new WorldPoint(1700, 3742, 0)), - BETWEEN_A_ROCK("Between a Rock...", new WorldPoint(2823, 10168, 0)), - BIG_CHOMPY_BIRD_HUNTING("Big Chompy Bird Hunting", new WorldPoint(2629, 2981, 0)), - BIOHAZARD("Biohazard", new WorldPoint(2591, 3335, 0)), - BONE_VOYAGE("Bone Voyage", new WorldPoint(3259, 3450, 0)), - CABIN_FEVER("Cabin Fever", new WorldPoint(3674, 3496, 0)), - CLIENT_OF_KOUREND("Client of Kourend", new WorldPoint(1823, 3690, 0)), - CLOCK_TOWER("Clock Tower", new WorldPoint(2568, 3249, 0)), - COLD_WAR("Cold War", new WorldPoint(2593, 3265, 0)), - CONTACT("Contact!", new WorldPoint(3280, 2770, 0)), - CREATURE_OF_FENKENSTRAIN("Creature of Fenkenstrain", new WorldPoint(3487, 3485, 0)), - DARKNESS_OF_HALLOWVALE("Darkness of Hallowvale", new WorldPoint(3494, 9628, 0)), - DEATH_PLATEAU_TROLL_STRONGHOLD("Death Plateau & Troll Stronghold", new WorldPoint(2895, 3528, 0)), - DEATH_TO_THE_DORGESHUUN("Death to the Dorgeshuun", new WorldPoint(3316, 9613, 0)), - THE_DEPTHS_OF_DESPAIR("The Depths of Despair", new WorldPoint(1846, 3556, 0)), - DESERT_TREASURE("Desert Treasure", new WorldPoint(3177, 3043, 0)), - DEVIOUS_MINDS("Devious Minds", new WorldPoint(3405, 3492, 0)), - THE_DIG_SITE("The Dig Site", new WorldPoint(3363, 3337, 0)), - DRAGON_SLAYER_II("Dragon Slayer II", new WorldPoint(2456, 2868, 0)), - DREAM_MENTOR("Dream Mentor", new WorldPoint(2144, 10346, 0)), - DRUIDIC_RITUAL("Druidic Ritual", new WorldPoint(2916, 3484, 0)), - DWARF_CANNON("Dwarf Cannon", new WorldPoint(2566, 3461, 0)), - EADGARS_RUSE("Eadgar's Ruse", new WorldPoint(2896, 3426, 0)), - EAGLES_PEAK("Eagles' Peak", new WorldPoint(2605, 3264, 0)), - ELEMENTAL_WORKSHOP("Elemental Workshop I & II", new WorldPoint(2714, 3482, 0)), - ENAKHRAS_LAMENT("Enakhra's Lament", new WorldPoint(3190, 2926, 0)), - ENLIGHTENED_JOURNEY("Enlightened Journey", new WorldPoint(2809, 3356, 0)), - THE_EYES_OF_GLOUPHRIE("The Eyes of Glouphrie", new WorldPoint(2400, 3419, 0)), - FAIRYTALE("Fairytale I & II", new WorldPoint(3077, 3258, 0)), - FAMILY_CREST("Family Crest", new WorldPoint(3278, 3404, 0)), - THE_FEUD("The Feud", new WorldPoint(3301, 3211, 0)), - FIGHT_ARENA("Fight Arena", new WorldPoint(2565, 3199, 0)), - FISHING_CONTEST_1("Fishing Contest", new WorldPoint(2875, 3483, 0)), - FISHING_CONTEST_2("Fishing Contest", new WorldPoint(2820, 3487, 0)), - FORGETTABLE_TALE("Forgettable Tale...", new WorldPoint(2826, 10215, 0)), - THE_FORSAKEN_TOWER("The Forsaken Tower", new WorldPoint(1484, 3747, 0)), - THE_FREMENNIK_ISLES("The Fremennik Isles", new WorldPoint(2645, 3711, 0)), - THE_FREMENNIK_TRIALS("The Fremennik Trials", new WorldPoint(2657, 3669, 0)), - GARDEN_OF_TRANQUILLITY("Garden of Tranquillity", new WorldPoint(3227, 3477, 0)), - GERTRUDES_CAT_RATCATCHERS("Gertrude's Cat & Ratcatchers", new WorldPoint(3150, 3411, 0)), - GHOSTS_AHOY("Ghosts Ahoy", new WorldPoint(3677, 3510, 0)), - THE_GIANT_DWARF("The Giant Dwarf", new WorldPoint(2841, 10129, 0)), - THE_GOLEM("The Golem", new WorldPoint(3487, 3089, 0)), - THE_GRAND_TREE_MONKEY_MADNESS("The Grand Tree & Monkey Madness I & II", new WorldPoint(2466, 3497, 0)), - THE_GREAT_BRAIN_ROBBERY("The Great Brain Robbery", new WorldPoint(3681, 2963, 0)), - GRIM_TALES("Grim Tales", new WorldPoint(2890, 3454, 0)), - THE_HAND_IN_THE_SAND("The Hand in the Sand", new WorldPoint(2552, 3101, 0)), - HAUNTED_MINE("Haunted Mine", new WorldPoint(3443, 3258, 0)), - HAZEEL_CULT("Hazeel Cult", new WorldPoint(2565, 3271, 0)), - HEROES_QUEST("Heroes' Quest", new WorldPoint(2903, 3511, 0)), - HOLY_GRAIL("Holy Grail & Merlin's Crystal", new WorldPoint(2763, 3515, 0)), - HORROR_FROM_THE_DEEP("Horror from the Deep", new WorldPoint(2507, 3635, 0)), - ICTHLARINS_LITTLE_HELPER("Icthlarin's Little Helper", new WorldPoint(3314, 2849, 0)), - IN_SEARCH_OF_THE_MYREQUE("In Search of the Myreque", new WorldPoint(3502, 3477, 0)), - JUNGLE_POTION("Jungle Potion", new WorldPoint(2809, 3086, 0)), - KINGS_RANSOM("King's Ransom", new WorldPoint(2741, 3554, 0)), - LEGENDS_QUEST("Legends' Quest", new WorldPoint(2725, 3367, 0)), - LOST_CITY("Lost City", new WorldPoint(3149, 3205, 0)), - THE_LOST_TRIBE("The Lost Tribe", new WorldPoint(3211, 3224, 0)), - LUNAR_DIPLOMACY("Lunar Diplomacy", new WorldPoint(2619, 3689, 0)), - MAKING_FRIENDS_WITH_MY_ARM("Making Friends with My Arm", new WorldPoint(2904, 10092, 0)), - MAKING_HISTORY("Making History", new WorldPoint(2435, 3346, 0)), - MONKS_FRIEND("Monk's Friend", new WorldPoint(2605, 3209, 0)), - MOUNTAIN_DAUGHTER("Mountain Daughter", new WorldPoint(2810, 3672, 0)), - MOURNINGS_ENDS_PART_I("Mourning's Ends Part I", new WorldPoint(2289, 3149, 0)), - MOURNINGS_ENDS_PART_II("Mourning's Ends Part II", new WorldPoint(2352, 3172, 0)), - MURDER_MYSTERY("Murder Mystery", new WorldPoint(2740, 3562, 0)), - MY_ARMS_BIG_ADVENTURE("My Arm's Big Adventure", new WorldPoint(2908, 10088, 0)), - NATURE_SPIRIT("Nature Spirit", new WorldPoint(3440, 9894, 0)), - OBSERVATORY_QUEST("Observatory Quest", new WorldPoint(2438, 3185, 0)), - OLAFS_QUEST("Olaf's Quest", new WorldPoint(2723, 3729, 0)), - ONE_SMALL_FAVOUR("One Small Favour", new WorldPoint(2834, 2985, 0)), - PLAGUE_CITY("Plague City", new WorldPoint(2567, 3334, 0)), - PRIEST_IN_PERIL("Priest in Peril", new WorldPoint(3219, 3473, 0)), - THE_QUEEN_OF_THIEVES("The Queen of Thieves", new WorldPoint(1795, 3782, 0)), - RAG_AND_BONE_MAN("Rag and Bone Man I & II", new WorldPoint(3359, 3504, 0)), - RECRUITMENT_DRIVE_BLACK_KNIGHTS_FORTRESS("Recruitment Drive & Black Knights' Fortress", new WorldPoint(2959, 3336, 0)), - ROVING_ELVES("Roving Elves", new WorldPoint(2289, 3146, 0)), - RUM_DEAL("Rum Deal", new WorldPoint(3679, 3535, 0)), - SCORPION_CATCHER("Scorpion Catcher", new WorldPoint(2701, 3399, 0)), - SEA_SLUG("Sea Slug", new WorldPoint(2715, 3302, 0)), - SHADES_OF_MORTTON("Shades of Mort'ton", new WorldPoint(3463, 3308, 0)), - SHADOW_OF_THE_STORM("Shadow of the Storm", new WorldPoint(3270, 3159, 0)), - SHEEP_HERDER("Sheep Herder", new WorldPoint(2616, 3299, 0)), - SHILO_VILLAGE("Shilo Village", new WorldPoint(2882, 2951, 0)), - A_SOULS_BANE("A Soul's Bane", new WorldPoint(3307, 3454, 0)), - SPIRITS_OF_THE_ELID("Spirits of the Elid", new WorldPoint(3441, 2911, 0)), - SWAN_SONG("Swan Song", new WorldPoint(2345, 3652, 0)), - TAI_BWO_WANNAI_TRIO("Tai Bwo Wannai Trio", new WorldPoint(2779, 3087, 0)), - A_TAIL_OF_TWO_CATS("A Tail of Two Cats", new WorldPoint(2917, 3557, 0)), - TALE_OF_THE_RIGHTEOUS("Tale of the Righteous", new WorldPoint(1511, 3631, 0)), - A_TASTE_OF_HOPE("A Taste of Hope", new WorldPoint(3668, 3216, 0)), - TEARS_OF_GUTHIX("Tears of Guthix", new WorldPoint(3251, 9517, 0)), - TEMPLE_OF_IKOV("Temple of Ikov", new WorldPoint(2574, 3320, 0)), - THRONE_OF_MISCELLANIA_ROYAL_TROUBLE("Throne of Miscellania & Royal Trouble", new WorldPoint(2497, 3859, 0)), - THE_TOURIST_TRAP("The Tourist Trap", new WorldPoint(3302, 3113, 0)), - TOWER_OF_LIFE("Tower of Life", new WorldPoint(2640, 3218, 0)), - TREE_GNOME_VILLAGE("Tree Gnome Village", new WorldPoint(2541, 3169, 0)), - TRIBAL_TOTEM("Tribal Totem", new WorldPoint(2790, 3182, 0)), - TROLL_ROMANCE("Troll Romance", new WorldPoint(2890, 10097, 0)), - UNDERGROUND_PASS_REGICIDE("Underground Pass & Regicide", new WorldPoint(2575, 3293, 0)), - WANTED_SLUG_MENACE("Wanted! & The Slug Menace", new WorldPoint(2996, 3373, 0)), - WATCHTOWER("Watchtower", new WorldPoint(2545, 3112, 0)), - WATERFALL_QUEST("Waterfall Quest", new WorldPoint(2521, 3498, 0)), - WHAT_LIES_BELOW("What Lies Below", new WorldPoint(3265, 3333, 0)), - WITCHS_HOUSE("Witch's House", new WorldPoint(2927, 3456, 0)), - ZOGRE_FLESH_EATERS("Zogre Flesh Eaters", new WorldPoint(2442, 3051, 0)); - - @Getter - private final String tooltip; - - @Getter - private final WorldPoint location; - - QuestStartLocation(String description, WorldPoint location) - { - this.tooltip = "Quest Start - " + description; - this.location = location; - } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/ClientLoader.java b/RuneLitePlus/src/main/java/net/runelite/client/rs/ClientLoader.java deleted file mode 100644 index 694f5de7e3..0000000000 --- a/RuneLitePlus/src/main/java/net/runelite/client/rs/ClientLoader.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * Copyright (c) 2018, Tomas Slusny - * Copyright (c) 2018 Abex - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.rs; - -import api.Client; -import com.google.common.io.ByteStreams; -import io.sigpipe.jbsdiff.InvalidHeaderException; -import io.sigpipe.jbsdiff.Patch; -import java.applet.Applet; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.jar.Attributes; -import java.util.jar.JarEntry; -import java.util.jar.JarInputStream; -import java.util.jar.Manifest; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; -import lombok.extern.slf4j.Slf4j; -import static net.runelite.client.rs.ClientUpdateCheckMode.AUTO; -import static net.runelite.client.rs.ClientUpdateCheckMode.CUSTOM; -import static net.runelite.client.rs.ClientUpdateCheckMode.NONE; -import net.runelite.http.api.RuneLiteAPI; -import okhttp3.Request; -import okhttp3.Response; -import org.apache.commons.compress.compressors.CompressorException; - -@Slf4j -@Singleton -public class ClientLoader -{ - private static final File CUSTOMFILE = new File("./injected-client/target/injected-client-1.5.25-SNAPSHOT.jar"); - private final ClientConfigLoader clientConfigLoader; - private ClientUpdateCheckMode updateCheckMode; - - @Inject - private ClientLoader( - @Named("updateCheckMode") final ClientUpdateCheckMode updateCheckMode, - final ClientConfigLoader clientConfigLoader) - { - this.updateCheckMode = updateCheckMode; - this.clientConfigLoader = clientConfigLoader; - } - - public Applet load() - { - if (updateCheckMode == NONE) - { - return null; - } - updateCheckMode = CUSTOM; - try - { - Manifest manifest = new Manifest(); - manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); - RSConfig config = clientConfigLoader.fetch(); - - Map zipFile = new HashMap<>(); - { - Certificate[] jagexCertificateChain = getJagexCertificateChain(); - String codebase = config.getCodeBase(); - String initialJar = config.getInitialJar(); - URL url = new URL(codebase + initialJar); - Request request = new Request.Builder() - .url(url) - .build(); - - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) - { - JarInputStream jis; - - jis = new JarInputStream(response.body().byteStream()); - byte[] tmp = new byte[4096]; - ByteArrayOutputStream buffer = new ByteArrayOutputStream(756 * 1024); - for (; ; ) - { - JarEntry metadata = jis.getNextJarEntry(); - if (metadata == null) - { - break; - } - - buffer.reset(); - for (; ; ) - { - int n = jis.read(tmp); - if (n <= -1) - { - break; - } - buffer.write(tmp, 0, n); - } - - if (!Arrays.equals(metadata.getCertificates(), jagexCertificateChain)) - { - if (metadata.getName().startsWith("META-INF/")) - { - // META-INF/JAGEXLTD.SF and META-INF/JAGEXLTD.RSA are not signed, but we don't need - // anything in META-INF anyway. - continue; - } - else - { - throw new VerificationException("Unable to verify jar entry: " + metadata.getName()); - } - } - - zipFile.put(metadata.getName(), buffer.toByteArray()); - } - } - } - - - if (updateCheckMode == AUTO) - { - ByteArrayOutputStream patchOs = new ByteArrayOutputStream(756 * 1024); - int patchCount = 0; - - for (Map.Entry file : zipFile.entrySet()) - { - byte[] bytes; - try (InputStream is = ClientLoader.class.getResourceAsStream("/patch/" + file.getKey() + ".bs")) - { - if (is == null) - { - continue; - } - - bytes = ByteStreams.toByteArray(is); - } - - patchOs.reset(); - Patch.patch(file.getValue(), bytes, patchOs); - file.setValue(patchOs.toByteArray()); - - ++patchCount; - } - - log.info("Patched {} classes", patchCount); - } - - if (updateCheckMode == CUSTOM) - { - JarInputStream fis = new JarInputStream(new FileInputStream(CUSTOMFILE)); - byte[] tmp = new byte[4096]; - ByteArrayOutputStream buffer = new ByteArrayOutputStream(756 * 1024); - for (; ; ) - { - JarEntry metadata = fis.getNextJarEntry(); - if (metadata == null) - { - break; - } - - buffer.reset(); - for (; ; ) - { - int n = fis.read(tmp); - if (n <= -1) - { - break; - } - buffer.write(tmp, 0, n); - } - zipFile.replace(metadata.getName(), buffer.toByteArray()); - } - } - - String initialClass = config.getInitialClass(); - - ClassLoader rsClassLoader = new ClassLoader(ClientLoader.class.getClassLoader()) - { - @Override - protected Class findClass(String name) throws ClassNotFoundException - { - String path = name.replace('.', '/').concat(".class"); - byte[] data = zipFile.get(path); - if (data == null) - { - throw new ClassNotFoundException(name); - } - - return defineClass(name, data, 0, data.length); - } - }; - - Class clientClass = rsClassLoader.loadClass(initialClass); - - Applet rs = (Applet) clientClass.newInstance(); - rs.setStub(new RSAppletStub(config)); - - if (rs instanceof Client) - { - log.info("client-patch {}", "420 blaze it RL pricks"); - } - - return rs; - } - catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException | SecurityException | VerificationException | CertificateException | CompressorException | InvalidHeaderException e) - { - if (e instanceof ClassNotFoundException) - { - log.error("Unable to load client - class not found. This means you" - + " are not running RuneLite with Maven as the client patch" - + " is not in your classpath."); - } - - log.error("Error loading RS!", e); - return null; - } - } - - private static Certificate[] getJagexCertificateChain() throws CertificateException - { - CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); - Collection certificates = certificateFactory.generateCertificates(ClientLoader.class.getResourceAsStream("jagex.crt")); - return certificates.toArray(new Certificate[0]); - } -} diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/rlp.properties b/RuneLitePlus/src/main/resources/com/runeswag/client/rlp.properties deleted file mode 100644 index b89682ed8a..0000000000 --- a/RuneLitePlus/src/main/resources/com/runeswag/client/rlp.properties +++ /dev/null @@ -1,8 +0,0 @@ -runeliteplus.title=RuneLitePlus -runeliteplus.version=1.0 -runeliteplus.version=1.0 -runeliteplus.discord.appid=409416265891971072 -runeliteplus.discord.invite=https://discord.gg/HN5gf3m -runeliteplus.github.link=https://github.com/runelite-extended/runelite -runeliteplus.wiki.link=https://github.com/runelite-extended/runelite/wiki -runeliteplus.patreon.link=https://www.patreon.com/RuneLitePlus \ No newline at end of file diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/runeliteplus.png b/RuneLitePlus/src/main/resources/com/runeswag/client/ui/runeliteplus.png deleted file mode 100644 index 2b5357ab17..0000000000 Binary files a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/runeliteplus.png and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/barbarianassault/clock.png b/RuneLitePlus/src/main/resources/net/runelite/client/plugins/barbarianassault/clock.png deleted file mode 100644 index c0f39269e1..0000000000 Binary files a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/barbarianassault/clock.png and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png b/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png deleted file mode 100644 index 407e476c54..0000000000 Binary files a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/open.png b/RuneLitePlus/src/main/resources/net/runelite/client/ui/open.png deleted file mode 100644 index 6d5ca35ad4..0000000000 Binary files a/RuneLitePlus/src/main/resources/net/runelite/client/ui/open.png and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/open_rs.png b/RuneLitePlus/src/main/resources/net/runelite/client/ui/open_rs.png deleted file mode 100644 index e0cb3df043..0000000000 Binary files a/RuneLitePlus/src/main/resources/net/runelite/client/ui/open_rs.png and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape.ttf b/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape.ttf deleted file mode 100644 index 9d15fc64ff..0000000000 Binary files a/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape.ttf and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape_bold.ttf b/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape_bold.ttf deleted file mode 100644 index 1eaf0e7b82..0000000000 Binary files a/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape_bold.ttf and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape_small.ttf b/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape_small.ttf deleted file mode 100644 index 7998560026..0000000000 Binary files a/RuneLitePlus/src/main/resources/net/runelite/client/ui/runescape_small.ttf and /dev/null differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes b/RuneLitePlus/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes deleted file mode 100644 index 1d9ffee41b..0000000000 --- a/RuneLitePlus/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright (c) 2018, Tomas Slusny -# Copyright (c) 2018, Psikoi -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -RuneLite Enabled { - kind=Dark - colorUltraLight=#232323 - colorExtraLight=#232323 - colorLight=#232323 - colorMid=#232323 - colorDark=#232323 - colorUltraDark=#232323 - colorForeground=#C6C6C6 -} - -RuneLite Active { - kind=Light - colorUltraLight=#4e4e4e - colorExtraLight=#4e4e4e - colorLight=#4e4e4e - colorMid=#232323 - colorDark=#232323 - colorUltraDark=#232323 - colorForeground=#000000 -} - -RuneLite Selected Disabled Border { - kind=Dark - colorUltraLight=#191919 - colorExtraLight=#191919 - colorLight=#191919 - colorMid=#191919 - colorDark=#191919 - colorUltraDark=#191919 - colorForeground=#C6C6C6 -} - -RuneLite Border { - kind=Dark - colorUltraLight=#191919 - colorExtraLight=#191919 - colorLight=#191919 - colorMid=#191919 - colorDark=#191919 - colorUltraDark=#191919 - colorForeground=#C6C6C6 -} - -RuneLite Tab Border { - kind=Light - colorUltraLight=#232323 - colorExtraLight=#232323 - colorLight=#232323 - colorMid=#232323 - colorDark=#232323 - colorUltraDark=#232323 - colorForeground=#232323 -} - -RuneLite Mark Active { - kind=Dark - colorUltraLight=#191919 - colorExtraLight=#191919 - colorLight=#191919 - colorMid=#191919 - colorDark=#191919 - colorUltraDark=#191919 - colorForeground=#191919 -} - -RuneLite Highlight { - kind=Light - colorUltraLight=#C6C6C6 - colorExtraLight=#C6C6C6 - colorLight=#C6C6C6 - colorMid=#C6C6C6 - colorDark=#C6C6C6 - colorUltraDark=#C6C6C6 - colorForeground=#191919 -} - -RuneLite Watermark { - kind=Light - colorUltraLight=#313131 - colorExtraLight=#313131 - colorLight=#313131 - colorMid=#313131 - colorDark=#313131 - colorUltraDark=#313131 - colorForeground=#C6C6C6 -} - -RuneLite Decorations Watermark { - kind=Light - colorUltraLight=#1e1e1e - colorExtraLight=#1e1e1e - colorLight=#1e1e1e - colorMid=#1e1e1e - colorDark=#1e1e1e - colorUltraDark=#1e1e1e - colorForeground=#1e1e1e -} - -RuneLite Separator { - kind=Dark - colorUltraLight=#232323 - colorExtraLight=#232323 - colorLight=#232323 - colorMid=#232323 - colorDark=#232323 - colorUltraDark=#232323 - colorForeground=#232323 -} - -RuneLite Decorations Separator { - kind=Dark - colorUltraLight=#232323 - colorExtraLight=#232323 - colorLight=#232323 - colorMid=#232323 - colorDark=#232323 - colorUltraDark=#232323 - colorForeground=#232323 -} - -RuneLite Header Watermark { - kind=Dark - colorUltraLight=#1e1e1e - colorExtraLight=#1e1e1e - colorLight=#1e1e1e - colorMid=#1e1e1e - colorDark=#1e1e1e - colorUltraDark=#1e1e1e - colorForeground=#C6C6C6 -} - -RuneLite Header Border { - kind=Dark - colorUltraLight=#1e1e1e - colorExtraLight=#1e1e1e - colorLight=#1e1e1e - colorMid=#1e1e1e - colorDark=#1e1e1e - colorUltraDark=#1e1e1e - colorForeground=#C6C6C6 -} \ No newline at end of file diff --git a/api/src/main/java/api/vars/AccountType.java b/api/src/main/java/api/vars/AccountType.java deleted file mode 100644 index 6e8c2de5b6..0000000000 --- a/api/src/main/java/api/vars/AccountType.java +++ /dev/null @@ -1,35 +0,0 @@ -package api.vars; - -/** - * An enumeration of possible account types. - */ -public enum AccountType -{ - /** - * Normal account type. - */ - NORMAL, - /** - * Ironman account type. - */ - IRONMAN, - /** - * Ultimate ironman account type. - */ - ULTIMATE_IRONMAN, - /** - * Hardcore ironman account type. - */ - HARDCORE_IRONMAN; - - /** - * Checks whether this type is an ironman. - * - * @return {@code true} if the type is any of the ironman types. - */ - public boolean isIronman() - { - return this.ordinal() >= IRONMAN.ordinal() && this.ordinal() <= HARDCORE_IRONMAN.ordinal(); - } - -} \ No newline at end of file diff --git a/api/src/main/java/rs/api/RSClanMate.java b/api/src/main/java/rs/api/RSClanMate.java deleted file mode 100644 index 362d7a8904..0000000000 --- a/api/src/main/java/rs/api/RSClanMate.java +++ /dev/null @@ -1,7 +0,0 @@ -package rs.api; - -import api.ClanMember; - -public interface RSClanMate extends RSBuddy, ClanMember -{ -} diff --git a/api/src/main/java/rs/api/RSFriend.java b/api/src/main/java/rs/api/RSFriend.java deleted file mode 100644 index 4c5b799d9a..0000000000 --- a/api/src/main/java/rs/api/RSFriend.java +++ /dev/null @@ -1,7 +0,0 @@ -package rs.api; - -import api.Friend; - -public interface RSFriend extends Friend, RSBuddy -{ -} diff --git a/api/src/main/java/rs/api/RSIgnored.java b/api/src/main/java/rs/api/RSIgnored.java deleted file mode 100644 index 1e17d128d1..0000000000 --- a/api/src/main/java/rs/api/RSIgnored.java +++ /dev/null @@ -1,7 +0,0 @@ -package rs.api; - -import api.Ignore; - -public interface RSIgnored extends Ignore, RSUser -{ -} diff --git a/api/src/main/java/rs/api/RSPacketBuffer.java b/api/src/main/java/rs/api/RSPacketBuffer.java deleted file mode 100644 index f9dbfac32e..0000000000 --- a/api/src/main/java/rs/api/RSPacketBuffer.java +++ /dev/null @@ -1,7 +0,0 @@ -package rs.api; - -import api.PacketBuffer; - -public interface RSPacketBuffer extends PacketBuffer -{ -} diff --git a/api/src/main/java/rs/api/RSSoundEffect.java b/api/src/main/java/rs/api/RSSoundEffect.java deleted file mode 100644 index 7c7fd22ffe..0000000000 --- a/api/src/main/java/rs/api/RSSoundEffect.java +++ /dev/null @@ -1,5 +0,0 @@ -package rs.api; - -public interface RSSoundEffect -{ -} diff --git a/bootstrap.json b/bootstrap.json new file mode 100644 index 0000000000..2052530dbe --- /dev/null +++ b/bootstrap.json @@ -0,0 +1,299 @@ +{ + "buildCommit": "2d0c2b8eb66a8088b41b29d42ec2a58ead460581", + "artifacts": [ + { + "hash": "b12331da8683e5f107d294adeebb83ecf9124abc1db533554d2a8d3c62832d75", + "name": "asm-all-6.0_BETA.jar", + "path": "https://mvn.runelite.net/org/ow2/asm/asm-all/6.0_BETA/asm-all-6.0_BETA.jar", + "size": "265176" + }, + { + "hash": "37abf0103ce5318bfda004fabc004c75ed0dc6d392a8459175692ab7eac97083", + "name": "naturalmouse-2.0.0.jar", + "path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/artifacts/naturalmouse-2.0.0.jar", + "size": "3168921" + }, + { + "hash": "50d1e07f11827672249dee9ce8a23691fc59f663deed084bb7b52a4f778d5fbc", + "name": "jcl-core-2.9-SNAPSHOT.jar", + "path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/artifacts/jcl-core-2.9-SNAPSHOT.jar", + "size": "3168921" + }, + { + "hash": "4c388a85fb538bbb8cb6e0fd93e0ba0666605123d77b976764818be6f090bbe5", + "name": "client-1.5.28-SNAPSHOT.jar", + "path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/client-1.5.28-SNAPSHOT.jar", + "size": "5871886" + }, + { + "hash": "18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79", + "name": "slf4j-api-1.7.25.jar", + "path": "https://mvn.runelite.net/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar", + "size": "41203" + }, + { + "hash": "fb53f8539e7fcb8f093a56e138112056ec1dc809ebb020b59d8a36a5ebac37e0", + "name": "logback-classic-1.2.3.jar", + "path": "https://mvn.runelite.net/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "size": "290339" + }, + { + "hash": "5946d837fe6f960c02a53eda7a6926ecc3c758bbdd69aa453ee429f858217f22", + "name": "logback-core-1.2.3.jar", + "path": "https://mvn.runelite.net/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "size": "471901" + }, + { + "hash": "9f0c8d50fa4b79b6ff1502dbec8502179d6b9497cacbe17a13074001aed537ec", + "name": "jopt-simple-5.0.1.jar", + "path": "https://mvn.runelite.net/net/sf/jopt-simple/jopt-simple/5.0.1/jopt-simple-5.0.1.jar", + "size": "78826" + }, + { + "hash": "5be9a7d05ba0ccd74708bc8018ae412255f85843c0b92302e9b9befa6ed52564", + "name": "guava-23.2-jre.jar", + "path": "https://mvn.runelite.net/com/google/guava/guava/23.2-jre/guava-23.2-jre.jar", + "size": "2649860" + }, + { + "hash": "905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed", + "name": "jsr305-1.3.9.jar", + "path": "https://mvn.runelite.net/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar", + "size": "33015" + }, + { + "hash": "cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b", + "name": "error_prone_annotations-2.0.18.jar", + "path": "https://mvn.runelite.net/com/google/errorprone/error_prone_annotations/2.0.18/error_prone_annotations-2.0.18.jar", + "size": "12078" + }, + { + "hash": "2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6", + "name": "j2objc-annotations-1.1.jar", + "path": "https://mvn.runelite.net/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar", + "size": "8782" + }, + { + "hash": "2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d", + "name": "animal-sniffer-annotations-1.14.jar", + "path": "https://mvn.runelite.net/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar", + "size": "3482" + }, + { + "hash": "9264c6931c431e928dc64adc842584d5f57d17b2f3aff29221f2b3fdea673dad", + "name": "guice-4.1.0-no_aop.jar", + "path": "https://mvn.runelite.net/com/google/inject/guice/4.1.0/guice-4.1.0-no_aop.jar", + "size": "428603" + }, + { + "hash": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff", + "name": "javax.inject-1.jar", + "path": "https://mvn.runelite.net/javax/inject/javax.inject/1/javax.inject-1.jar", + "size": "2497" + }, + { + "hash": "0addec670fedcd3f113c5c8091d783280d23f75e3acb841b61a9cdb079376a08", + "name": "aopalliance-1.0.jar", + "path": "https://mvn.runelite.net/aopalliance/aopalliance/1.0/aopalliance-1.0.jar", + "size": "4467" + }, + { + "hash": "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81", + "name": "gson-2.8.5.jar", + "path": "https://mvn.runelite.net/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar", + "size": "241622" + }, + { + "hash": "0467d25f408428824d5c9c09ec60ee1f0bc341d9bf48971a77fd14939a826c83", + "name": "substance-8.0.02.jar", + "path": "https://repo.runelite.net/net/runelite/pushingpixels/substance/8.0.02/substance-8.0.02.jar", + "size": "1589195" + }, + { + "hash": "3214e1c23d549d5d67c91da4da1ef33c5248470bb824f91cbe8f9e0beea59eef", + "name": "trident-1.5.00.jar", + "path": "https://repo.runelite.net/net/runelite/pushingpixels/trident/1.5.00/trident-1.5.00.jar", + "size": "79726" + }, + { + "hash": "d4a57bbc1627da7c391308fd0fe910b83170fb66afd117236a5b111d2db1590b", + "name": "commons-text-1.2.jar", + "path": "https://mvn.runelite.net/org/apache/commons/commons-text/1.2/commons-text-1.2.jar", + "size": "136544" + }, + { + "hash": "6e8dc31e046508d9953c96534edf0c2e0bfe6f468966b5b842b3f87e43b6a847", + "name": "commons-lang3-3.7.jar", + "path": "https://mvn.runelite.net/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar", + "size": "499634" + }, + { + "hash": "e74603dc77b4183f108480279dbbf7fed3ac206069478636406c1fb45e83b31a", + "name": "jogl-all-2.3.2.jar", + "path": "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2.jar", + "size": "3414448" + }, + { + "hash": "8c53b1884cef19309d34fd10a94b010136d9d6de9a88c386f46006fb47acab5d", + "name": "jogl-all-2.3.2-natives-windows-amd64.jar", + "path": "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-windows-amd64.jar", + "size": "240721" + }, + { + "hash": "507a0e6bd1ee4e81c3dfb287783af93775864eec742988d4162f98ce0cbac9d6", + "name": "jogl-all-2.3.2-natives-windows-i586.jar", + "path": "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-windows-i586.jar", + "size": "209445" + }, + { + "hash": "82637302ae9effdf7d6f302e1050ad6aee3b13019914ddda5b502b9faa980216", + "name": "jogl-all-2.3.2-natives-linux-amd64.jar", + "path": "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-linux-amd64.jar", + "size": "224010" + }, + { + "hash": "f474ef2ef01be24ec811d3858b0f4bc5659076975f4a58ddd79abd787e9305c7", + "name": "jogl-all-2.3.2-natives-linux-i586.jar", + "path": "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-linux-i586.jar", + "size": "217274" + }, + { + "hash": "084844543b18f7ff71b4c0437852bd22f0cb68d7e44c2c611c1bbea76f8c6fdf", + "name": "gluegen-rt-2.3.2.jar", + "path": "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2.jar", + "size": "345605" + }, + { + "hash": "3474017422eff384db466bdb56c96c61220c43133a9da6329cf1781bea16c6b6", + "name": "gluegen-rt-2.3.2-natives-windows-amd64.jar", + "path": "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-windows-amd64.jar", + "size": "8159" + }, + { + "hash": "4eeed9fc2ebea5b9dc48a342b9478d127e989a2e1aa7129b512a98ec75cde338", + "name": "gluegen-rt-2.3.2-natives-windows-i586.jar", + "path": "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-windows-i586.jar", + "size": "7577" + }, + { + "hash": "f2dfd1800202059cf7e0294db5d57755147304e6eb220a9277526dbe6842bde2", + "name": "gluegen-rt-2.3.2-natives-linux-amd64.jar", + "path": "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-linux-amd64.jar", + "size": "4149" + }, + { + "hash": "1365d463f98c0abec92f3ad6b35aa4b53a9599a517800cf99fdabea6712ca7ec", + "name": "gluegen-rt-2.3.2-natives-linux-i586.jar", + "path": "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-linux-i586.jar", + "size": "4130" + }, + { + "hash": "7b7ae00e2aa98c3b2b5ac76e793e2c9b752bf51c86c54654dbd473843a25f1aa", + "name": "jbsdiff-1.0.jar", + "path": "https://mvn.runelite.net/io/sigpipe/jbsdiff/1.0/jbsdiff-1.0.jar", + "size": "24589" + }, + { + "hash": "55bbfe26cee9296fd5b7c0d47ce6a00ea4dd572e235b63e9bb4eaf6f802315e4", + "name": "commons-compress-1.5.jar", + "path": "https://mvn.runelite.net/org/apache/commons/commons-compress/1.5/commons-compress-1.5.jar", + "size": "256241" + }, + { + "hash": "fbc9de96a0cc193a125b4008dbc348e9ed54e5e13fc67b8ed40e645d303cc51b", + "name": "jna-4.5.1.jar", + "path": "https://mvn.runelite.net/net/java/dev/jna/jna/4.5.1/jna-4.5.1.jar", + "size": "1440662" + }, + { + "hash": "84c8667555ee8dd91fef44b451419f6f16f71f727d5fc475a10c2663eba83abb", + "name": "jna-platform-4.5.1.jar", + "path": "https://mvn.runelite.net/net/java/dev/jna/jna-platform/4.5.1/jna-platform-4.5.1.jar", + "size": "2327547" + }, + { + "hash": "440c629bec3905eb21dc5965fa38464f160a4cb8f87ca76806cdecc18b2c5992", + "name": "runelite-api-1.5.28-SNAPSHOT.jar", + "path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/runelite-api-1.5.28-SNAPSHOT.jar", + "size": "1019717" + }, + { + "hash": "45e3bcec9e7bae4ca2facd0fbee1f3da5e0700584e8419deed784a95255552c1", + "name": "runescape-api-1.5.28-SNAPSHOT.jar", + "path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/runescape-api-1.5.28-SNAPSHOT.jar", + "size": "56079" + }, + { + "hash": "811aadce9ce35ac638712da86123d4cb99570a9550614931471295cb26f91c36", + "name": "http-api-1.5.28-SNAPSHOT.jar", + "path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/http-api-1.5.28-SNAPSHOT.jar", + "size": "101785" + }, + { + "hash": "f55abda036da75e1af45bd43b9dfa79b2a3d90905be9cb38687c6621597a8165", + "name": "okhttp-3.7.0.jar", + "path": "https://mvn.runelite.net/com/squareup/okhttp3/okhttp/3.7.0/okhttp-3.7.0.jar", + "size": "394987" + }, + { + "hash": "bfe7dfe483c37137966a1690f0c7d0b448ba217902c1fed202aaffdbba3291ae", + "name": "okio-1.12.0.jar", + "path": "https://mvn.runelite.net/com/squareup/okio/okio/1.12.0/okio-1.12.0.jar", + "size": "81088" + }, + { + "hash": "9d4924588d6280c7516db3a4b7298306db5b6f0d1cdf568ce738309b5660f008", + "name": "commons-csv-1.4.jar", + "path": "https://mvn.runelite.net/org/apache/commons/commons-csv/1.4/commons-csv-1.4.jar", + "size": "39978" + }, + { + "hash": "7e26a8d043418f2f22d5f6a3083a9a131817009ee8cd72c004e83b50d1849a7c", + "name": "discord-1.1.jar", + "path": "https://repo.runelite.net/net/runelite/discord/1.1/discord-1.1.jar", + "size": "617294" + }, + { + "hash": "a3cab9293960d1d61968ce1591c87859ddcaa6cb2faca554cc938961c8fb3d3a", + "name": "injected-client-1.5.28-SNAPSHOT.jar", + "path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/injected-client-1.5.28-SNAPSHOT.jar", + "size": "2193046" + } + ], + "client": { + "artifactId": "client", + "classifier": "", + "extension": "jar", + "groupId": "net.runelite", + "properties": "", + "version": "1.5.28" + }, + "clientJvm9Arguments": [ + "-XX:+DisableAttachMechanism", + "-Xmx512m", + "-Xss2m", + "-XX:CompileThreshold=1500", + "-Djna.nosys=true" + ], + "clientJvmArguments": [ + "-XX:+DisableAttachMechanism", + "-Xmx512m", + "-Xss2m", + "-XX:CompileThreshold=1500", + "-Xincgc", + "-XX:+UseConcMarkSweepGC", + "-XX:+UseParNewGC", + "-Djna.nosys=true" + ], + "launcherArguments": [ + "-XX:+DisableAttachMechanism", + "-Drunelite.launcher.nojvm=true", + "-Xmx512m", + "-Xss2m", + "-XX:CompileThreshold=1500", + "-Xincgc", + "-XX:+UseConcMarkSweepGC", + "-XX:+UseParNewGC", + "-Djna.nosys=true" + ] +} \ No newline at end of file diff --git a/cache-client/pom.xml b/cache-client/pom.xml new file mode 100644 index 0000000000..59b213541f --- /dev/null +++ b/cache-client/pom.xml @@ -0,0 +1,70 @@ + + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + cache-client + Cache Client + + + + net.runelite + cache + ${project.version} + + + net.runelite + protocol + ${project.version} + + + + junit + junit + 4.12 + test + + + org.slf4j + slf4j-simple + 1.7.12 + test + + + net.runelite + cache + ${project.version} + test-jar + test + + + diff --git a/cache-client/src/main/java/net/runelite/cache/client/ArchiveResponseHandler.java b/cache-client/src/main/java/net/runelite/cache/client/ArchiveResponseHandler.java new file mode 100644 index 0000000000..f6bffbeba1 --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/ArchiveResponseHandler.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import net.runelite.protocol.api.update.ArchiveResponsePacket; + +public class ArchiveResponseHandler extends SimpleChannelInboundHandler +{ + private final CacheClient client; + + public ArchiveResponseHandler(CacheClient client) + { + this.client = client; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ArchiveResponsePacket archiveResponse) throws Exception + { + client.onFileFinish(archiveResponse.getIndex(), + archiveResponse.getArchive(), + archiveResponse.getData()); + } + +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java b/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java new file mode 100644 index 0000000000..273da5d5fa --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java @@ -0,0 +1,459 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import com.google.common.base.Stopwatch; +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import java.io.IOException; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.CompletableFuture; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.index.ArchiveData; +import net.runelite.cache.index.IndexData; +import net.runelite.protocol.update.decoders.HandshakeResponseDecoder; +import net.runelite.protocol.update.encoders.ArchiveRequestEncoder; +import net.runelite.protocol.update.encoders.EncryptionEncoder; +import net.runelite.protocol.api.update.ArchiveRequestPacket; +import net.runelite.protocol.api.login.HandshakeResponseType; +import net.runelite.cache.util.Crc32; +import net.runelite.protocol.api.handshake.UpdateHandshakePacket; +import net.runelite.protocol.handshake.UpdateHandshakeEncoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CacheClient implements AutoCloseable +{ + private static final Logger logger = LoggerFactory.getLogger(CacheClient.class); + + private static final String HOST = "oldschool1.runescape.com"; + private static final int PORT = 43594; + + private static final int MAX_REQUESTS = 19; // too many and the server closes the conncetion + + private final Store store; // store cache will be written to + private final String host; + private final int clientRevision; + private DownloadWatcher watcher; + + private ClientState state; + + private final EventLoopGroup group = new NioEventLoopGroup(1); + private Channel channel; + + private CompletableFuture handshakeFuture; + private final Queue requests = new ArrayDeque<>(); + + public CacheClient(Store store, int clientRevision) + { + this(store, HOST, clientRevision); + } + + public CacheClient(Store store, String host, int clientRevision) + { + this.store = store; + this.host = host; + this.clientRevision = clientRevision; + } + + public CacheClient(Store store, int clientRevision, DownloadWatcher watcher) + { + this(store, clientRevision); + this.watcher = watcher; + } + + public void connect() + { + Bootstrap b = new Bootstrap(); + b.group(group) + .channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .handler(new ChannelInitializer() + { + @Override + public void initChannel(SocketChannel ch) throws Exception + { + ChannelPipeline p = ch.pipeline(); + + //p.addFirst(new HttpProxyHandler(new InetSocketAddress("runelite.net", 3128))); + p.addLast("decoder", new HandshakeResponseDecoder()); + + p.addLast( + new CacheClientHandler(), + new HandshakeResponseHandler(CacheClient.this), + new ArchiveResponseHandler(CacheClient.this) + ); + + p.addLast( + new UpdateHandshakeEncoder(), + new EncryptionEncoder(), + new ArchiveRequestEncoder() + ); + } + }); + + // Start the client. + ChannelFuture f = b.connect(host, PORT).syncUninterruptibly(); + channel = f.channel(); + } + + public CompletableFuture handshake() + { + UpdateHandshakePacket handshakePacket = new UpdateHandshakePacket(); + handshakePacket.setRevision(getClientRevision()); + + state = ClientState.HANDSHAKING; + + assert handshakeFuture == null; + handshakeFuture = new CompletableFuture<>(); + + channel.writeAndFlush(handshakePacket); + + logger.info("Sent handshake with revision {}", handshakePacket.getRevision()); + + return handshakeFuture; + } + + @Override + public void close() + { + channel.close().syncUninterruptibly(); + group.shutdownGracefully(); + } + + public int getClientRevision() + { + return clientRevision; + } + + public ClientState getState() + { + return state; + } + + void setState(ClientState state) + { + this.state = state; + } + + CompletableFuture getHandshakeFuture() + { + return handshakeFuture; + } + + public List requestIndexes() throws IOException + { + logger.info("Requesting indexes"); + + FileResult result = requestFile(255, 255, true).join(); + result.decompress(null); + + ByteBuf buffer = Unpooled.wrappedBuffer(result.getContents()); + int indexCount = result.getContents().length / 8; + List indexInfo = new ArrayList<>(); + + for (int i = 0; i < indexCount; ++i) + { + int crc = buffer.readInt(); + int revision = buffer.readInt(); + indexInfo.add(new IndexInfo(i, crc, revision)); + } + + return indexInfo; + } + + public void download() throws IOException + { + Stopwatch stopwatch = Stopwatch.createStarted(); + + List indexes = requestIndexes(); + for (IndexInfo indexInfo : indexes) + { + int i = indexInfo.getId(); + int crc = indexInfo.getCrc(); + int revision = indexInfo.getRevision(); + + Index index = store.findIndex(i); + + if (index == null) + { + logger.info("Index {} does not exist, creating", i); + } + else if (index.getRevision() != revision) + { + if (revision < index.getRevision()) + { + logger.warn("Index {} revision is going BACKWARDS! (our revision {}, their revision {})", index.getId(), index.getRevision(), revision); + } + else + { + logger.info("Index {} has the wrong revision (our revision {}, their revision {})", index.getId(), index.getRevision(), revision); + } + } + else if (index.getCrc() != crc) + { + logger.warn("Index {} CRC has changed! (our crc {}, their crc {})", + index.getCrc(), index.getCrc(), crc); + } + else + { + // despite the index being up to date, not everything + // can be downloaded, eg. for tracks. + logger.info("Index {} is up to date", index.getId()); + } + + logger.info("Downloading index {}", i); + + FileResult indexFileResult = requestFile(255, i, true).join(); + indexFileResult.decompress(null); + + logger.info("Downloaded index {}", i); + + if (indexFileResult.getCrc() != crc) + { + logger.warn("Corrupted download for index {}", i); + continue; + } + + IndexData indexData = new IndexData(); + indexData.load(indexFileResult.getContents()); + + if (index == null) + { + index = store.addIndex(i); + } + + // update index settings + index.setProtocol(indexData.getProtocol()); + index.setNamed(indexData.isNamed()); + index.setCrc(crc); + index.setRevision(revision); + + logger.info("Index {} has {} archives", i, indexData.getArchives().length); + + for (ArchiveData ad : indexData.getArchives()) + { + Archive existing = index.getArchive(ad.getId()); + + if (existing != null && existing.getRevision() == ad.getRevision() + && existing.getCrc() == ad.getCrc() + && existing.getNameHash() == ad.getNameHash()) + { + logger.debug("Archive {}/{} in index {} is up to date", + ad.getId(), indexData.getArchives().length, index.getId()); + continue; + } + + if (existing == null) + { + logger.info("Archive {}/{} in index {} is out of date, downloading", + ad.getId(), indexData.getArchives().length, index.getId()); + } + else if (ad.getRevision() < existing.getRevision()) + { + logger.warn("Archive {}/{} in index {} revision is going BACKWARDS! (our revision {}, their revision {})", + ad.getId(), indexData.getArchives().length, index.getId(), + existing.getRevision(), ad.getRevision()); + } + else + { + logger.info("Archive {}/{} in index {} is out of date, downloading. " + + "revision: ours: {} theirs: {}, crc: ours: {} theirs {}, name: ours {} theirs {}", + ad.getId(), indexData.getArchives().length, index.getId(), + existing.getRevision(), ad.getRevision(), + existing.getCrc(), ad.getCrc(), + existing.getNameHash(), ad.getNameHash()); + } + + final Archive archive = existing == null + ? index.addArchive(ad.getId()) + : existing; + + archive.setRevision(ad.getRevision()); + archive.setCrc(ad.getCrc()); + archive.setNameHash(ad.getNameHash()); + + // Add files + archive.setFileData(ad.getFiles()); + + CompletableFuture future = requestFile(index.getId(), ad.getId(), false); + future.handle((fr, ex) -> + { + byte[] data = fr.getCompressedData(); + + Crc32 crc32 = new Crc32(); + crc32.update(data, 0, data.length); + int hash = crc32.getHash(); + + if (hash != archive.getCrc()) + { + logger.warn("crc mismatch on downloaded archive {}/{}: {} != {}", + archive.getIndex().getId(), archive.getArchiveId(), + hash, archive.getCrc()); + throw new RuntimeException("crc mismatch"); + } + + if (watcher != null) + { + watcher.downloadComplete(archive, data); + } + else + { + try + { + Storage storage = store.getStorage(); + storage.saveArchive(archive, data); + } + catch (IOException ex1) + { + logger.warn("unable to save archive data", ex1); + } + } + return null; + }); + } + } + + // flush any pending requests + channel.flush(); + + while (!requests.isEmpty()) + { + // wait for pending requests + synchronized (this) + { + try + { + wait(); + } + catch (InterruptedException ex) + { + logger.warn(null, ex); + } + } + } + + stopwatch.stop(); + logger.info("Download completed in {}", stopwatch); + } + + private synchronized CompletableFuture requestFile(int index, int fileId, boolean flush) + { + if (state != ClientState.CONNECTED) + { + throw new IllegalStateException("Can't request files until connected!"); + } + + if (!flush) + { + while (requests.size() >= MAX_REQUESTS) + { + channel.flush(); + + try + { + wait(); + } + catch (InterruptedException ex) + { + logger.warn("interrupted while waiting for requests", ex); + } + } + } + + ArchiveRequestPacket archiveRequest = new ArchiveRequestPacket(); + archiveRequest.setPriority(false); + archiveRequest.setIndex(index); + archiveRequest.setArchive(fileId); + + CompletableFuture future = new CompletableFuture<>(); + PendingFileRequest pf = new PendingFileRequest(index, + fileId, future); + + logger.trace("Sending request for {}/{}", index, fileId); + + requests.add(pf); + + if (!flush) + { + channel.write(archiveRequest); + } + else + { + channel.writeAndFlush(archiveRequest); + } + + return future; + } + + private PendingFileRequest findRequest(int index, int file) + { + for (PendingFileRequest pr : requests) + { + if (pr.getIndex() == index && pr.getArchive() == file) + { + return pr; + } + } + return null; + } + + protected synchronized void onFileFinish(int index, int file, byte[] compressedData) + { + PendingFileRequest pr = findRequest(index, file); + + if (pr == null) + { + logger.warn("File download {}/{} with no pending request", index, file); + return; + } + + requests.remove(pr); + + notify(); + + FileResult result = new FileResult(index, file, compressedData); + + logger.debug("File download finished for index {} file {}, length {}", index, file, compressedData.length); + + pr.getFuture().complete(result); + } +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/CacheClientHandler.java b/cache-client/src/main/java/net/runelite/cache/client/CacheClientHandler.java new file mode 100644 index 0000000000..9afe8f976b --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/CacheClientHandler.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CacheClientHandler extends ChannelInboundHandlerAdapter +{ + private static final Logger logger = LoggerFactory.getLogger(CacheClientHandler.class); + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception + { + logger.warn("Channel has gone inactive"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) + { + // Close the connection when an exception is raised. + logger.warn(null, cause); + ctx.close(); + } +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/ClientState.java b/cache-client/src/main/java/net/runelite/cache/client/ClientState.java new file mode 100644 index 0000000000..5c859aa61c --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/ClientState.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +public enum ClientState +{ + HANDSHAKING, + CONNECTED +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/DownloadWatcher.java b/cache-client/src/main/java/net/runelite/cache/client/DownloadWatcher.java new file mode 100644 index 0000000000..3924c74541 --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/DownloadWatcher.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import net.runelite.cache.fs.Archive; + +@FunctionalInterface +public interface DownloadWatcher +{ + void downloadComplete(Archive archive, byte[] data); +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/FileResult.java b/cache-client/src/main/java/net/runelite/cache/client/FileResult.java new file mode 100644 index 0000000000..2c5046af62 --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/FileResult.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import java.io.IOException; +import net.runelite.cache.fs.Container; + +public class FileResult +{ + private final int index; + private final int fileId; + private final byte[] compressedData; + + private byte[] contents; + private int revision; + private int crc; + private int compression; // compression method used by archive data + + public FileResult(int index, int fileId, byte[] compressedData) + { + this.index = index; + this.fileId = fileId; + this.compressedData = compressedData; + } + + public int getIndex() + { + return index; + } + + public int getFileId() + { + return fileId; + } + + public byte[] getCompressedData() + { + return compressedData; + } + + public void decompress(int[] keys) throws IOException + { + Container res = Container.decompress(compressedData, keys); + + contents = res.data; + revision = res.revision; + crc = res.crc; + compression = res.compression; + } + + public byte[] getContents() + { + return contents; + } + + public int getRevision() + { + return revision; + } + + public int getCrc() + { + return crc; + } + + public int getCompression() + { + return compression; + } +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/HandshakeResponseHandler.java b/cache-client/src/main/java/net/runelite/cache/client/HandshakeResponseHandler.java new file mode 100644 index 0000000000..bcbb01bafb --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/HandshakeResponseHandler.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.SimpleChannelInboundHandler; +import java.util.concurrent.CompletableFuture; +import net.runelite.protocol.update.decoders.ArchiveResponseDecoder; +import net.runelite.protocol.api.update.EncryptionPacket; +import net.runelite.protocol.api.handshake.HandshakeResponsePacket; +import net.runelite.protocol.api.login.HandshakeResponseType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HandshakeResponseHandler extends SimpleChannelInboundHandler +{ + private static final Logger logger = LoggerFactory.getLogger(HandshakeResponseHandler.class); + + private final CacheClient client; + + public HandshakeResponseHandler(CacheClient client) + { + this.client = client; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, HandshakeResponsePacket handshakeResponse) throws Exception + { + Channel channel = ctx.channel(); + ChannelPipeline p = ctx.pipeline(); + CompletableFuture handshakeFuture = client.getHandshakeFuture(); + + assert handshakeFuture != null; + + if (handshakeResponse.getResponse() != HandshakeResponseType.RESPONSE_OK) + { + logger.warn("Non-ok response from server {}", handshakeResponse.getResponse()); + handshakeFuture.complete(handshakeResponse.getResponse()); + ctx.close(); + return; + } + + // Send encryption packet + EncryptionPacket encryptionPacket = new EncryptionPacket(); + encryptionPacket.setKey((byte) 0); + channel.writeAndFlush(encryptionPacket); + + client.setState(ClientState.CONNECTED); + + logger.info("Client is now connected!"); + + p.replace("decoder", "decoder", new ArchiveResponseDecoder()); + + handshakeFuture.complete(handshakeResponse.getResponse()); + } + +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/IndexInfo.java b/cache-client/src/main/java/net/runelite/cache/client/IndexInfo.java new file mode 100644 index 0000000000..b6f088e84b --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/IndexInfo.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +public class IndexInfo +{ + private final int id; + private final int crc; + private final int revision; + + public IndexInfo(int id, int crc, int revision) + { + this.id = id; + this.crc = crc; + this.revision = revision; + } + + @Override + public String toString() + { + return "IndexInfo{" + "id=" + id + ", crc=" + crc + ", revision=" + revision + '}'; + } + + @Override + public int hashCode() + { + int hash = 5; + hash = 71 * hash + this.id; + hash = 71 * hash + this.crc; + hash = 71 * hash + this.revision; + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final IndexInfo other = (IndexInfo) obj; + if (this.id != other.id) + { + return false; + } + if (this.crc != other.crc) + { + return false; + } + if (this.revision != other.revision) + { + return false; + } + return true; + } + + public int getId() + { + return id; + } + + public int getCrc() + { + return crc; + } + + public int getRevision() + { + return revision; + } +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/PendingFileRequest.java b/cache-client/src/main/java/net/runelite/cache/client/PendingFileRequest.java new file mode 100644 index 0000000000..d07dc4f606 --- /dev/null +++ b/cache-client/src/main/java/net/runelite/cache/client/PendingFileRequest.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import java.util.concurrent.CompletableFuture; + +public class PendingFileRequest +{ + private final int index; + private final int archive; + private final CompletableFuture future; + + public PendingFileRequest(int index, int archive, CompletableFuture future) + { + this.index = index; + this.archive = archive; + this.future = future; + } + + public int getIndex() + { + return index; + } + + public int getArchive() + { + return archive; + } + + public CompletableFuture getFuture() + { + return future; + } +} diff --git a/cache-client/src/test/java/net/runelite/cache/client/CacheClientTest.java b/cache-client/src/test/java/net/runelite/cache/client/CacheClientTest.java new file mode 100644 index 0000000000..f5ba5d6824 --- /dev/null +++ b/cache-client/src/test/java/net/runelite/cache/client/CacheClientTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import java.io.File; +import java.util.concurrent.CompletableFuture; +import net.runelite.cache.CacheProperties; +import net.runelite.cache.fs.Store; +import net.runelite.protocol.api.login.HandshakeResponseType; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.impl.SimpleLogger; + +public class CacheClientTest +{ + private static final Logger logger = LoggerFactory.getLogger(CacheClientTest.class); + + @Before + public void before() + { + System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE"); + } + + @Test + @Ignore + public void test() throws Exception + { + try (Store store = new Store(new File("D:\\rs\\07\\temp\\cache"))) + { + store.load(); + + CacheClient c = new CacheClient(store, CacheProperties.getRsVersion()); + c.connect(); + CompletableFuture handshake = c.handshake(); + + HandshakeResponseType result = handshake.get(); + logger.info("Handshake result: {}", result); + + Assert.assertEquals(HandshakeResponseType.RESPONSE_OK, result); + + c.download(); + + c.close(); + + store.save(); + } + } +} diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml new file mode 100644 index 0000000000..4eb3f28217 --- /dev/null +++ b/cache-updater/pom.xml @@ -0,0 +1,105 @@ + + + + 4.0.0 + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + Cache Updater + cache-updater + + + 1.5.6.RELEASE + + + + + org.springframework.boot + spring-boot-starter + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-jdbc + ${spring.boot.version} + + + org.springframework.boot + spring-boot-devtools + ${spring.boot.version} + true + + + mysql + mysql-connector-java + 5.1.45 + + + net.runelite + cache-client + ${project.version} + + + org.sql2o + sql2o + 1.5.4 + + + io.minio + minio + 3.0.6 + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + spring-boot + net.runelite.cache.updater.CacheUpdater + + + + + + + \ No newline at end of file diff --git a/cache-updater/schema.sql b/cache-updater/schema.sql new file mode 100644 index 0000000000..a4e063e1a6 --- /dev/null +++ b/cache-updater/schema.sql @@ -0,0 +1,118 @@ +-- MySQL dump 10.16 Distrib 10.2.9-MariaDB, for Linux (x86_64) +-- +-- Host: localhost Database: cache +-- ------------------------------------------------------ +-- Server version 10.2.9-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `archive` +-- + +DROP TABLE IF EXISTS `archive`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `archive` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `archiveId` int(11) NOT NULL, + `nameHash` int(11) NOT NULL, + `crc` int(11) NOT NULL, + `revision` int(11) NOT NULL, + `hash` binary(32) NOT NULL, + PRIMARY KEY (`id`), + KEY `archive_revision` (`archiveId`,`revision`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `cache` +-- + +DROP TABLE IF EXISTS `cache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `cache` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `revision` int(11) NOT NULL, + `date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `revision_date` (`revision`,`date`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `file` +-- + +DROP TABLE IF EXISTS `file`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `file` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `archive` int(11) NOT NULL, + `fileId` int(11) NOT NULL, + `nameHash` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `archive_file` (`archive`,`fileId`), + CONSTRAINT `file_ibfk_1` FOREIGN KEY (`archive`) REFERENCES `archive` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `index` +-- + +DROP TABLE IF EXISTS `index`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `index` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cache` int(11) NOT NULL, + `indexId` int(11) NOT NULL, + `crc` int(11) NOT NULL, + `revision` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `indexId` (`cache`,`indexId`,`revision`,`crc`) USING BTREE, + CONSTRAINT `index_ibfk_1` FOREIGN KEY (`cache`) REFERENCES `cache` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `index_archive` +-- + +DROP TABLE IF EXISTS `index_archive`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `index_archive` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `index` int(11) NOT NULL, + `archive` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `idx_index_archive` (`index`,`archive`) USING BTREE, + KEY `archive` (`archive`) USING BTREE, + CONSTRAINT `index_archive_ibfk_1` FOREIGN KEY (`index`) REFERENCES `index` (`id`), + CONSTRAINT `index_archive_ibfk_2` FOREIGN KEY (`archive`) REFERENCES `archive` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2018-02-02 21:55:48 diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/CacheConfiguration.java b/cache-updater/src/main/java/net/runelite/cache/updater/CacheConfiguration.java new file mode 100644 index 0000000000..229ea1d268 --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/CacheConfiguration.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater; + +import io.minio.MinioClient; +import io.minio.errors.InvalidEndpointException; +import io.minio.errors.InvalidPortException; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import javax.sql.DataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.sql2o.Sql2o; +import org.sql2o.converters.Converter; +import org.sql2o.quirks.NoQuirks; + +@Configuration +public class CacheConfiguration +{ + @Value("${minio.endpoint}") + private String minioUrl; + + @Value("${minio.accesskey}") + private String minioAccessKey; + + @Value("${minio.secretkey}") + private String minioSecretKey; + + @Bean + @ConfigurationProperties(prefix = "datasource.runelite-cache") + public DataSource dataSource() + { + return DataSourceBuilder.create().build(); + } + + @Bean + @Qualifier("Runelite Cache SQL2O") + public Sql2o sql2o(DataSource dataSource) + { + Map converters = new HashMap<>(); + converters.put(Instant.class, new InstantConverter()); + return new Sql2o(dataSource, new NoQuirks(converters)); + } + + @Bean + public MinioClient minioClient() throws InvalidEndpointException, InvalidPortException + { + return new MinioClient(minioUrl, minioAccessKey, minioSecretKey); + } +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/CacheDAO.java b/cache-updater/src/main/java/net/runelite/cache/updater/CacheDAO.java new file mode 100644 index 0000000000..2834e5bb1e --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/CacheDAO.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater; + +import java.time.Instant; +import java.util.List; +import net.runelite.cache.updater.beans.ArchiveEntry; +import net.runelite.cache.updater.beans.CacheEntry; +import net.runelite.cache.updater.beans.IndexEntry; +import org.sql2o.Connection; +import org.sql2o.Query; +import org.sql2o.ResultSetIterable; + +class CacheDAO +{ + // cache prepared statements for high volume queries + private Query associateArchive; + private Query findArchive, insertArchive; + private Query associateFile; + + public CacheEntry findMostRecent(Connection con) + { + return con.createQuery("select id, revision, date from cache order by revision desc, date desc limit 1") + .executeAndFetchFirst(CacheEntry.class); + } + + public List findIndexesForCache(Connection con, CacheEntry cache) + { + return con.createQuery("select id, indexId, crc, revision from `index` where cache = :cache") + .addParameter("cache", cache.getId()) + .executeAndFetch(IndexEntry.class); + } + + public ResultSetIterable findArchivesForIndex(Connection con, IndexEntry indexEntry) + { + return con.createQuery("select archive.id, archive.archiveId, archive.nameHash," + + " archive.crc, archive.revision, archive.hash from index_archive " + + "join archive on index_archive.archive = archive.id " + + "where index_archive.index = :id") + .addParameter("id", indexEntry.getId()) + .executeAndFetchLazy(ArchiveEntry.class); + } + + public CacheEntry createCache(Connection con, int revision, Instant date) + { + int cacheId = con.createQuery("insert into cache (revision, date) values (:revision, :date)") + .addParameter("revision", revision) + .addParameter("date", date) + .executeUpdate() + .getKey(int.class); + + CacheEntry entry = new CacheEntry(); + entry.setId(cacheId); + entry.setRevision(revision); + entry.setDate(date); + return entry; + } + + public IndexEntry createIndex(Connection con, CacheEntry cache, int indexId, int crc, int revision) + { + int id = con.createQuery("insert into `index` (cache, indexId, crc, revision) values (:cache, :indexId, :crc, :revision)") + .addParameter("cache", cache.getId()) + .addParameter("indexId", indexId) + .addParameter("crc", crc) + .addParameter("revision", revision) + .executeUpdate() + .getKey(int.class); + + IndexEntry entry = new IndexEntry(); + entry.setId(id); + entry.setIndexId(indexId); + entry.setCrc(crc); + entry.setRevision(revision); + return entry; + } + + public void associateArchiveToIndex(Connection con, ArchiveEntry archive, IndexEntry index) + { + if (associateArchive == null) + { + associateArchive = con.createQuery("insert into index_archive (`index`, archive) values (:index, :archive)"); + } + associateArchive + .addParameter("index", index.getId()) + .addParameter("archive", archive.getId()) + .executeUpdate(); + } + + public ArchiveEntry findArchive(Connection con, IndexEntry index, + int archiveId, int nameHash, int crc, int revision) + { + if (findArchive == null) + { + findArchive = con.createQuery("select distinct archive.id, archive.archiveId, archive.nameHash," + + " archive.crc, archive.revision, archive.hash from archive " + + " join index_archive on index_archive.archive = archive.id" + + " join `index` on index.id = index_archive.index" + + " where archive.archiveId = :archiveId" + + " and archive.nameHash = :nameHash" + + " and archive.crc = :crc" + + " and archive.revision = :revision" + + " and index.indexId = :indexId"); + } + + ArchiveEntry entry = findArchive + .addParameter("archiveId", archiveId) + .addParameter("nameHash", nameHash) + .addParameter("crc", crc) + .addParameter("revision", revision) + .addParameter("indexId", index.getIndexId()) + .executeAndFetchFirst(ArchiveEntry.class); + return entry; + } + + public ArchiveEntry createArchive(Connection con, IndexEntry index, + int archiveId, int nameHash, int crc, int revision, byte[] hash) + { + if (insertArchive == null) + { + insertArchive = con.createQuery("insert into archive (archiveId, nameHash, crc, revision, hash) values " + + "(:archiveId, :nameHash, :crc, :revision, :hash)"); + } + + int id = insertArchive + .addParameter("archiveId", archiveId) + .addParameter("nameHash", nameHash) + .addParameter("crc", crc) + .addParameter("revision", revision) + .addParameter("hash", hash) + .executeUpdate() + .getKey(int.class); + + ArchiveEntry entry = new ArchiveEntry(); + entry.setId(id); + entry.setArchiveId(archiveId); + entry.setNameHash(nameHash); + entry.setCrc(crc); + entry.setRevision(revision); + entry.setHash(hash); + return entry; + } + + public void associateFileToArchive(Connection con, ArchiveEntry archive, int fileId, int nameHash) + { + if (associateFile == null) + { + associateFile = con.createQuery("insert into file (archive, fileId, nameHash) values (:archive, :fileId, :nameHash)"); + } + associateFile + .addParameter("archive", archive.getId()) + .addParameter("fileId", fileId) + .addParameter("nameHash", nameHash) + .executeUpdate(); + } +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/CacheStorage.java b/cache-updater/src/main/java/net/runelite/cache/updater/CacheStorage.java new file mode 100644 index 0000000000..cac605da09 --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/CacheStorage.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater; + +import java.io.IOException; +import java.util.List; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.index.FileData; +import net.runelite.cache.updater.beans.ArchiveEntry; +import net.runelite.cache.updater.beans.CacheEntry; +import net.runelite.cache.updater.beans.IndexEntry; +import org.sql2o.Connection; +import org.sql2o.ResultSetIterable; + +public class CacheStorage implements Storage +{ + private CacheEntry cacheEntry; + private final CacheDAO cacheDao; + private final Connection con; + + public CacheStorage(CacheEntry cacheEntry, CacheDAO cacheDao, Connection con) + { + this.cacheEntry = cacheEntry; + this.cacheDao = cacheDao; + this.con = con; + } + + public CacheEntry getCacheEntry() + { + return cacheEntry; + } + + public void setCacheEntry(CacheEntry cacheEntry) + { + this.cacheEntry = cacheEntry; + } + + @Override + public void init(Store store) throws IOException + { + } + + @Override + public void close() throws IOException + { + } + + @Override + public void load(Store store) throws IOException + { + List indexes = cacheDao.findIndexesForCache(con, cacheEntry); + for (IndexEntry indexEntry : indexes) + { + Index index = store.addIndex(indexEntry.getIndexId()); + index.setCrc(indexEntry.getCrc()); + index.setRevision(indexEntry.getRevision()); + + try (ResultSetIterable archives = cacheDao.findArchivesForIndex(con, indexEntry)) + { + for (ArchiveEntry archiveEntry : archives) + { + if (index.getArchive(archiveEntry.getArchiveId()) != null) + { + throw new IOException("Duplicate archive " + archiveEntry + " on " + indexEntry); + } + + Archive archive = index.addArchive(archiveEntry.getArchiveId()); + archive.setNameHash(archiveEntry.getNameHash()); + archive.setCrc(archiveEntry.getCrc()); + archive.setRevision(archiveEntry.getRevision()); + archive.setHash(archiveEntry.getHash()); + + // File data is not necessary for cache updating + } + } + } + } + + @Override + public void save(Store store) throws IOException + { + for (Index index : store.getIndexes()) + { + IndexEntry entry = cacheDao.createIndex(con, cacheEntry, index.getId(), index.getCrc(), index.getRevision()); + + for (Archive archive : index.getArchives()) + { + ArchiveEntry archiveEntry = cacheDao.findArchive(con, entry, archive.getArchiveId(), + archive.getNameHash(), archive.getCrc(), archive.getRevision()); + if (archiveEntry == null) + { + byte[] hash = archive.getHash(); + archiveEntry = cacheDao.createArchive(con, entry, archive.getArchiveId(), + archive.getNameHash(), archive.getCrc(), archive.getRevision(), hash); + + for (FileData file : archive.getFileData()) + { + cacheDao.associateFileToArchive(con, archiveEntry, file.getId(), file.getNameHash()); + } + } + + cacheDao.associateArchiveToIndex(con, archiveEntry, entry); + } + } + } + + @Override + public byte[] loadArchive(Archive archive) throws IOException + { + throw new UnsupportedOperationException(); + } + + @Override + public void saveArchive(Archive archive, byte[] data) throws IOException + { + throw new UnsupportedOperationException(); + } + +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/CacheUpdater.java b/cache-updater/src/main/java/net/runelite/cache/updater/CacheUpdater.java new file mode 100644 index 0000000000..1a8f81c5ec --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/CacheUpdater.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater; + +import io.minio.MinioClient; +import io.minio.errors.InvalidEndpointException; +import io.minio.errors.InvalidPortException; +import java.io.IOException; +import java.time.Instant; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import net.runelite.cache.client.CacheClient; +import net.runelite.cache.client.IndexInfo; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Store; +import net.runelite.cache.updater.beans.CacheEntry; +import net.runelite.cache.updater.beans.IndexEntry; +import net.runelite.http.api.RuneLiteAPI; +import net.runelite.protocol.api.login.HandshakeResponseType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.sql2o.Connection; +import org.sql2o.Sql2o; + +@SpringBootApplication +public class CacheUpdater implements CommandLineRunner +{ + private static final Logger logger = LoggerFactory.getLogger(CacheUpdater.class); + + private final Sql2o sql2o; + private final MinioClient minioClient; + + @Value("${minio.bucket}") + private String minioBucket; + + @Autowired + public CacheUpdater( + @Qualifier("Runelite Cache SQL2O") Sql2o sql2o, + MinioClient minioClient + ) + { + this.sql2o = sql2o; + this.minioClient = minioClient; + } + + public void update() throws IOException, InvalidEndpointException, InvalidPortException, InterruptedException + { + int rsVersion = RuneLiteAPI.getRsVersion(); + + try (Connection con = sql2o.beginTransaction()) + { + CacheDAO cacheDao = new CacheDAO(); + CacheEntry cache = cacheDao.findMostRecent(con); + boolean created = false; + if (cache == null) + { + created = true; + cache = cacheDao.createCache(con, rsVersion, Instant.now()); + } + + CacheStorage storage = new CacheStorage(cache, cacheDao, con); + Store store = new Store(storage); + store.load(); + + ExecutorService executor = Executors.newSingleThreadExecutor(); + + CacheClient client = new CacheClient(store, rsVersion, + (Archive archive, byte[] data) -> executor.submit(new CacheUploader(minioClient, minioBucket, archive, data))); + + client.connect(); + HandshakeResponseType result = client.handshake().join(); + + if (result != HandshakeResponseType.RESPONSE_OK) + { + logger.warn("Out of date!"); + return; + } + + List indexes = client.requestIndexes(); + List entries = cacheDao.findIndexesForCache(con, cache); + + if (!checkOutOfDate(indexes, entries)) + { + logger.info("All up to date."); + return; + } + + client.download(); + + CacheEntry newCache = created ? cache : cacheDao.createCache(con, rsVersion, Instant.now()); + + storage.setCacheEntry(newCache); + store.save(); + + // ensure objects are added to the store before they become + // visible in the database + executor.shutdown(); + while (!executor.awaitTermination(1, TimeUnit.SECONDS)) + { + logger.debug("Waiting for termination of executor..."); + } + + // commit database + con.commit(); + } + } + + private boolean checkOutOfDate(List indexes, List dbIndexes) + { + if (indexes.size() != dbIndexes.size()) + { + return true; + } + + for (int i = 0; i < indexes.size(); ++i) + { + IndexInfo ii = indexes.get(i); + IndexEntry ie = dbIndexes.get(i); + + if (ii.getId() != ie.getIndexId() + || ii.getRevision() != ie.getRevision() + || ii.getCrc() != ie.getCrc()) + { + return true; + } + } + + return false; + } + + @Override + public void run(String... args) throws Exception + { + update(); + } + + public static void main(String[] args) + { + SpringApplication.run(CacheUpdater.class, args).close(); + System.exit(0); + } + +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/CacheUploader.java b/cache-updater/src/main/java/net/runelite/cache/updater/CacheUploader.java new file mode 100644 index 0000000000..ed685a9034 --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/CacheUploader.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater; + +import com.google.common.hash.Hashing; +import com.google.common.io.BaseEncoding; +import io.minio.MinioClient; +import io.minio.errors.ErrorResponseException; +import io.minio.errors.InsufficientDataException; +import io.minio.errors.InternalException; +import io.minio.errors.InvalidArgumentException; +import io.minio.errors.InvalidBucketNameException; +import io.minio.errors.NoResponseException; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import net.runelite.cache.fs.Archive; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xmlpull.v1.XmlPullParserException; + +public class CacheUploader implements Runnable +{ + private static final Logger logger = LoggerFactory.getLogger(CacheUploader.class); + + private final MinioClient minioClient; + private final String minioBucket; + private final Archive archive; + private final byte[] data; + + public CacheUploader(MinioClient minioClient, String minioBucket, Archive archive, byte[] data) + { + this.minioClient = minioClient; + this.minioBucket = minioBucket; + this.archive = archive; + this.data = data; + } + + @Override + public void run() + { + byte[] hash = Hashing.sha256().hashBytes(data).asBytes(); + String hashStr = BaseEncoding.base16().encode(hash); + + archive.setHash(hash); + + String path = new StringBuilder() + .append(hashStr, 0, 2) + .append('/') + .append(hashStr.substring(2)) + .toString(); + + try + { + try (InputStream in = minioClient.getObject(minioBucket, path)) + { + return; // already exists + } + catch (ErrorResponseException ex) + { + // doesn't exist + } + + minioClient.putObject(minioBucket, path, new ByteArrayInputStream(data), data.length, "binary/octet-stream"); + } + catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidArgumentException | InvalidBucketNameException | NoResponseException | IOException | InvalidKeyException | NoSuchAlgorithmException | XmlPullParserException ex) + { + logger.warn("unable to upload data to store", ex); + } + } + +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/InstantConverter.java b/cache-updater/src/main/java/net/runelite/cache/updater/InstantConverter.java new file mode 100644 index 0000000000..953fe9bd3a --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/InstantConverter.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater; + +import java.sql.Timestamp; +import java.time.Instant; +import org.sql2o.converters.Converter; +import org.sql2o.converters.ConverterException; + +public class InstantConverter implements Converter +{ + @Override + public Instant convert(Object val) throws ConverterException + { + Timestamp ts = (Timestamp) val; + return ts.toInstant(); + } + + @Override + public Object toDatabaseParam(Instant val) + { + return Timestamp.from(val); + } + +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/beans/ArchiveEntry.java b/cache-updater/src/main/java/net/runelite/cache/updater/beans/ArchiveEntry.java new file mode 100644 index 0000000000..9bacab75b8 --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/beans/ArchiveEntry.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater.beans; + +import lombok.Data; + +@Data +public class ArchiveEntry +{ + private int id; + private int archiveId; + private int nameHash; + private int crc; + private int revision; + private byte[] hash; +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/beans/CacheEntry.java b/cache-updater/src/main/java/net/runelite/cache/updater/beans/CacheEntry.java new file mode 100644 index 0000000000..c9081cd883 --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/beans/CacheEntry.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater.beans; + +import java.time.Instant; +import lombok.Data; + +@Data +public class CacheEntry +{ + private int id; + private int revision; + private Instant date; +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/beans/FileEntry.java b/cache-updater/src/main/java/net/runelite/cache/updater/beans/FileEntry.java new file mode 100644 index 0000000000..bb43c2a189 --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/beans/FileEntry.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater.beans; + +import lombok.Data; + +@Data +public class FileEntry +{ + private int id; + private int archiveId; + private int fileId; + private int nameHash; +} diff --git a/cache-updater/src/main/java/net/runelite/cache/updater/beans/IndexEntry.java b/cache-updater/src/main/java/net/runelite/cache/updater/beans/IndexEntry.java new file mode 100644 index 0000000000..a5a0748f18 --- /dev/null +++ b/cache-updater/src/main/java/net/runelite/cache/updater/beans/IndexEntry.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.updater.beans; + +import lombok.Data; + +@Data +public class IndexEntry +{ + private int id; + private int indexId; + private int crc; + private int revision; +} diff --git a/cache-updater/src/main/resources/application.yaml b/cache-updater/src/main/resources/application.yaml new file mode 100644 index 0000000000..df290d680f --- /dev/null +++ b/cache-updater/src/main/resources/application.yaml @@ -0,0 +1,16 @@ +--- +# Database +datasource: + runelite-cache: + driverClassName: com.mysql.jdbc.Driver + type: com.mysql.jdbc.jdbc2.optional.MysqlDataSource + url: jdbc:mysql://localhost/runelite-cache + username: runelite + password: runelite + +# Minio client storage for cache +minio: + endpoint: http://localhost:9000 + accesskey: AM54M27O4WZK65N6F8IP + secretkey: /PZCxzmsJzwCHYlogcymuprniGCaaLUOET2n6yMP + bucket: runelite diff --git a/cache/pom.xml b/cache/pom.xml new file mode 100644 index 0000000000..9fd6153b3b --- /dev/null +++ b/cache/pom.xml @@ -0,0 +1,171 @@ + + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + cache + Cache + + + 165 + + 4.6 + + + + + net.runelite + http-api + ${project.version} + + + + com.google.guava + guava + + + org.slf4j + slf4j-api + + + org.apache.commons + commons-compress + 1.10 + + + com.google.code.gson + gson + + + io.netty + netty-buffer + 4.1.0.Final + + + org.antlr + antlr4-runtime + ${antlr4.version} + + + commons-cli + commons-cli + 1.3.1 + + + org.projectlombok + lombok + provided + + + + junit + junit + 4.12 + test + + + org.slf4j + slf4j-simple + 1.7.12 + test + + + net.runelite.rs + cache + ${cache.version} + test + + + + + + + src/test/resources + true + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + -Xmx2048m + + ${cache.tmpdir} + + + + + maven-assembly-plugin + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + org.antlr + antlr4-maven-plugin + ${antlr4.version} + + + process-resources + + antlr4 + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + + + + diff --git a/cache/src/main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 b/cache/src/main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 new file mode 100644 index 0000000000..f8b33e8676 --- /dev/null +++ b/cache/src/main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +grammar rs2asm; + +prog: NEWLINE* (header NEWLINE+)* (line NEWLINE+)+ ; + +header: id | int_stack_count | string_stack_count | int_var_count | string_var_count ; + +id: '.id ' id_value ; +int_stack_count: '.int_stack_count ' int_stack_value ; +string_stack_count: '.string_stack_count ' string_stack_value ; +int_var_count: '.int_var_count ' int_var_value ; +string_var_count: '.string_var_count ' string_var_value ; + +id_value: INT ; +int_stack_value: INT ; +string_stack_value: INT ; +int_var_value: INT ; +string_var_value: INT ; + +line: instruction | label | switch_lookup ; +instruction: instruction_name instruction_operand ; +label: IDENTIFIER ':' ; + +instruction_name: name_string | name_opcode ; +name_string: IDENTIFIER ; +name_opcode: INT ; + +instruction_operand: operand_int | operand_qstring | operand_label | ; +operand_int: INT ; +operand_qstring: QSTRING ; +operand_label: IDENTIFIER ; + +switch_lookup: switch_key ':' switch_value ; +switch_key: INT ; +switch_value: IDENTIFIER ; + +NEWLINE: ( '\r' | '\n' )+ ; +INT: '-'? [0-9]+ ; +QSTRING: '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"' ; +IDENTIFIER: [a-zA-Z0-9_]+ ; +COMMENT: ';' ~( '\r' | '\n' )* -> channel(HIDDEN) ; + +WS: (' ' | '\t')+ -> channel(HIDDEN) ; \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Calls.java b/cache/src/main/java/net/runelite/cache/AreaManager.java similarity index 51% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Calls.java rename to cache/src/main/java/net/runelite/cache/AreaManager.java index 5cba373d95..96967b84b6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Calls.java +++ b/cache/src/main/java/net/runelite/cache/AreaManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,62 +22,56 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.barbarianassault; +package net.runelite.cache; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import net.runelite.cache.definitions.AreaDefinition; +import net.runelite.cache.definitions.loaders.AreaLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; -public enum Calls -{ //Attacker Calls - RED_EGG("Red egg", "Tell-red"), - GREEN_EGG("Green egg", "Tell-green"), - BLUE_EGG("Blue egg", "Tell-blue"), - //Collector Calls - CONTROLLED("Controlled/Bullet/Wind", "Tell-controlled"), - ACCURATE("Accurate/Field/Water", "Tell-accurate"), - AGGRESSIVE("Aggressive/Blunt/Earth", "Tell-aggressive"), - DEFENSIVE("Defensive/Barbed/Fire", "Tell-defensive"), - //Healer Calls - TOFU("Tofu", "Tell-tofu"), - CRACKERS("Crackers", "Tell-crackers"), - WORMS("Worms", "Tell-worms"), - //Defender Calls - POIS_WORMS("Pois. Worms", "Tell-worms"), - POIS_TOFU("Pois. Tofu", "Tell-tofu"), - POIS_MEAT("Pois. Meat", "Tell-meat"); +public class AreaManager +{ + private final Store store; + private final Map areas = new HashMap<>(); - private final String call; - private final String option; - - private static final Map CALL_MENU = new HashMap<>(); - - static + public AreaManager(Store store) { - for (Calls s : values()) + this.store = store; + } + + public void load() throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.AREA.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) { - CALL_MENU.put(s.getCall(), s.getOption()); + AreaLoader loader = new AreaLoader(); + AreaDefinition area = loader.load(file.getContents(), file.getFileId()); + areas.put(area.id, area); } } - Calls(String call, String option) + public Collection getAreas() { - this.call = call; - this.option = option; + return Collections.unmodifiableCollection(areas.values()); } - public String getCall() + public AreaDefinition getArea(int areaId) { - return call; + return areas.get(areaId); } - - public String getOption() - { - return option; - } - - public static String getOption(String call) - { - return CALL_MENU.get(call); - } - -} \ No newline at end of file +} diff --git a/cache/src/main/java/net/runelite/cache/Cache.java b/cache/src/main/java/net/runelite/cache/Cache.java new file mode 100644 index 0000000000..0f2c2d36b1 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/Cache.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import net.runelite.cache.fs.Store; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +public class Cache +{ + public static void main(String[] args) throws IOException + { + Options options = new Options(); + + options.addOption("c", "cache", true, "cache base"); + + options.addOption(null, "items", true, "directory to dump items to"); + options.addOption(null, "npcs", true, "directory to dump npcs to"); + options.addOption(null, "objects", true, "directory to dump objects to"); + options.addOption(null, "sprites", true, "directory to dump sprites to"); + + CommandLineParser parser = new DefaultParser(); + CommandLine cmd; + try + { + cmd = parser.parse(options, args); + } + catch (ParseException ex) + { + System.err.println("Error parsing command line options: " + ex.getMessage()); + System.exit(-1); + return; + } + + String cache = cmd.getOptionValue("cache"); + + Store store = loadStore(cache); + + if (cmd.hasOption("items")) + { + String itemdir = cmd.getOptionValue("items"); + + if (itemdir == null) + { + System.err.println("Item directory must be specified"); + return; + } + + System.out.println("Dumping items to " + itemdir); + dumpItems(store, new File(itemdir)); + } + else if (cmd.hasOption("npcs")) + { + String npcdir = cmd.getOptionValue("npcs"); + + if (npcdir == null) + { + System.err.println("NPC directory must be specified"); + return; + } + + System.out.println("Dumping npcs to " + npcdir); + dumpNpcs(store, new File(npcdir)); + } + else if (cmd.hasOption("objects")) + { + String objectdir = cmd.getOptionValue("objects"); + + if (objectdir == null) + { + System.err.println("Object directory must be specified"); + return; + } + + System.out.println("Dumping objects to " + objectdir); + dumpObjects(store, new File(objectdir)); + } + else if (cmd.hasOption("sprites")) + { + String spritedir = cmd.getOptionValue("sprites"); + + if (spritedir == null) + { + System.err.println("Sprite directory must be specified"); + return; + } + + System.out.println("Dumping sprites to " + spritedir); + dumpSprites(store, new File(spritedir)); + } + else + { + System.err.println("Nothing to do"); + } + } + + private static Store loadStore(String cache) throws IOException + { + Store store = new Store(new File(cache)); + store.load(); + return store; + } + + private static void dumpItems(Store store, File itemdir) throws IOException + { + ItemManager dumper = new ItemManager(store); + dumper.load(); + dumper.export(itemdir); + dumper.java(itemdir); + } + + private static void dumpNpcs(Store store, File npcdir) throws IOException + { + NpcManager dumper = new NpcManager(store); + dumper.load(); + dumper.dump(npcdir); + dumper.java(npcdir); + } + + private static void dumpObjects(Store store, File objectdir) throws IOException + { + ObjectManager dumper = new ObjectManager(store); + dumper.load(); + dumper.dump(objectdir); + dumper.java(objectdir); + } + + private static void dumpSprites(Store store, File spritedir) throws IOException + { + SpriteManager dumper = new SpriteManager(store); + dumper.load(); + dumper.export(spritedir); + } +} diff --git a/cache/src/main/java/net/runelite/cache/ConfigType.java b/cache/src/main/java/net/runelite/cache/ConfigType.java new file mode 100644 index 0000000000..48d8e229c0 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/ConfigType.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache; + +public enum ConfigType +{ + // types from https://github.com/im-frizzy/OpenRS/blob/master/source/net/openrs/cache/type/ConfigArchive.java + UNDERLAY(1), + IDENTKIT(3), + OVERLAY(4), + INV(5), + OBJECT(6), + ENUM(8), + NPC(9), + ITEM(10), + SEQUENCE(12), + SPOTANIM(13), + VARBIT(14), + VARCLIENT(19), + VARCLIENTSTRING(15), + VARPLAYER(16), + STRUCT(34), + AREA(35); + + private final int id; + + ConfigType(int id) + { + this.id = id; + } + + public int getId() + { + return id; + } +} diff --git a/cache/src/main/java/net/runelite/cache/HeightMapDumper.java b/cache/src/main/java/net/runelite/cache/HeightMapDumper.java new file mode 100644 index 0000000000..5db30815ff --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/HeightMapDumper.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.io.IOException; +import net.runelite.cache.fs.Store; +import net.runelite.cache.region.Region; +import net.runelite.cache.region.RegionLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HeightMapDumper +{ + private static final Logger logger = LoggerFactory.getLogger(HeightMapDumper.class); + + private static final int MAP_SCALE = 1; + private static final float MAX_HEIGHT = 2048f; + + private final Store store; + private RegionLoader regionLoader; + + public HeightMapDumper(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + regionLoader = new RegionLoader(store); + regionLoader.loadRegions(); + regionLoader.calculateBounds(); + } + + public BufferedImage drawHeightMap(int z) + { + int minX = regionLoader.getLowestX().getBaseX(); + int minY = regionLoader.getLowestY().getBaseY(); + + int maxX = regionLoader.getHighestX().getBaseX() + Region.X; + int maxY = regionLoader.getHighestY().getBaseY() + Region.Y; + + int dimX = maxX - minX; + int dimY = maxY - minY; + + dimX *= MAP_SCALE; + dimY *= MAP_SCALE; + + logger.info("Map image dimensions: {}px x {}px, {}px per map square ({} MB)", dimX, dimY, MAP_SCALE, (dimX * dimY / 1024 / 1024)); + + BufferedImage image = new BufferedImage(dimX, dimY, BufferedImage.TYPE_INT_RGB); + draw(image, z); + return image; + } + + private void draw(BufferedImage image, int z) + { + int max = Integer.MIN_VALUE; + int min = Integer.MAX_VALUE; + + for (Region region : regionLoader.getRegions()) + { + int baseX = region.getBaseX(); + int baseY = region.getBaseY(); + + // to pixel X + int drawBaseX = baseX - regionLoader.getLowestX().getBaseX(); + + // to pixel Y. top most y is 0, but the top most + // region has the greatest y, so invert + int drawBaseY = regionLoader.getHighestY().getBaseY() - baseY; + + for (int x = 0; x < Region.X; ++x) + { + int drawX = drawBaseX + x; + + for (int y = 0; y < Region.Y; ++y) + { + int drawY = drawBaseY + (Region.Y - 1 - y); + + int height = region.getTileHeight(z, x, y); + if (height > max) + { + max = height; + } + if (height < min) + { + min = height; + } + + int rgb = toColor(height); + + drawMapSquare(image, drawX, drawY, rgb); + } + } + } + System.out.println("max " + max); + System.out.println("min " + min); + } + + private int toColor(int height) + { + // height seems to be between -2040 and 0, inclusive + height = -height; + // Convert to between 0 and 1 + float color = (float) height / MAX_HEIGHT; + + assert color >= 0.0f && color <= 1.0f; + + return new Color(color, color, color).getRGB(); + } + + private void drawMapSquare(BufferedImage image, int x, int y, int rgb) + { + x *= MAP_SCALE; + y *= MAP_SCALE; + + for (int i = 0; i < MAP_SCALE; ++i) + { + for (int j = 0; j < MAP_SCALE; ++j) + { + image.setRGB(x + i, y + j, rgb); + } + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/IndexType.java b/cache/src/main/java/net/runelite/cache/IndexType.java new file mode 100644 index 0000000000..813594bac5 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/IndexType.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache; + +public enum IndexType +{ + FRAMES(0), + FRAMEMAPS(1), + CONFIGS(2), + INTERFACES(3), + SOUNDEFFECTS(4), + MAPS(5), + TRACK1(6), + MODELS(7), + SPRITES(8), + TEXTURES(9), + BINARY(10), + TRACK2(11), + CLIENTSCRIPT(12), + FONTS(13), + VORBIS(14), + INSTRUMENTS(15), + WORLDMAP(16); + + private int id; + + IndexType(int id) + { + this.id = id; + } + + public int getNumber() + { + return id; + } +} \ No newline at end of file diff --git a/cache/src/main/java/net/runelite/cache/InterfaceManager.java b/cache/src/main/java/net/runelite/cache/InterfaceManager.java new file mode 100644 index 0000000000..ccfcfedd3b --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/InterfaceManager.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import net.runelite.cache.definitions.InterfaceDefinition; +import net.runelite.cache.definitions.exporters.InterfaceExporter; +import net.runelite.cache.definitions.loaders.InterfaceLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.util.Namer; + +public class InterfaceManager +{ + private final Store store; + private InterfaceDefinition[][] interfaces; + private final Namer namer = new Namer(); + + public InterfaceManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + InterfaceLoader loader = new InterfaceLoader(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.INTERFACES); + + int max = index.getArchives().stream().mapToInt(a -> a.getArchiveId()).max().getAsInt(); + interfaces = new InterfaceDefinition[max + 1][]; + + for (Archive archive : index.getArchives()) + { + int archiveId = archive.getArchiveId(); + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + InterfaceDefinition[] ifaces = interfaces[archiveId]; + if (ifaces == null) + { + ifaces = interfaces[archiveId] = new InterfaceDefinition[archive.getFileData().length]; + } + + for (FSFile file : files.getFiles()) + { + int fileId = file.getFileId(); + + int widgetId = (archiveId << 16) + fileId; + + InterfaceDefinition iface = loader.load(widgetId, file.getContents()); + ifaces[fileId] = iface; + } + } + } + + public int getNumInterfaceGroups() + { + return interfaces.length; + } + + public int getNumChildren(int groupId) + { + return interfaces[groupId].length; + } + + public InterfaceDefinition[] getIntefaceGroup(int groupId) + { + return interfaces[groupId]; + } + + public InterfaceDefinition getInterface(int groupId, int childId) + { + return interfaces[groupId][childId]; + } + + public InterfaceDefinition[][] getInterfaces() + { + return interfaces; + } + + public void export(File out) throws IOException + { + out.mkdirs(); + + for (InterfaceDefinition[] defs : interfaces) + { + if (defs == null) + { + continue; + } + + for (InterfaceDefinition def : defs) + { + if (def == null) + { + continue; + } + + InterfaceExporter exporter = new InterfaceExporter(def); + + File folder = new File(out, "" + (def.id >>> 16)); + folder.mkdirs(); + + File targ = new File(folder, (def.id & 0xffff) + ".json"); + exporter.exportTo(targ); + } + } + } + + public void java(File java) throws IOException + { + System.setProperty("line.separator", "\n"); + java.mkdirs(); + File targ = new File(java, "InterfaceID.java"); + try (PrintWriter fw = new PrintWriter(targ)) + { + fw.println("/* This file is automatically generated. Do not edit. */"); + fw.println("package net.runelite.api;"); + fw.println(""); + fw.println("public final class InterfaceID {"); + for (InterfaceDefinition[] defs : interfaces) + { + if (defs == null) + { + continue; + } + for (InterfaceDefinition def : defs) + { + if (def == null || def.name == null || def.name.equalsIgnoreCase("NULL")) + { + continue; + } + + String name = namer.name(def.name, def.id); + if (name == null) + { + continue; + } + + fw.println(" public static final int " + name + " = " + def.id + ";"); + } + } + fw.println("}"); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/InventoryManager.java b/cache/src/main/java/net/runelite/cache/InventoryManager.java new file mode 100644 index 0000000000..772d48b1a9 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/InventoryManager.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import net.runelite.cache.definitions.InventoryDefinition; +import net.runelite.cache.definitions.loaders.InventoryLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; + +public class InventoryManager +{ + private final Store store; + private final List inventories = new ArrayList<>(); + + public InventoryManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + InventoryLoader loader = new InventoryLoader(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.INV.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + InventoryDefinition inv = loader.load(file.getFileId(), file.getContents()); + inventories.add(inv); + } + } + + public List getInventories() + { + return Collections.unmodifiableList(inventories); + } + + public InventoryDefinition findInventory(int id) + { + for (InventoryDefinition def : inventories) + { + if (def.id == id) + { + return def; + } + } + return null; + } +} diff --git a/cache/src/main/java/net/runelite/cache/ItemManager.java b/cache/src/main/java/net/runelite/cache/ItemManager.java new file mode 100644 index 0000000000..b3449a51a4 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/ItemManager.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.ItemDefinition; +import net.runelite.cache.definitions.exporters.ItemExporter; +import net.runelite.cache.definitions.loaders.ItemLoader; +import net.runelite.cache.definitions.providers.ItemProvider; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.util.IDClass; + +public class ItemManager implements ItemProvider +{ + private final Store store; + private final Map items = new HashMap<>(); + + public ItemManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + ItemLoader loader = new ItemLoader(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.ITEM.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile f : files.getFiles()) + { + ItemDefinition def = loader.load(f.getFileId(), f.getContents()); + items.put(f.getFileId(), def); + } + } + + public Collection getItems() + { + return Collections.unmodifiableCollection(items.values()); + } + + public ItemDefinition getItem(int itemId) + { + return items.get(itemId); + } + + public void export(File out) throws IOException + { + out.mkdirs(); + + for (ItemDefinition def : items.values()) + { + ItemExporter exporter = new ItemExporter(def); + + File targ = new File(out, def.id + ".json"); + exporter.exportTo(targ); + } + } + + public void java(File java) throws IOException + { + java.mkdirs(); + try (IDClass ids = IDClass.create(java, "ItemID")) + { + try (IDClass nulls = IDClass.create(java, "NullItemID")) + { + for (ItemDefinition def : items.values()) + { + if (def.name.equalsIgnoreCase("NULL")) + { + nulls.add(def.name, def.id); + } + else + { + ids.add(def.name, def.id); + } + } + } + } + } + + @Override + public ItemDefinition provide(int itemId) + { + return getItem(itemId); + } +} diff --git a/cache/src/main/java/net/runelite/cache/MapImageDumper.java b/cache/src/main/java/net/runelite/cache/MapImageDumper.java new file mode 100644 index 0000000000..5235d97fb6 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/MapImageDumper.java @@ -0,0 +1,987 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import lombok.Getter; +import lombok.Setter; +import net.runelite.cache.definitions.AreaDefinition; +import net.runelite.cache.definitions.ObjectDefinition; +import net.runelite.cache.definitions.OverlayDefinition; +import net.runelite.cache.definitions.SpriteDefinition; +import net.runelite.cache.definitions.UnderlayDefinition; +import net.runelite.cache.definitions.loaders.OverlayLoader; +import net.runelite.cache.definitions.loaders.SpriteLoader; +import net.runelite.cache.definitions.loaders.UnderlayLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.item.ColorPalette; +import net.runelite.cache.item.RSTextureProvider; +import net.runelite.cache.region.Location; +import net.runelite.cache.region.Region; +import net.runelite.cache.region.RegionLoader; +import net.runelite.cache.util.Djb2; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MapImageDumper +{ + private static final Logger logger = LoggerFactory.getLogger(MapImageDumper.class); + + private static final int MAP_SCALE = 4; // this squared is the number of pixels per map square + private static final int MAPICON_MAX_WIDTH = 5; // scale minimap icons down to this size so they fit.. + private static final int MAPICON_MAX_HEIGHT = 6; + private static final int BLEND = 5; // number of surrounding tiles for ground blending + + private static int[] colorPalette = new ColorPalette(0.9d, 0, 512).getColorPalette(); + + private static int[][] TILE_SHAPE_2D = new int[][]{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1}}; + private static int[][] TILE_ROTATION_2D = new int[][]{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, {12, 8, 4, 0, 13, 9, 5, 1, 14, 10, 6, 2, 15, 11, 7, 3}, {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, {3, 7, 11, 15, 2, 6, 10, 14, 1, 5, 9, 13, 0, 4, 8, 12}}; + + private final int wallColor = (238 + (int) (Math.random() * 20.0D) - 10 << 16) + (238 + (int) (Math.random() * 20.0D) - 10 << 8) + (238 + (int) (Math.random() * 20.0D) - 10); + private final int doorColor = 238 + (int) (Math.random() * 20.0D) - 10 << 16; + + private final Store store; + + private final Map underlays = new HashMap<>(); + private final Map overlays = new HashMap<>(); + private final Map scaledMapIcons = new HashMap<>(); + + private RegionLoader regionLoader; + private final AreaManager areas; + private final SpriteManager sprites; + private RSTextureProvider rsTextureProvider; + private final ObjectManager objectManager; + + @Getter + @Setter + private boolean labelRegions; + + @Getter + @Setter + private boolean outlineRegions; + + public MapImageDumper(Store store) + { + this.store = store; + this.areas = new AreaManager(store); + this.sprites = new SpriteManager(store); + objectManager = new ObjectManager(store); + } + + public void load() throws IOException + { + loadUnderlays(store); + loadOverlays(store); + objectManager.load(); + + TextureManager textureManager = new TextureManager(store); + textureManager.load(); + rsTextureProvider = new RSTextureProvider(textureManager, sprites); + + loadRegions(store); + areas.load(); + sprites.load(); + loadSprites(); + } + + public BufferedImage drawMap(int z) + { + int minX = regionLoader.getLowestX().getBaseX(); + int minY = regionLoader.getLowestY().getBaseY(); + + int maxX = regionLoader.getHighestX().getBaseX() + Region.X; + int maxY = regionLoader.getHighestY().getBaseY() + Region.Y; + + int dimX = maxX - minX; + int dimY = maxY - minY; + + int pixelsX = dimX * MAP_SCALE; + int pixelsY = dimY * MAP_SCALE; + + logger.info("Map image dimensions: {}px x {}px, {}px per map square ({} MB). Max memory: {}mb", pixelsX, pixelsY, + MAP_SCALE, (pixelsX * pixelsY * 3 / 1024 / 1024), + Runtime.getRuntime().maxMemory() / 1024L / 1024L); + + BufferedImage image = new BufferedImage(pixelsX, pixelsY, BufferedImage.TYPE_INT_RGB); + + drawMap(image, z); + drawObjects(image, z); + drawMapIcons(image, z); + + return image; + } + + public BufferedImage drawRegion(Region region, int z) + { + int pixelsX = Region.X * MAP_SCALE; + int pixelsY = Region.Y * MAP_SCALE; + + BufferedImage image = new BufferedImage(pixelsX, pixelsY, BufferedImage.TYPE_INT_RGB); + + drawMap(image, 0, 0, z, region); + drawObjects(image, 0, 0, region, z); + drawMapIcons(image, 0, 0, region, z); + + return image; + } + + private void drawMap(BufferedImage image, int drawBaseX, int drawBaseY, int z, Region region) + { + int[][] map = new int[Region.X * MAP_SCALE][Region.Y * MAP_SCALE]; + drawMap(map, region, z); + + int[][] above = null; + if (z < 3) + { + above = new int[Region.X * MAP_SCALE][Region.Y * MAP_SCALE]; + drawMap(above, region, z + 1); + } + + for (int x = 0; x < Region.X; ++x) + { + for (int y = 0; y < Region.Y; ++y) + { + boolean isBridge = (region.getTileSetting(1, x, Region.Y - y - 1) & 2) != 0; + + int tileSetting = region.getTileSetting(z, x, Region.Y - y - 1); + if (!isBridge && ((tileSetting & 24) == 0)) + { + drawTile(image, map, drawBaseX, drawBaseY, x, y); + } + + if (z < 3 && isBridge) // client also has a check for &8 != 0 here + { + drawTile(image, above, drawBaseX, drawBaseY, x, y); + } + } + } + } + + private void drawMap(BufferedImage image, int z) + { + for (Region region : regionLoader.getRegions()) + { + int baseX = region.getBaseX(); + int baseY = region.getBaseY(); + + // to pixel X + int drawBaseX = baseX - regionLoader.getLowestX().getBaseX(); + + // to pixel Y. top most y is 0, but the top most + // region has the greatest y, so invert + int drawBaseY = regionLoader.getHighestY().getBaseY() - baseY; + + drawMap(image, drawBaseX, drawBaseY, z, region); + } + } + + private void drawTile(BufferedImage to, int[][] pixels, int drawBaseX, int drawBaseY, int x, int y) + { + for (int i = 0; i < MAP_SCALE; ++i) + { + for (int j = 0; j < MAP_SCALE; ++j) + { + to.setRGB(drawBaseX * MAP_SCALE + x * MAP_SCALE + i, + drawBaseY * MAP_SCALE + y * MAP_SCALE + j, + pixels[x * MAP_SCALE + i][y * MAP_SCALE + j]); + } + } + } + + private void drawMap(int[][] pixels, Region region, int z) + { + int baseX = region.getBaseX(); + int baseY = region.getBaseY(); + + int len = Region.X + BLEND * 2; + int[] hues = new int[len]; + int[] sats = new int[len]; + int[] light = new int[len]; + int[] mul = new int[len]; + int[] num = new int[len]; + + boolean hasLeftRegion = regionLoader.findRegionForWorldCoordinates(baseX - 1, baseY) != null; + boolean hasRightRegion = regionLoader.findRegionForWorldCoordinates(baseX + Region.X, baseY) != null; + boolean hasUpRegion = regionLoader.findRegionForWorldCoordinates(baseX, baseY + Region.Y) != null; + boolean hasDownRegion = regionLoader.findRegionForWorldCoordinates(baseX, baseY - 1) != null; + + for (int xi = (hasLeftRegion ? -BLEND * 2 : -BLEND); xi < Region.X + (hasRightRegion ? BLEND * 2 : BLEND); ++xi) + { + for (int yi = (hasDownRegion ? -BLEND : 0); yi < Region.Y + (hasUpRegion ? BLEND : 0); ++yi) + { + int xr = xi + BLEND; + if (xr >= (hasLeftRegion ? -BLEND : 0) && xr < Region.X + (hasRightRegion ? BLEND : 0)) + { + Region r = regionLoader.findRegionForWorldCoordinates(baseX + xr, baseY + yi); + if (r != null) + { + int underlayId = r.getUnderlayId(z, convert(xr), convert(yi)); + if (underlayId > 0) + { + UnderlayDefinition underlay = findUnderlay(underlayId - 1); + hues[yi + BLEND] += underlay.getHue(); + sats[yi + BLEND] += underlay.getSaturation(); + light[yi + BLEND] += underlay.getLightness(); + mul[yi + BLEND] += underlay.getHueMultiplier(); + num[yi + BLEND]++; + } + } + } + + int xl = xi - BLEND; + if (xl >= (hasLeftRegion ? -BLEND : 0) && xl < Region.X + (hasRightRegion ? BLEND : 0)) + { + Region r = regionLoader.findRegionForWorldCoordinates(baseX + xl, baseY + yi); + if (r != null) + { + int underlayId = r.getUnderlayId(z, convert(xl), convert(yi)); + if (underlayId > 0) + { + UnderlayDefinition underlay = findUnderlay(underlayId - 1); + hues[yi + BLEND] -= underlay.getHue(); + sats[yi + BLEND] -= underlay.getSaturation(); + light[yi + BLEND] -= underlay.getLightness(); + mul[yi + BLEND] -= underlay.getHueMultiplier(); + num[yi + BLEND]--; + } + } + } + } + + if (xi >= 0 && xi < Region.X) + { + int runningHues = 0; + int runningSat = 0; + int runningLight = 0; + int runningMultiplier = 0; + int runningNumber = 0; + + for (int yi = (hasDownRegion ? -BLEND * 2 : -BLEND); yi < Region.Y + (hasUpRegion ? BLEND * 2 : BLEND); ++yi) + { + int yu = yi + BLEND; + if (yu >= (hasDownRegion ? -BLEND : 0) && yu < Region.Y + (hasUpRegion ? BLEND : 0)) + { + runningHues += hues[yu + BLEND]; + runningSat += sats[yu + BLEND]; + runningLight += light[yu + BLEND]; + runningMultiplier += mul[yu + BLEND]; + runningNumber += num[yu + BLEND]; + } + + int yd = yi - BLEND; + if (yd >= (hasDownRegion ? -BLEND : 0) && yd < Region.Y + (hasUpRegion ? BLEND : 0)) + { + runningHues -= hues[yd + BLEND]; + runningSat -= sats[yd + BLEND]; + runningLight -= light[yd + BLEND]; + runningMultiplier -= mul[yd + BLEND]; + runningNumber -= num[yd + BLEND]; + } + + if (yi >= 0 && yi < Region.Y) + { + Region r = regionLoader.findRegionForWorldCoordinates(baseX + xi, baseY + yi); + if (r != null) + { + int underlayId = r.getUnderlayId(z, convert(xi), convert(yi)); + int overlayId = r.getOverlayId(z, convert(xi), convert(yi)); + + if (underlayId > 0 || overlayId > 0) + { + int underlayHsl = -1; + if (underlayId > 0) + { + int avgHue = runningHues * 256 / runningMultiplier; + int avgSat = runningSat / runningNumber; + int avgLight = runningLight / runningNumber; + // randomness is added to avgHue here + + if (avgLight < 0) + { + avgLight = 0; + } + else if (avgLight > 255) + { + avgLight = 255; + } + + underlayHsl = packHsl(avgHue, avgSat, avgLight); + } + + int underlayRgb = 0; + if (underlayHsl != -1) + { + int var0 = method1792(underlayHsl, 96); + underlayRgb = colorPalette[var0]; + } + + int shape, rotation; + Integer overlayRgb = null; + if (overlayId == 0) + { + shape = rotation = 0; + } + else + { + shape = r.getOverlayPath(z, convert(xi), convert(yi)) + 1; + rotation = r.getOverlayRotation(z, convert(xi), convert(yi)); + + OverlayDefinition overlayDefinition = findOverlay(overlayId - 1); + int overlayTexture = overlayDefinition.getTexture(); + int rgb; + + if (overlayTexture >= 0) + { + rgb = rsTextureProvider.getAverageTextureRGB(overlayTexture); + } + else if (overlayDefinition.getRgbColor() == 0xFF_00FF) + { + rgb = -2; + } + else + { + // randomness added here + int overlayHsl = packHsl(overlayDefinition.getHue(), overlayDefinition.getSaturation(), overlayDefinition.getLightness()); + rgb = overlayHsl; + } + + overlayRgb = 0; + if (rgb != -2) + { + int var0 = adjustHSLListness0(rgb, 96); + overlayRgb = colorPalette[var0]; + } + + if (overlayDefinition.getSecondaryRgbColor() != -1) + { + int hue = overlayDefinition.getOtherHue(); + int sat = overlayDefinition.getOtherSaturation(); + int olight = overlayDefinition.getOtherLightness(); + rgb = packHsl(hue, sat, olight); + int var0 = adjustHSLListness0(rgb, 96); + overlayRgb = colorPalette[var0]; + } + } + + if (shape == 0) + { + int drawX = xi; + int drawY = Region.Y - 1 - yi; + if (underlayRgb != 0) + { + drawMapSquare(pixels, drawX, drawY, underlayRgb); + } + } + else if (shape == 1) + { + int drawX = xi; + int drawY = Region.Y - 1 - yi; + drawMapSquare(pixels, drawX, drawY, overlayRgb); + } + else + { + int drawX = xi * MAP_SCALE; + int drawY = (Region.Y - 1 - yi) * MAP_SCALE; + int[] tileShapes = TILE_SHAPE_2D[shape]; + int[] tileRotations = TILE_ROTATION_2D[rotation]; + if (underlayRgb != 0) + { + int rotIdx = 0; + for (int i = 0; i < Region.Z; ++i) + { + int p1 = tileShapes[tileRotations[rotIdx++]] == 0 ? underlayRgb : overlayRgb; + int p2 = tileShapes[tileRotations[rotIdx++]] == 0 ? underlayRgb : overlayRgb; + int p3 = tileShapes[tileRotations[rotIdx++]] == 0 ? underlayRgb : overlayRgb; + int p4 = tileShapes[tileRotations[rotIdx++]] == 0 ? underlayRgb : overlayRgb; + pixels[drawX + 0][drawY + i] = p1; + pixels[drawX + 1][drawY + i] = p2; + pixels[drawX + 2][drawY + i] = p3; + pixels[drawX + 3][drawY + i] = p4; + } + } + else + { + int rotIdx = 0; + for (int i = 0; i < Region.Z; ++i) + { + int p1 = tileShapes[tileRotations[rotIdx++]]; + int p2 = tileShapes[tileRotations[rotIdx++]]; + int p3 = tileShapes[tileRotations[rotIdx++]]; + int p4 = tileShapes[tileRotations[rotIdx++]]; + + if (p1 != 0) + { + pixels[drawX + 0][drawY + i] = overlayRgb; + } + + if (p2 != 0) + { + pixels[drawX + 1][drawY + i] = overlayRgb; + } + + if (p3 != 0) + { + pixels[drawX + 2][drawY + i] = overlayRgb; + } + + if (p4 != 0) + { + pixels[drawX + 3][drawY + i] = overlayRgb; + } + } + } + } + } + } + } + } + } + } + } + + private static int convert(int d) + { + if (d >= 0) + { + return d % 64; + } + else + { + return 64 - -(d % 64) - 1; + } + } + + private void drawObjects(BufferedImage image, int drawBaseX, int drawBaseY, Region region, int z) + { + Graphics2D graphics = image.createGraphics(); + + for (Location location : region.getLocations()) + { + + int rotation = location.getOrientation(); + int type = location.getType(); + + int localX = location.getPosition().getX() - region.getBaseX(); + int localY = location.getPosition().getY() - region.getBaseY(); + + boolean isBridge = (region.getTileSetting(1, localX, localY) & 2) != 0; + + if (location.getPosition().getZ() == z + 1) + { + if (!isBridge) + { + continue; + } + } + else if (location.getPosition().getZ() == z) + { + if (isBridge) + { + continue; + } + + if ((region.getTileSetting(z, localX, localY) & 24) != 0) + { + continue; + } + } + else + { + continue; + } + + ObjectDefinition object = findObject(location.getId()); + + int drawX = (drawBaseX + localX) * MAP_SCALE; + int drawY = (drawBaseY + (Region.Y - 1 - localY)) * MAP_SCALE; + + if (type >= 0 && type <= 3) + { + // this is a wall + int hash = (localY << 7) + localX + (location.getId() << 14) + 0x4000_0000; + if (object.getAnInt2088() == 0) + { + hash -= Integer.MIN_VALUE; + } + + int rgb = wallColor; + if (hash > 0) + { + rgb = doorColor; + } + + if (object.getMapSceneID() != -1) + { + Image spriteImage = scaledMapIcons.get(object.getMapSceneID()); + graphics.drawImage(spriteImage, drawX * MAP_SCALE, drawY * MAP_SCALE, null); + } + else + { + if (type == 0 || type == 2) + { + if (rotation == 0) + { + image.setRGB(drawX + 0, drawY + 0, rgb); + image.setRGB(drawX + 0, drawY + 1, rgb); + image.setRGB(drawX + 0, drawY + 2, rgb); + image.setRGB(drawX + 0, drawY + 3, rgb); + } + else if (rotation == 1) + { + image.setRGB(drawX + 0, drawY + 0, rgb); + image.setRGB(drawX + 1, drawY + 0, rgb); + image.setRGB(drawX + 2, drawY + 0, rgb); + image.setRGB(drawX + 3, drawY + 0, rgb); + } + else if (rotation == 2) + { + image.setRGB(drawX + 3, drawY + 0, rgb); + image.setRGB(drawX + 3, drawY + 1, rgb); + image.setRGB(drawX + 3, drawY + 2, rgb); + image.setRGB(drawX + 3, drawY + 3, rgb); + } + else if (rotation == 3) + { + image.setRGB(drawX + 0, drawY + 3, rgb); + image.setRGB(drawX + 1, drawY + 3, rgb); + image.setRGB(drawX + 2, drawY + 3, rgb); + image.setRGB(drawX + 3, drawY + 3, rgb); + } + } + + if (type == 3) + { + if (rotation == 0) + { + image.setRGB(drawX + 0, drawY + 0, rgb); + } + else if (rotation == 1) + { + image.setRGB(drawX + 3, drawY + 0, rgb); + } + else if (rotation == 2) + { + image.setRGB(drawX + 3, drawY + 3, rgb); + } + else if (rotation == 3) + { + image.setRGB(drawX + 0, drawY + 3, rgb); + } + } + + if (type == 2) + { + if (rotation == 3) + { + image.setRGB(drawX + 0, drawY + 0, rgb); + image.setRGB(drawX + 0, drawY + 1, rgb); + image.setRGB(drawX + 0, drawY + 2, rgb); + image.setRGB(drawX + 0, drawY + 3, rgb); + } + else if (rotation == 0) + { + image.setRGB(drawX + 0, drawY + 0, rgb); + image.setRGB(drawX + 1, drawY + 0, rgb); + image.setRGB(drawX + 2, drawY + 0, rgb); + image.setRGB(drawX + 3, drawY + 0, rgb); + } + else if (rotation == 1) + { + image.setRGB(drawX + 3, drawY + 0, rgb); + image.setRGB(drawX + 3, drawY + 1, rgb); + image.setRGB(drawX + 3, drawY + 2, rgb); + image.setRGB(drawX + 3, drawY + 3, rgb); + } + else if (rotation == 2) + { + image.setRGB(drawX + 0, drawY + 3, rgb); + image.setRGB(drawX + 1, drawY + 3, rgb); + image.setRGB(drawX + 2, drawY + 3, rgb); + image.setRGB(drawX + 3, drawY + 3, rgb); + } + } + } + } + else if (type == 9) + { + if (object.getMapSceneID() != -1) + { + Image spriteImage = scaledMapIcons.get(object.getMapSceneID()); + graphics.drawImage(spriteImage, drawX, drawY, null); + continue; + } + + int hash = (localY << 7) + localX + (location.getId() << 14) + 0x4000_0000; + if (object.getAnInt2088() == 0) + { + hash -= Integer.MIN_VALUE; + } + + if ((hash >> 29 & 3) != 2) + { + continue; + } + + int rgb = 0xEE_EEEE; + if (hash > 0) + { + rgb = 0xEE_0000; + } + + if (rotation != 0 && rotation != 2) + { + image.setRGB(drawX + 0, drawY + 0, rgb); + image.setRGB(drawX + 1, drawY + 1, rgb); + image.setRGB(drawX + 2, drawY + 2, rgb); + image.setRGB(drawX + 3, drawY + 3, rgb); + } + else + { + image.setRGB(drawX + 0, drawY + 3, rgb); + image.setRGB(drawX + 1, drawY + 2, rgb); + image.setRGB(drawX + 2, drawY + 1, rgb); + image.setRGB(drawX + 3, drawY + 0, rgb); + } + } + else if (type == 22 || (type >= 9 && type <= 11)) + { + // ground object + if (object.getMapSceneID() != -1) + { + Image spriteImage = scaledMapIcons.get(object.getMapSceneID()); + graphics.drawImage(spriteImage, drawX, drawY, null); + } + } + } + + graphics.dispose(); + } + + private void drawObjects(BufferedImage image, int z) + { + for (Region region : regionLoader.getRegions()) + { + int baseX = region.getBaseX(); + int baseY = region.getBaseY(); + + // to pixel X + int drawBaseX = baseX - regionLoader.getLowestX().getBaseX(); + + // to pixel Y. top most y is 0, but the top most + // region has the greatest y, so invert + int drawBaseY = regionLoader.getHighestY().getBaseY() - baseY; + + drawObjects(image, drawBaseX, drawBaseY, region, z); + } + } + + private void drawMapIcons(BufferedImage image, int drawBaseX, int drawBaseY, Region region, int z) + { + int baseX = region.getBaseX(); + int baseY = region.getBaseY(); + + Graphics2D graphics = image.createGraphics(); + + drawMapIcons(graphics, region, z, drawBaseX, drawBaseY); + + if (labelRegions) + { + graphics.setColor(Color.WHITE); + String str = baseX + "," + baseY + " (" + region.getRegionX() + "," + region.getRegionY() + ")"; + graphics.drawString(str, drawBaseX * MAP_SCALE, drawBaseY * MAP_SCALE + graphics.getFontMetrics().getHeight()); + } + + if (outlineRegions) + { + graphics.setColor(Color.WHITE); + graphics.drawRect(drawBaseX * MAP_SCALE, drawBaseY * MAP_SCALE, Region.X * MAP_SCALE, Region.Y * MAP_SCALE); + } + + graphics.dispose(); + } + + private void drawMapIcons(BufferedImage image, int z) + { + // map icons + for (Region region : regionLoader.getRegions()) + { + int baseX = region.getBaseX(); + int baseY = region.getBaseY(); + + // to pixel X + int drawBaseX = baseX - regionLoader.getLowestX().getBaseX(); + + // to pixel Y. top most y is 0, but the top most + // region has the greatest y, so invert + int drawBaseY = regionLoader.getHighestY().getBaseY() - baseY; + + drawMapIcons(image, drawBaseX, drawBaseY, region, z); + } + } + + private ObjectDefinition findObject(int id) + { + return objectManager.getObject(id); + } + + private int packHsl(int var0, int var1, int var2) + { + if (var2 > 179) + { + var1 /= 2; + } + + if (var2 > 192) + { + var1 /= 2; + } + + if (var2 > 217) + { + var1 /= 2; + } + + if (var2 > 243) + { + var1 /= 2; + } + + int var3 = (var1 / 32 << 7) + (var0 / 4 << 10) + var2 / 2; + return var3; + } + + static int method1792(int var0, int var1) + { + if (var0 == -1) + { + return 12345678; + } + else + { + var1 = (var0 & 127) * var1 / 128; + if (var1 < 2) + { + var1 = 2; + } + else if (var1 > 126) + { + var1 = 126; + } + + return (var0 & 65408) + var1; + } + } + + static final int adjustHSLListness0(int var0, int var1) + { + if (var0 == -2) + { + return 12345678; + } + else if (var0 == -1) + { + if (var1 < 2) + { + var1 = 2; + } + else if (var1 > 126) + { + var1 = 126; + } + + return var1; + } + else + { + var1 = (var0 & 127) * var1 / 128; + if (var1 < 2) + { + var1 = 2; + } + else if (var1 > 126) + { + var1 = 126; + } + + return (var0 & 65408) + var1; + } + } + + private void drawMapSquare(int[][] pixels, int x, int y, int rgb) + { + x *= MAP_SCALE; + y *= MAP_SCALE; + + for (int i = 0; i < MAP_SCALE; ++i) + { + for (int j = 0; j < MAP_SCALE; ++j) + { + pixels[x + i][y + j] = rgb; + } + } + } + + private void drawMapIcons(Graphics2D graphics, Region region, int z, int drawBaseX, int drawBaseY) + { + for (Location location : region.getLocations()) + { + int localZ = location.getPosition().getZ(); + if (z != 0 && localZ != z) + { + // draw all icons on z=0 + continue; + } + + ObjectDefinition od = findObject(location.getId()); + + assert od != null; + + int localX = location.getPosition().getX() - region.getBaseX(); + int localY = location.getPosition().getY() - region.getBaseY(); + + int drawX = drawBaseX + localX; + int drawY = drawBaseY + (Region.Y - 1 - localY); + + if (od.getMapAreaId() != -1) + { + AreaDefinition area = areas.getArea(od.getMapAreaId()); + assert area != null; + + int spriteId = area.spriteId; + + SpriteDefinition sprite = sprites.findSprite(spriteId, 0); + assert sprite != null; + + BufferedImage iconImage = sprites.getSpriteImage(sprite); + graphics.drawImage(iconImage, drawX * MAP_SCALE, drawY * MAP_SCALE, null); + } + } + } + + private void loadRegions(Store store) throws IOException + { + regionLoader = new RegionLoader(store); + regionLoader.loadRegions(); + regionLoader.calculateBounds(); + + logger.info("North most region: {}", regionLoader.getLowestY().getBaseY()); + logger.info("South most region: {}", regionLoader.getHighestY().getBaseY()); + logger.info("West most region: {}", regionLoader.getLowestX().getBaseX()); + logger.info("East most region: {}", regionLoader.getHighestX().getBaseX()); + } + + private void loadUnderlays(Store store) throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.UNDERLAY.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + UnderlayLoader loader = new UnderlayLoader(); + UnderlayDefinition underlay = loader.load(file.getFileId(), file.getContents()); + + underlays.put(underlay.getId(), underlay); + } + } + + private UnderlayDefinition findUnderlay(int id) + { + return underlays.get(id); + } + + private void loadOverlays(Store store) throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.OVERLAY.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + OverlayLoader loader = new OverlayLoader(); + OverlayDefinition overlay = loader.load(file.getFileId(), file.getContents()); + + overlays.put(overlay.getId(), overlay); + } + } + + private OverlayDefinition findOverlay(int id) + { + return overlays.get(id); + } + + private void loadSprites() throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.SPRITES); + final int mapsceneHash = Djb2.hash("mapscene"); + + for (Archive a : index.getArchives()) + { + byte[] contents = a.decompress(storage.loadArchive(a)); + + SpriteLoader loader = new SpriteLoader(); + SpriteDefinition[] sprites = loader.load(a.getArchiveId(), contents); + + for (SpriteDefinition sprite : sprites) + { + if (sprite.getHeight() <= 0 || sprite.getWidth() <= 0) + { + continue; + } + + if (a.getNameHash() == mapsceneHash) + { + BufferedImage spriteImage = new BufferedImage(sprite.getWidth(), sprite.getHeight(), BufferedImage.TYPE_INT_ARGB); + spriteImage.setRGB(0, 0, sprite.getWidth(), sprite.getHeight(), sprite.getPixels(), 0, sprite.getWidth()); + + // scale image down so it fits + Image scaledImage = spriteImage.getScaledInstance(MAPICON_MAX_WIDTH, MAPICON_MAX_HEIGHT, 0); + + assert scaledMapIcons.containsKey(sprite.getFrame()) == false; + scaledMapIcons.put(sprite.getFrame(), scaledImage); + } + } + } + } + +} diff --git a/cache/src/main/java/net/runelite/cache/NpcManager.java b/cache/src/main/java/net/runelite/cache/NpcManager.java new file mode 100644 index 0000000000..3124eb455f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/NpcManager.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.NpcDefinition; +import net.runelite.cache.definitions.exporters.NpcExporter; +import net.runelite.cache.definitions.loaders.NpcLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.util.IDClass; + +public class NpcManager +{ + private final Store store; + private final Map npcs = new HashMap<>(); + + public NpcManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + NpcLoader loader = new NpcLoader(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.NPC.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile f : files.getFiles()) + { + NpcDefinition npc = loader.load(f.getFileId(), f.getContents()); + npcs.put(f.getFileId(), npc); + } + } + + public Collection getNpcs() + { + return Collections.unmodifiableCollection(npcs.values()); + } + + public NpcDefinition get(int npcId) + { + return npcs.get(npcId); + } + + public void dump(File out) throws IOException + { + out.mkdirs(); + + for (NpcDefinition def : npcs.values()) + { + NpcExporter exporter = new NpcExporter(def); + + File targ = new File(out, def.id + ".json"); + exporter.exportTo(targ); + } + } + + public void java(File java) throws IOException + { + java.mkdirs(); + try (IDClass ids = IDClass.create(java, "NpcID")) + { + for (NpcDefinition def : npcs.values()) + { + if (def.name.equalsIgnoreCase("NULL")) + { + continue; + } + + ids.add(def.name, def.id); + } + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/ObjectManager.java b/cache/src/main/java/net/runelite/cache/ObjectManager.java new file mode 100644 index 0000000000..cb1372ed65 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/ObjectManager.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.ObjectDefinition; +import net.runelite.cache.definitions.exporters.ObjectExporter; +import net.runelite.cache.definitions.loaders.ObjectLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.util.IDClass; + +public class ObjectManager +{ + private final Store store; + private final Map objects = new HashMap<>(); + + public ObjectManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + ObjectLoader loader = new ObjectLoader(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.OBJECT.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile f : files.getFiles()) + { + ObjectDefinition def = loader.load(f.getFileId(), f.getContents()); + objects.put(f.getFileId(), def); + } + } + + public Collection getObjects() + { + return Collections.unmodifiableCollection(objects.values()); + } + + public ObjectDefinition getObject(int id) + { + return objects.get(id); + } + + public void dump(File out) throws IOException + { + out.mkdirs(); + + for (ObjectDefinition def : objects.values()) + { + ObjectExporter exporter = new ObjectExporter(def); + + File targ = new File(out, def.getId() + ".json"); + exporter.exportTo(targ); + } + } + + public void java(File java) throws IOException + { + java.mkdirs(); + try (IDClass ids = IDClass.create(java, "ObjectID")) + { + try (IDClass nulls = IDClass.create(java, "NullObjectID")) + { + for (ObjectDefinition def : objects.values()) + { + if ("null".equals(def.getName())) + { + nulls.add(def.getName(), def.getId()); + } + else + { + ids.add(def.getName(), def.getId()); + } + } + } + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/OverlayManager.java b/cache/src/main/java/net/runelite/cache/OverlayManager.java new file mode 100644 index 0000000000..6940227c0f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/OverlayManager.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.OverlayDefinition; +import net.runelite.cache.definitions.loaders.OverlayLoader; +import net.runelite.cache.definitions.providers.OverlayProvider; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; + +public class OverlayManager implements OverlayProvider +{ + private final Store store; + private final Map overlays = new HashMap<>(); + + public OverlayManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.OVERLAY.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + OverlayLoader loader = new OverlayLoader(); + OverlayDefinition overlay = loader.load(file.getFileId(), file.getContents()); + + overlays.put(overlay.getId(), overlay); + } + } + + public Collection getOverlays() + { + return Collections.unmodifiableCollection(overlays.values()); + } + + @Override + public OverlayDefinition provide(int overlayId) + { + return overlays.get(overlayId); + } +} diff --git a/cache/src/main/java/net/runelite/cache/SpriteManager.java b/cache/src/main/java/net/runelite/cache/SpriteManager.java new file mode 100644 index 0000000000..a18dd4f6ba --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/SpriteManager.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Multimap; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import net.runelite.cache.definitions.SpriteDefinition; +import net.runelite.cache.definitions.exporters.SpriteExporter; +import net.runelite.cache.definitions.loaders.SpriteLoader; +import net.runelite.cache.definitions.providers.SpriteProvider; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; + +public class SpriteManager implements SpriteProvider +{ + private final Store store; + private final Multimap sprites = LinkedListMultimap.create(); + + public SpriteManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.SPRITES); + + for (Archive a : index.getArchives()) + { + byte[] contents = a.decompress(storage.loadArchive(a)); + + SpriteLoader loader = new SpriteLoader(); + SpriteDefinition[] defs = loader.load(a.getArchiveId(), contents); + + for (SpriteDefinition sprite : defs) + { + sprites.put(sprite.getId(), sprite); + } + } + } + + public Collection getSprites() + { + return Collections.unmodifiableCollection(sprites.values()); + } + + public SpriteDefinition findSprite(int spriteId, int frameId) + { + for (SpriteDefinition sprite : sprites.get(spriteId)) + { + if (sprite.getFrame() == frameId) + { + return sprite; + } + } + return null; + } + + public BufferedImage getSpriteImage(SpriteDefinition sprite) + { + BufferedImage image = new BufferedImage(sprite.getWidth(), sprite.getHeight(), BufferedImage.TYPE_INT_ARGB); + image.setRGB(0, 0, sprite.getWidth(), sprite.getHeight(), sprite.getPixels(), 0, sprite.getWidth()); + return image; + } + + public void export(File outDir) throws IOException + { + for (SpriteDefinition sprite : sprites.values()) + { + // I don't know why this happens + if (sprite.getHeight() <= 0 || sprite.getWidth() <= 0) + { + continue; + } + + SpriteExporter exporter = new SpriteExporter(sprite); + File png = new File(outDir, sprite.getId() + "-" + sprite.getFrame() + ".png"); + + exporter.exportTo(png); + } + } + + @Override + public SpriteDefinition provide(int spriteId, int frameId) + { + return findSprite(spriteId, frameId); + } +} diff --git a/cache/src/main/java/net/runelite/cache/StructManager.java b/cache/src/main/java/net/runelite/cache/StructManager.java new file mode 100644 index 0000000000..bd816a4abb --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/StructManager.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.StructDefinition; +import net.runelite.cache.definitions.loaders.StructLoader; +import net.runelite.cache.definitions.providers.StructProvider; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; + +public class StructManager implements StructProvider +{ + private final Store store; + private final Map structs = new HashMap<>(); + + public StructManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + StructLoader loader = new StructLoader(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.STRUCT.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile f : files.getFiles()) + { + StructDefinition def = loader.load(f.getFileId(), f.getContents()); + structs.put(f.getFileId(), def); + } + } + + public Map getStructs() + { + return Collections.unmodifiableMap(structs); + } + + public StructDefinition getStruct(int structId) + { + return structs.get(structId); + } + + @Override + public StructDefinition provide(int structId) + { + return getStruct(structId); + } +} diff --git a/cache/src/main/java/net/runelite/cache/TextureManager.java b/cache/src/main/java/net/runelite/cache/TextureManager.java new file mode 100644 index 0000000000..9eeb3504f2 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/TextureManager.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import net.runelite.cache.definitions.TextureDefinition; +import net.runelite.cache.definitions.loaders.TextureLoader; +import net.runelite.cache.definitions.providers.TextureProvider; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; + +public class TextureManager implements TextureProvider +{ + private final Store store; + private final List textures = new ArrayList<>(); + + public TextureManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.TEXTURES); + Archive archive = index.getArchive(0); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + TextureLoader loader = new TextureLoader(); + + for (FSFile file : files.getFiles()) + { + TextureDefinition texture = loader.load(file.getFileId(), file.getContents()); + textures.add(texture); + } + } + + public List getTextures() + { + return textures; + } + + public TextureDefinition findTexture(int id) + { + for (TextureDefinition td : textures) + { + if (td.getId() == id) + { + return td; + } + } + return null; + } + + @Override + public TextureDefinition[] provide() + { + return textures.toArray(new TextureDefinition[textures.size()]); + } +} diff --git a/cache/src/main/java/net/runelite/cache/UnderlayManager.java b/cache/src/main/java/net/runelite/cache/UnderlayManager.java new file mode 100644 index 0000000000..3bba2230a4 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/UnderlayManager.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.UnderlayDefinition; +import net.runelite.cache.definitions.loaders.UnderlayLoader; +import net.runelite.cache.definitions.providers.UnderlayProvider; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; + +public class UnderlayManager implements UnderlayProvider +{ + private final Store store; + private final Map underlays = new HashMap<>(); + + public UnderlayManager(Store store) + { + this.store = store; + } + + public void load() throws IOException + { + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.UNDERLAY.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + UnderlayLoader loader = new UnderlayLoader(); + UnderlayDefinition underlay = loader.load(file.getFileId(), file.getContents()); + + underlays.put(underlay.getId(), underlay); + } + } + + public Collection getUnderlays() + { + return Collections.unmodifiableCollection(underlays.values()); + } + + @Override + public UnderlayDefinition provide(int underlayId) + { + return underlays.get(underlayId); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/AreaDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/AreaDefinition.java new file mode 100644 index 0000000000..7abdbdfddd --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/AreaDefinition.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class AreaDefinition +{ + public int id; + public int[] field3292; + public int spriteId = -1; + public int field3294 = -1; + public String name; + public int field3296; + public int field3297 = -1; + public String[] field3298 = new String[5]; + public int[] field3300; + public String field3308; + public byte[] field3309; + public int field3310; + +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/ClientScript1Instruction.java b/cache/src/main/java/net/runelite/cache/definitions/ClientScript1Instruction.java new file mode 100644 index 0000000000..b56c0a42d1 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/ClientScript1Instruction.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +public class ClientScript1Instruction +{ + @RequiredArgsConstructor + public enum Opcode + { + RETURN(0), + BOOSTED_SKILL_LEVELS(1), + REAL_SKILL_LEVELS(1), + SKILL_EXPERIENCE(1), + WIDGET_CONTAINS_ITEM_GET_QUANTITY(3), + VARP(1), + EXPERIENCE_AT_LEVEL_FOR_SKILL(1), + VARP_TIMES_469(1), + COMBAT_LEVEL(1), + TOTAL_LEVEL(0), + WIDGET_CONTAINS_ITEM_STAR(3), + RUN_ENERGY(0), + WEIGHT(0), + VARP_TESTBIT(2), + VARBIT(1), + MINUS(0), + DIV(0), + MUL(0), + WORLD_X(0), + WORLD_Y(1), + CONSTANT(1); + + public final int argumentCount; + } + + public Opcode opcode; + public int[] operands; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/EnumDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/EnumDefinition.java new file mode 100644 index 0000000000..e9f1c11b02 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/EnumDefinition.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.definitions; + +import lombok.Data; +import net.runelite.cache.util.ScriptVarType; + +@Data +public class EnumDefinition +{ + private int id; + private int[] intVals; + private ScriptVarType keyType; + private ScriptVarType valType; + private String defaultString = "null"; + private int defaultInt; + private int size; + private int[] keys; + private String[] stringVals; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/FrameDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/FrameDefinition.java new file mode 100644 index 0000000000..c31f0330ac --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/FrameDefinition.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class FrameDefinition +{ + public int id; // file id + public FramemapDefinition framemap; + public int[] translator_x; + public int[] translator_y; + public int[] translator_z; + public int translatorCount = -1; + public int[] indexFrameIds; + public boolean showing; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/FramemapDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/FramemapDefinition.java new file mode 100644 index 0000000000..00669d6690 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/FramemapDefinition.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class FramemapDefinition +{ + public int id; + public int[] types; + public int[][] frameMaps; + public int length; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/InterfaceDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/InterfaceDefinition.java new file mode 100644 index 0000000000..aede6d6d7b --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/InterfaceDefinition.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class InterfaceDefinition +{ + public int id = -1; + public boolean isIf3 = false; + public int type; + public int contentType; + public int originalX; + public int originalY; + public int originalWidth; + public int originalHeight; + public int widthMode; + public int heightMode; + public int xPositionMode; + public int yPositionMode; + public int parentId = -1; + public boolean isHidden; + public int scrollWidth; + public int scrollHeight; + public boolean noClickThrough; + public int spriteId; + public int textureId; + public boolean spriteTiling; + public int opacity; + public int borderType; + public int shadowColor; + public boolean flippedVertically; + public boolean flippedHorizontally; + public int modelType; + public int modelId; + public int offsetX2d; + public int offsetY2d; + public int rotationX; + public int rotationY; + public int rotationZ; + public int modelZoom; + public int animation; + public boolean orthogonal; + public int modelHeightOverride; + public int fontId; + public String text; + public int lineHeight; + public int xTextAlignment; + public int yTextAlignment; + public boolean textShadowed; + public int textColor; + public boolean filled; + public int lineWidth; + public boolean lineDirection; + public int clickMask; + public String name; + public String[] actions; + public int dragDeadZone; + public int dragDeadTime; + public boolean dragRenderBehavior; + public String targetVerb; + public Object[] onLoadListener; + public Object[] onMouseOverListener; + public Object[] onMouseLeaveListener; + public Object[] onTargetLeaveListener; + public Object[] onTargetEnterListener; + public Object[] onVarTransmitListener; + public Object[] onInvTransmitListener; + public Object[] onStatTransmitListener; + public Object[] onTimerListener; + public Object[] onOpListener; + public Object[] onMouseRepeatListener; + public Object[] onClickListener; + public Object[] onClickRepeatListener; + public Object[] onReleaseListener; + public Object[] onHoldListener; + public Object[] onDragListener; + public Object[] onDragCompleteListener; + public Object[] onScrollWheelListener; + public int[] varTransmitTriggers; + public int[] invTransmitTriggers; + public int[] statTransmitTriggers; + public boolean hasListener; + + public int menuType; + // This is set to a siblings' child id when that widget should get a hover effect when this one is hovered + public int hoveredSiblingId; + public int[] alternateOperators; + public int[] alternateRhs; + public ClientScript1Instruction[][] clientScripts; + public int[] itemIds; + public int[] itemQuantities; + public int xPitch; + public int yPitch; + public int[] xOffsets; + public int[] yOffsets; + public int[] sprites; + public String[] configActions; + public String alternateText; + public int alternateTextColor; + public int hoveredTextColor; + public int alternateHoveredTextColor; + public int alternateSpriteId; + public int alternateModelId; + public int alternateAnimation; + public String spellName; + public String tooltip; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/InventoryDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/InventoryDefinition.java new file mode 100644 index 0000000000..5239f5c093 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/InventoryDefinition.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class InventoryDefinition +{ + public int id; + public int size; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/ItemDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/ItemDefinition.java new file mode 100644 index 0000000000..8f67622b24 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/ItemDefinition.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import java.util.Map; +import lombok.Data; + +@Data +public class ItemDefinition +{ + public final int id; + + public String name = "null"; + + public int resizeX = 128; + public int resizeY = 128; + public int resizeZ = 128; + + public int xan2d = 0; + public int yan2d = 0; + public int zan2d = 0; + + public int cost = 1; + public boolean isTradeable; + public int stackable = 0; + public int inventoryModel; + public boolean members = false; + + public short[] colorFind; + public short[] colorReplace; + public short[] textureFind; + public short[] textureReplace; + + public int zoom2d = 2000; + public int xOffset2d = 0; + public int yOffset2d = 0; + + public int ambient; + public int contrast; + + public int[] countCo; + public int[] countObj; + + public String[] options = new String[] + { + null, null, "Take", null, null + }; + + public String[] interfaceOptions = new String[] + { + null, null, null, null, "Drop" + }; + + public int maleModel0 = -1; + public int maleModel1 = -1; + public int maleModel2 = -1; + public int maleOffset; + public int maleHeadModel = -1; + public int maleHeadModel2 = -1; + + public int femaleModel0 = -1; + public int femaleModel1 = -1; + public int femaleModel2 = -1; + public int femaleOffset; + public int femaleHeadModel = -1; + public int femaleHeadModel2 = -1; + + public int notedID = -1; + public int notedTemplate = -1; + + public int team; + + public int shiftClickDropIndex = -2; + + public int boughtId = -1; + public int boughtTemplateId = -1; + + public int placeholderId = -1; + public int placeholderTemplateId = -1; + + public Map params = null; + + public void updateNote(ItemDefinition notedItem, ItemDefinition unnotedItem) + { + this.inventoryModel = notedItem.inventoryModel; + this.zoom2d = notedItem.zoom2d; + this.xan2d = notedItem.xan2d; + this.yan2d = notedItem.yan2d; + this.zan2d = notedItem.zan2d; + this.xOffset2d = notedItem.xOffset2d; + this.yOffset2d = notedItem.yOffset2d; + this.colorFind = notedItem.colorFind; + this.colorReplace = notedItem.colorReplace; + this.textureFind = notedItem.textureFind; + this.textureReplace = notedItem.textureReplace; + this.name = unnotedItem.name; + this.members = unnotedItem.members; + this.cost = unnotedItem.cost; + this.stackable = 1; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/KitDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/KitDefinition.java new file mode 100644 index 0000000000..bd2ee535f5 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/KitDefinition.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class KitDefinition +{ + private final int id; + public short[] recolorToReplace; + public short[] recolorToFind; + public short[] retextureToFind; + public short[] retextureToReplace; + public int bodyPartId = -1; + public int[] modelIds; + public int[] models = new int[] + { + -1, -1, -1, -1, -1 + }; + public boolean nonSelectable = false; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/LocationsDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/LocationsDefinition.java new file mode 100644 index 0000000000..435cdd4746 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/LocationsDefinition.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import java.util.ArrayList; +import java.util.List; +import lombok.Data; +import net.runelite.cache.region.Location; + +@Data +public class LocationsDefinition +{ + private int regionX; + private int regionY; + private List locations = new ArrayList<>(); +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/MapDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/MapDefinition.java new file mode 100644 index 0000000000..b695b24cbe --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/MapDefinition.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class MapDefinition +{ + public static final int X = 64; + public static final int Y = 64; + public static final int Z = 4; + + @Data + public static class Tile + { + public Integer height; + public int attrOpcode; + public byte settings; + public byte overlayId; + public byte overlayPath; + public byte overlayRotation; + public byte underlayId; + } + + private int regionX; + private int regionY; + private Tile[][][] tiles = new Tile[Z][X][Y]; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/ModelDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/ModelDefinition.java new file mode 100644 index 0000000000..2259026a4d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/ModelDefinition.java @@ -0,0 +1,635 @@ +package net.runelite.cache.definitions; + +import java.util.Arrays; +import lombok.Data; +import net.runelite.cache.models.CircularAngle; +import net.runelite.cache.models.FaceNormal; +import net.runelite.cache.models.VertexNormal; + +@Data +public class ModelDefinition +{ + public int id; + + public int vertexCount = 0; + public int[] vertexPositionsX; + public int[] vertexPositionsY; + public int[] vertexPositionsZ; + public transient VertexNormal[] vertexNormals; + + public int faceCount; + public int[] faceVertexIndices1; + public int[] faceVertexIndices2; + public int[] faceVertexIndices3; + public byte[] faceAlphas; + public short[] faceColors; + public byte[] faceRenderPriorities; + public byte[] faceRenderTypes; + public transient FaceNormal[] faceNormals; + + public int textureTriangleCount; + public short[] textureTriangleVertexIndices1; + public short[] textureTriangleVertexIndices2; + public short[] textureTriangleVertexIndices3; + public transient float[][] faceTextureUCoordinates; + public transient float[][] faceTextureVCoordinates; + public short[] texturePrimaryColors; + public short[] faceTextures; + public byte[] textureCoordinates; + public byte[] textureRenderTypes; + + public int[] vertexSkins; + public int[] faceSkins; + + public byte priority; + + public short[] aShortArray2574; + public short[] aShortArray2575; + public short[] aShortArray2577; + public short[] aShortArray2578; + public byte[] aByteArray2580; + public short[] aShortArray2586; + + private transient int[][] vertexGroups; + + private transient int[] origVX; + private transient int[] origVY; + private transient int[] origVZ; + + public transient int maxPriority; + + public static transient int animOffsetX, animOffsetY, animOffsetZ; + + public void computeNormals() + { + if (this.vertexNormals != null) + { + return; + } + + this.vertexNormals = new VertexNormal[this.vertexCount]; + + int var1; + for (var1 = 0; var1 < this.vertexCount; ++var1) + { + this.vertexNormals[var1] = new VertexNormal(); + } + + for (var1 = 0; var1 < this.faceCount; ++var1) + { + int vertexA = this.faceVertexIndices1[var1]; + int vertexB = this.faceVertexIndices2[var1]; + int vertexC = this.faceVertexIndices3[var1]; + + int xA = this.vertexPositionsX[vertexB] - this.vertexPositionsX[vertexA]; + int yA = this.vertexPositionsY[vertexB] - this.vertexPositionsY[vertexA]; + int zA = this.vertexPositionsZ[vertexB] - this.vertexPositionsZ[vertexA]; + + int xB = this.vertexPositionsX[vertexC] - this.vertexPositionsX[vertexA]; + int yB = this.vertexPositionsY[vertexC] - this.vertexPositionsY[vertexA]; + int zB = this.vertexPositionsZ[vertexC] - this.vertexPositionsZ[vertexA]; + + // Compute cross product + int var11 = yA * zB - yB * zA; + int var12 = zA * xB - zB * xA; + int var13 = xA * yB - xB * yA; + + while (var11 > 8192 || var12 > 8192 || var13 > 8192 || var11 < -8192 || var12 < -8192 || var13 < -8192) + { + var11 >>= 1; + var12 >>= 1; + var13 >>= 1; + } + + int length = (int) Math.sqrt((double) (var11 * var11 + var12 * var12 + var13 * var13)); + if (length <= 0) + { + length = 1; + } + + var11 = var11 * 256 / length; + var12 = var12 * 256 / length; + var13 = var13 * 256 / length; + + byte var15; + if (this.faceRenderTypes == null) + { + var15 = 0; + } + else + { + var15 = this.faceRenderTypes[var1]; + } + + if (var15 == 0) + { + VertexNormal var16 = this.vertexNormals[vertexA]; + var16.x += var11; + var16.y += var12; + var16.z += var13; + ++var16.magnitude; + + var16 = this.vertexNormals[vertexB]; + var16.x += var11; + var16.y += var12; + var16.z += var13; + ++var16.magnitude; + + var16 = this.vertexNormals[vertexC]; + var16.x += var11; + var16.y += var12; + var16.z += var13; + ++var16.magnitude; + } + else if (var15 == 1) + { + if (this.faceNormals == null) + { + this.faceNormals = new FaceNormal[this.faceCount]; + } + + FaceNormal var17 = this.faceNormals[var1] = new FaceNormal(); + var17.x = var11; + var17.y = var12; + var17.z = var13; + } + } + } + + /** + * Computes the UV coordinates for every three-vertex face that has a + * texture. + */ + public void computeTextureUVCoordinates() + { + this.faceTextureUCoordinates = new float[faceCount][]; + this.faceTextureVCoordinates = new float[faceCount][]; + + for (int i = 0; i < faceCount; i++) + { + int textureCoordinate; + if (textureCoordinates == null) + { + textureCoordinate = -1; + } + else + { + textureCoordinate = textureCoordinates[i]; + } + + int textureIdx; + if (faceTextures == null) + { + textureIdx = -1; + } + else + { + textureIdx = faceTextures[i] & 0xFFFF; + } + + if (textureIdx != -1) + { + float[] u = new float[3]; + float[] v = new float[3]; + + if (textureCoordinate == -1) + { + u[0] = 0.0F; + v[0] = 1.0F; + + u[1] = 1.0F; + v[1] = 1.0F; + + u[2] = 0.0F; + v[2] = 0.0F; + } + else + { + textureCoordinate &= 0xFF; + + byte textureRenderType = 0; + if (textureRenderTypes != null) + { + textureRenderType = textureRenderTypes[textureCoordinate]; + } + + if (textureRenderType == 0) + { + int faceVertexIdx1 = faceVertexIndices1[i]; + int faceVertexIdx2 = faceVertexIndices2[i]; + int faceVertexIdx3 = faceVertexIndices3[i]; + + short triangleVertexIdx1 = textureTriangleVertexIndices1[textureCoordinate]; + short triangleVertexIdx2 = textureTriangleVertexIndices2[textureCoordinate]; + short triangleVertexIdx3 = textureTriangleVertexIndices3[textureCoordinate]; + + float triangleX = (float) vertexPositionsX[triangleVertexIdx1]; + float triangleY = (float) vertexPositionsY[triangleVertexIdx1]; + float triangleZ = (float) vertexPositionsZ[triangleVertexIdx1]; + + float f_882_ = (float) vertexPositionsX[triangleVertexIdx2] - triangleX; + float f_883_ = (float) vertexPositionsY[triangleVertexIdx2] - triangleY; + float f_884_ = (float) vertexPositionsZ[triangleVertexIdx2] - triangleZ; + float f_885_ = (float) vertexPositionsX[triangleVertexIdx3] - triangleX; + float f_886_ = (float) vertexPositionsY[triangleVertexIdx3] - triangleY; + float f_887_ = (float) vertexPositionsZ[triangleVertexIdx3] - triangleZ; + float f_888_ = (float) vertexPositionsX[faceVertexIdx1] - triangleX; + float f_889_ = (float) vertexPositionsY[faceVertexIdx1] - triangleY; + float f_890_ = (float) vertexPositionsZ[faceVertexIdx1] - triangleZ; + float f_891_ = (float) vertexPositionsX[faceVertexIdx2] - triangleX; + float f_892_ = (float) vertexPositionsY[faceVertexIdx2] - triangleY; + float f_893_ = (float) vertexPositionsZ[faceVertexIdx2] - triangleZ; + float f_894_ = (float) vertexPositionsX[faceVertexIdx3] - triangleX; + float f_895_ = (float) vertexPositionsY[faceVertexIdx3] - triangleY; + float f_896_ = (float) vertexPositionsZ[faceVertexIdx3] - triangleZ; + + float f_897_ = f_883_ * f_887_ - f_884_ * f_886_; + float f_898_ = f_884_ * f_885_ - f_882_ * f_887_; + float f_899_ = f_882_ * f_886_ - f_883_ * f_885_; + float f_900_ = f_886_ * f_899_ - f_887_ * f_898_; + float f_901_ = f_887_ * f_897_ - f_885_ * f_899_; + float f_902_ = f_885_ * f_898_ - f_886_ * f_897_; + float f_903_ = 1.0F / (f_900_ * f_882_ + f_901_ * f_883_ + f_902_ * f_884_); + + u[0] = (f_900_ * f_888_ + f_901_ * f_889_ + f_902_ * f_890_) * f_903_; + u[1] = (f_900_ * f_891_ + f_901_ * f_892_ + f_902_ * f_893_) * f_903_; + u[2] = (f_900_ * f_894_ + f_901_ * f_895_ + f_902_ * f_896_) * f_903_; + + f_900_ = f_883_ * f_899_ - f_884_ * f_898_; + f_901_ = f_884_ * f_897_ - f_882_ * f_899_; + f_902_ = f_882_ * f_898_ - f_883_ * f_897_; + f_903_ = 1.0F / (f_900_ * f_885_ + f_901_ * f_886_ + f_902_ * f_887_); + + v[0] = (f_900_ * f_888_ + f_901_ * f_889_ + f_902_ * f_890_) * f_903_; + v[1] = (f_900_ * f_891_ + f_901_ * f_892_ + f_902_ * f_893_) * f_903_; + v[2] = (f_900_ * f_894_ + f_901_ * f_895_ + f_902_ * f_896_) * f_903_; + } + } + + this.faceTextureUCoordinates[i] = u; + this.faceTextureVCoordinates[i] = v; + } + } + } + + public void computeAnimationTables() + { + if (this.vertexSkins != null) + { + int[] groupCounts = new int[256]; + int numGroups = 0; + int var3, var4; + + for (var3 = 0; var3 < this.vertexCount; ++var3) + { + var4 = this.vertexSkins[var3]; + ++groupCounts[var4]; + if (var4 > numGroups) + { + numGroups = var4; + } + } + + this.vertexGroups = new int[numGroups + 1][]; + + for (var3 = 0; var3 <= numGroups; ++var3) + { + this.vertexGroups[var3] = new int[groupCounts[var3]]; + groupCounts[var3] = 0; + } + + for (var3 = 0; var3 < this.vertexCount; this.vertexGroups[var4][groupCounts[var4]++] = var3++) + { + var4 = this.vertexSkins[var3]; + } + + this.vertexSkins = null; + } + + // triangleSkinValues is here + } + + public void rotate(int orientation) + { + int sin = CircularAngle.SINE[orientation]; + int cos = CircularAngle.COSINE[orientation]; + + assert vertexPositionsX.length == vertexPositionsY.length; + assert vertexPositionsY.length == vertexPositionsZ.length; + + for (int i = 0; i < vertexPositionsX.length; ++i) + { + vertexPositionsX[i] = vertexPositionsX[i] * cos + vertexPositionsZ[i] * sin >> 16; + vertexPositionsZ[i] = vertexPositionsZ[i] * cos - vertexPositionsX[i] * sin >> 16; + } + + reset(); + } + + public void resetAnim() + { + if (origVX == null) + { + return; + } + + System.arraycopy(origVX, 0, vertexPositionsX, 0, origVX.length); + System.arraycopy(origVY, 0, vertexPositionsY, 0, origVY.length); + System.arraycopy(origVZ, 0, vertexPositionsZ, 0, origVZ.length); + } + + public void animate(int type, int[] frameMap, int dx, int dy, int dz) + { + if (origVX == null) + { + origVX = Arrays.copyOf(vertexPositionsX, vertexPositionsX.length); + origVY = Arrays.copyOf(vertexPositionsY, vertexPositionsY.length); + origVZ = Arrays.copyOf(vertexPositionsZ, vertexPositionsZ.length); + } + + final int[] verticesX = vertexPositionsX; + final int[] verticesY = vertexPositionsY; + final int[] verticesZ = vertexPositionsZ; + int var6 = frameMap.length; + int var7; + int var8; + int var11; + int var12; + if (type == 0) + { + var7 = 0; + animOffsetX = 0; + animOffsetY = 0; + animOffsetZ = 0; + + for (var8 = 0; var8 < var6; ++var8) + { + int var9 = frameMap[var8]; + if (var9 < this.vertexGroups.length) + { + int[] var10 = this.vertexGroups[var9]; + + for (var11 = 0; var11 < var10.length; ++var11) + { + var12 = var10[var11]; + animOffsetX += verticesX[var12]; + animOffsetY += verticesY[var12]; + animOffsetZ += verticesZ[var12]; + ++var7; + } + } + } + + if (var7 > 0) + { + animOffsetX = dx + animOffsetX / var7; + animOffsetY = dy + animOffsetY / var7; + animOffsetZ = dz + animOffsetZ / var7; + } + else + { + animOffsetX = dx; + animOffsetY = dy; + animOffsetZ = dz; + } + + } + else + { + int[] var18; + int var19; + if (type == 1) + { + for (var7 = 0; var7 < var6; ++var7) + { + var8 = frameMap[var7]; + if (var8 < this.vertexGroups.length) + { + var18 = this.vertexGroups[var8]; + + for (var19 = 0; var19 < var18.length; ++var19) + { + var11 = var18[var19]; + verticesX[var11] += dx; + verticesY[var11] += dy; + verticesZ[var11] += dz; + } + } + } + + } + else if (type == 2) + { + for (var7 = 0; var7 < var6; ++var7) + { + var8 = frameMap[var7]; + if (var8 < this.vertexGroups.length) + { + var18 = this.vertexGroups[var8]; + + for (var19 = 0; var19 < var18.length; ++var19) + { + var11 = var18[var19]; + verticesX[var11] -= animOffsetX; + verticesY[var11] -= animOffsetY; + verticesZ[var11] -= animOffsetZ; + var12 = (dx & 255) * 8; + int var13 = (dy & 255) * 8; + int var14 = (dz & 255) * 8; + int var15; + int var16; + int var17; + if (var14 != 0) + { + var15 = CircularAngle.SINE[var14]; + var16 = CircularAngle.COSINE[var14]; + var17 = var15 * verticesY[var11] + var16 * verticesX[var11] >> 16; + verticesY[var11] = var16 * verticesY[var11] - var15 * verticesX[var11] >> 16; + verticesX[var11] = var17; + } + + if (var12 != 0) + { + var15 = CircularAngle.SINE[var12]; + var16 = CircularAngle.COSINE[var12]; + var17 = var16 * verticesY[var11] - var15 * verticesZ[var11] >> 16; + verticesZ[var11] = var15 * verticesY[var11] + var16 * verticesZ[var11] >> 16; + verticesY[var11] = var17; + } + + if (var13 != 0) + { + var15 = CircularAngle.SINE[var13]; + var16 = CircularAngle.COSINE[var13]; + var17 = var15 * verticesZ[var11] + var16 * verticesX[var11] >> 16; + verticesZ[var11] = var16 * verticesZ[var11] - var15 * verticesX[var11] >> 16; + verticesX[var11] = var17; + } + + verticesX[var11] += animOffsetX; + verticesY[var11] += animOffsetY; + verticesZ[var11] += animOffsetZ; + } + } + } + + } + else if (type == 3) + { + for (var7 = 0; var7 < var6; ++var7) + { + var8 = frameMap[var7]; + if (var8 < this.vertexGroups.length) + { + var18 = this.vertexGroups[var8]; + + for (var19 = 0; var19 < var18.length; ++var19) + { + var11 = var18[var19]; + verticesX[var11] -= animOffsetX; + verticesY[var11] -= animOffsetY; + verticesZ[var11] -= animOffsetZ; + verticesX[var11] = dx * verticesX[var11] / 128; + verticesY[var11] = dy * verticesY[var11] / 128; + verticesZ[var11] = dz * verticesZ[var11] / 128; + verticesX[var11] += animOffsetX; + verticesY[var11] += animOffsetY; + verticesZ[var11] += animOffsetZ; + } + } + } + + } + else if (type == 5) + { + // alpha animation + } + } + } + + public void method1493() + { + int var1; + for (var1 = 0; var1 < this.vertexCount; ++var1) + { + this.vertexPositionsZ[var1] = -this.vertexPositionsZ[var1]; + } + + for (var1 = 0; var1 < this.faceCount; ++var1) + { + int var2 = this.faceVertexIndices1[var1]; + this.faceVertexIndices1[var1] = this.faceVertexIndices3[var1]; + this.faceVertexIndices3[var1] = var2; + } + + reset(); + } + + public void rotate1() + { + for (int var1 = 0; var1 < this.vertexCount; ++var1) + { + int var2 = this.vertexPositionsX[var1]; + this.vertexPositionsX[var1] = this.vertexPositionsZ[var1]; + this.vertexPositionsZ[var1] = -var2; + } + + reset(); + } + + public void rotate2() + { + for (int var1 = 0; var1 < this.vertexCount; ++var1) + { + this.vertexPositionsX[var1] = -this.vertexPositionsX[var1]; + this.vertexPositionsZ[var1] = -this.vertexPositionsZ[var1]; + } + + reset(); + } + + public void rotate3() + { + for (int var1 = 0; var1 < this.vertexCount; ++var1) + { + int var2 = this.vertexPositionsZ[var1]; + this.vertexPositionsZ[var1] = this.vertexPositionsX[var1]; + this.vertexPositionsX[var1] = -var2; + } + + reset(); + } + + private void reset() + { + vertexNormals = null; + faceNormals = null; + faceTextureUCoordinates = faceTextureVCoordinates = null; + } + + public void resize(int var1, int var2, int var3) + { + for (int var4 = 0; var4 < this.vertexCount; ++var4) + { + this.vertexPositionsX[var4] = this.vertexPositionsX[var4] * var1 / 128; + this.vertexPositionsY[var4] = var2 * this.vertexPositionsY[var4] / 128; + this.vertexPositionsZ[var4] = var3 * this.vertexPositionsZ[var4] / 128; + } + + reset(); + } + + public void recolor(short var1, short var2) + { + for (int var3 = 0; var3 < this.faceCount; ++var3) + { + if (this.faceColors[var3] == var1) + { + this.faceColors[var3] = var2; + } + } + + } + + public void retexture(short var1, short var2) + { + if (this.faceTextures != null) + { + for (int var3 = 0; var3 < this.faceCount; ++var3) + { + if (this.faceTextures[var3] == var1) + { + this.faceTextures[var3] = var2; + } + } + + } + } + + public void move(int xOffset, int yOffset, int zOffset) + { + for (int i = 0; i < this.vertexCount; i++) + { + this.vertexPositionsX[i] += xOffset; + this.vertexPositionsY[i] += yOffset; + this.vertexPositionsZ[i] += zOffset; + } + this.reset(); + } + + public void computeMaxPriority() + { + if (faceRenderPriorities == null) + { + return; + } + + for (int i = 0; i < faceCount; ++i) + { + if (faceRenderPriorities[i] > maxPriority) + { + maxPriority = faceRenderPriorities[i]; + } + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java new file mode 100644 index 0000000000..8ba160c97a --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.definitions; + +import java.util.Map; +import lombok.Data; + +@Data +public class NpcDefinition +{ + + public final int id; + public short[] recolorToFind; + public int rotation = 32; + public String name = "null"; + public short[] recolorToReplace; + public int[] models; + public int[] models_2; + public int stanceAnimation = -1; + public int anInt2165 = -1; + public int tileSpacesOccupied = 1; + public int walkAnimation = -1; + public short[] retextureToReplace; + public int rotate90RightAnimation = -1; + public boolean aBool2170 = true; + public int resizeX = 128; + public int contrast = 0; + public int rotate180Animation = -1; + public int varbitIndex = -1; + public String[] options = new String[5]; + public boolean renderOnMinimap = true; + public int combatLevel = -1; + public int rotate90LeftAnimation = -1; + public int resizeY = 128; + public boolean hasRenderPriority = false; + public int ambient = 0; + public int headIcon = -1; + public int[] configs; + public short[] retextureToFind; + public int varpIndex = -1; + public boolean isClickable = true; + public int anInt2189 = -1; + public boolean aBool2190 = false; + public Map params = null; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/ObjectDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/ObjectDefinition.java new file mode 100644 index 0000000000..007c9e2ebf --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/ObjectDefinition.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.definitions; + +import java.util.Map; +import lombok.Data; + +@Data +public class ObjectDefinition +{ + private int id; + private short[] retextureToFind; + private int anInt2069 = 16; + private boolean isSolid = false; + private String name = "null"; + private int[] objectModels; + private int[] objectTypes; + private short[] recolorToFind; + private int mapAreaId = -1; + private short[] textureToReplace; + private int sizeX = 1; + private int sizeY = 1; + private int anInt2083 = 0; + private int[] anIntArray2084; + private int offsetX = 0; + private boolean nonFlatShading = false; + private int anInt2088 = -1; + private int animationID = -1; + private int varbitID = -1; + private int ambient = 0; + private int contrast = 0; + private String[] actions = new String[5]; + private int interactType = 2; + private int mapSceneID = -1; + private short[] recolorToReplace; + private boolean aBool2097 = true; + private int modelSizeX = 128; + private int modelSizeHeight = 128; + private int modelSizeY = 128; + private int objectID; + private int offsetHeight = 0; + private int offsetY = 0; + private boolean aBool2104 = false; + private int anInt2105 = -1; + private int anInt2106 = -1; + private int[] configChangeDest; + private boolean isRotated = false; + private int varpID = -1; + private int anInt2110 = -1; + private boolean aBool2111 = false; + private int anInt2112 = 0; + private int anInt2113 = 0; + private boolean blocksProjectile = true; + private Map params = null; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/OverlayDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/OverlayDefinition.java new file mode 100644 index 0000000000..3846e99364 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/OverlayDefinition.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class OverlayDefinition +{ + private int id; + private int rgbColor = 0; + private int texture = -1; + private int secondaryRgbColor = -1; + private boolean hideUnderlay = true; + + private transient int hue; + private transient int saturation; + private transient int lightness; + + private transient int otherHue; + private transient int otherSaturation; + private transient int otherLightness; + + public void calculateHsl() + { + if (secondaryRgbColor != -1) + { + calculateHsl(secondaryRgbColor); + otherHue = hue; + otherSaturation = saturation; + otherLightness = lightness; + } + + calculateHsl(rgbColor); + } + + private void calculateHsl(int var1) + { + double var2 = (double) (var1 >> 16 & 255) / 256.0D; + double var4 = (double) (var1 >> 8 & 255) / 256.0D; + double var6 = (double) (var1 & 255) / 256.0D; + double var8 = var2; + if (var4 < var2) + { + var8 = var4; + } + + if (var6 < var8) + { + var8 = var6; + } + + double var10 = var2; + if (var4 > var2) + { + var10 = var4; + } + + if (var6 > var10) + { + var10 = var6; + } + + double var12 = 0.0D; + double var14 = 0.0D; + double var16 = (var8 + var10) / 2.0D; + if (var10 != var8) + { + if (var16 < 0.5D) + { + var14 = (var10 - var8) / (var10 + var8); + } + + if (var16 >= 0.5D) + { + var14 = (var10 - var8) / (2.0D - var10 - var8); + } + + if (var2 == var10) + { + var12 = (var4 - var6) / (var10 - var8); + } + else if (var4 == var10) + { + var12 = 2.0D + (var6 - var2) / (var10 - var8); + } + else if (var10 == var6) + { + var12 = 4.0D + (var2 - var4) / (var10 - var8); + } + } + + var12 /= 6.0D; + this.hue = (int) (256.0D * var12); + this.saturation = (int) (var14 * 256.0D); + this.lightness = (int) (var16 * 256.0D); + if (this.saturation < 0) + { + this.saturation = 0; + } + else if (this.saturation > 255) + { + this.saturation = 255; + } + + if (this.lightness < 0) + { + this.lightness = 0; + } + else if (this.lightness > 255) + { + this.lightness = 255; + } + + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/ScriptDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/ScriptDefinition.java new file mode 100644 index 0000000000..cb57851b8c --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/ScriptDefinition.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import java.util.Map; +import lombok.Data; + +@Data +public class ScriptDefinition +{ + private int id; + private int[] instructions; + private int[] intOperands; + private String[] stringOperands; + private int intStackCount; + private int stringStackCount; + private int localIntCount; + private int localStringCount; + private Map[] switches; +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/HealerTeam.java b/cache/src/main/java/net/runelite/cache/definitions/SequenceDefinition.java similarity index 68% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/HealerTeam.java rename to cache/src/main/java/net/runelite/cache/definitions/SequenceDefinition.java index c82cb38e1e..3f280f31c2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/HealerTeam.java +++ b/cache/src/main/java/net/runelite/cache/definitions/SequenceDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, whartd + * Copyright (c) 2016-2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,23 +22,26 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.barbarianassault; +package net.runelite.cache.definitions; -import lombok.AllArgsConstructor; -import lombok.Getter; -import api.Point; -import api.widgets.WidgetInfo; +import lombok.Data; -@Getter -@AllArgsConstructor -enum HealerTeam +@Data +public class SequenceDefinition { - TEAMMATE1(WidgetInfo.BA_HEAL_TEAMMATE1, new Point(28, 2), 115), - TEAMMATE2(WidgetInfo.BA_HEAL_TEAMMATE2, new Point(26, 2), 115), - TEAMMATE3(WidgetInfo.BA_HEAL_TEAMMATE3, new Point(26, 2), 115), - TEAMMATE4(WidgetInfo.BA_HEAL_TEAMMATE4, new Point(25, 2), 115); - - private WidgetInfo teammate; - private Point offset; - private int width; + private final int id; + public int[] frameIDs; // top 16 bits are FrameDefinition ids + public int[] field3048; + public int[] frameLenghts; + public int rightHandItem = -1; + public int[] interleaveLeave; + public boolean stretches = false; + public int forcedPriority = 5; + public int maxLoops = 99; + public int[] field3056; + public int precedenceAnimating = -1; + public int leftHandItem = -1; + public int replyMode = 2; + public int frameStep = -1; + public int priority = -1; } diff --git a/cache/src/main/java/net/runelite/cache/definitions/SpotAnimDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/SpotAnimDefinition.java new file mode 100644 index 0000000000..e85b3918e2 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/SpotAnimDefinition.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class SpotAnimDefinition +{ + public int rotaton = 0; + public short[] textureToReplace; + public int id; + public short[] textureToFind; + public int resizeY = 128; + public int animationId = -1; + public short[] recolorToFind; + public short[] recolorToReplace; + public int resizeX = 128; + public int modelId; + public int ambient = 0; + public int contrast = 0; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/SpriteDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/SpriteDefinition.java new file mode 100644 index 0000000000..632ea1e4e3 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/SpriteDefinition.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class SpriteDefinition +{ + private int id; + private int frame; + private int offsetX; + private int offsetY; + private int width; + private int height; + private int[] pixels; + private int maxWidth; + private int maxHeight; + + public transient byte[] pixelIdx; + public transient int[] palette; + + public void normalize() + { + if (this.width != this.maxWidth || this.height != this.maxHeight) + { + byte[] var1 = new byte[this.maxWidth * this.maxHeight]; + int var2 = 0; + + for (int var3 = 0; var3 < this.height; ++var3) + { + for (int var4 = 0; var4 < this.width; ++var4) + { + var1[var4 + (var3 + this.offsetY) * this.maxWidth + this.offsetX] = this.pixelIdx[var2++]; + } + } + + this.pixelIdx = var1; + this.width = this.maxWidth; + this.height = this.maxHeight; + this.offsetX = 0; + this.offsetY = 0; + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/StructDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/StructDefinition.java new file mode 100644 index 0000000000..455ce9ea5e --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/StructDefinition.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import java.util.Map; +import lombok.Data; + +@Data +public class StructDefinition +{ + public final int id; + public Map params = null; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/TextureDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/TextureDefinition.java new file mode 100644 index 0000000000..d34bc5678a --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/TextureDefinition.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.definitions; + +import lombok.Data; +import net.runelite.cache.definitions.providers.SpriteProvider; + +@Data +public class TextureDefinition +{ + public int field1777; + public boolean field1778; + private int id; + private int[] fileIds; + public int[] field1780; + public int[] field1781; + public int[] field1786; + public int field1782; + public int field1783; + + public transient int[] pixels; + + public boolean method2680(double var1, int var3, SpriteProvider spriteProvider) + { + int var5 = var3 * var3; + this.pixels = new int[var5]; + + for (int var6 = 0; var6 < this.fileIds.length; ++var6) + { + SpriteDefinition var7 = spriteProvider.provide(fileIds[var6], 0); + var7.normalize(); + byte[] var8 = var7.pixelIdx; + int[] var9 = var7.palette; + int var10 = this.field1786[var6]; + + int var11; + int var12; + int var13; + int var14; + if ((var10 & -16777216) == 50331648) + { + var11 = var10 & 16711935; + var12 = var10 >> 8 & 255; + + for (var13 = 0; var13 < var9.length; ++var13) + { + var14 = var9[var13]; + if (var14 >> 8 == (var14 & 65535)) + { + var14 &= 255; + var9[var13] = var11 * var14 >> 8 & 16711935 | var12 * var14 & 65280; + } + } + } + + for (var11 = 0; var11 < var9.length; ++var11) + { + var9[var11] = adjustRGB(var9[var11], var1); + } + + if (var6 == 0) + { + var11 = 0; + } + else + { + var11 = this.field1780[var6 - 1]; + } + + if (var11 == 0) + { + if (var3 == var7.getMaxWidth()) + { + for (var12 = 0; var12 < var5; ++var12) + { + this.pixels[var12] = var9[var8[var12] & 255]; + } + } + else if (var7.getMaxWidth() == 64 && var3 == 128) + { + var12 = 0; + + for (var13 = 0; var13 < var3; ++var13) + { + for (var14 = 0; var14 < var3; ++var14) + { + this.pixels[var12++] = var9[var8[(var13 >> 1 << 6) + (var14 >> 1)] & 255]; + } + } + } + else + { + if (var7.getMaxWidth() != 128 || var3 != 64) + { + throw new RuntimeException(); + } + + var12 = 0; + + for (var13 = 0; var13 < var3; ++var13) + { + for (var14 = 0; var14 < var3; ++var14) + { + this.pixels[var12++] = var9[var8[(var14 << 1) + (var13 << 1 << 7)] & 255]; + } + } + } + } + } + + return true; + } + + static int adjustRGB(int var0, double var1) + { + double var3 = (double) (var0 >> 16) / 256.0D; + double var5 = (double) (var0 >> 8 & 255) / 256.0D; + double var7 = (double) (var0 & 255) / 256.0D; + var3 = Math.pow(var3, var1); + var5 = Math.pow(var5, var1); + var7 = Math.pow(var7, var1); + int var9 = (int) (var3 * 256.0D); + int var10 = (int) (var5 * 256.0D); + int var11 = (int) (var7 * 256.0D); + return var11 + (var10 << 8) + (var9 << 16); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/TrackDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/TrackDefinition.java new file mode 100644 index 0000000000..136070e8f9 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/TrackDefinition.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class TrackDefinition +{ + public byte[] midi; // midi file contents +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/UnderlayDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/UnderlayDefinition.java new file mode 100644 index 0000000000..7d3d8c2a47 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/UnderlayDefinition.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class UnderlayDefinition +{ + private int id; + private int color; + + private transient int hue; + private transient int saturation; + private transient int lightness; + private transient int hueMultiplier; + + public void calculateHsl() + { + int var1 = color; + double var2 = (double) (var1 >> 16 & 255) / 256.0D; + double var4 = (double) (var1 >> 8 & 255) / 256.0D; + double var6 = (double) (var1 & 255) / 256.0D; + double var8 = var2; + if (var4 < var2) + { + var8 = var4; + } + + if (var6 < var8) + { + var8 = var6; + } + + double var10 = var2; + if (var4 > var2) + { + var10 = var4; + } + + if (var6 > var10) + { + var10 = var6; + } + + double var12 = 0.0D; + double var14 = 0.0D; + double var16 = (var10 + var8) / 2.0D; + if (var8 != var10) + { + if (var16 < 0.5D) + { + var14 = (var10 - var8) / (var8 + var10); + } + + if (var16 >= 0.5D) + { + var14 = (var10 - var8) / (2.0D - var10 - var8); + } + + if (var2 == var10) + { + var12 = (var4 - var6) / (var10 - var8); + } + else if (var10 == var4) + { + var12 = 2.0D + (var6 - var2) / (var10 - var8); + } + else if (var10 == var6) + { + var12 = 4.0D + (var2 - var4) / (var10 - var8); + } + } + + var12 /= 6.0D; + this.saturation = (int) (var14 * 256.0D); + this.lightness = (int) (var16 * 256.0D); + if (this.saturation < 0) + { + this.saturation = 0; + } + else if (this.saturation > 255) + { + this.saturation = 255; + } + + if (this.lightness < 0) + { + this.lightness = 0; + } + else if (this.lightness > 255) + { + this.lightness = 255; + } + + if (var16 > 0.5D) + { + this.hueMultiplier = (int) (var14 * (1.0D - var16) * 512.0D); + } + else + { + this.hueMultiplier = (int) (var14 * var16 * 512.0D); + } + + if (this.hueMultiplier < 1) + { + this.hueMultiplier = 1; + } + + this.hue = (int) ((double) this.hueMultiplier * var12); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/VarbitDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/VarbitDefinition.java new file mode 100644 index 0000000000..f50ae2ddf1 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/VarbitDefinition.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class VarbitDefinition +{ + private int id; + private int index; + private int leastSignificantBit; + private int mostSignificantBit; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/WorldMapDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/WorldMapDefinition.java new file mode 100644 index 0000000000..a8333263e5 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/WorldMapDefinition.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import java.util.List; +import lombok.Data; +import net.runelite.cache.region.Position; + +@Data +public class WorldMapDefinition +{ + public String name; + public int field450; + public int field451; + public int fileId; + public int field453; + public int field454; + public int field456; + public boolean field457; + public List field458; + public String safeName; + public Position position; + public int field463; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/WorldMapType0.java b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType0.java new file mode 100644 index 0000000000..1294d0eb4d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType0.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class WorldMapType0 implements WorldMapTypeBase +{ + public int field600; + public int field601; + public int field602; + public int field603; + public int field604; + public int field605; + public int field606; + public int field607; + public int field608; + public int field609; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/WorldMapType1.java b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType1.java new file mode 100644 index 0000000000..15a4f3e28d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType1.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class WorldMapType1 implements WorldMapTypeBase +{ + public int field424; + public int field425; + public int field426; + public int field427; + public int field428; + public int field429; + public int field431; + public int field433; + public int field434; + public int field435; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/WorldMapType2.java b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType2.java new file mode 100644 index 0000000000..7b5326814d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType2.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class WorldMapType2 implements WorldMapTypeBase +{ + public int field510; + public int field511; + public int field512; + public int field514; + public int field515; + public int field519; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/WorldMapType3.java b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType3.java new file mode 100644 index 0000000000..433c8a17fa --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/WorldMapType3.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +import lombok.Data; + +@Data +public class WorldMapType3 implements WorldMapTypeBase +{ + public int field376; + public int field377; + public int field378; + public int field379; + public int field380; + public int field381; + public int field382; + public int field383; + public int field384; + public int field385; + public int field386; + public int field387; + public int field388; + public int field389; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/WorldMapTypeBase.java b/cache/src/main/java/net/runelite/cache/definitions/WorldMapTypeBase.java new file mode 100644 index 0000000000..d24d6d63f3 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/WorldMapTypeBase.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions; + +public interface WorldMapTypeBase +{ + +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/exporters/InterfaceExporter.java b/cache/src/main/java/net/runelite/cache/definitions/exporters/InterfaceExporter.java new file mode 100644 index 0000000000..b1020b9a59 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/exporters/InterfaceExporter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.exporters; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import net.runelite.cache.definitions.InterfaceDefinition; + +public class InterfaceExporter +{ + private final InterfaceDefinition item; + private final Gson gson; + + public InterfaceExporter(InterfaceDefinition item) + { + this.item = item; + + GsonBuilder builder = new GsonBuilder() + .setPrettyPrinting(); + gson = builder.create(); + } + + public String export() + { + return gson.toJson(item); + } + + public void exportTo(File file) throws IOException + { + try (FileWriter fw = new FileWriter(file)) + { + fw.write(export()); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/exporters/ItemExporter.java b/cache/src/main/java/net/runelite/cache/definitions/exporters/ItemExporter.java new file mode 100644 index 0000000000..5dddff97ee --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/exporters/ItemExporter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.exporters; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import net.runelite.cache.definitions.ItemDefinition; + +public class ItemExporter +{ + private final ItemDefinition item; + private final Gson gson; + + public ItemExporter(ItemDefinition item) + { + this.item = item; + + GsonBuilder builder = new GsonBuilder() + .setPrettyPrinting(); + gson = builder.create(); + } + + public String export() + { + return gson.toJson(item); + } + + public void exportTo(File file) throws IOException + { + try (FileWriter fw = new FileWriter(file)) + { + fw.write(export()); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/exporters/NpcExporter.java b/cache/src/main/java/net/runelite/cache/definitions/exporters/NpcExporter.java new file mode 100644 index 0000000000..eec1be340b --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/exporters/NpcExporter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.exporters; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import net.runelite.cache.definitions.NpcDefinition; + +public class NpcExporter +{ + private final NpcDefinition npc; + private final Gson gson; + + public NpcExporter(NpcDefinition npc) + { + this.npc = npc; + + GsonBuilder builder = new GsonBuilder() + .setPrettyPrinting(); + gson = builder.create(); + } + + public String export() + { + return gson.toJson(npc); + } + + public void exportTo(File file) throws IOException + { + try (FileWriter fw = new FileWriter(file)) + { + fw.write(export()); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/exporters/ObjectExporter.java b/cache/src/main/java/net/runelite/cache/definitions/exporters/ObjectExporter.java new file mode 100644 index 0000000000..994bff625f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/exporters/ObjectExporter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.exporters; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import net.runelite.cache.definitions.ObjectDefinition; + +public class ObjectExporter +{ + private final ObjectDefinition object; + private final Gson gson; + + public ObjectExporter(ObjectDefinition object) + { + this.object = object; + + GsonBuilder builder = new GsonBuilder() + .setPrettyPrinting(); + gson = builder.create(); + } + + public String export() + { + return gson.toJson(object); + } + + public void exportTo(File file) throws IOException + { + try (FileWriter fw = new FileWriter(file)) + { + fw.write(export()); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/exporters/SpriteExporter.java b/cache/src/main/java/net/runelite/cache/definitions/exporters/SpriteExporter.java new file mode 100644 index 0000000000..9c073d5e3a --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/exporters/SpriteExporter.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.exporters; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; +import net.runelite.cache.definitions.SpriteDefinition; + +public class SpriteExporter +{ + private final SpriteDefinition sprite; + + public SpriteExporter(SpriteDefinition sprite) + { + this.sprite = sprite; + } + + public BufferedImage export() + { + BufferedImage bi = new BufferedImage(sprite.getWidth(), sprite.getHeight(), BufferedImage.TYPE_INT_ARGB); + bi.setRGB(0, 0, sprite.getWidth(), sprite.getHeight(), sprite.getPixels(), 0, sprite.getWidth()); + return bi; + } + + public void exportTo(File file) throws IOException + { + BufferedImage image = export(); + ImageIO.write(image, "png", file); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/AreaLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/AreaLoader.java new file mode 100644 index 0000000000..7b47358678 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/AreaLoader.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.AreaDefinition; +import net.runelite.cache.io.InputStream; + +public class AreaLoader +{ + public AreaDefinition load(byte[] b, int id) + { + InputStream in = new InputStream(b); + AreaDefinition def = new AreaDefinition(); + def.id = id; + + for (;;) + { + int opcode = in.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + processOpcode(def, in, opcode); + } + + return def; + } + + private void processOpcode(AreaDefinition def, InputStream in, int opcode) + { + if (opcode == 1) + { + def.spriteId = in.readBigSmart2(); + } + else if (opcode == 2) + { + def.field3294 = in.readBigSmart2(); + } + else if (opcode == 3) + { + def.name = in.readString(); + } + else if (opcode == 4) + { + def.field3296 = in.read24BitInt(); + } + else if (opcode == 5) + { + in.read24BitInt(); + } + else if (opcode == 6) + { + def.field3310 = in.readUnsignedByte(); + } + else if (opcode == 7) + { + int var3 = in.readUnsignedByte(); + if ((var3 & 1) == 0) + { + ; + } + + if ((var3 & 2) == 2) + { + ; + } + } + else if (opcode == 8) + { + in.readUnsignedByte(); + } + else if (opcode >= 10 && opcode <= 14) + { + def.field3298[opcode - 10] = in.readString(); + } + else if (opcode == 15) + { + int var3 = in.readUnsignedByte(); + def.field3300 = new int[var3 * 2]; + + int var4; + for (var4 = 0; var4 < var3 * 2; ++var4) + { + def.field3300[var4] = in.readShort(); + } + + in.readInt(); + var4 = in.readUnsignedByte(); + def.field3292 = new int[var4]; + + int var5; + for (var5 = 0; var5 < def.field3292.length; ++var5) + { + def.field3292[var5] = in.readInt(); + } + + def.field3309 = new byte[var3]; + + for (var5 = 0; var5 < var3; ++var5) + { + def.field3309[var5] = in.readByte(); + } + } + else if (opcode == 16) + { + + } + else if (opcode == 17) + { + def.field3308 = in.readString(); + } + else if (opcode == 18) + { + in.readBigSmart2(); + } + else if (opcode == 19) + { + def.field3297 = in.readUnsignedShort(); + } + else if (opcode == 21) + { + in.readInt(); + } + else if (opcode == 22) + { + in.readInt(); + } + else if (opcode == 23) + { + in.readUnsignedByte(); + in.readUnsignedByte(); + in.readUnsignedByte(); + } + else if (opcode == 24) + { + in.readShort(); + in.readShort(); + } + else if (opcode == 25) + { + in.readBigSmart2(); + } + else if (opcode == 28) + { + in.readUnsignedByte(); + } + else if (opcode == 29) + { + in.skip(1); +// class257[] var6 = new class257[] +// { +// class257.field3538, class257.field3539, class257.field3540 +// }; +// this.field3299 = (class257) Item.method1751(var6, var1.readUnsignedByte()); + } + else if (opcode == 30) + { + in.skip(1); +// class239[] var7 = new class239[] +// { +// class239.field3273, class239.field3275, class239.field3271 +// }; +// this.field3306 = (class239) Item.method1751(var7, var1.readUnsignedByte()); + } + + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/EnumLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/EnumLoader.java new file mode 100644 index 0000000000..83542c4fed --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/EnumLoader.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.EnumDefinition; +import net.runelite.cache.io.InputStream; +import net.runelite.cache.util.ScriptVarType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EnumLoader +{ + private static final Logger logger = LoggerFactory.getLogger(EnumLoader.class); + + public EnumDefinition load(int id, byte[] b) + { + if (b.length == 1 && b[0] == 0) + { + return null; + } + + EnumDefinition def = new EnumDefinition(); + InputStream is = new InputStream(b); + + def.setId(id); + + for (;;) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + processOp(opcode, def, is); + } + + return def; + } + + private void processOp(int opcode, EnumDefinition def, InputStream is) + { + switch (opcode) + { + case 1: + def.setKeyType(ScriptVarType.forCharKey((char) is.readUnsignedByte())); + break; + case 2: + def.setValType(ScriptVarType.forCharKey((char) is.readUnsignedByte())); + break; + case 3: + def.setDefaultString(is.readString()); + break; + case 4: + def.setDefaultInt(is.readInt()); + break; + case 5: + { + int size = is.readUnsignedShort(); + int[] keys = new int[size]; + String[] stringVals = new String[size]; + for (int index = 0; index < size; ++index) + { + keys[index] = is.readInt(); + stringVals[index] = is.readString(); + } + def.setSize(size); + def.setKeys(keys); + def.setStringVals(stringVals); + break; + } + case 6: + { + int size = is.readUnsignedShort(); + int[] keys = new int[size]; + int[] intVals = new int[size]; + for (int index = 0; index < size; ++index) + { + keys[index] = is.readInt(); + intVals[index] = is.readInt(); + } + def.setSize(size); + def.setKeys(keys); + def.setIntVals(intVals); + break; + } + default: + logger.warn("Unrecognized opcode {}", opcode); + break; + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/FrameLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/FrameLoader.java new file mode 100644 index 0000000000..5ec512d62f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/FrameLoader.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.FrameDefinition; +import net.runelite.cache.definitions.FramemapDefinition; +import net.runelite.cache.io.InputStream; + +public class FrameLoader +{ + public FrameDefinition load(FramemapDefinition framemap, int id, byte[] b) + { + FrameDefinition def = new FrameDefinition(); + InputStream in = new InputStream(b); + InputStream data = new InputStream(b); + + def.id = id; + def.framemap = framemap; + + int framemapArchiveIndex = in.readUnsignedShort(); + int length = in.readUnsignedByte(); + + data.skip(3 + length); // framemapArchiveIndex + length + data + + int[] indexFrameIds = new int[500]; + int[] scratchTranslatorX = new int[500]; + int[] scratchTranslatorY = new int[500]; + int[] scratchTranslatorZ = new int[500]; + + int lastI = -1; + int index = 0; + for (int i = 0; i < length; ++i) + { + int var9 = in.readUnsignedByte(); + + if (var9 <= 0) + { + continue; + } + + if (def.framemap.types[i] != 0) + { + for (int var10 = i - 1; var10 > lastI; --var10) + { + if (def.framemap.types[var10] == 0) + { + indexFrameIds[index] = var10; + scratchTranslatorX[index] = 0; + scratchTranslatorY[index] = 0; + scratchTranslatorZ[index] = 0; + ++index; + break; + } + } + } + + indexFrameIds[index] = i; + short var11 = 0; + if (def.framemap.types[i] == 3) + { + var11 = 128; + } + + if ((var9 & 1) != 0) + { + scratchTranslatorX[index] = data.readShortSmart(); + } + else + { + scratchTranslatorX[index] = var11; + } + + if ((var9 & 2) != 0) + { + scratchTranslatorY[index] = data.readShortSmart(); + } + else + { + scratchTranslatorY[index] = var11; + } + + if ((var9 & 4) != 0) + { + scratchTranslatorZ[index] = data.readShortSmart(); + } + else + { + scratchTranslatorZ[index] = var11; + } + + lastI = i; + ++index; + if (def.framemap.types[i] == 5) + { + def.showing = true; + } + } + + if (data.getOffset() != b.length) + { + throw new RuntimeException(); + } + + def.translatorCount = index; + def.indexFrameIds = new int[index]; + def.translator_x = new int[index]; + def.translator_y = new int[index]; + def.translator_z = new int[index]; + + for (int i = 0; i < index; ++i) + { + def.indexFrameIds[i] = indexFrameIds[i]; + def.translator_x[i] = scratchTranslatorX[i]; + def.translator_y[i] = scratchTranslatorY[i]; + def.translator_z[i] = scratchTranslatorZ[i]; + } + + return def; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/FramemapLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/FramemapLoader.java new file mode 100644 index 0000000000..b649af8e47 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/FramemapLoader.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.FramemapDefinition; +import net.runelite.cache.io.InputStream; + +public class FramemapLoader +{ + public FramemapDefinition load(int id, byte[] b) + { + FramemapDefinition def = new FramemapDefinition(); + InputStream in = new InputStream(b); + + def.id = id; + + def.length = in.readUnsignedByte(); + def.types = new int[def.length]; + def.frameMaps = new int[def.length][]; + + for (int i = 0; i < def.length; ++i) + { + def.types[i] = in.readUnsignedByte(); + } + + for (int i = 0; i < def.length; ++i) + { + def.frameMaps[i] = new int[in.readUnsignedByte()]; + } + + for (int i = 0; i < def.length; ++i) + { + for (int j = 0; j < def.frameMaps[i].length; ++j) + { + def.frameMaps[i][j] = in.readUnsignedByte(); + } + } + + return def; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/InterfaceLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/InterfaceLoader.java new file mode 100644 index 0000000000..69db420f9f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/InterfaceLoader.java @@ -0,0 +1,572 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import net.runelite.cache.definitions.ClientScript1Instruction; +import net.runelite.cache.definitions.InterfaceDefinition; +import net.runelite.cache.io.InputStream; + +public class InterfaceLoader +{ + public InterfaceDefinition load(int id, byte[] b) + { + InterfaceDefinition iface = new InterfaceDefinition(); + iface.id = id; + if (b[0] == -1) + { + decodeIf3(iface, new InputStream(b)); + } + else + { + decodeIf1(iface, new InputStream(b)); + } + + return iface; + } + + private void decodeIf1(InterfaceDefinition iface, InputStream var1) + { + iface.isIf3 = false; + iface.type = var1.readUnsignedByte(); + iface.menuType = var1.readUnsignedByte(); + iface.contentType = var1.readUnsignedShort(); + iface.originalX = var1.readShort(); + iface.originalY = var1.readShort(); + iface.originalWidth = var1.readUnsignedShort(); + iface.originalHeight = var1.readUnsignedShort(); + iface.opacity = var1.readUnsignedByte(); + iface.parentId = var1.readUnsignedShort(); + if (iface.parentId == 0xFFFF) + { + iface.parentId = -1; + } + else + { + iface.parentId += iface.id & ~0xFFFF; + } + + iface.hoveredSiblingId = var1.readUnsignedShort(); + if (iface.hoveredSiblingId == 0xFFFF) + { + iface.hoveredSiblingId = -1; + } + + int var2 = var1.readUnsignedByte(); + int var3; + if (var2 > 0) + { + iface.alternateOperators = new int[var2]; + iface.alternateRhs = new int[var2]; + + for (var3 = 0; var3 < var2; ++var3) + { + iface.alternateOperators[var3] = var1.readUnsignedByte(); + iface.alternateRhs[var3] = var1.readUnsignedShort(); + } + } + + var3 = var1.readUnsignedByte(); + int var4; + int var5; + int var6; + if (var3 > 0) + { + iface.clientScripts = new ClientScript1Instruction[var3][]; + + for (var4 = 0; var4 < var3; ++var4) + { + var5 = var1.readUnsignedShort(); + int[] bytecode = new int[var5]; + + for (var6 = 0; var6 < var5; ++var6) + { + bytecode[var6] = var1.readUnsignedShort(); + if (bytecode[var6] == 0xFFFF) + { + bytecode[var6] = -1; + } + + List instructions = new ArrayList<>(); + for (int i = 0; i < bytecode.length;) + { + ClientScript1Instruction ins = new ClientScript1Instruction(); + + ins.opcode = ClientScript1Instruction.Opcode.values()[bytecode[i++]]; + + int ac = ins.opcode.argumentCount; + ins.operands = Arrays.copyOfRange(bytecode, i, i + ac); + + instructions.add(ins); + i += ac; + } + iface.clientScripts[var4] = instructions.toArray(new ClientScript1Instruction[0]); + } + } + } + + if (iface.type == 0) + { + iface.scrollHeight = var1.readUnsignedShort(); + iface.isHidden = var1.readUnsignedByte() == 1; + } + + if (iface.type == 1) + { + var1.readUnsignedShort(); + var1.readUnsignedByte(); + } + + if (iface.type == 2) + { + iface.itemIds = new int[iface.originalWidth * iface.originalHeight]; + iface.itemQuantities = new int[iface.originalHeight * iface.originalWidth]; + var4 = var1.readUnsignedByte(); + if (var4 == 1) + { + iface.clickMask |= 268435456; + } + + var5 = var1.readUnsignedByte(); + if (var5 == 1) + { + iface.clickMask |= 1073741824; + } + + var6 = var1.readUnsignedByte(); + if (var6 == 1) + { + iface.clickMask |= Integer.MIN_VALUE; + } + + int var7 = var1.readUnsignedByte(); + if (var7 == 1) + { + iface.clickMask |= 536870912; + } + + iface.xPitch = var1.readUnsignedByte(); + iface.yPitch = var1.readUnsignedByte(); + iface.xOffsets = new int[20]; + iface.yOffsets = new int[20]; + iface.sprites = new int[20]; + + int var8; + for (var8 = 0; var8 < 20; ++var8) + { + int var9 = var1.readUnsignedByte(); + if (var9 == 1) + { + iface.xOffsets[var8] = var1.readShort(); + iface.yOffsets[var8] = var1.readShort(); + iface.sprites[var8] = var1.readInt(); + } + else + { + iface.sprites[var8] = -1; + } + } + + iface.configActions = new String[5]; + + for (var8 = 0; var8 < 5; ++var8) + { + String var11 = var1.readString(); + if (var11.length() > 0) + { + iface.configActions[var8] = var11; + iface.clickMask |= 1 << var8 + 23; + } + } + } + + if (iface.type == 3) + { + iface.filled = var1.readUnsignedByte() == 1; + } + + if (iface.type == 4 || iface.type == 1) + { + iface.xTextAlignment = var1.readUnsignedByte(); + iface.yTextAlignment = var1.readUnsignedByte(); + iface.lineHeight = var1.readUnsignedByte(); + iface.fontId = var1.readUnsignedShort(); + if (iface.fontId == 0xFFFF) + { + iface.fontId = -1; + } + + iface.textShadowed = var1.readUnsignedByte() == 1; + } + + if (iface.type == 4) + { + iface.text = var1.readString(); + iface.alternateText = var1.readString(); + } + + if (iface.type == 1 || iface.type == 3 || iface.type == 4) + { + iface.textColor = var1.readInt(); + } + + if (iface.type == 3 || iface.type == 4) + { + iface.alternateTextColor = var1.readInt(); + iface.hoveredTextColor = var1.readInt(); + iface.alternateHoveredTextColor = var1.readInt(); + } + + if (iface.type == 5) + { + iface.spriteId = var1.readInt(); + iface.alternateSpriteId = var1.readInt(); + } + + if (iface.type == 6) + { + iface.modelType = 1; + iface.modelId = var1.readUnsignedShort(); + if (iface.modelId == 0xFFFF) + { + iface.modelId = -1; + } + + iface.alternateModelId = var1.readUnsignedShort(); + if (iface.alternateModelId == 0xFFFF) + { + iface.alternateModelId = -1; + } + + iface.animation = var1.readUnsignedShort(); + if (iface.animation == 0xFFFF) + { + iface.animation = -1; + } + + iface.alternateAnimation = var1.readUnsignedShort(); + if (iface.alternateAnimation == 0xFFFF) + { + iface.alternateAnimation = -1; + } + + iface.modelZoom = var1.readUnsignedShort(); + iface.rotationX = var1.readUnsignedShort(); + iface.rotationZ = var1.readUnsignedShort(); + } + + if (iface.type == 7) + { + iface.itemIds = new int[iface.originalWidth * iface.originalHeight]; + iface.itemQuantities = new int[iface.originalWidth * iface.originalHeight]; + iface.xTextAlignment = var1.readUnsignedByte(); + iface.fontId = var1.readUnsignedShort(); + if (iface.fontId == 0xFFFF) + { + iface.fontId = -1; + } + + iface.textShadowed = var1.readUnsignedByte() == 1; + iface.textColor = var1.readInt(); + iface.xPitch = var1.readShort(); + iface.yPitch = var1.readShort(); + var4 = var1.readUnsignedByte(); + if (var4 == 1) + { + iface.clickMask |= 1073741824; + } + + iface.configActions = new String[5]; + + for (var5 = 0; var5 < 5; ++var5) + { + String var10 = var1.readString(); + if (var10.length() > 0) + { + iface.configActions[var5] = var10; + iface.clickMask |= 1 << var5 + 23; + } + } + } + + if (iface.type == 8) + { + iface.text = var1.readString(); + } + + if (iface.menuType == 2 || iface.type == 2) + { + iface.targetVerb = var1.readString(); + iface.spellName = var1.readString(); + var4 = var1.readUnsignedShort() & 63; + iface.clickMask |= var4 << 11; + } + + if (iface.menuType == 1 || iface.menuType == 4 || iface.menuType == 5 || iface.menuType == 6) + { + iface.tooltip = var1.readString(); + if (iface.tooltip.length() == 0) + { + if (iface.menuType == 1) + { + iface.tooltip = "Ok"; + } + + if (iface.menuType == 4) + { + iface.tooltip = "Select"; + } + + if (iface.menuType == 5) + { + iface.tooltip = "Select"; + } + + if (iface.menuType == 6) + { + iface.tooltip = "Continue"; + } + } + } + + if (iface.menuType == 1 || iface.menuType == 4 || iface.menuType == 5) + { + iface.clickMask |= 4194304; + } + + if (iface.menuType == 6) + { + iface.clickMask |= 1; + } + + } + + private void decodeIf3(InterfaceDefinition iface, InputStream var1) + { + var1.readUnsignedByte(); + iface.isIf3 = true; + iface.type = var1.readUnsignedByte(); + iface.contentType = var1.readUnsignedShort(); + iface.originalX = var1.readShort(); + iface.originalY = var1.readShort(); + iface.originalWidth = var1.readUnsignedShort(); + if (iface.type == 9) + { + iface.originalHeight = var1.readShort(); + } + else + { + iface.originalHeight = var1.readUnsignedShort(); + } + + iface.widthMode = var1.readByte(); + iface.heightMode = var1.readByte(); + iface.xPositionMode = var1.readByte(); + iface.yPositionMode = var1.readByte(); + iface.parentId = var1.readUnsignedShort(); + if (iface.parentId == 0xFFFF) + { + iface.parentId = -1; + } + else + { + iface.parentId += iface.id & ~0xFFFF; + } + + iface.isHidden = var1.readUnsignedByte() == 1; + if (iface.type == 0) + { + iface.scrollWidth = var1.readUnsignedShort(); + iface.scrollHeight = var1.readUnsignedShort(); + iface.noClickThrough = var1.readUnsignedByte() == 1; + } + + if (iface.type == 5) + { + iface.spriteId = var1.readInt(); + iface.textureId = var1.readUnsignedShort(); + iface.spriteTiling = var1.readUnsignedByte() == 1; + iface.opacity = var1.readUnsignedByte(); + iface.borderType = var1.readUnsignedByte(); + iface.shadowColor = var1.readInt(); + iface.flippedVertically = var1.readUnsignedByte() == 1; + iface.flippedHorizontally = var1.readUnsignedByte() == 1; + } + + if (iface.type == 6) + { + iface.modelType = 1; + iface.modelId = var1.readUnsignedShort(); + if (iface.modelId == 0xFFFF) + { + iface.modelId = -1; + } + + iface.offsetX2d = var1.readShort(); + iface.offsetY2d = var1.readShort(); + iface.rotationX = var1.readUnsignedShort(); + iface.rotationZ = var1.readUnsignedShort(); + iface.rotationY = var1.readUnsignedShort(); + iface.modelZoom = var1.readUnsignedShort(); + iface.animation = var1.readUnsignedShort(); + if (iface.animation == 0xFFFF) + { + iface.animation = -1; + } + + iface.orthogonal = var1.readUnsignedByte() == 1; + var1.readUnsignedShort(); + if (iface.widthMode != 0) + { + iface.modelHeightOverride = var1.readUnsignedShort(); + } + + if (iface.heightMode != 0) + { + var1.readUnsignedShort(); + } + } + + if (iface.type == 4) + { + iface.fontId = var1.readUnsignedShort(); + if (iface.fontId == 0xFFFF) + { + iface.fontId = -1; + } + + iface.text = var1.readString(); + iface.lineHeight = var1.readUnsignedByte(); + iface.xTextAlignment = var1.readUnsignedByte(); + iface.yTextAlignment = var1.readUnsignedByte(); + iface.textShadowed = var1.readUnsignedByte() == 1; + iface.textColor = var1.readInt(); + } + + if (iface.type == 3) + { + iface.textColor = var1.readInt(); + iface.filled = var1.readUnsignedByte() == 1; + iface.opacity = var1.readUnsignedByte(); + } + + if (iface.type == 9) + { + iface.lineWidth = var1.readUnsignedByte(); + iface.textColor = var1.readInt(); + iface.lineDirection = var1.readUnsignedByte() == 1; + } + + iface.clickMask = var1.read24BitInt(); + iface.name = var1.readString(); + int var2 = var1.readUnsignedByte(); + if (var2 > 0) + { + iface.actions = new String[var2]; + + for (int var3 = 0; var3 < var2; ++var3) + { + iface.actions[var3] = var1.readString(); + } + } + + iface.dragDeadZone = var1.readUnsignedByte(); + iface.dragDeadTime = var1.readUnsignedByte(); + iface.dragRenderBehavior = var1.readUnsignedByte() == 1; + iface.targetVerb = var1.readString(); + iface.onLoadListener = this.decodeListener(iface, var1); + iface.onMouseOverListener = this.decodeListener(iface, var1); + iface.onMouseLeaveListener = this.decodeListener(iface, var1); + iface.onTargetLeaveListener = this.decodeListener(iface, var1); + iface.onTargetEnterListener = this.decodeListener(iface, var1); + iface.onVarTransmitListener = this.decodeListener(iface, var1); + iface.onInvTransmitListener = this.decodeListener(iface, var1); + iface.onStatTransmitListener = this.decodeListener(iface, var1); + iface.onTimerListener = this.decodeListener(iface, var1); + iface.onOpListener = this.decodeListener(iface, var1); + iface.onMouseRepeatListener = this.decodeListener(iface, var1); + iface.onClickListener = this.decodeListener(iface, var1); + iface.onClickRepeatListener = this.decodeListener(iface, var1); + iface.onReleaseListener = this.decodeListener(iface, var1); + iface.onHoldListener = this.decodeListener(iface, var1); + iface.onDragListener = this.decodeListener(iface, var1); + iface.onDragCompleteListener = this.decodeListener(iface, var1); + iface.onScrollWheelListener = this.decodeListener(iface, var1); + iface.varTransmitTriggers = this.decodeTriggers(var1); + iface.invTransmitTriggers = this.decodeTriggers(var1); + iface.statTransmitTriggers = this.decodeTriggers(var1); + } + + private Object[] decodeListener(InterfaceDefinition iface, InputStream var1) + { + int var2 = var1.readUnsignedByte(); + if (var2 == 0) + { + return null; + } + else + { + Object[] var3 = new Object[var2]; + + for (int var4 = 0; var4 < var2; ++var4) + { + int var5 = var1.readUnsignedByte(); + if (var5 == 0) + { + var3[var4] = new Integer(var1.readInt()); + } + else if (var5 == 1) + { + var3[var4] = var1.readString(); + } + } + + iface.hasListener = true; + return var3; + } + } + + private int[] decodeTriggers(InputStream var1) + { + int var2 = var1.readUnsignedByte(); + if (var2 == 0) + { + return null; + } + else + { + int[] var3 = new int[var2]; + + for (int var4 = 0; var4 < var2; ++var4) + { + var3[var4] = var1.readInt(); + } + + return var3; + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/rememberclan/RememberClanConfig.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/InventoryLoader.java similarity index 70% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/rememberclan/RememberClanConfig.java rename to cache/src/main/java/net/runelite/cache/definitions/loaders/InventoryLoader.java index bf80dac615..b93cac48c0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/rememberclan/RememberClanConfig.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/InventoryLoader.java @@ -1,7 +1,5 @@ /* - * Copyright (c) 2018, Infinitay - * Copyright (c) 2018, Shaun Dreclin - * + * Copyright (c) 2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,25 +22,33 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.rememberclan; +package net.runelite.cache.definitions.loaders; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; +import net.runelite.cache.definitions.InventoryDefinition; +import net.runelite.cache.io.InputStream; -@ConfigGroup("rememberclan") -public interface RememberClanConfig extends Config +public class InventoryLoader { - @ConfigItem( - position = 1, - keyName = "clanname", - name = "Clan Name", - description = "Clanname to always remember" - ) - default String clanname() + public InventoryDefinition load(int id, byte[] b) { - return ""; + InventoryDefinition def = new InventoryDefinition(); + def.id = id; + InputStream is = new InputStream(b); + + while (true) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + if (opcode == 2) + { + def.size = is.readUnsignedShort(); + } + } + + return def; } - - } diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java new file mode 100644 index 0000000000..6cb6c9bd41 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.ItemDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; + +public class ItemLoader +{ + private static final Logger logger = LoggerFactory.getLogger(ItemLoader.class); + + public ItemDefinition load(int id, byte[] b) + { + ItemDefinition def = new ItemDefinition(id); + InputStream is = new InputStream(b); + + while (true) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + this.decodeValues(opcode, def, is); + } + + return def; + } + + private void decodeValues(int opcode, ItemDefinition def, InputStream stream) + { + if (opcode == 1) + { + def.inventoryModel = stream.readUnsignedShort(); + } + else if (opcode == 2) + { + def.name = stream.readString(); + } + else if (opcode == 4) + { + def.zoom2d = stream.readUnsignedShort(); + } + else if (opcode == 5) + { + def.xan2d = stream.readUnsignedShort(); + } + else if (opcode == 6) + { + def.yan2d = stream.readUnsignedShort(); + } + else if (opcode == 7) + { + def.xOffset2d = stream.readUnsignedShort(); + if (def.xOffset2d > 32767) + { + def.xOffset2d -= 65536; + } + } + else if (opcode == 8) + { + def.yOffset2d = stream.readUnsignedShort(); + if (def.yOffset2d > 32767) + { + def.yOffset2d -= 65536; + } + } + else if (opcode == 11) + { + def.stackable = 1; + } + else if (opcode == 12) + { + def.cost = stream.readInt(); + } + else if (opcode == 16) + { + def.members = true; + } + else if (opcode == 23) + { + def.maleModel0 = stream.readUnsignedShort(); + def.maleOffset = stream.readUnsignedByte(); + } + else if (opcode == 24) + { + def.maleModel1 = stream.readUnsignedShort(); + } + else if (opcode == 25) + { + def.femaleModel0 = stream.readUnsignedShort(); + def.femaleOffset = stream.readUnsignedByte(); + } + else if (opcode == 26) + { + def.femaleModel1 = stream.readUnsignedShort(); + } + else if (opcode >= 30 && opcode < 35) + { + def.options[opcode - 30] = stream.readString(); + if (def.options[opcode - 30].equalsIgnoreCase("Hidden")) + { + def.options[opcode - 30] = null; + } + } + else if (opcode >= 35 && opcode < 40) + { + def.interfaceOptions[opcode - 35] = stream.readString(); + } + else if (opcode == 40) + { + int var5 = stream.readUnsignedByte(); + def.colorFind = new short[var5]; + def.colorReplace = new short[var5]; + + for (int var4 = 0; var4 < var5; ++var4) + { + def.colorFind[var4] = (short) stream.readUnsignedShort(); + def.colorReplace[var4] = (short) stream.readUnsignedShort(); + } + + } + else if (opcode == 41) + { + int var5 = stream.readUnsignedByte(); + def.textureFind = new short[var5]; + def.textureReplace = new short[var5]; + + for (int var4 = 0; var4 < var5; ++var4) + { + def.textureFind[var4] = (short) stream.readUnsignedShort(); + def.textureReplace[var4] = (short) stream.readUnsignedShort(); + } + + } + else if (opcode == 42) + { + def.shiftClickDropIndex = stream.readByte(); + } + else if (opcode == 65) + { + def.isTradeable = true; + } + else if (opcode == 78) + { + def.maleModel2 = stream.readUnsignedShort(); + } + else if (opcode == 79) + { + def.femaleModel2 = stream.readUnsignedShort(); + } + else if (opcode == 90) + { + def.maleHeadModel = stream.readUnsignedShort(); + } + else if (opcode == 91) + { + def.femaleHeadModel = stream.readUnsignedShort(); + } + else if (opcode == 92) + { + def.maleHeadModel2 = stream.readUnsignedShort(); + } + else if (opcode == 93) + { + def.femaleHeadModel2 = stream.readUnsignedShort(); + } + else if (opcode == 95) + { + def.zan2d = stream.readUnsignedShort(); + } + else if (opcode == 97) + { + def.notedID = stream.readUnsignedShort(); + } + else if (opcode == 98) + { + def.notedTemplate = stream.readUnsignedShort(); + } + else if (opcode >= 100 && opcode < 110) + { + if (def.countObj == null) + { + def.countObj = new int[10]; + def.countCo = new int[10]; + } + + def.countObj[opcode - 100] = stream.readUnsignedShort(); + def.countCo[opcode - 100] = stream.readUnsignedShort(); + } + else if (opcode == 110) + { + def.resizeX = stream.readUnsignedShort(); + } + else if (opcode == 111) + { + def.resizeY = stream.readUnsignedShort(); + } + else if (opcode == 112) + { + def.resizeZ = stream.readUnsignedShort(); + } + else if (opcode == 113) + { + def.ambient = stream.readByte(); + } + else if (opcode == 114) + { + def.contrast = stream.readByte(); + } + else if (opcode == 115) + { + def.team = stream.readUnsignedByte(); + } + else if (opcode == 139) + { + def.boughtId = stream.readUnsignedShort(); + } + else if (opcode == 140) + { + def.boughtTemplateId = stream.readUnsignedShort(); + } + else if (opcode == 148) + { + def.placeholderId = stream.readUnsignedShort(); + } + else if (opcode == 149) + { + def.placeholderTemplateId = stream.readUnsignedShort(); + } + else if (opcode == 249) + { + int length = stream.readUnsignedByte(); + + def.params = new HashMap<>(length); + + for (int i = 0; i < length; i++) + { + boolean isString = stream.readUnsignedByte() == 1; + int key = stream.read24BitInt(); + Object value; + + if (isString) + { + value = stream.readString(); + } + + else + { + value = stream.readInt(); + } + + def.params.put(key, value); + } + } + else + { + logger.warn("Unrecognized opcode {}", opcode); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/KitLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/KitLoader.java new file mode 100644 index 0000000000..9bd3f89a2f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/KitLoader.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.KitDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class KitLoader +{ + private static final Logger logger = LoggerFactory.getLogger(KitLoader.class); + + public KitDefinition load(int id, byte[] b) + { + KitDefinition def = new KitDefinition(id); + InputStream is = new InputStream(b); + + for (;;) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + if (opcode == 1) + { + def.bodyPartId = is.readUnsignedByte(); + } + else if (opcode == 2) + { + int length = is.readUnsignedByte(); + def.modelIds = new int[length]; + + for (int index = 0; index < length; ++index) + { + def.modelIds[index] = is.readUnsignedShort(); + } + } + else if (opcode == 3) + { + def.nonSelectable = true; + } + else if (opcode == 40) + { + int length = is.readUnsignedByte(); + def.recolorToFind = new short[length]; + def.recolorToReplace = new short[length]; + + for (int index = 0; index < length; ++index) + { + def.recolorToFind[index] = is.readShort(); + def.recolorToReplace[index] = is.readShort(); + } + } + else if (opcode == 41) + { + int length = is.readUnsignedByte(); + def.retextureToFind = new short[length]; + def.retextureToReplace = new short[length]; + + for (int index = 0; index < length; ++index) + { + def.retextureToFind[index] = is.readShort(); + def.retextureToReplace[index] = is.readShort(); + } + } + else if (opcode >= 60 && opcode < 70) + { + def.models[opcode - 60] = is.readShort(); + } + } + + return def; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/LocationsLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/LocationsLoader.java new file mode 100644 index 0000000000..4dab72cf77 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/LocationsLoader.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.LocationsDefinition; +import net.runelite.cache.io.InputStream; +import net.runelite.cache.region.Location; +import net.runelite.cache.region.Position; + +public class LocationsLoader +{ + public LocationsDefinition load(int regionX, int regionY, byte[] b) + { + LocationsDefinition loc = new LocationsDefinition(); + loc.setRegionX(regionX); + loc.setRegionY(regionY); + loadLocations(loc, b); + return loc; + } + + private void loadLocations(LocationsDefinition loc, byte[] b) + { + InputStream buf = new InputStream(b); + + int id = -1; + int idOffset; + + while ((idOffset = buf.readUnsignedIntSmartShortCompat()) != 0) + { + id += idOffset; + + int position = 0; + int positionOffset; + + while ((positionOffset = buf.readUnsignedShortSmart()) != 0) + { + position += positionOffset - 1; + + int localY = position & 0x3F; + int localX = position >> 6 & 0x3F; + int height = position >> 12 & 0x3; + + int attributes = buf.readUnsignedByte(); + int type = attributes >> 2; + int orientation = attributes & 0x3; + + loc.getLocations().add(new Location(id, type, orientation, new Position(localX, localY, height))); + } + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/MapLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/MapLoader.java new file mode 100644 index 0000000000..3224536388 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/MapLoader.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.MapDefinition; +import net.runelite.cache.definitions.MapDefinition.Tile; +import net.runelite.cache.io.InputStream; +import static net.runelite.cache.region.Region.X; +import static net.runelite.cache.region.Region.Y; +import static net.runelite.cache.region.Region.Z; + +public class MapLoader +{ + public MapDefinition load(int regionX, int regionY, byte[] b) + { + MapDefinition map = new MapDefinition(); + map.setRegionX(regionX); + map.setRegionY(regionY); + loadTerrain(map, b); + return map; + } + + private void loadTerrain(MapDefinition map, byte[] buf) + { + Tile[][][] tiles = map.getTiles(); + + InputStream in = new InputStream(buf); + + for (int z = 0; z < Z; z++) + { + for (int x = 0; x < X; x++) + { + for (int y = 0; y < Y; y++) + { + Tile tile = tiles[z][x][y] = new Tile(); + while (true) + { + int attribute = in.readUnsignedByte(); + if (attribute == 0) + { + break; + } + else if (attribute == 1) + { + int height = in.readUnsignedByte(); + tile.height = height; + break; + } + else if (attribute <= 49) + { + tile.attrOpcode = attribute; + tile.overlayId = in.readByte(); + tile.overlayPath = (byte) ((attribute - 2) / 4); + tile.overlayRotation = (byte) (attribute - 2 & 3); + } + else if (attribute <= 81) + { + tile.settings = (byte) (attribute - 49); + } + else + { + tile.underlayId = (byte) (attribute - 81); + } + } + } + } + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/ModelLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/ModelLoader.java new file mode 100644 index 0000000000..4529f8a069 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/ModelLoader.java @@ -0,0 +1,750 @@ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.ModelDefinition; +import net.runelite.cache.io.InputStream; + +public class ModelLoader +{ + public ModelDefinition load(int modelId, byte[] b) + { + ModelDefinition def = new ModelDefinition(); + def.id = modelId; + + if (b[b.length - 1] == -1 && b[b.length - 2] == -1) + { + this.load1(def, b); + } + else + { + this.load2(def, b); + } + + def.computeNormals(); + def.computeTextureUVCoordinates(); + def.computeAnimationTables(); + + return def; + } + + private void load1(ModelDefinition model, byte[] var1) + { + InputStream var2 = new InputStream(var1); + InputStream var24 = new InputStream(var1); + InputStream var3 = new InputStream(var1); + InputStream var28 = new InputStream(var1); + InputStream var6 = new InputStream(var1); + InputStream var55 = new InputStream(var1); + InputStream var51 = new InputStream(var1); + var2.setOffset(var1.length - 23); + int verticeCount = var2.readUnsignedShort(); + int triangleCount = var2.readUnsignedShort(); + int textureTriangleCount = var2.readUnsignedByte(); + int var13 = var2.readUnsignedByte(); + int modelPriority = var2.readUnsignedByte(); + int var50 = var2.readUnsignedByte(); + int var17 = var2.readUnsignedByte(); + int modelTexture = var2.readUnsignedByte(); + int modelVertexSkins = var2.readUnsignedByte(); + int var20 = var2.readUnsignedShort(); + int var21 = var2.readUnsignedShort(); + int var42 = var2.readUnsignedShort(); + int var22 = var2.readUnsignedShort(); + int var38 = var2.readUnsignedShort(); + int textureAmount = 0; + int var7 = 0; + int var29 = 0; + int position; + if (textureTriangleCount > 0) + { + model.textureRenderTypes = new byte[textureTriangleCount]; + var2.setOffset(0); + + for (position = 0; position < textureTriangleCount; ++position) + { + byte renderType = model.textureRenderTypes[position] = var2.readByte(); + if (renderType == 0) + { + ++textureAmount; + } + + if (renderType >= 1 && renderType <= 3) + { + ++var7; + } + + if (renderType == 2) + { + ++var29; + } + } + } + + position = textureTriangleCount + verticeCount; + int renderTypePos = position; + if (var13 == 1) + { + position += triangleCount; + } + + int var49 = position; + position += triangleCount; + int priorityPos = position; + if (modelPriority == 255) + { + position += triangleCount; + } + + int triangleSkinPos = position; + if (var17 == 1) + { + position += triangleCount; + } + + int var35 = position; + if (modelVertexSkins == 1) + { + position += verticeCount; + } + + int alphaPos = position; + if (var50 == 1) + { + position += triangleCount; + } + + int var11 = position; + position += var22; + int texturePos = position; + if (modelTexture == 1) + { + position += triangleCount * 2; + } + + int textureCoordPos = position; + position += var38; + int colorPos = position; + position += triangleCount * 2; + int var40 = position; + position += var20; + int var41 = position; + position += var21; + int var8 = position; + position += var42; + int var43 = position; + position += textureAmount * 6; + int var37 = position; + position += var7 * 6; + int var48 = position; + position += var7 * 6; + int var56 = position; + position += var7 * 2; + int var45 = position; + position += var7; + int var46 = position; + position += var7 * 2 + var29 * 2; + model.vertexCount = verticeCount; + model.faceCount = triangleCount; + model.textureTriangleCount = textureTriangleCount; + model.vertexPositionsX = new int[verticeCount]; + model.vertexPositionsY = new int[verticeCount]; + model.vertexPositionsZ = new int[verticeCount]; + model.faceVertexIndices1 = new int[triangleCount]; + model.faceVertexIndices2 = new int[triangleCount]; + model.faceVertexIndices3 = new int[triangleCount]; + if (modelVertexSkins == 1) + { + model.vertexSkins = new int[verticeCount]; + } + + if (var13 == 1) + { + model.faceRenderTypes = new byte[triangleCount]; + } + + if (modelPriority == 255) + { + model.faceRenderPriorities = new byte[triangleCount]; + } + else + { + model.priority = (byte) modelPriority; + } + + if (var50 == 1) + { + model.faceAlphas = new byte[triangleCount]; + } + + if (var17 == 1) + { + model.faceSkins = new int[triangleCount]; + } + + if (modelTexture == 1) + { + model.faceTextures = new short[triangleCount]; + } + + if (modelTexture == 1 && textureTriangleCount > 0) + { + model.textureCoordinates = new byte[triangleCount]; + } + + model.faceColors = new short[triangleCount]; + if (textureTriangleCount > 0) + { + model.textureTriangleVertexIndices1 = new short[textureTriangleCount]; + model.textureTriangleVertexIndices2 = new short[textureTriangleCount]; + model.textureTriangleVertexIndices3 = new short[textureTriangleCount]; + if (var7 > 0) + { + model.aShortArray2574 = new short[var7]; + model.aShortArray2575 = new short[var7]; + model.aShortArray2586 = new short[var7]; + model.aShortArray2577 = new short[var7]; + model.aByteArray2580 = new byte[var7]; + model.aShortArray2578 = new short[var7]; + } + + if (var29 > 0) + { + model.texturePrimaryColors = new short[var29]; + } + } + + var2.setOffset(textureTriangleCount); + var24.setOffset(var40); + var3.setOffset(var41); + var28.setOffset(var8); + var6.setOffset(var35); + int vX = 0; + int vY = 0; + int vZ = 0; + + int vertexZOffset; + int var10; + int vertexYOffset; + int var15; + int point; + for (point = 0; point < verticeCount; ++point) + { + int vertexFlags = var2.readUnsignedByte(); + int vertexXOffset = 0; + if ((vertexFlags & 1) != 0) + { + vertexXOffset = var24.readShortSmart(); + } + + vertexYOffset = 0; + if ((vertexFlags & 2) != 0) + { + vertexYOffset = var3.readShortSmart(); + } + + vertexZOffset = 0; + if ((vertexFlags & 4) != 0) + { + vertexZOffset = var28.readShortSmart(); + } + + model.vertexPositionsX[point] = vX + vertexXOffset; + model.vertexPositionsY[point] = vY + vertexYOffset; + model.vertexPositionsZ[point] = vZ + vertexZOffset; + vX = model.vertexPositionsX[point]; + vY = model.vertexPositionsY[point]; + vZ = model.vertexPositionsZ[point]; + if (modelVertexSkins == 1) + { + model.vertexSkins[point] = var6.readUnsignedByte(); + } + } + + var2.setOffset(colorPos); + var24.setOffset(renderTypePos); + var3.setOffset(priorityPos); + var28.setOffset(alphaPos); + var6.setOffset(triangleSkinPos); + var55.setOffset(texturePos); + var51.setOffset(textureCoordPos); + + for (point = 0; point < triangleCount; ++point) + { + model.faceColors[point] = (short) var2.readUnsignedShort(); + if (var13 == 1) + { + model.faceRenderTypes[point] = var24.readByte(); + } + + if (modelPriority == 255) + { + model.faceRenderPriorities[point] = var3.readByte(); + } + + if (var50 == 1) + { + model.faceAlphas[point] = var28.readByte(); + } + + if (var17 == 1) + { + model.faceSkins[point] = var6.readUnsignedByte(); + } + + if (modelTexture == 1) + { + model.faceTextures[point] = (short) (var55.readUnsignedShort() - 1); + } + + if (model.textureCoordinates != null && model.faceTextures[point] != -1) + { + model.textureCoordinates[point] = (byte) (var51.readUnsignedByte() - 1); + } + } + + var2.setOffset(var11); + var24.setOffset(var49); + int trianglePointX = 0; + int trianglePointY = 0; + int trianglePointZ = 0; + vertexYOffset = 0; + + int var16; + for (vertexZOffset = 0; vertexZOffset < triangleCount; ++vertexZOffset) + { + int numFaces = var24.readUnsignedByte(); + if (numFaces == 1) + { + trianglePointX = var2.readShortSmart() + vertexYOffset; + trianglePointY = var2.readShortSmart() + trianglePointX; + trianglePointZ = var2.readShortSmart() + trianglePointY; + vertexYOffset = trianglePointZ; + model.faceVertexIndices1[vertexZOffset] = trianglePointX; + model.faceVertexIndices2[vertexZOffset] = trianglePointY; + model.faceVertexIndices3[vertexZOffset] = trianglePointZ; + } + + if (numFaces == 2) + { + trianglePointY = trianglePointZ; + trianglePointZ = var2.readShortSmart() + vertexYOffset; + vertexYOffset = trianglePointZ; + model.faceVertexIndices1[vertexZOffset] = trianglePointX; + model.faceVertexIndices2[vertexZOffset] = trianglePointY; + model.faceVertexIndices3[vertexZOffset] = trianglePointZ; + } + + if (numFaces == 3) + { + trianglePointX = trianglePointZ; + trianglePointZ = var2.readShortSmart() + vertexYOffset; + vertexYOffset = trianglePointZ; + model.faceVertexIndices1[vertexZOffset] = trianglePointX; + model.faceVertexIndices2[vertexZOffset] = trianglePointY; + model.faceVertexIndices3[vertexZOffset] = trianglePointZ; + } + + if (numFaces == 4) + { + int var57 = trianglePointX; + trianglePointX = trianglePointY; + trianglePointY = var57; + trianglePointZ = var2.readShortSmart() + vertexYOffset; + vertexYOffset = trianglePointZ; + model.faceVertexIndices1[vertexZOffset] = trianglePointX; + model.faceVertexIndices2[vertexZOffset] = var57; + model.faceVertexIndices3[vertexZOffset] = trianglePointZ; + } + } + + var2.setOffset(var43); + var24.setOffset(var37); + var3.setOffset(var48); + var28.setOffset(var56); + var6.setOffset(var45); + var55.setOffset(var46); + + for (int texIndex = 0; texIndex < textureTriangleCount; ++texIndex) + { + int type = model.textureRenderTypes[texIndex] & 255; + if (type == 0) + { + model.textureTriangleVertexIndices1[texIndex] = (short) var2.readUnsignedShort(); + model.textureTriangleVertexIndices2[texIndex] = (short) var2.readUnsignedShort(); + model.textureTriangleVertexIndices3[texIndex] = (short) var2.readUnsignedShort(); + } + + if (type == 1) + { + model.textureTriangleVertexIndices1[texIndex] = (short) var24.readUnsignedShort(); + model.textureTriangleVertexIndices2[texIndex] = (short) var24.readUnsignedShort(); + model.textureTriangleVertexIndices3[texIndex] = (short) var24.readUnsignedShort(); + model.aShortArray2574[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2575[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2586[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2577[texIndex] = (short) var28.readUnsignedShort(); + model.aByteArray2580[texIndex] = var6.readByte(); + model.aShortArray2578[texIndex] = (short) var55.readUnsignedShort(); + } + + if (type == 2) + { + model.textureTriangleVertexIndices1[texIndex] = (short) var24.readUnsignedShort(); + model.textureTriangleVertexIndices2[texIndex] = (short) var24.readUnsignedShort(); + model.textureTriangleVertexIndices3[texIndex] = (short) var24.readUnsignedShort(); + model.aShortArray2574[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2575[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2586[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2577[texIndex] = (short) var28.readUnsignedShort(); + model.aByteArray2580[texIndex] = var6.readByte(); + model.aShortArray2578[texIndex] = (short) var55.readUnsignedShort(); + model.texturePrimaryColors[texIndex] = (short) var55.readUnsignedShort(); + } + + if (type == 3) + { + model.textureTriangleVertexIndices1[texIndex] = (short) var24.readUnsignedShort(); + model.textureTriangleVertexIndices2[texIndex] = (short) var24.readUnsignedShort(); + model.textureTriangleVertexIndices3[texIndex] = (short) var24.readUnsignedShort(); + model.aShortArray2574[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2575[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2586[texIndex] = (short) var3.readUnsignedShort(); + model.aShortArray2577[texIndex] = (short) var28.readUnsignedShort(); + model.aByteArray2580[texIndex] = var6.readByte(); + model.aShortArray2578[texIndex] = (short) var55.readUnsignedShort(); + } + } + + var2.setOffset(position); + vertexZOffset = var2.readUnsignedByte(); + if (vertexZOffset != 0) + { + //new Class41(); + var2.readUnsignedShort(); + var2.readUnsignedShort(); + var2.readUnsignedShort(); + var2.readInt(); + } + } + + private void load2(ModelDefinition model, byte[] var1) + { + boolean var2 = false; + boolean var43 = false; + InputStream var5 = new InputStream(var1); + InputStream var39 = new InputStream(var1); + InputStream var26 = new InputStream(var1); + InputStream var9 = new InputStream(var1); + InputStream var3 = new InputStream(var1); + var5.setOffset(var1.length - 18); + int var10 = var5.readUnsignedShort(); + int var11 = var5.readUnsignedShort(); + int var12 = var5.readUnsignedByte(); + int var13 = var5.readUnsignedByte(); + int var14 = var5.readUnsignedByte(); + int var30 = var5.readUnsignedByte(); + int var15 = var5.readUnsignedByte(); + int var28 = var5.readUnsignedByte(); + int var27 = var5.readUnsignedShort(); + int var20 = var5.readUnsignedShort(); + int var36 = var5.readUnsignedShort(); + int var23 = var5.readUnsignedShort(); + byte var16 = 0; + int var46 = var16 + var10; + int var24 = var46; + var46 += var11; + int var25 = var46; + if (var14 == 255) + { + var46 += var11; + } + + int var4 = var46; + if (var15 == 1) + { + var46 += var11; + } + + int var42 = var46; + if (var13 == 1) + { + var46 += var11; + } + + int var37 = var46; + if (var28 == 1) + { + var46 += var10; + } + + int var29 = var46; + if (var30 == 1) + { + var46 += var11; + } + + int var44 = var46; + var46 += var23; + int var17 = var46; + var46 += var11 * 2; + int var32 = var46; + var46 += var12 * 6; + int var34 = var46; + var46 += var27; + int var35 = var46; + var46 += var20; + int var10000 = var46 + var36; + model.vertexCount = var10; + model.faceCount = var11; + model.textureTriangleCount = var12; + model.vertexPositionsX = new int[var10]; + model.vertexPositionsY = new int[var10]; + model.vertexPositionsZ = new int[var10]; + model.faceVertexIndices1 = new int[var11]; + model.faceVertexIndices2 = new int[var11]; + model.faceVertexIndices3 = new int[var11]; + if (var12 > 0) + { + model.textureRenderTypes = new byte[var12]; + model.textureTriangleVertexIndices1 = new short[var12]; + model.textureTriangleVertexIndices2 = new short[var12]; + model.textureTriangleVertexIndices3 = new short[var12]; + } + + if (var28 == 1) + { + model.vertexSkins = new int[var10]; + } + + if (var13 == 1) + { + model.faceRenderTypes = new byte[var11]; + model.textureCoordinates = new byte[var11]; + model.faceTextures = new short[var11]; + } + + if (var14 == 255) + { + model.faceRenderPriorities = new byte[var11]; + } + else + { + model.priority = (byte) var14; + } + + if (var30 == 1) + { + model.faceAlphas = new byte[var11]; + } + + if (var15 == 1) + { + model.faceSkins = new int[var11]; + } + + model.faceColors = new short[var11]; + var5.setOffset(var16); + var39.setOffset(var34); + var26.setOffset(var35); + var9.setOffset(var46); + var3.setOffset(var37); + int var41 = 0; + int var33 = 0; + int var19 = 0; + + int var6; + int var7; + int var8; + int var18; + int var31; + for (var18 = 0; var18 < var10; ++var18) + { + var8 = var5.readUnsignedByte(); + var31 = 0; + if ((var8 & 1) != 0) + { + var31 = var39.readShortSmart(); + } + + var6 = 0; + if ((var8 & 2) != 0) + { + var6 = var26.readShortSmart(); + } + + var7 = 0; + if ((var8 & 4) != 0) + { + var7 = var9.readShortSmart(); + } + + model.vertexPositionsX[var18] = var41 + var31; + model.vertexPositionsY[var18] = var33 + var6; + model.vertexPositionsZ[var18] = var19 + var7; + var41 = model.vertexPositionsX[var18]; + var33 = model.vertexPositionsY[var18]; + var19 = model.vertexPositionsZ[var18]; + if (var28 == 1) + { + model.vertexSkins[var18] = var3.readUnsignedByte(); + } + } + + var5.setOffset(var17); + var39.setOffset(var42); + var26.setOffset(var25); + var9.setOffset(var29); + var3.setOffset(var4); + + for (var18 = 0; var18 < var11; ++var18) + { + model.faceColors[var18] = (short) var5.readUnsignedShort(); + if (var13 == 1) + { + var8 = var39.readUnsignedByte(); + if ((var8 & 1) == 1) + { + model.faceRenderTypes[var18] = 1; + var2 = true; + } + else + { + model.faceRenderTypes[var18] = 0; + } + + if ((var8 & 2) == 2) + { + model.textureCoordinates[var18] = (byte) (var8 >> 2); + model.faceTextures[var18] = model.faceColors[var18]; + model.faceColors[var18] = 127; + if (model.faceTextures[var18] != -1) + { + var43 = true; + } + } + else + { + model.textureCoordinates[var18] = -1; + model.faceTextures[var18] = -1; + } + } + + if (var14 == 255) + { + model.faceRenderPriorities[var18] = var26.readByte(); + } + + if (var30 == 1) + { + model.faceAlphas[var18] = var9.readByte(); + } + + if (var15 == 1) + { + model.faceSkins[var18] = var3.readUnsignedByte(); + } + } + + var5.setOffset(var44); + var39.setOffset(var24); + var18 = 0; + var8 = 0; + var31 = 0; + var6 = 0; + + int var21; + int var22; + for (var7 = 0; var7 < var11; ++var7) + { + var22 = var39.readUnsignedByte(); + if (var22 == 1) + { + var18 = var5.readShortSmart() + var6; + var8 = var5.readShortSmart() + var18; + var31 = var5.readShortSmart() + var8; + var6 = var31; + model.faceVertexIndices1[var7] = var18; + model.faceVertexIndices2[var7] = var8; + model.faceVertexIndices3[var7] = var31; + } + + if (var22 == 2) + { + var8 = var31; + var31 = var5.readShortSmart() + var6; + var6 = var31; + model.faceVertexIndices1[var7] = var18; + model.faceVertexIndices2[var7] = var8; + model.faceVertexIndices3[var7] = var31; + } + + if (var22 == 3) + { + var18 = var31; + var31 = var5.readShortSmart() + var6; + var6 = var31; + model.faceVertexIndices1[var7] = var18; + model.faceVertexIndices2[var7] = var8; + model.faceVertexIndices3[var7] = var31; + } + + if (var22 == 4) + { + var21 = var18; + var18 = var8; + var8 = var21; + var31 = var5.readShortSmart() + var6; + var6 = var31; + model.faceVertexIndices1[var7] = var18; + model.faceVertexIndices2[var7] = var21; + model.faceVertexIndices3[var7] = var31; + } + } + + var5.setOffset(var32); + + for (var7 = 0; var7 < var12; ++var7) + { + model.textureRenderTypes[var7] = 0; + model.textureTriangleVertexIndices1[var7] = (short) var5.readUnsignedShort(); + model.textureTriangleVertexIndices2[var7] = (short) var5.readUnsignedShort(); + model.textureTriangleVertexIndices3[var7] = (short) var5.readUnsignedShort(); + } + + if (model.textureCoordinates != null) + { + boolean var45 = false; + + for (var22 = 0; var22 < var11; ++var22) + { + var21 = model.textureCoordinates[var22] & 255; + if (var21 != 255) + { + if ((model.textureTriangleVertexIndices1[var21] & '\uffff') == model.faceVertexIndices1[var22] && (model.textureTriangleVertexIndices2[var21] & '\uffff') == model.faceVertexIndices2[var22] && (model.textureTriangleVertexIndices3[var21] & '\uffff') == model.faceVertexIndices3[var22]) + { + model.textureCoordinates[var22] = -1; + } + else + { + var45 = true; + } + } + } + + if (!var45) + { + model.textureCoordinates = null; + } + } + + if (!var43) + { + model.faceTextures = null; + } + + if (!var2) + { + model.faceRenderTypes = null; + } + } + +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java new file mode 100644 index 0000000000..478ef2660a --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.NpcDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; + +public class NpcLoader +{ + private static final Logger logger = LoggerFactory.getLogger(NpcLoader.class); + + public NpcDefinition load(int id, byte[] b) + { + NpcDefinition def = new NpcDefinition(id); + InputStream is = new InputStream(b); + + while (true) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + this.decodeValues(opcode, def, is); + } + + return def; + } + + private void decodeValues(int opcode, NpcDefinition def, InputStream stream) + { + int length; + int index; + if (opcode == 1) + { + length = stream.readUnsignedByte(); + def.models = new int[length]; + + for (index = 0; index < length; ++index) + { + def.models[index] = stream.readUnsignedShort(); + } + + } + else if (opcode == 2) + { + def.name = stream.readString(); + } + else if (opcode == 12) + { + def.tileSpacesOccupied = stream.readUnsignedByte(); + } + else if (opcode == 13) + { + def.stanceAnimation = stream.readUnsignedShort(); + } + else if (opcode == 14) + { + def.walkAnimation = stream.readUnsignedShort(); + } + else if (opcode == 15) + { + def.anInt2165 = stream.readUnsignedShort(); + } + else if (opcode == 16) + { + def.anInt2189 = stream.readUnsignedShort(); + } + else if (opcode == 17) + { + def.walkAnimation = stream.readUnsignedShort(); + def.rotate180Animation = stream.readUnsignedShort(); + def.rotate90RightAnimation = stream.readUnsignedShort(); + def.rotate90LeftAnimation = stream.readUnsignedShort(); + } + else if (opcode >= 30 && opcode < 35) + { + def.options[opcode - 30] = stream.readString(); + if (def.options[opcode - 30].equalsIgnoreCase("Hidden")) + { + def.options[opcode - 30] = null; + } + } + else if (opcode == 40) + { + length = stream.readUnsignedByte(); + def.recolorToFind = new short[length]; + def.recolorToReplace = new short[length]; + + for (index = 0; index < length; ++index) + { + def.recolorToFind[index] = (short) stream.readUnsignedShort(); + def.recolorToReplace[index] = (short) stream.readUnsignedShort(); + } + + } + else if (opcode == 41) + { + length = stream.readUnsignedByte(); + def.retextureToFind = new short[length]; + def.retextureToReplace = new short[length]; + + for (index = 0; index < length; ++index) + { + def.retextureToFind[index] = (short) stream.readUnsignedShort(); + def.retextureToReplace[index] = (short) stream.readUnsignedShort(); + } + + } + else if (opcode == 60) + { + length = stream.readUnsignedByte(); + def.models_2 = new int[length]; + + for (index = 0; index < length; ++index) + { + def.models_2[index] = stream.readUnsignedShort(); + } + + } + else if (opcode == 93) + { + def.renderOnMinimap = false; + } + else if (opcode == 95) + { + def.combatLevel = stream.readUnsignedShort(); + } + else if (opcode == 97) + { + def.resizeX = stream.readUnsignedShort(); + } + else if (opcode == 98) + { + def.resizeY = stream.readUnsignedShort(); + } + else if (opcode == 99) + { + def.hasRenderPriority = true; + } + else if (opcode == 100) + { + def.ambient = stream.readByte(); + } + else if (opcode == 101) + { + def.contrast = stream.readByte(); + } + else if (opcode == 102) + { + def.headIcon = stream.readUnsignedShort(); + } + else if (opcode == 103) + { + def.rotation = stream.readUnsignedShort(); + } + else if (opcode == 106) + { + def.varbitIndex = stream.readUnsignedShort(); + if ('\uffff' == def.varbitIndex) + { + def.varbitIndex = -1; + } + + def.varpIndex = stream.readUnsignedShort(); + if ('\uffff' == def.varpIndex) + { + def.varpIndex = -1; + } + + length = stream.readUnsignedByte(); + def.configs = new int[length + 2]; + + for (index = 0; index <= length; ++index) + { + def.configs[index] = stream.readUnsignedShort(); + if (def.configs[index] == '\uffff') + { + def.configs[index] = -1; + } + } + + def.configs[length + 1] = -1; + + } + else if (opcode == 107) + { + def.isClickable = false; + } + else if (opcode == 109) + { + def.aBool2170 = false; + } + else if (opcode == 111) + { + def.aBool2190 = true; + } + else if (opcode == 118) + { + def.varbitIndex = stream.readUnsignedShort(); + if ('\uffff' == def.varbitIndex) + { + def.varbitIndex = -1; + } + + def.varpIndex = stream.readUnsignedShort(); + if ('\uffff' == def.varpIndex) + { + def.varpIndex = -1; + } + + int var = stream.readUnsignedShort(); + if (var == 0xFFFF) + { + var = -1; + } + + length = stream.readUnsignedByte(); + def.configs = new int[length + 2]; + + for (index = 0; index <= length; ++index) + { + def.configs[index] = stream.readUnsignedShort(); + if (def.configs[index] == '\uffff') + { + def.configs[index] = -1; + } + } + + def.configs[length + 1] = var; + } + else if (opcode == 249) + { + length = stream.readUnsignedByte(); + + def.params = new HashMap<>(length); + + for (int i = 0; i < length; i++) + { + boolean isString = stream.readUnsignedByte() == 1; + int key = stream.read24BitInt(); + Object value; + + if (isString) + { + value = stream.readString(); + } + + else + { + value = stream.readInt(); + } + + def.params.put(key, value); + } + } + else + { + logger.warn("Unrecognized opcode {}", opcode); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/ObjectLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/ObjectLoader.java new file mode 100644 index 0000000000..13a3eab754 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/ObjectLoader.java @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.ObjectDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ObjectLoader +{ + private static final Logger logger = LoggerFactory.getLogger(ObjectLoader.class); + + public ObjectDefinition load(int id, byte[] b) + { + ObjectDefinition def = new ObjectDefinition(); + InputStream is = new InputStream(b); + + def.setId(id); + + for (;;) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + processOp(opcode, def, is); + } + + post(def); + + return def; + } + + private void processOp(int opcode, ObjectDefinition def, InputStream is) + { + if (opcode == 1) + { + int length = is.readUnsignedByte(); + if (length > 0) + { + int[] objectTypes = new int[length]; + int[] objectModels = new int[length]; + + for (int index = 0; index < length; ++index) + { + objectModels[index] = is.readUnsignedShort(); + objectTypes[index] = is.readUnsignedByte(); + } + + def.setObjectTypes(objectTypes); + def.setObjectModels(objectModels); + } + } + else if (opcode == 2) + { + def.setName(is.readString()); + } + else if (opcode == 5) + { + int length = is.readUnsignedByte(); + if (length > 0) + { + def.setObjectTypes(null); + int[] objectModels = new int[length]; + + for (int index = 0; index < length; ++index) + { + objectModels[index] = is.readUnsignedShort(); + } + + def.setObjectModels(objectModels); + } + } + else if (opcode == 14) + { + def.setSizeX(is.readUnsignedByte()); + } + else if (opcode == 15) + { + def.setSizeY(is.readUnsignedByte()); + } + else if (opcode == 17) + { + def.setInteractType(0); + def.setBlocksProjectile(false); + } + else if (opcode == 18) + { + def.setBlocksProjectile(false); + } + else if (opcode == 19) + { + def.setAnInt2088(is.readUnsignedByte()); + } + else if (opcode == 21) + { + def.setAnInt2105(0); + } + else if (opcode == 22) + { + def.setNonFlatShading(false); + } + else if (opcode == 23) + { + def.setABool2111(true); + } + else if (opcode == 24) + { + def.setAnimationID(is.readUnsignedShort()); + if (def.getAnimationID() == 0xFFFF) + { + def.setAnimationID(-1); + } + } + else if (opcode == 27) + { + def.setInteractType(1); + } + else if (opcode == 28) + { + def.setAnInt2069(is.readUnsignedByte()); + } + else if (opcode == 29) + { + def.setAmbient(is.readByte()); + } + else if (opcode == 39) + { + def.setContrast(is.readByte()); + } + else if (opcode >= 30 && opcode < 35) + { + String[] actions = def.getActions(); + actions[opcode - 30] = is.readString(); + if (actions[opcode - 30].equalsIgnoreCase("Hidden")) + { + actions[opcode - 30] = null; + } + } + else if (opcode == 40) + { + int length = is.readUnsignedByte(); + short[] recolorToFind = new short[length]; + short[] recolorToReplace = new short[length]; + + for (int index = 0; index < length; ++index) + { + recolorToFind[index] = is.readShort(); + recolorToReplace[index] = is.readShort(); + } + + def.setRecolorToFind(recolorToFind); + def.setRecolorToReplace(recolorToReplace); + } + else if (opcode == 41) + { + int length = is.readUnsignedByte(); + short[] retextureToFind = new short[length]; + short[] textureToReplace = new short[length]; + + for (int index = 0; index < length; ++index) + { + retextureToFind[index] = is.readShort(); + textureToReplace[index] = is.readShort(); + } + + def.setRetextureToFind(retextureToFind); + def.setTextureToReplace(textureToReplace); + } + else if (opcode == 62) + { + def.setRotated(true); + } + else if (opcode == 64) + { + def.setABool2097(false); + } + else if (opcode == 65) + { + def.setModelSizeX(is.readUnsignedShort()); + } + else if (opcode == 66) + { + def.setModelSizeHeight(is.readUnsignedShort()); + } + else if (opcode == 67) + { + def.setModelSizeY(is.readUnsignedShort()); + } + else if (opcode == 68) + { + def.setMapSceneID(is.readUnsignedShort()); + } + else if (opcode == 69) + { + is.readByte(); + } + else if (opcode == 70) + { + def.setOffsetX(is.readUnsignedShort()); + } + else if (opcode == 71) + { + def.setOffsetHeight(is.readUnsignedShort()); + } + else if (opcode == 72) + { + def.setOffsetY(is.readUnsignedShort()); + } + else if (opcode == 73) + { + def.setABool2104(true); + } + else if (opcode == 74) + { + def.setSolid(true); + } + else if (opcode == 75) + { + def.setAnInt2106(is.readUnsignedByte()); + } + else if (opcode == 77) + { + int varpID = is.readUnsignedShort(); + if (varpID == 0xFFFF) + { + varpID = -1; + } + def.setVarbitID(varpID); + + int configId = is.readUnsignedShort(); + if (configId == 0xFFFF) + { + configId = -1; + } + def.setVarpID(configId); + + int length = is.readUnsignedByte(); + int[] configChangeDest = new int[length + 2]; + + for (int index = 0; index <= length; ++index) + { + configChangeDest[index] = is.readUnsignedShort(); + if (0xFFFF == configChangeDest[index]) + { + configChangeDest[index] = -1; + } + } + + configChangeDest[length + 1] = -1; + + def.setConfigChangeDest(configChangeDest); + } + else if (opcode == 78) + { + def.setAnInt2110(is.readUnsignedShort()); + def.setAnInt2083(is.readUnsignedByte()); + } + else if (opcode == 79) + { + def.setAnInt2112(is.readUnsignedShort()); + def.setAnInt2113(is.readUnsignedShort()); + def.setAnInt2083(is.readUnsignedByte()); + int length = is.readUnsignedByte(); + int[] anIntArray2084 = new int[length]; + + for (int index = 0; index < length; ++index) + { + anIntArray2084[index] = is.readUnsignedShort(); + } + + def.setAnIntArray2084(anIntArray2084); + } + else if (opcode == 81) + { + def.setAnInt2105(is.readUnsignedByte() * 256); + } + else if (opcode == 82) + { + def.setMapAreaId(is.readUnsignedShort()); + } + else if (opcode == 92) + { + int varpID = is.readUnsignedShort(); + if (varpID == 0xFFFF) + { + varpID = -1; + } + def.setVarbitID(varpID); + + int configId = is.readUnsignedShort(); + if (configId == 0xFFFF) + { + configId = -1; + } + def.setVarpID(configId); + + + int var = is.readUnsignedShort(); + if (var == 0xFFFF) + { + var = -1; + } + + int length = is.readUnsignedByte(); + int[] configChangeDest = new int[length + 2]; + + for (int index = 0; index <= length; ++index) + { + configChangeDest[index] = is.readUnsignedShort(); + if (0xFFFF == configChangeDest[index]) + { + configChangeDest[index] = -1; + } + } + + configChangeDest[length + 1] = var; + + def.setConfigChangeDest(configChangeDest); + } + else if (opcode == 249) + { + int length = is.readUnsignedByte(); + + Map params = new HashMap<>(length); + for (int i = 0; i < length; i++) + { + boolean isString = is.readUnsignedByte() == 1; + int key = is.read24BitInt(); + Object value; + + if (isString) + { + value = is.readString(); + } + + else + { + value = is.readInt(); + } + + params.put(key, value); + } + + def.setParams(params); + } + else + { + logger.warn("Unrecognized opcode {}", opcode); + } + } + + + private void post(ObjectDefinition def) + { + if (def.getAnInt2088() == -1) + { + def.setAnInt2088(0); + if (def.getObjectModels() != null && (def.getObjectTypes() == null || def.getObjectTypes()[0] == 10)) + { + def.setAnInt2088(1); + } + + for (int var1 = 0; var1 < 5; ++var1) + { + if (def.getActions()[var1] != null) + { + def.setAnInt2088(1); + } + } + } + + if (def.getAnInt2106() == -1) + { + def.setAnInt2106(def.getInteractType() != 0 ? 1 : 0); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/OverlayLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/OverlayLoader.java new file mode 100644 index 0000000000..1b01c07c87 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/OverlayLoader.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.OverlayDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OverlayLoader +{ + private static final Logger logger = LoggerFactory.getLogger(OverlayLoader.class); + + public OverlayDefinition load(int id, byte[] b) + { + OverlayDefinition def = new OverlayDefinition(); + InputStream is = new InputStream(b); + + def.setId(id); + + for (;;) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + if (opcode == 1) + { + int color = is.read24BitInt(); + def.setRgbColor(color); + } + else if (opcode == 2) + { + int texture = is.readUnsignedByte(); + def.setTexture(texture); + } + else if (opcode == 5) + { + def.setHideUnderlay(false); + } + else if (opcode == 7) + { + int secondaryColor = is.read24BitInt(); + def.setSecondaryRgbColor(secondaryColor); + } + } + + def.calculateHsl(); + + return def; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/ScriptLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/ScriptLoader.java new file mode 100644 index 0000000000..e77964a5ca --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/ScriptLoader.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.io.InputStream; +import static net.runelite.cache.script.Opcodes.SCONST; +import static net.runelite.cache.script.Opcodes.POP_INT; +import static net.runelite.cache.script.Opcodes.POP_STRING; +import static net.runelite.cache.script.Opcodes.RETURN; + +public class ScriptLoader +{ + public ScriptDefinition load(int id, byte[] b) + { + ScriptDefinition def = new ScriptDefinition(); + def.setId(id); + InputStream in = new InputStream(b); + + in.setOffset(in.getLength() - 2); + int switchLength = in.readUnsignedShort(); + + // 2 for switchLength + the switch data + 12 for the param/vars/stack data + int endIdx = in.getLength() - 2 - switchLength - 12; + in.setOffset(endIdx); + int numOpcodes = in.readInt(); + int localIntCount = in.readUnsignedShort(); + int localStringCount = in.readUnsignedShort(); + int intStackCount = in.readUnsignedShort(); + int stringStackCount = in.readUnsignedShort(); + + int numSwitches = in.readUnsignedByte(); + if (numSwitches > 0) + { + Map[] switches = new Map[numSwitches]; + def.setSwitches(switches); + + for (int i = 0; i < numSwitches; ++i) + { + switches[i] = new HashMap<>(); + + int count = in.readUnsignedShort(); + while (count-- > 0) + { + int key = in.readInt(); // int from stack is compared to this + int pcOffset = in.readInt(); // pc jumps by this + + switches[i].put(key, pcOffset); + } + } + } + + def.setLocalIntCount(localIntCount); + def.setLocalStringCount(localStringCount); + def.setIntStackCount(intStackCount); + def.setStringStackCount(stringStackCount); + + in.setOffset(0); + in.readStringOrNull(); + + int[] instructions = new int[numOpcodes]; + int[] intOperands = new int[numOpcodes]; + String[] stringOperands = new String[numOpcodes]; + + def.setInstructions(instructions); + def.setIntOperands(intOperands); + def.setStringOperands(stringOperands); + + int opcode; + for (int i = 0; in.getOffset() < endIdx; instructions[i++] = opcode) + { + opcode = in.readUnsignedShort(); + if (opcode == SCONST) + { + stringOperands[i] = in.readString(); + } + else if (opcode < 100 && opcode != RETURN && opcode != POP_INT && opcode != POP_STRING) + { + intOperands[i] = in.readInt(); + } + else + { + intOperands[i] = in.readUnsignedByte(); + } + } + + return def; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/SequenceLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/SequenceLoader.java new file mode 100644 index 0000000000..987cbd4204 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/SequenceLoader.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.SequenceDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SequenceLoader +{ + private static final Logger logger = LoggerFactory.getLogger(SequenceLoader.class); + + public SequenceDefinition load(int id, byte[] b) + { + SequenceDefinition def = new SequenceDefinition(id); + InputStream is = new InputStream(b); + + while (true) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + this.decodeValues(opcode, def, is); + } + + return def; + } + + private void decodeValues(int opcode, SequenceDefinition def, InputStream stream) + { + int var3; + int var4; + if (opcode == 1) + { + var3 = stream.readUnsignedShort(); + def.frameLenghts = new int[var3]; + + for (var4 = 0; var4 < var3; ++var4) + { + def.frameLenghts[var4] = stream.readUnsignedShort(); + } + + def.frameIDs = new int[var3]; + + for (var4 = 0; var4 < var3; ++var4) + { + def.frameIDs[var4] = stream.readUnsignedShort(); + } + + for (var4 = 0; var4 < var3; ++var4) + { + def.frameIDs[var4] += stream.readUnsignedShort() << 16; + } + } + else if (opcode == 2) + { + def.frameStep = stream.readUnsignedShort(); + } + else if (opcode == 3) + { + var3 = stream.readUnsignedByte(); + def.interleaveLeave = new int[1 + var3]; + + for (var4 = 0; var4 < var3; ++var4) + { + def.interleaveLeave[var4] = stream.readUnsignedByte(); + } + + def.interleaveLeave[var3] = 9999999; + } + else if (opcode == 4) + { + def.stretches = true; + } + else if (opcode == 5) + { + def.forcedPriority = stream.readUnsignedByte(); + } + else if (opcode == 6) + { + def.leftHandItem = stream.readUnsignedShort(); + } + else if (opcode == 7) + { + def.rightHandItem = stream.readUnsignedShort(); + } + else if (opcode == 8) + { + def.maxLoops = stream.readUnsignedByte(); + } + else if (opcode == 9) + { + def.precedenceAnimating = stream.readUnsignedByte(); + } + else if (opcode == 10) + { + def.priority = stream.readUnsignedByte(); + } + else if (opcode == 11) + { + def.replyMode = stream.readUnsignedByte(); + } + else if (opcode == 12) + { + var3 = stream.readUnsignedByte(); + def.field3048 = new int[var3]; + + for (var4 = 0; var4 < var3; ++var4) + { + def.field3048[var4] = stream.readUnsignedShort(); + } + + for (var4 = 0; var4 < var3; ++var4) + { + def.field3048[var4] += stream.readUnsignedShort() << 16; + } + } + else if (opcode == 13) + { + var3 = stream.readUnsignedByte(); + def.field3056 = new int[var3]; + + for (var4 = 0; var4 < var3; ++var4) + { + def.field3056[var4] = stream.read24BitInt(); + } + } + + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/SpotAnimLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/SpotAnimLoader.java new file mode 100644 index 0000000000..20f2be2d24 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/SpotAnimLoader.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.SpotAnimDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SpotAnimLoader +{ + private static final Logger logger = LoggerFactory.getLogger(SpotAnimLoader.class); + + public SpotAnimDefinition load(int id, byte[] b) + { + SpotAnimDefinition def = new SpotAnimDefinition(); + InputStream is = new InputStream(b); + def.id = id; + + while (true) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + this.decodeValues(opcode, def, is); + } + + return def; + } + + private void decodeValues(int opcode, SpotAnimDefinition def, InputStream stream) + { + if (opcode == 1) + { + def.modelId = stream.readUnsignedShort(); + } + else if (opcode == 2) + { + def.animationId = stream.readUnsignedShort(); + } + else if (opcode == 4) + { + def.resizeX = stream.readUnsignedShort(); + } + else if (opcode == 5) + { + def.resizeY = stream.readUnsignedShort(); + } + else if (opcode == 6) + { + def.rotaton = stream.readUnsignedShort(); + } + else if (opcode == 7) + { + def.ambient = stream.readUnsignedByte(); + } + else if (opcode == 8) + { + def.contrast = stream.readUnsignedByte(); + } + else if (opcode == 40) + { + int var3 = stream.readUnsignedByte(); + def.recolorToFind = new short[var3]; + def.recolorToReplace = new short[var3]; + + for (int var4 = 0; var4 < var3; ++var4) + { + def.recolorToFind[var4] = (short) stream.readUnsignedShort(); + def.recolorToReplace[var4] = (short) stream.readUnsignedShort(); + } + } + else if (opcode == 41) + { + int var3 = stream.readUnsignedByte(); + def.textureToFind = new short[var3]; + def.textureToReplace = new short[var3]; + + for (int var4 = 0; var4 < var3; ++var4) + { + def.textureToFind[var4] = (short) stream.readUnsignedShort(); + def.textureToReplace[var4] = (short) stream.readUnsignedShort(); + } + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/SpriteLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/SpriteLoader.java new file mode 100644 index 0000000000..9dc6e43e0f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/SpriteLoader.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.SpriteDefinition; +import net.runelite.cache.io.InputStream; + +public class SpriteLoader +{ + public static final int FLAG_VERTICAL = 0b01; + public static final int FLAG_ALPHA = 0b10; + + public SpriteDefinition[] load(int id, byte[] b) + { + InputStream is = new InputStream(b); + + is.setOffset(is.getLength() - 2); + int spriteCount = is.readUnsignedShort(); + + SpriteDefinition[] sprites = new SpriteDefinition[spriteCount]; + + // 2 for size + // 5 for width, height, palette length + // + 8 bytes per sprite for offset x/y, width, and height + is.setOffset(is.getLength() - 7 - spriteCount * 8); + + // max width and height + int width = is.readUnsignedShort(); + int height = is.readUnsignedShort(); + int paletteLength = is.readUnsignedByte() + 1; + + for (int i = 0; i < spriteCount; ++i) + { + sprites[i] = new SpriteDefinition(); + sprites[i].setId(id); + sprites[i].setFrame(i); + sprites[i].setMaxWidth(width); + sprites[i].setMaxHeight(height); + } + + for (int i = 0; i < spriteCount; ++i) + { + sprites[i].setOffsetX(is.readUnsignedShort()); + } + + for (int i = 0; i < spriteCount; ++i) + { + sprites[i].setOffsetY(is.readUnsignedShort()); + } + + for (int i = 0; i < spriteCount; ++i) + { + sprites[i].setWidth(is.readUnsignedShort()); + } + + for (int i = 0; i < spriteCount; ++i) + { + sprites[i].setHeight(is.readUnsignedShort()); + } + + // same as above + 3 bytes for each palette entry, except for the first one (which is transparent) + is.setOffset(is.getLength() - 7 - spriteCount * 8 - (paletteLength - 1) * 3); + int[] palette = new int[paletteLength]; + + for (int i = 1; i < paletteLength; ++i) + { + palette[i] = is.read24BitInt(); + + if (palette[i] == 0) + { + palette[i] = 1; + } + } + + is.setOffset(0); + + for (int i = 0; i < spriteCount; ++i) + { + SpriteDefinition def = sprites[i]; + int spriteWidth = def.getWidth(); + int spriteHeight = def.getHeight(); + int dimension = spriteWidth * spriteHeight; + byte[] pixelPaletteIndicies = new byte[dimension]; + byte[] pixelAlphas = new byte[dimension]; + def.pixelIdx = pixelPaletteIndicies; + def.palette = palette; + + int flags = is.readUnsignedByte(); + + if ((flags & FLAG_VERTICAL) == 0) + { + // read horizontally + for (int j = 0; j < dimension; ++j) + { + pixelPaletteIndicies[j] = is.readByte(); + } + } + else + { + // read vertically + for (int j = 0; j < spriteWidth; ++j) + { + for (int k = 0; k < spriteHeight; ++k) + { + pixelPaletteIndicies[spriteWidth * k + j] = is.readByte(); + } + } + } + + // read alphas + if ((flags & FLAG_ALPHA) != 0) + { + if ((flags & FLAG_VERTICAL) == 0) + { + // read horizontally + for (int j = 0; j < dimension; ++j) + { + pixelAlphas[j] = is.readByte(); + } + } + else + { + // read vertically + for (int j = 0; j < spriteWidth; ++j) + { + for (int k = 0; k < spriteHeight; ++k) + { + pixelAlphas[spriteWidth * k + j] = is.readByte(); + } + } + } + } + else + { + // everything non-zero is opaque + for (int j = 0; j < dimension; ++j) + { + int index = pixelPaletteIndicies[j]; + + if (index != 0) + pixelAlphas[j] = (byte) 0xFF; + } + } + + int[] pixels = new int[dimension]; + + // build argb pixels from palette/alphas + for (int j = 0; j < dimension; ++j) + { + int index = pixelPaletteIndicies[j] & 0xFF; + + pixels[j] = palette[index] | (pixelAlphas[j] << 24); + } + + def.setPixels(pixels); + } + + return sprites; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/StructLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/StructLoader.java new file mode 100644 index 0000000000..4137da8f37 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/StructLoader.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import java.util.HashMap; +import net.runelite.cache.definitions.StructDefinition; +import net.runelite.cache.io.InputStream; + +public class StructLoader +{ + public StructDefinition load(int id, byte[] b) + { + StructDefinition def = new StructDefinition(id); + InputStream is = new InputStream(b); + + while (true) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + this.decodeValues(opcode, def, is); + } + + return def; + } + + private void decodeValues(int opcode, StructDefinition def, InputStream stream) + { + if (opcode == 249) + { + int length = stream.readUnsignedByte(); + + def.params = new HashMap<>(length); + + for (int i = 0; i < length; i++) + { + boolean isString = stream.readUnsignedByte() == 1; + int key = stream.read24BitInt(); + Object value; + + if (isString) + { + value = stream.readString(); + } + else + { + value = stream.readInt(); + } + + def.params.put(key, value); + } + } + } + +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/TextureLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/TextureLoader.java new file mode 100644 index 0000000000..3e9ff09e89 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/TextureLoader.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.TextureDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TextureLoader +{ + private static final Logger logger = LoggerFactory.getLogger(TextureLoader.class); + + public TextureDefinition load(int id, byte[] b) + { + TextureDefinition def = new TextureDefinition(); + InputStream is = new InputStream(b); + + def.field1777 = is.readUnsignedShort(); + def.field1778 = is.readByte() != 0; + def.setId(id); + + int count = is.readUnsignedByte(); + int[] files = new int[count]; + + for (int i = 0; i < count; ++i) + files[i] = is.readUnsignedShort(); + + def.setFileIds(files); + + if (count > 1) + { + def.field1780 = new int[count - 1]; + + for (int var3 = 0; var3 < count - 1; ++var3) + { + def.field1780[var3] = is.readUnsignedByte(); + } + } + + if (count > 1) + { + def.field1781 = new int[count - 1]; + + for (int var3 = 0; var3 < count - 1; ++var3) + { + def.field1781[var3] = is.readUnsignedByte(); + } + } + + def.field1786 = new int[count]; + + for (int var3 = 0; var3 < count; ++var3) + { + def.field1786[var3] = is.readInt(); + } + + def.field1783 = is.readUnsignedByte(); + def.field1782 = is.readUnsignedByte(); + + return def; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/TrackLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/TrackLoader.java new file mode 100644 index 0000000000..6911b9de27 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/TrackLoader.java @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.TrackDefinition; +import net.runelite.cache.io.InputStream; +import net.runelite.cache.io.OutputStream; + +public class TrackLoader +{ + // Headers + private static final int MTHD_MAGIC = 1297377380; + private static final int MTRK_MAGIC = 1297379947; + + // Major MIDI Messages. Bottom 4 bits are the channel. + private static final int NOTE_ON = 0b1001_0000; + private static final int NOTE_OFF = 0b1000_0000; + private static final int CONTROL_CHANGE = 0b1011_0000; + private static final int PITCH_WHEEL_CHANGE = 0b1110_0000; + private static final int CHANNEL_PRESSURE = 0b1101_0000; + private static final int POLYPHONIC_KEY_PRESSURE = 0b1010_0000; + private static final int PROGRAM_CHANGE = 0b1100_0000; + + // Meta Events + private static final int META = 255; + private static final int END_OF_TRACK = 47; + private static final int TEMPO = 81; + + // Controller messages + private static final int CONTROLLER_BANK_SELECT = 0; + private static final int CONTROLLER_MODULATION_WHEEL = 1; + private static final int CONTROLLER_CHANNEL_VOLUME = 7; + private static final int CONTROLLER_PAN = 10; + private static final int CONTROLLER_BANK_SELECT_2 = 32; + private static final int CONTROLLER_MODULATION_WHEEL2 = 33; + private static final int CONTROLLER_CHANNEL_VOLUME_2 = 39; + private static final int CONTROLLER_PAN_2 = 42; + private static final int CONTROLLER_DAMPER_PEDAL = 64; + private static final int CONTROLLER_PORTAMENTO = 65; + private static final int CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB = 98; + private static final int CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB = 99; + private static final int CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB = 100; + private static final int CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB = 101; + private static final int CONTROLLER_ALL_SOUND_OFF = 120; + private static final int CONTROLLER_RESET_ALL_CONTROLLERS = 121; + private static final int CONTROLLER_ALL_NOTES_OFF = 123; + + private static final int JAG_NOTE_ON = 0; + private static final int JAG_NOTE_OFF = 1; + private static final int JAG_CONTROL_CHANGE = 2; + private static final int JAG_PITCH_BEND = 3; + private static final int JAG_CHANNEL_PRESSURE = 4; + private static final int JAG_POLY_PRESSURE = 5; + private static final int JAG_PROGRAM_CHANGE = 6; + private static final int JAG_END_OF_TRACK = 7; + private static final int JAG_TEMPO = 23; + + public TrackDefinition load(byte[] b) + { + TrackDefinition def = new TrackDefinition(); + load(def, new InputStream(b)); + return def; + } + + private void load(TrackDefinition def, InputStream var1) + { + // Some of the names are from https://www.rune-server.ee/runescape-development/rs-503-client-server/snippets/311669-rs-music-file-structure-conversion.html + var1.setOffset(var1.getLength() - 3); + int tracks = var1.readUnsignedByte(); + int division = var1.readUnsignedShort(); + int offset = 14 + tracks * 10; + var1.setOffset(0); + int tempoOpcodes = 0; + int ctrlChangeOpcodes = 0; + int noteOnOpcodes = 0; + int noteOffOpcodes = 0; + int wheelChangeOpcodes = 0; + int chnnlAfterTchOpcodes = 0; + int keyAfterTchOpcodes = 0; + int progmChangeOpcodes = 0; + + int var13; + int opcode; + int controlChangeIndex; + for (var13 = 0; var13 < tracks; ++var13) + { + opcode = -1; + + while (true) + { + controlChangeIndex = var1.readUnsignedByte(); + if (controlChangeIndex != opcode) + { + ++offset; + } + + opcode = controlChangeIndex & 15; + if (controlChangeIndex == JAG_END_OF_TRACK) + { + break; + } + + if (controlChangeIndex == JAG_TEMPO) + { + ++tempoOpcodes; + } + else if (opcode == JAG_NOTE_ON) + { + ++noteOnOpcodes; + } + else if (opcode == JAG_NOTE_OFF) + { + ++noteOffOpcodes; + } + else if (opcode == JAG_CONTROL_CHANGE) + { + ++ctrlChangeOpcodes; + } + else if (opcode == JAG_PITCH_BEND) + { + ++wheelChangeOpcodes; + } + else if (opcode == JAG_CHANNEL_PRESSURE) + { + ++chnnlAfterTchOpcodes; + } + else if (opcode == JAG_POLY_PRESSURE) + { + ++keyAfterTchOpcodes; + } + else if (opcode == JAG_PROGRAM_CHANGE) + { + ++progmChangeOpcodes; + } + else + { + throw new RuntimeException(); + } + } + } + + offset += 5 * tempoOpcodes; + offset += 2 * (noteOnOpcodes + noteOffOpcodes + ctrlChangeOpcodes + wheelChangeOpcodes + keyAfterTchOpcodes); + offset += chnnlAfterTchOpcodes + progmChangeOpcodes; + var13 = var1.getOffset(); + opcode = tracks + tempoOpcodes + ctrlChangeOpcodes + noteOnOpcodes + noteOffOpcodes + wheelChangeOpcodes + chnnlAfterTchOpcodes + keyAfterTchOpcodes + progmChangeOpcodes; + + for (controlChangeIndex = 0; controlChangeIndex < opcode; ++controlChangeIndex) + { + var1.readVarInt(); + } + + offset += var1.getOffset() - var13; + controlChangeIndex = var1.getOffset(); + int modulationWheelSize = 0; + int modulationWheel2Size = 0; + int channelVolumeSize = 0; + int channelVolume2Size = 0; + int panSize = 0; + int pan2Size = 0; + int nonRegisteredMsbSize = 0; + int nonRegisteredLsbSize = 0; + int registeredNumberMsb = 0; + int registeredLsbSize = 0; + int commandsSize = 0; + int otherSize = 0; + int controllerNumber = 0; + + int var29; + for (var29 = 0; var29 < ctrlChangeOpcodes; ++var29) + { + controllerNumber = controllerNumber + var1.readUnsignedByte() & 127; + if (controllerNumber == CONTROLLER_BANK_SELECT || controllerNumber == CONTROLLER_BANK_SELECT_2) + { + ++progmChangeOpcodes; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL) + { + ++modulationWheelSize; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL2) + { + ++modulationWheel2Size; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME) + { + ++channelVolumeSize; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME_2) + { + ++channelVolume2Size; + } + else if (controllerNumber == CONTROLLER_PAN) + { + ++panSize; + } + else if (controllerNumber == CONTROLLER_PAN_2) + { + ++pan2Size; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB) + { + ++nonRegisteredMsbSize; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB) + { + ++nonRegisteredLsbSize; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB) + { + ++registeredNumberMsb; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB) + { + ++registeredLsbSize; + } + else if (controllerNumber != CONTROLLER_DAMPER_PEDAL + && controllerNumber != CONTROLLER_PORTAMENTO + && controllerNumber != CONTROLLER_ALL_SOUND_OFF + && controllerNumber != CONTROLLER_RESET_ALL_CONTROLLERS + && controllerNumber != CONTROLLER_ALL_NOTES_OFF) + { + ++otherSize; + } + else + { + ++commandsSize; + } + } + + var29 = 0; + int commandsIndex = var1.getOffset(); + var1.skip(commandsSize); + int polyPressureIndex = var1.getOffset(); + var1.skip(keyAfterTchOpcodes); + int channelPressureIndex = var1.getOffset(); + var1.skip(chnnlAfterTchOpcodes); + int pitchWheelHighIndex = var1.getOffset(); + var1.skip(wheelChangeOpcodes); + int modulationWheelOffset = var1.getOffset(); + var1.skip(modulationWheelSize); + int channelVolumeOffset = var1.getOffset(); + var1.skip(channelVolumeSize); + int panOffset = var1.getOffset(); + var1.skip(panSize); + int notesIndex = var1.getOffset(); + var1.skip(noteOnOpcodes + noteOffOpcodes + keyAfterTchOpcodes); + int notesOnIndex = var1.getOffset(); + var1.skip(noteOnOpcodes); + int otherIndex = var1.getOffset(); + var1.skip(otherSize); + int notesOffIndex = var1.getOffset(); + var1.skip(noteOffOpcodes); + int modulationWheel2Offset = var1.getOffset(); + var1.skip(modulationWheel2Size); + int channelVolume2Offset = var1.getOffset(); + var1.skip(channelVolume2Size); + int pan2Offset = var1.getOffset(); + var1.skip(pan2Size); + int programChangeIndex = var1.getOffset(); + var1.skip(progmChangeOpcodes); + int pitchWheelLowIndex = var1.getOffset(); + var1.skip(wheelChangeOpcodes); + int nonRegisteredMsbIndex = var1.getOffset(); + var1.skip(nonRegisteredMsbSize); + int nonRegisteredLsbIndex = var1.getOffset(); + var1.skip(nonRegisteredLsbSize); + int registeredMsbIndex = var1.getOffset(); + var1.skip(registeredNumberMsb); + int registeredLsbIndex = var1.getOffset(); + var1.skip(registeredLsbSize); + int tempoOffset = var1.getOffset(); + var1.skip(tempoOpcodes * 3); + OutputStream var51 = new OutputStream(offset); + var51.writeInt(MTHD_MAGIC); // MThd header + var51.writeInt(6); // length of header + var51.writeShort(tracks > 1 ? 1 : 0); // format + var51.writeShort(tracks); // tracks + var51.writeShort(division); // division + var1.setOffset(var13); + int channel = 0; + int var53 = 0; + int var54 = 0; + int var55 = 0; + int var56 = 0; + int var57 = 0; + int var58 = 0; + int[] var59 = new int[128]; + controllerNumber = 0; + + label361: + for (int var60 = 0; var60 < tracks; ++var60) + { + var51.writeInt(MTRK_MAGIC); // MTrk + var51.skip(4); // length gets written here later + int var61 = var51.getOffset(); + int var62 = -1; + + while (true) + { + int deltaTick = var1.readVarInt(); + var51.writeVarInt(deltaTick); // delta time + int status = var1.getArray()[var29++] & 255; + boolean var65 = status != var62; + var62 = status & 15; + if (status == JAG_END_OF_TRACK) + { + //if (var65) -- client has this if, but it causes broken midi to be produced + { + var51.writeByte(META); + } + + var51.writeByte(END_OF_TRACK); // type - end of track + var51.writeByte(0); // length + var51.writeLengthFromMark(var51.getOffset() - var61); + continue label361; + } + + if (status == JAG_TEMPO) + { + //if (var65) -- client has this if, but it causes broken midi to be produced + { + var51.writeByte(META); // meta event FF + } + + var51.writeByte(TEMPO); // type - set tempo + var51.writeByte(3); // length + var51.writeByte(var1.getArray()[tempoOffset++]); + var51.writeByte(var1.getArray()[tempoOffset++]); + var51.writeByte(var1.getArray()[tempoOffset++]); + } + else + { + channel ^= status >> 4; + if (var62 == JAG_NOTE_ON) + { + if (var65) + { + var51.writeByte(NOTE_ON + channel); + } + + var53 += var1.getArray()[notesIndex++]; + var54 += var1.getArray()[notesOnIndex++]; + var51.writeByte(var53 & 127); + var51.writeByte(var54 & 127); + } + else if (var62 == JAG_NOTE_OFF) + { + if (var65) + { + var51.writeByte(NOTE_OFF + channel); + } + + var53 += var1.getArray()[notesIndex++]; + var55 += var1.getArray()[notesOffIndex++]; + var51.writeByte(var53 & 127); + var51.writeByte(var55 & 127); + } + else if (var62 == JAG_CONTROL_CHANGE) + { + if (var65) + { + var51.writeByte(CONTROL_CHANGE + channel); + } + + controllerNumber = controllerNumber + var1.getArray()[controlChangeIndex++] & 127; + var51.writeByte(controllerNumber); + byte var66; + if (controllerNumber == CONTROLLER_BANK_SELECT || controllerNumber == CONTROLLER_BANK_SELECT_2) + { + var66 = var1.getArray()[programChangeIndex++]; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL) + { + var66 = var1.getArray()[modulationWheelOffset++]; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL2) + { + var66 = var1.getArray()[modulationWheel2Offset++]; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME) + { + var66 = var1.getArray()[channelVolumeOffset++]; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME_2) + { + var66 = var1.getArray()[channelVolume2Offset++]; + } + else if (controllerNumber == CONTROLLER_PAN) + { + var66 = var1.getArray()[panOffset++]; + } + else if (controllerNumber == CONTROLLER_PAN_2) + { + var66 = var1.getArray()[pan2Offset++]; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB) + { + var66 = var1.getArray()[nonRegisteredMsbIndex++]; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB) + { + var66 = var1.getArray()[nonRegisteredLsbIndex++]; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB) + { + var66 = var1.getArray()[registeredMsbIndex++]; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB) + { + var66 = var1.getArray()[registeredLsbIndex++]; + } + else if (controllerNumber != CONTROLLER_DAMPER_PEDAL + && controllerNumber != CONTROLLER_PORTAMENTO + && controllerNumber != CONTROLLER_ALL_SOUND_OFF + && controllerNumber != CONTROLLER_RESET_ALL_CONTROLLERS + && controllerNumber != CONTROLLER_ALL_NOTES_OFF) + { + var66 = var1.getArray()[otherIndex++]; + } + else + { + var66 = var1.getArray()[commandsIndex++]; + } + + int var67 = var66 + var59[controllerNumber]; + var59[controllerNumber] = var67; + var51.writeByte(var67 & 127); + } + else if (var62 == JAG_PITCH_BEND) + { + if (var65) + { + var51.writeByte(PITCH_WHEEL_CHANGE + channel); + } + + var56 += var1.getArray()[pitchWheelLowIndex++]; + var56 += var1.getArray()[pitchWheelHighIndex++] << 7; + var51.writeByte(var56 & 127); + var51.writeByte(var56 >> 7 & 127); + } + else if (var62 == JAG_CHANNEL_PRESSURE) + { + if (var65) + { + var51.writeByte(CHANNEL_PRESSURE + channel); + } + + var57 += var1.getArray()[channelPressureIndex++]; + var51.writeByte(var57 & 127); + } + else if (var62 == JAG_POLY_PRESSURE) + { + if (var65) + { + var51.writeByte(POLYPHONIC_KEY_PRESSURE + channel); + } + + var53 += var1.getArray()[notesIndex++]; + var58 += var1.getArray()[polyPressureIndex++]; + var51.writeByte(var53 & 127); + var51.writeByte(var58 & 127); + } + else if (var62 == JAG_PROGRAM_CHANGE) + { + + if (var65) + { + var51.writeByte(PROGRAM_CHANGE + channel); + } + + var51.writeByte(var1.getArray()[programChangeIndex++]); + } + else + { + throw new RuntimeException(); + } + } + } + } + + def.midi = var51.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/UnderlayLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/UnderlayLoader.java new file mode 100644 index 0000000000..5c4c10f09d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/UnderlayLoader.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import net.runelite.cache.definitions.UnderlayDefinition; +import net.runelite.cache.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UnderlayLoader +{ + private static final Logger logger = LoggerFactory.getLogger(UnderlayLoader.class); + + public UnderlayDefinition load(int id, byte[] b) + { + UnderlayDefinition def = new UnderlayDefinition(); + InputStream is = new InputStream(b); + + def.setId(id); + + for (;;) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + if (opcode == 1) + { + int color = is.read24BitInt(); + def.setColor(color); + } + } + + def.calculateHsl(); + + return def; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/Vorkath.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/VarbitLoader.java similarity index 66% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/Vorkath.java rename to cache/src/main/java/net/runelite/cache/definitions/loaders/VarbitLoader.java index 2e7e239619..05d91afa90 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/Vorkath.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/VarbitLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,47 +22,36 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.vorkath; +package net.runelite.cache.definitions.loaders; -import lombok.Getter; -import lombok.Setter; -import api.NPC; +import net.runelite.cache.definitions.VarbitDefinition; +import net.runelite.cache.io.InputStream; -public class Vorkath +public class VarbitLoader { - static final int ATTACKS_PER_SWITCH = 6; - - enum AttackStyle + public VarbitDefinition load(int id, byte[] b) { - MAGERANGE, - ICE, - ACID, - SPECIAL + VarbitDefinition def = new VarbitDefinition(); + InputStream is = new InputStream(b); + + def.setId(id); + + for (;;) + { + int opcode = is.readUnsignedByte(); + if (opcode == 0) + { + break; + } + + if (opcode == 1) + { + def.setIndex(is.readUnsignedShort()); + def.setLeastSignificantBit(is.readUnsignedByte()); + def.setMostSignificantBit(is.readUnsignedByte()); + } + } + + return def; } - - @Getter - private NPC npc; - - @Getter - @Setter - private int phase; - - @Getter - @Setter - private int attacksUntilSwitch; - - @Getter - @Setter - private int lastTickAnimation; - - @Getter - @Setter - private boolean icePhaseAttack; - - public Vorkath(NPC npc) - { - this.npc = npc; - this.attacksUntilSwitch = ATTACKS_PER_SWITCH; - this.phase = 0; - } -} \ No newline at end of file +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/WorldMapLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/WorldMapLoader.java new file mode 100644 index 0000000000..15ec975d6d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/WorldMapLoader.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders; + +import java.util.LinkedList; +import net.runelite.cache.definitions.WorldMapDefinition; +import net.runelite.cache.definitions.WorldMapType0; +import net.runelite.cache.definitions.WorldMapType1; +import net.runelite.cache.definitions.WorldMapType2; +import net.runelite.cache.definitions.WorldMapType3; +import net.runelite.cache.definitions.WorldMapTypeBase; +import net.runelite.cache.io.InputStream; +import net.runelite.cache.region.Position; + +public class WorldMapLoader +{ + public WorldMapDefinition load(byte[] b, int fileId) + { + WorldMapDefinition def = new WorldMapDefinition(); + InputStream in = new InputStream(b); + + def.fileId = fileId; + def.safeName = in.readString(); + def.name = in.readString(); + + int packedPos = in.readInt(); + if (packedPos == -1) + { + def.position = new Position(-1, -1, -1); + } + else + { + int y = packedPos >> 28 & 3; + int x = packedPos >> 14 & 16383; + int z = packedPos & 16383; + def.position = new Position(x, y, z); + } + + def.field450 = in.readInt(); + in.readUnsignedByte(); + def.field457 = in.readUnsignedByte() == 1; + def.field451 = in.readUnsignedByte(); + int var3 = in.readUnsignedByte(); + def.field458 = new LinkedList(); + + for (int var4 = 0; var4 < var3; ++var4) + { + def.field458.add(this.loadType(in)); + } + + return def; + } + + private WorldMapTypeBase loadType(InputStream var1) + { + int var2 = var1.readUnsignedByte(); + // field397 = new class27(1, (byte)0); + // field390 = new class27(2, (byte)1); + // field399 = new class27(3, (byte)2); + // field393 = new class27(0, (byte)3); + WorldMapTypeBase base; + switch (var2) + { + case 0: + // type 1 + base = load1(var1); + break; + case 1: + // type 2 + base = load2(var1); + break; + case 2: + // type 3 + base = load3(var1); + break; + case 3: + // type 0 + base = load0(var1); + break; + default: + throw new IllegalStateException(); + } + return base; + } + + private WorldMapTypeBase load0(InputStream in) + { + WorldMapType0 wm = new WorldMapType0(); + + wm.field606 = in.readUnsignedByte(); + wm.field605 = in.readUnsignedByte(); + wm.field601 = in.readUnsignedShort(); + wm.field602 = in.readUnsignedByte(); + wm.field603 = in.readUnsignedShort(); + wm.field607 = in.readUnsignedByte(); + wm.field604 = in.readUnsignedShort(); + wm.field600 = in.readUnsignedByte(); + wm.field608 = in.readUnsignedShort(); + wm.field609 = in.readUnsignedByte(); + + return wm; + } + + private WorldMapTypeBase load1(InputStream in) + { + WorldMapType1 wm = new WorldMapType1(); + + wm.field434 = in.readUnsignedByte(); + wm.field424 = in.readUnsignedByte(); + wm.field425 = in.readUnsignedShort(); + wm.field426 = in.readUnsignedShort(); + wm.field427 = in.readUnsignedShort(); + wm.field431 = in.readUnsignedShort(); + wm.field429 = in.readUnsignedShort(); + wm.field428 = in.readUnsignedShort(); + wm.field433 = in.readUnsignedShort(); + wm.field435 = in.readUnsignedShort(); + + return wm; + } + + private WorldMapTypeBase load2(InputStream in) + { + WorldMapType2 wm = new WorldMapType2(); + + wm.field519 = in.readUnsignedByte(); + wm.field511 = in.readUnsignedByte(); + wm.field510 = in.readUnsignedShort(); + wm.field512 = in.readUnsignedShort(); + wm.field514 = in.readUnsignedShort(); + wm.field515 = in.readUnsignedShort(); + + return wm; + } + + private WorldMapTypeBase load3(InputStream in) + { + WorldMapType3 wm = new WorldMapType3(); + + wm.field387 = in.readUnsignedByte(); + wm.field377 = in.readUnsignedByte(); + wm.field378 = in.readUnsignedShort(); + wm.field382 = in.readUnsignedByte(); + wm.field376 = in.readUnsignedByte(); + wm.field383 = in.readUnsignedShort(); + wm.field385 = in.readUnsignedByte(); + wm.field379 = in.readUnsignedByte(); + wm.field380 = in.readUnsignedShort(); + wm.field386 = in.readUnsignedByte(); + wm.field388 = in.readUnsignedByte(); + wm.field381 = in.readUnsignedShort(); + wm.field384 = in.readUnsignedByte(); + wm.field389 = in.readUnsignedByte(); + + return wm; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect1Loader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect1Loader.java new file mode 100644 index 0000000000..a5c8f16f78 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect1Loader.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders.sound; + +import net.runelite.cache.definitions.sound.SoundEffect1Definition; +import net.runelite.cache.definitions.sound.SoundEffect2Definition; +import net.runelite.cache.io.InputStream; + +public class SoundEffect1Loader +{ + private final SoundEffect2Loader se2Loader = new SoundEffect2Loader(); + private final SoundEffect3Loader se3Loader = new SoundEffect3Loader(); + + public SoundEffect1Definition load(InputStream in) + { + SoundEffect1Definition se = new SoundEffect1Definition(); + + load(se, in); + + return se; + } + + private void load(SoundEffect1Definition se, InputStream var1) + { + se.field1181 = se2Loader.load(var1); + se.field1173 = se2Loader.load(var1); + int var2 = var1.readUnsignedByte(); + if (var2 != 0) + { + var1.setOffset(var1.getOffset() - 1); + se.field1174 = se2Loader.load(var1); + se.field1193 = se2Loader.load(var1); + } + + var2 = var1.readUnsignedByte(); + if (var2 != 0) + { + var1.setOffset(var1.getOffset() - 1); + se.field1183 = se2Loader.load(var1); + se.field1192 = se2Loader.load(var1); + } + + var2 = var1.readUnsignedByte(); + if (var2 != 0) + { + var1.setOffset(var1.getOffset() - 1); + se.field1178 = se2Loader.load(var1); + se.field1175 = se2Loader.load(var1); + } + + for (int var3 = 0; var3 < 10; ++var3) + { + int var4 = var1.readUnsignedShortSmart(); + if (var4 == 0) + { + break; + } + + se.field1180[var3] = var4; + se.field1179[var3] = var1.readShortSmart(); + se.field1177[var3] = var1.readUnsignedShortSmart(); + } + + se.field1187 = var1.readUnsignedShortSmart(); + se.field1184 = var1.readUnsignedShortSmart(); + se.field1176 = var1.readUnsignedShort(); + se.field1188 = var1.readUnsignedShort(); + se.field1186 = new SoundEffect2Definition(); + se.field1182 = se3Loader.load(var1, se.field1186); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect2Loader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect2Loader.java new file mode 100644 index 0000000000..d9ae3d3abb --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect2Loader.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders.sound; + +import net.runelite.cache.definitions.sound.SoundEffect2Definition; +import net.runelite.cache.io.InputStream; + +public class SoundEffect2Loader +{ + public SoundEffect2Definition load(InputStream in) + { + SoundEffect2Definition se = new SoundEffect2Definition(); + + load(se, in); + + return se; + } + + private void load(SoundEffect2Definition se, InputStream var1) + { + se.field1087 = var1.readUnsignedByte(); + se.field1088 = var1.readInt(); + se.field1089 = var1.readInt(); + this.method1144(se, var1); + } + + final void method1144(SoundEffect2Definition se, InputStream var1) + { + se.field1092 = var1.readUnsignedByte(); + se.field1086 = new int[se.field1092]; + se.field1090 = new int[se.field1092]; + + for (int var2 = 0; var2 < se.field1092; ++var2) + { + se.field1086[var2] = var1.readUnsignedShort(); + se.field1090[var2] = var1.readUnsignedShort(); + } + + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect3Loader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect3Loader.java new file mode 100644 index 0000000000..ad7f733efb --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffect3Loader.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders.sound; + +import net.runelite.cache.definitions.sound.SoundEffect2Definition; +import net.runelite.cache.definitions.sound.SoundEffect3Definition; +import net.runelite.cache.io.InputStream; + +public class SoundEffect3Loader +{ + private final SoundEffect2Loader se2Loader = new SoundEffect2Loader(); + + public SoundEffect3Definition load(InputStream in, SoundEffect2Definition var2) + { + SoundEffect3Definition se = new SoundEffect3Definition(); + + load(se, in, var2); + + return se; + } + + private void load(SoundEffect3Definition se, InputStream var1, SoundEffect2Definition var2) + { + int var3 = var1.readUnsignedByte(); + se.field1155[0] = var3 >> 4; + se.field1155[1] = var3 & 15; + if (var3 != 0) + { + se.field1156[0] = var1.readUnsignedShort(); + se.field1156[1] = var1.readUnsignedShort(); + int var4 = var1.readUnsignedByte(); + + int var5; + int var6; + for (var5 = 0; var5 < 2; ++var5) + { + for (var6 = 0; var6 < se.field1155[var5]; ++var6) + { + se.field1154[var5][0][var6] = var1.readUnsignedShort(); + se.field1159[var5][0][var6] = var1.readUnsignedShort(); + } + } + + for (var5 = 0; var5 < 2; ++var5) + { + for (var6 = 0; var6 < se.field1155[var5]; ++var6) + { + if ((var4 & 1 << var5 * 4 << var6) != 0) + { + se.field1154[var5][1][var6] = var1.readUnsignedShort(); + se.field1159[var5][1][var6] = var1.readUnsignedShort(); + } + else + { + se.field1154[var5][1][var6] = se.field1154[var5][0][var6]; + se.field1159[var5][1][var6] = se.field1159[var5][0][var6]; + } + } + } + + if (var4 != 0 || se.field1156[1] != se.field1156[0]) + { + se2Loader.method1144(var2, var1); + } + } + else + { + int[] var7 = se.field1156; + se.field1156[1] = 0; + var7[0] = 0; + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffectLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffectLoader.java new file mode 100644 index 0000000000..ddb6a4d9fc --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/sound/SoundEffectLoader.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.loaders.sound; + +import net.runelite.cache.definitions.sound.SoundEffectDefinition; +import net.runelite.cache.definitions.sound.SoundEffect1Definition; +import net.runelite.cache.io.InputStream; + +public class SoundEffectLoader +{ + public SoundEffectDefinition load(byte[] b) + { + SoundEffectDefinition se = new SoundEffectDefinition(); + InputStream in = new InputStream(b); + + load(se, in); + + return se; + } + + private void load(SoundEffectDefinition se, InputStream var1) + { + for (int var2 = 0; var2 < 10; ++var2) + { + int var3 = var1.readUnsignedByte(); + if (var3 != 0) + { + var1.setOffset(var1.getOffset() - 1); + + SoundEffect1Loader se1Loader = new SoundEffect1Loader(); + SoundEffect1Definition se1 = se1Loader.load(var1); + + se.field1008[var2] = se1; + } + } + + se.field1006 = var1.readUnsignedShort(); + se.field1009 = var1.readUnsignedShort(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/providers/ItemProvider.java b/cache/src/main/java/net/runelite/cache/definitions/providers/ItemProvider.java new file mode 100644 index 0000000000..7d58c98104 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/providers/ItemProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.providers; + +import net.runelite.cache.definitions.ItemDefinition; + +public interface ItemProvider +{ + ItemDefinition provide(int itemId); +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/providers/ModelProvider.java b/cache/src/main/java/net/runelite/cache/definitions/providers/ModelProvider.java new file mode 100644 index 0000000000..36a8412b81 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/providers/ModelProvider.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.providers; + +import java.io.IOException; +import net.runelite.cache.definitions.ModelDefinition; + +public interface ModelProvider +{ + ModelDefinition provide(int modelId) throws IOException; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/providers/OverlayProvider.java b/cache/src/main/java/net/runelite/cache/definitions/providers/OverlayProvider.java new file mode 100644 index 0000000000..a793b39962 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/providers/OverlayProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.providers; + +import net.runelite.cache.definitions.OverlayDefinition; + +public interface OverlayProvider +{ + OverlayDefinition provide(int overlayId); +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/providers/SpriteProvider.java b/cache/src/main/java/net/runelite/cache/definitions/providers/SpriteProvider.java new file mode 100644 index 0000000000..f7177bd378 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/providers/SpriteProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.providers; + +import net.runelite.cache.definitions.SpriteDefinition; + +public interface SpriteProvider +{ + SpriteDefinition provide(int spriteId, int frameId); +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/providers/StructProvider.java b/cache/src/main/java/net/runelite/cache/definitions/providers/StructProvider.java new file mode 100644 index 0000000000..54d03060c1 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/providers/StructProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.providers; + +import net.runelite.cache.definitions.StructDefinition; + +public interface StructProvider +{ + StructDefinition provide(int structId); +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/providers/TextureProvider.java b/cache/src/main/java/net/runelite/cache/definitions/providers/TextureProvider.java new file mode 100644 index 0000000000..f85fec54d3 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/providers/TextureProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.providers; + +import net.runelite.cache.definitions.TextureDefinition; + +public interface TextureProvider +{ + TextureDefinition[] provide(); +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/providers/UnderlayProvider.java b/cache/src/main/java/net/runelite/cache/definitions/providers/UnderlayProvider.java new file mode 100644 index 0000000000..3b0381c7a3 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/providers/UnderlayProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.providers; + +import net.runelite.cache.definitions.UnderlayDefinition; + +public interface UnderlayProvider +{ + UnderlayDefinition provide(int underlayId); +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/InterfaceSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/InterfaceSaver.java new file mode 100644 index 0000000000..61151a4158 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/InterfaceSaver.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import net.runelite.cache.definitions.ClientScript1Instruction; +import net.runelite.cache.definitions.InterfaceDefinition; +import net.runelite.cache.io.OutputStream; + +public class InterfaceSaver +{ + public byte[] save(InterfaceDefinition def) + { + if (def.isIf3) + { + return saveIf3(def); + } + else + { + return saveIf1(def); + } + } + + private byte[] saveIf3(InterfaceDefinition def) + { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private byte[] saveIf1(InterfaceDefinition def) + { + OutputStream out = new OutputStream(); + out.writeByte(def.type); + out.writeByte(def.menuType); + out.writeShort(def.contentType); + out.writeShort(def.originalX); + out.writeShort(def.originalY); + out.writeShort(def.originalWidth); + out.writeShort(def.originalHeight); + out.writeByte(def.opacity); + out.writeShort(def.parentId); + out.writeShort(def.hoveredSiblingId); + if (def.alternateOperators != null) + { + out.writeByte(def.alternateOperators.length); + for (int i = 0; i < def.alternateOperators.length; ++i) + { + out.writeByte(def.alternateOperators[i]); + out.writeShort(def.alternateRhs[i]); + } + } + else + { + out.writeByte(0); + } + if (def.clientScripts != null) + { + out.writeByte(def.clientScripts.length); + for (int i = 0; i < def.clientScripts.length; ++i) + { + int len = 0; + for (int j = 0; j < def.clientScripts[i].length; ++j) + { + ClientScript1Instruction ins = def.clientScripts[i][j]; + len++; + if (ins.operands != null) + { + len += ins.operands.length; + } + } + out.writeShort(len); + for (int j = 0; j < def.clientScripts[i].length; ++j) + { + ClientScript1Instruction ins = def.clientScripts[i][j]; + out.writeShort(ins.opcode.ordinal()); + if (ins.operands != null) + { + for (int op : ins.operands) + { + out.writeShort(op); + } + } + } + } + } + else + { + out.writeByte(0); + } + if (def.type == 0) + { + out.writeShort(def.scrollHeight); + out.writeByte(def.isHidden ? 1 : 0); + } + if (def.type == 1) + { + out.writeShort(0); + out.writeByte(0); + } + if (def.type == 2) + { + out.writeByte((def.clickMask & 268435456) != 0 ? 1 : 0); + out.writeByte((def.clickMask & 1073741824) != 0 ? 1 : 0); + out.writeByte((def.clickMask & Integer.MIN_VALUE) != 0 ? 1 : 0); + out.writeByte((def.clickMask & 536870912) != 0 ? 1 : 0); + out.writeByte(def.xPitch); + out.writeByte(def.yPitch); + for (int i = 0; i < 20; ++i) + { + if (def.sprites[i] != -1) + { + out.writeByte(1); + out.writeShort(def.xOffsets[i]); + out.writeShort(def.yOffsets[i]); + out.writeShort(def.sprites[i]); + } + else + { + out.writeByte(0); + } + } + for (int i = 0; i < 5; ++i) + { + if (def.configActions[i] != null) + { + out.writeString(def.configActions[i]); + } + else + { + out.writeString(""); + } + } + } + if (def.type == 3) + { + out.writeByte(def.filled ? 1 : 0); + } + if (def.type == 4 || def.type == 1) + { + out.writeByte(def.xTextAlignment); + out.writeByte(def.yTextAlignment); + out.writeByte(def.lineHeight); + out.writeShort(def.fontId); + out.writeByte(def.textShadowed ? 1 : 0); + } + if (def.type == 4) + { + out.writeString(def.text); + out.writeString(def.alternateText); + } + if (def.type == 1 || def.type == 3 || def.type == 4) + { + out.writeInt(def.textColor); + } + if (def.type == 3 || def.type == 4) + { + out.writeInt(def.alternateTextColor); + out.writeInt(def.hoveredTextColor); + out.writeInt(def.alternateHoveredTextColor); + } + if (def.type == 5) + { + out.writeInt(def.spriteId); + out.writeInt(def.alternateSpriteId); + } + if (def.type == 6) + { + out.writeShort(def.modelId); + out.writeShort(def.alternateModelId); + out.writeShort(def.animation); + out.writeShort(def.alternateAnimation); + out.writeShort(def.modelZoom); + out.writeShort(def.rotationX); + out.writeShort(def.rotationZ); + } + if (def.type == 7) + { + out.writeByte(def.xTextAlignment); + out.writeShort(def.fontId); + out.writeByte(def.textShadowed ? 1 : 0); + out.writeInt(def.textColor); + out.writeShort(def.xPitch); + out.writeShort(def.yPitch); + out.writeByte((def.clickMask & 1073741824) != 0 ? 1 : 0); + for (int i = 0; i < 5; ++i) + { + out.writeString(def.configActions[i]); + } + } + if (def.type == 8) + { + out.writeString(def.text); + } + if (def.menuType == 2 || def.type == 2) + { + out.writeString(def.targetVerb); + out.writeString(def.spellName); + out.writeShort((def.clickMask >>> 11) & 63); + } + if (def.menuType == 1 || def.menuType == 4 || def.menuType == 5 || def.menuType == 6) + { + out.writeString(def.tooltip); + } + return out.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/ItemSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/ItemSaver.java new file mode 100644 index 0000000000..baa9af3bea --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/ItemSaver.java @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import java.util.Map.Entry; +import net.runelite.cache.definitions.ItemDefinition; +import net.runelite.cache.io.OutputStream; + +public class ItemSaver +{ + public byte[] save(ItemDefinition item) + { + OutputStream out = new OutputStream(); + if (item.inventoryModel != 0) + { + out.writeByte(1); + out.writeShort(item.inventoryModel); + } + if (item.name != null) + { + out.writeByte(2); + out.writeString(item.name); + } + out.writeByte(4); + out.writeShort(item.zoom2d); + out.writeByte(5); + out.writeShort(item.xan2d); + out.writeByte(6); + out.writeShort(item.yan2d); + out.writeByte(7); + out.writeShort(item.xOffset2d); + out.writeByte(8); + out.writeShort(item.yOffset2d); + if (item.stackable != 0) + { + out.writeByte(11); + } + out.writeByte(12); + out.writeInt(item.cost); + if (item.members) + { + out.writeByte(16); + } + if (item.maleModel0 != -1 || item.maleOffset != 0) + { + out.writeByte(23); + out.writeShort(item.maleModel0); + out.writeByte(item.maleOffset); + } + if (item.maleModel1 != -1) + { + out.writeByte(24); + out.writeShort(item.maleModel1); + } + if (item.femaleModel0 != -1 || item.femaleOffset != 0) + { + out.writeByte(25); + out.writeShort(item.femaleModel0); + out.writeByte(item.femaleOffset); + } + if (item.femaleModel1 != -1) + { + out.writeByte(26); + out.writeShort(item.femaleModel1); + } + for (int i = 0; i < 5; ++i) + { + if (item.options[i] != null) + { + out.writeByte(30 + i); + out.writeString(item.options[i]); + } + } + for (int i = 0; i < 5; ++i) + { + if (item.interfaceOptions[i] != null) + { + out.writeByte(35 + i); + out.writeString(item.interfaceOptions[i]); + } + } + if (item.colorFind != null && item.colorReplace != null) + { + out.writeByte(40); + out.writeByte(item.colorFind.length); + for (int i = 0; i < item.colorFind.length; ++i) + { + out.writeShort(item.colorFind[i]); + out.writeShort(item.colorReplace[i]); + } + } + if (item.textureFind != null && item.textureReplace != null) + { + out.writeByte(41); + out.writeByte(item.textureFind.length); + for (int i = 0; i < item.textureFind.length; ++i) + { + out.writeShort(item.textureFind[i]); + out.writeShort(item.textureReplace[i]); + } + } + out.writeByte(42); + out.writeByte(item.shiftClickDropIndex); + if (item.isTradeable) + { + out.writeByte(65); + } + if (item.maleModel2 != -1) + { + out.writeByte(78); + out.writeShort(item.maleModel2); + } + if (item.femaleModel2 != -1) + { + out.writeByte(79); + out.writeShort(item.femaleModel2); + } + if (item.maleHeadModel != -1) + { + out.writeByte(90); + out.writeShort(item.maleHeadModel); + } + if (item.femaleHeadModel != -1) + { + out.writeByte(91); + out.writeShort(item.femaleHeadModel); + } + if (item.maleHeadModel2 != -1) + { + out.writeByte(92); + out.writeShort(item.maleHeadModel2); + } + if (item.femaleHeadModel2 != -1) + { + out.writeByte(93); + out.writeShort(item.femaleHeadModel2); + } + out.writeByte(95); + out.writeShort(item.zan2d); + if (item.notedID != -1) + { + out.writeByte(97); + out.writeShort(item.notedID); + } + if (item.notedTemplate != -1) + { + out.writeByte(98); + out.writeShort(item.notedTemplate); + } + if (item.countObj != null) + { + for (int i = 0; i < 10; ++i) + { + out.writeByte(100 + i); + out.writeShort(item.countObj[i]); + out.writeShort(item.countCo[i]); + } + } + out.writeByte(110); + out.writeShort(item.resizeX); + out.writeByte(111); + out.writeShort(item.resizeY); + out.writeByte(112); + out.writeShort(item.resizeZ); + out.writeByte(113); + out.writeByte(item.ambient); + out.writeByte(114); + out.writeByte(item.contrast); + out.writeByte(115); + out.writeByte(item.team); + if (item.boughtId != -1) + { + out.writeByte(139); + out.writeShort(item.boughtId); + } + if (item.boughtTemplateId != -1) + { + out.writeByte(140); + out.writeShort(item.boughtTemplateId); + } + if (item.placeholderId != -1) + { + out.writeByte(148); + out.writeShort(item.placeholderId); + } + if (item.placeholderTemplateId != -1) + { + out.writeByte(149); + out.writeShort(item.placeholderTemplateId); + } + if (item.params != null) + { + out.writeByte(249); + out.writeByte(item.params.size()); + for (Entry entry : item.params.entrySet()) + { + out.writeByte(entry.getValue() instanceof String ? 1 : 0); + out.write24BitInt(entry.getKey()); + if (entry.getValue() instanceof String) + { + out.writeString((String) entry.getValue()); + } + else + { + out.writeInt((Integer) entry.getValue()); + } + } + } + out.writeByte(0); + + return out.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/LocationSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/LocationSaver.java new file mode 100644 index 0000000000..2086bd7e78 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/LocationSaver.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Multimap; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import net.runelite.cache.definitions.LocationsDefinition; +import net.runelite.cache.io.OutputStream; +import net.runelite.cache.region.Location; + +public class LocationSaver +{ + public byte[] save(LocationsDefinition locs) + { + Multimap locById = LinkedListMultimap.create(); + List sortedLocs = new ArrayList<>(locs.getLocations()); + sortedLocs.sort((l1, l2) -> Integer.compare(l1.getId(), l2.getId())); + for (Location loc : sortedLocs) + { + locById.put(loc.getId(), loc); + } + OutputStream out = new OutputStream(); + int prevId = -1; + for (Integer id : locById.keySet()) + { + int diffId = id - prevId; + prevId = id; + + out.writeShortSmart(diffId); + + Collection locations = locById.get(id); + int position = 0; + for (Location loc : locations) + { + int packedPosition = (loc.getPosition().getZ() << 12) + | (loc.getPosition().getX() << 6) + | (loc.getPosition().getY()); + + int diffPos = packedPosition - position; + position = packedPosition; + + out.writeShortSmart(diffPos + 1); + + int packedAttributes = (loc.getType() << 2) | loc.getOrientation(); + out.writeByte(packedAttributes); + } + + out.writeShortSmart(0); + } + out.writeShortSmart(0); + return out.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/MapSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/MapSaver.java new file mode 100644 index 0000000000..855ccd413c --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/MapSaver.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import net.runelite.cache.definitions.MapDefinition; +import net.runelite.cache.definitions.MapDefinition.Tile; +import net.runelite.cache.io.OutputStream; +import static net.runelite.cache.region.Region.X; +import static net.runelite.cache.region.Region.Y; +import static net.runelite.cache.region.Region.Z; + +public class MapSaver +{ + public byte[] save(MapDefinition map) + { + Tile[][][] tiles = map.getTiles(); + OutputStream out = new OutputStream(); + for (int z = 0; z < Z; z++) + { + for (int x = 0; x < X; x++) + { + for (int y = 0; y < Y; y++) + { + Tile tile = tiles[z][x][y]; + if (tile.attrOpcode != 0) + { + out.writeByte(tile.attrOpcode); + out.writeByte(tile.overlayId); + } + if (tile.settings != 0) + { + out.writeByte(tile.settings + 49); + } + if (tile.underlayId != 0) + { + out.writeByte(tile.underlayId + 81); + } + if (tile.height == null) + { + out.writeByte(0); + } + else + { + out.writeByte(1); + out.writeByte(tile.height); + } + } + } + } + return out.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java new file mode 100644 index 0000000000..55d4b966e9 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import java.util.Map; +import net.runelite.cache.definitions.NpcDefinition; +import net.runelite.cache.io.OutputStream; + +public class NpcSaver +{ + public byte[] save(NpcDefinition npc) + { + OutputStream out = new OutputStream(); + if (npc.models != null) + { + out.writeByte(1); + out.writeByte(npc.models.length); + for (int modelId : npc.models) + { + out.writeShort(modelId); + } + } + if (npc.name != null) + { + out.writeByte(2); + out.writeString(npc.name); + } + if (npc.tileSpacesOccupied != 1) + { + out.writeByte(12); + out.writeByte(npc.tileSpacesOccupied); + } + if (npc.stanceAnimation != -1) + { + out.writeByte(13); + out.writeShort(npc.stanceAnimation); + } + if (npc.walkAnimation != -1) + { + out.writeByte(14); + out.writeShort(npc.walkAnimation); + } + if (npc.anInt2165 != -1) + { + out.writeByte(15); + out.writeShort(npc.anInt2165); + } + if (npc.anInt2189 != -1) + { + out.writeByte(16); + out.writeShort(npc.anInt2189); + } + if (npc.rotate180Animation != -1 || npc.rotate90LeftAnimation != -1 || npc.rotate90RightAnimation != -1) + { + out.writeByte(17); + out.writeShort(npc.walkAnimation); + out.writeShort(npc.rotate180Animation); + out.writeShort(npc.rotate90RightAnimation); + out.writeShort(npc.rotate90LeftAnimation); + } + for (int i = 0; i < 5; ++i) + { + if (npc.options[i] != null) + { + out.writeByte(30 + i); + out.writeString(npc.options[i]); + } + } + if (npc.recolorToFind != null && npc.recolorToReplace != null) + { + out.writeByte(40); + out.writeByte(npc.recolorToFind.length); + for (int i = 0; i < npc.recolorToFind.length; ++i) + { + out.writeShort(npc.recolorToFind[i]); + out.writeShort(npc.recolorToReplace[i]); + } + } + if (npc.retextureToFind != null && npc.retextureToReplace != null) + { + out.writeByte(41); + out.writeByte(npc.retextureToFind.length); + for (int i = 0; i < npc.retextureToFind.length; ++i) + { + out.writeShort(npc.retextureToFind[i]); + out.writeShort(npc.retextureToReplace[i]); + } + } + if (npc.models_2 != null) + { + out.writeByte(60); + out.writeByte(npc.models_2.length); + for (int modelId : npc.models_2) + { + out.writeShort(modelId); + } + } + if (!npc.renderOnMinimap) + { + out.writeByte(93); + } + if (npc.combatLevel != -1) + { + out.writeByte(95); + out.writeShort(npc.combatLevel); + } + out.writeByte(97); + out.writeShort(npc.resizeX); + out.writeByte(98); + out.writeShort(npc.resizeY); + if (npc.hasRenderPriority) + { + out.writeByte(99); + } + out.writeByte(100); + out.writeByte(npc.ambient); + out.writeByte(101); + out.writeByte(npc.contrast); + if (npc.headIcon != -1) + { + out.writeByte(102); + out.writeShort(npc.headIcon); + } + out.writeByte(103); + out.writeShort(npc.rotation); + if (!npc.isClickable) + { + out.writeByte(107); + } + if (!npc.aBool2170) + { + out.writeByte(109); + } + if (npc.aBool2190) + { + out.writeByte(111); + } + if (npc.configs != null) + { + out.writeByte(118); + out.writeShort(npc.varbitIndex); + out.writeShort(npc.varpIndex); + + int[] c = npc.configs; + out.writeShort(c[c.length - 1]); + out.writeByte(c.length - 2); + for (int i = 0; i <= c.length - 2; ++i) + { + out.writeShort(c[i]); + } + } + if (npc.params != null) + { + out.writeByte(249); + out.writeByte(npc.params.size()); + for (Map.Entry entry : npc.params.entrySet()) + { + out.writeByte(entry.getValue() instanceof String ? 1 : 0); + out.write24BitInt(entry.getKey()); + if (entry.getValue() instanceof String) + { + out.writeString((String) entry.getValue()); + } + else + { + out.writeInt((Integer) entry.getValue()); + } + } + } + out.writeByte(0); + return out.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/ObjectSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/ObjectSaver.java new file mode 100644 index 0000000000..e1bb77896d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/ObjectSaver.java @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import java.util.Map; +import net.runelite.cache.definitions.ObjectDefinition; +import net.runelite.cache.io.OutputStream; + +public class ObjectSaver +{ + public byte[] save(ObjectDefinition obj) + { + OutputStream out = new OutputStream(); + if (obj.getObjectTypes() != null && obj.getObjectModels() != null) + { + out.writeByte(1); + out.writeByte(obj.getObjectTypes().length); + for (int i = 0; i < obj.getObjectTypes().length; ++i) + { + out.writeShort(obj.getObjectModels()[i]); + out.writeByte(obj.getObjectTypes()[i]); + } + } + if (obj.getName() != null) + { + out.writeByte(2); + out.writeString(obj.getName()); + } + if (obj.getObjectTypes() == null && obj.getObjectModels() != null) + { + out.writeByte(5); + out.writeByte(obj.getObjectModels().length); + for (int i = 0; i < obj.getObjectModels().length; ++i) + { + out.writeShort(obj.getObjectModels()[i]); + } + } + out.writeByte(14); + out.writeByte(obj.getSizeX()); + out.writeByte(15); + out.writeByte(obj.getSizeY()); + if (obj.getInteractType() == 0 && !obj.isBlocksProjectile()) + { + out.writeByte(17); + } + else if (!obj.isBlocksProjectile()) + { + out.writeByte(18); + } + if (obj.getAnInt2088() != -1) + { + out.writeByte(19); + out.writeByte(obj.getAnInt2088()); + } + if (obj.getAnInt2105() == 0) + { + out.writeByte(21); + } + if (!obj.isNonFlatShading()) + { + out.writeByte(22); + } + if (obj.isABool2111()) + { + out.writeByte(23); + } + if (obj.getAnimationID() != -1) + { + out.writeByte(24); + out.writeShort(obj.getAnimationID()); + } + if (obj.getInteractType() == 1) + { + out.writeByte(27); + } + out.writeByte(28); + out.writeByte(obj.getAnInt2069()); + out.writeByte(29); + out.writeByte(obj.getAmbient()); + out.writeByte(39); + out.writeByte(obj.getContrast()); + for (int i = 0; i < 5; ++i) + { + out.writeByte(30 + i); + String action = obj.getActions()[i]; + out.writeString(action != null ? action : "Hidden"); + } + if (obj.getRecolorToFind() != null && obj.getRecolorToReplace() != null) + { + out.writeByte(40); + out.writeByte(obj.getRecolorToFind().length); + for (int i = 0; i < obj.getRecolorToFind().length; ++i) + { + out.writeShort(obj.getRecolorToFind()[i]); + out.writeShort(obj.getRecolorToReplace()[i]); + } + } + if (obj.getRetextureToFind() != null && obj.getTextureToReplace() != null) + { + out.writeByte(41); + out.writeByte(obj.getRetextureToFind().length); + for (int i = 0; i < obj.getRetextureToFind().length; ++i) + { + out.writeShort(obj.getRetextureToFind()[i]); + out.writeShort(obj.getTextureToReplace()[i]); + } + } + if (obj.isRotated()) + { + out.writeByte(62); + } + if (!obj.isABool2097()) + { + out.writeByte(64); + } + out.writeByte(65); + out.writeShort(obj.getModelSizeX()); + out.writeByte(66); + out.writeShort(obj.getModelSizeHeight()); + out.writeByte(67); + out.writeShort(obj.getModelSizeY()); + if (obj.getMapSceneID() != -1) + { + out.writeByte(68); + out.writeShort(obj.getMapSceneID()); + } + out.writeByte(70); + out.writeShort(obj.getOffsetX()); + out.writeByte(71); + out.writeShort(obj.getOffsetHeight()); + out.writeByte(72); + out.writeShort(obj.getOffsetY()); + if (obj.isABool2104()) + { + out.writeByte(73); + } + if (obj.isSolid()) + { + out.writeByte(74); + } + if (obj.getAnInt2106() != -1) + { + out.writeByte(75); + out.writeByte(obj.getAnInt2106()); + } + if (obj.getAnInt2110() != -1) + { + out.writeByte(78); + out.writeShort(obj.getAnInt2110()); + out.writeByte(obj.getAnInt2083()); + } + if (obj.getAnIntArray2084() != null) + { + out.writeByte(79); + out.writeShort(obj.getAnInt2112()); + out.writeShort(obj.getAnInt2113()); + out.writeByte(obj.getAnInt2083()); + out.writeByte(obj.getAnIntArray2084().length); + for (int i : obj.getAnIntArray2084()) + { + out.writeShort(i); + } + } + if (obj.getAnInt2105() != -1) + { + out.writeByte(81); + out.writeByte(obj.getAnInt2105() / 256); + } + if (obj.getMapAreaId() != -1) + { + out.writeByte(82); + out.writeShort(obj.getMapAreaId()); + } + if (obj.getConfigChangeDest() != null) + { + out.writeByte(92); + out.writeShort(obj.getVarbitID()); + out.writeShort(obj.getVarpID()); + + int[] c = obj.getConfigChangeDest(); + out.writeShort(c[c.length - 1]); + out.writeByte(c.length - 2); + for (int i = 0; i <= c.length - 2; ++i) + { + out.writeShort(c[i]); + } + } + if (obj.getParams() != null) + { + out.writeByte(249); + out.writeByte(obj.getParams().size()); + for (Map.Entry entry : obj.getParams().entrySet()) + { + out.writeByte(entry.getValue() instanceof String ? 1 : 0); + out.write24BitInt(entry.getKey()); + if (entry.getValue() instanceof String) + { + out.writeString((String) entry.getValue()); + } + else + { + out.writeInt((Integer) entry.getValue()); + } + } + } + out.writeByte(0); + return out.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/ScriptSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/ScriptSaver.java new file mode 100644 index 0000000000..3b130c4c53 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/ScriptSaver.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import java.util.Map; +import java.util.Map.Entry; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.io.OutputStream; +import static net.runelite.cache.script.Opcodes.SCONST; +import static net.runelite.cache.script.Opcodes.POP_INT; +import static net.runelite.cache.script.Opcodes.POP_STRING; +import static net.runelite.cache.script.Opcodes.RETURN; + +public class ScriptSaver +{ + public byte[] save(ScriptDefinition script) + { + int[] instructions = script.getInstructions(); + int[] intOperands = script.getIntOperands(); + String[] stringOperands = script.getStringOperands(); + Map[] switches = script.getSwitches(); + + OutputStream out = new OutputStream(); + out.writeByte(0); // null string + for (int i = 0; i < instructions.length; ++i) + { + int opcode = instructions[i]; + out.writeShort(opcode); + if (opcode == SCONST) + { + out.writeString(stringOperands[i]); + } + else if (opcode < 100 && opcode != RETURN && opcode != POP_INT && opcode != POP_STRING) + { + out.writeInt(intOperands[i]); + } + else + { + out.writeByte(intOperands[i]); + } + } + out.writeInt(instructions.length); + out.writeShort(script.getLocalIntCount()); + out.writeShort(script.getLocalStringCount()); + out.writeShort(script.getIntStackCount()); + out.writeShort(script.getStringStackCount()); + int switchStart = out.getOffset(); + if (switches == null) + { + out.writeByte(0); + } + else + { + out.writeByte(switches.length); + for (Map s : switches) + { + out.writeShort(s.size()); + for (Entry e : s.entrySet()) + { + out.writeInt(e.getKey()); + out.writeInt(e.getValue()); + } + } + } + int switchLength = out.getOffset() - switchStart; + out.writeShort(switchLength); + return out.flip(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect1Definition.java b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect1Definition.java new file mode 100644 index 0000000000..ecd9854892 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect1Definition.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.sound; + +public class SoundEffect1Definition +{ + public SoundEffect2Definition field1173; + public SoundEffect2Definition field1174; + public SoundEffect2Definition field1175; + public int field1176 = 500; + public int[] field1177 = new int[] + { + 0, 0, 0, 0, 0 + }; + public SoundEffect2Definition field1178; + public int[] field1179 = new int[] + { + 0, 0, 0, 0, 0 + }; + public int[] field1180 = new int[] + { + 0, 0, 0, 0, 0 + }; + public SoundEffect2Definition field1181; + public SoundEffect3Definition field1182; + public SoundEffect2Definition field1183; + public int field1184 = 100; + public SoundEffect2Definition field1186; + public int field1187 = 0; + public int field1188 = 0; + public SoundEffect2Definition field1192; + public SoundEffect2Definition field1193; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect2Definition.java b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect2Definition.java new file mode 100644 index 0000000000..358d462f50 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect2Definition.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.sound; + +public class SoundEffect2Definition +{ + public int field1085; + public int[] field1086 = new int[2]; + public int field1087; + public int field1088; + public int field1089; + public int[] field1090 = new int[2]; + public int field1091; + public int field1092 = 2; + public int field1093; + public int field1094; + public int field1095; + + public SoundEffect2Definition() + { + this.field1086[0] = 0; + this.field1086[1] = '\uffff'; + this.field1090[0] = 0; + this.field1090[1] = '\uffff'; + } +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect3Definition.java b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect3Definition.java new file mode 100644 index 0000000000..a6580c046f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffect3Definition.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.sound; + +public class SoundEffect3Definition +{ + public int[][][] field1154 = new int[2][2][4]; + public int[] field1155 = new int[2]; + public int[] field1156 = new int[2]; + public int[][][] field1159 = new int[2][2][4]; +} diff --git a/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffectDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffectDefinition.java new file mode 100644 index 0000000000..0eda10254e --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/definitions/sound/SoundEffectDefinition.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.sound; + +public class SoundEffectDefinition +{ + public int field1006; + public SoundEffect1Definition[] field1008 = new SoundEffect1Definition[10]; + public int field1009; +} diff --git a/cache/src/main/java/net/runelite/cache/fs/Archive.java b/cache/src/main/java/net/runelite/cache/fs/Archive.java new file mode 100644 index 0000000000..d7b8435f3c --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/Archive.java @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import java.io.IOException; +import net.runelite.cache.index.FileData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Archive +{ + private static final Logger logger = LoggerFactory.getLogger(Archive.class); + + private final Index index; // member of this index + + private final int archiveId; + private int nameHash; + private int crc; + private int revision; + private int compression; + private FileData[] fileData; + private byte[] hash; // used by webservice, sha256 hash of content + + public Archive(Index index, int id) + { + this.index = index; + this.archiveId = id; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 47 * hash + this.archiveId; + hash = 47 * hash + this.nameHash; + hash = 47 * hash + this.revision; + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final Archive other = (Archive) obj; + if (this.archiveId != other.archiveId) + { + return false; + } + if (this.nameHash != other.nameHash) + { + return false; + } + if (this.revision != other.revision) + { + return false; + } + return true; + } + + public Index getIndex() + { + return index; + } + + public byte[] decompress(byte[] data) throws IOException + { + return decompress(data, null); + } + + public byte[] decompress(byte[] data, int[] keys) throws IOException + { + if (data == null) + { + return null; + } + + byte[] encryptedData = data; + + Container container = Container.decompress(encryptedData, keys); + if (container == null) + { + logger.warn("Unable to decrypt archive {}", this); + return null; + } + + byte[] decompressedData = container.data; + + if (this.crc != container.crc) + { + logger.warn("crc mismatch for archive {}/{}", index.getId(), this.getArchiveId()); + throw new IOException("CRC mismatch for " + index.getId() + "/" + this.getArchiveId()); + } + + if (container.revision != -1 && this.getRevision() != container.revision) + { + // compressed data doesn't always include a revision, but check it if it does + logger.warn("revision mismatch for archive {}/{}, expected {} was {}", + index.getId(), this.getArchiveId(), + this.getRevision(), container.revision); + // I've seen this happen with vanilla caches where the + // revision in the index data differs from the revision + // stored for the archive data on disk... I assume this + // is more correct + this.setRevision(container.revision); + } + + setCompression(container.compression); + return decompressedData; + } + + public ArchiveFiles getFiles(byte[] data) throws IOException + { + return getFiles(data, null); + } + + public ArchiveFiles getFiles(byte[] data, int[] keys) throws IOException + { + byte[] decompressedData = decompress(data, keys); + + ArchiveFiles files = new ArchiveFiles(); + for (FileData fileEntry : fileData) + { + FSFile file = new FSFile(fileEntry.getId()); + file.setNameHash(fileEntry.getNameHash()); + files.addFile(file); + } + files.loadContents(decompressedData); + return files; + } + + public int getArchiveId() + { + return archiveId; + } + + public int getNameHash() + { + return nameHash; + } + + public void setNameHash(int nameHash) + { + this.nameHash = nameHash; + } + + public int getCrc() + { + return crc; + } + + public void setCrc(int crc) + { + this.crc = crc; + } + + public int getRevision() + { + return revision; + } + + public void setRevision(int revision) + { + this.revision = revision; + } + + public int getCompression() + { + return compression; + } + + public void setCompression(int compression) + { + this.compression = compression; + } + + public FileData[] getFileData() + { + return fileData; + } + + public void setFileData(FileData[] fileData) + { + this.fileData = fileData; + } + + public byte[] getHash() + { + return hash; + } + + public void setHash(byte[] hash) + { + this.hash = hash; + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/ArchiveFiles.java b/cache/src/main/java/net/runelite/cache/fs/ArchiveFiles.java new file mode 100644 index 0000000000..2642b1fbb4 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/ArchiveFiles.java @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import com.google.common.base.Preconditions; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import net.runelite.cache.io.InputStream; +import net.runelite.cache.io.OutputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ArchiveFiles +{ + private static final Logger logger = LoggerFactory.getLogger(ArchiveFiles.class); + + private final List files = new ArrayList<>(); + private final Map fileMap = new HashMap<>(); + + @Override + public int hashCode() + { + int hash = 7; + hash = 67 * hash + Objects.hashCode(this.files); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final ArchiveFiles other = (ArchiveFiles) obj; + if (!Objects.equals(this.files, other.files)) + { + return false; + } + return true; + } + + public void addFile(FSFile file) + { + Preconditions.checkArgument(file.getFileId() != -1); + + if (fileMap.containsKey(file.getFileId())) + { + throw new IllegalStateException("duplicate file ids"); + } + + files.add(file); + fileMap.put(file.getFileId(), file); + } + + public List getFiles() + { + return Collections.unmodifiableList(files); + } + + public FSFile findFile(int fileId) + { + return fileMap.get(fileId); + } + + public void clear() + { + files.clear(); + fileMap.clear(); + } + + public void loadContents(byte[] data) + { + logger.trace("Loading contents of archive ({} files)", files.size()); + + assert !this.getFiles().isEmpty(); + + if (this.getFiles().size() == 1) + { + this.getFiles().get(0).setContents(data); + return; + } + + int filesCount = this.getFiles().size(); + + InputStream stream = new InputStream(data); + stream.setOffset(stream.getLength() - 1); + int chunks = stream.readUnsignedByte(); + + // -1 for chunks count + one int per file slot per chunk + stream.setOffset(stream.getLength() - 1 - chunks * filesCount * 4); + int[][] chunkSizes = new int[filesCount][chunks]; + int[] filesSize = new int[filesCount]; + + for (int chunk = 0; chunk < chunks; ++chunk) + { + int chunkSize = 0; + + for (int id = 0; id < filesCount; ++id) + { + int delta = stream.readInt(); + chunkSize += delta; // size of this chunk + + chunkSizes[id][chunk] = chunkSize; // store size of chunk + + filesSize[id] += chunkSize; // add chunk size to file size + } + } + + byte[][] fileContents = new byte[filesCount][]; + int[] fileOffsets = new int[filesCount]; + + for (int i = 0; i < filesCount; ++i) + { + fileContents[i] = new byte[filesSize[i]]; + } + + // the file data is at the beginning of the stream + stream.setOffset(0); + + for (int chunk = 0; chunk < chunks; ++chunk) + { + for (int id = 0; id < filesCount; ++id) + { + int chunkSize = chunkSizes[id][chunk]; + + stream.readBytes(fileContents[id], fileOffsets[id], chunkSize); + + fileOffsets[id] += chunkSize; + } + } + + for (int i = 0; i < filesCount; ++i) + { + FSFile f = this.getFiles().get(i); + f.setContents(fileContents[i]); + } + } + + public byte[] saveContents() + { + OutputStream stream = new OutputStream(); + + int filesCount = this.getFiles().size(); + + if (filesCount == 1) + { + FSFile file = this.getFiles().get(0); + stream.writeBytes(file.getContents()); + } + else + { + for (FSFile file : this.getFiles()) + { + byte[] contents = file.getContents(); + stream.writeBytes(contents); + } + + int offset = 0; + + for (FSFile file : this.getFiles()) + { + int chunkSize = file.getSize(); + + int sz = chunkSize - offset; + offset = chunkSize; + stream.writeInt(sz); + } + + stream.writeByte(1); // chunks + } + + byte[] fileData = stream.flip(); + + logger.trace("Saved contents of archive ({} files), {} bytes", files.size(), fileData.length); + return fileData; + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/Container.java b/cache/src/main/java/net/runelite/cache/fs/Container.java new file mode 100644 index 0000000000..9d57264bc7 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/Container.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import static com.google.common.primitives.Bytes.concat; +import com.google.common.primitives.Ints; +import java.io.IOException; +import net.runelite.cache.fs.jagex.CompressionType; +import net.runelite.cache.io.InputStream; +import net.runelite.cache.io.OutputStream; +import net.runelite.cache.util.BZip2; +import net.runelite.cache.util.Crc32; +import net.runelite.cache.util.GZip; +import net.runelite.cache.util.Xtea; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Container +{ + private static final Logger logger = LoggerFactory.getLogger(Container.class); + + public byte[] data; + public int compression; // compression + public int revision; + public int crc; // crc of compressed data + + public Container(int compression, int revision) + { + this.compression = compression; + this.revision = revision; + } + + public void compress(byte[] data, int[] keys) throws IOException + { + OutputStream stream = new OutputStream(); + + byte[] compressedData; + int length; + switch (compression) + { + case CompressionType.NONE: + compressedData = data; + length = compressedData.length; + break; + case CompressionType.BZ2: + compressedData = concat(Ints.toByteArray(data.length), BZip2.compress(data)); + length = compressedData.length - 4; + break; + case CompressionType.GZ: + compressedData = concat(Ints.toByteArray(data.length), GZip.compress(data)); + length = compressedData.length - 4; + break; + default: + throw new RuntimeException("Unknown compression type"); + } + + compressedData = encrypt(compressedData, compressedData.length, keys); + + stream.writeByte(compression); + stream.writeInt(length); + + stream.writeBytes(compressedData); + if (revision != -1) + { + stream.writeShort(revision); + } + + this.data = stream.flip(); + } + + public static Container decompress(byte[] b, int[] keys) throws IOException + { + InputStream stream = new InputStream(b); + + int compression = stream.readUnsignedByte(); + int compressedLength = stream.readInt(); + if (compressedLength < 0 || compressedLength > 1000000) + { + throw new RuntimeException("Invalid data"); + } + + Crc32 crc32 = new Crc32(); + crc32.update(b, 0, 5); // compression + length + + byte[] data; + int revision = -1; + switch (compression) + { + case CompressionType.NONE: + { + byte[] encryptedData = new byte[compressedLength]; + stream.readBytes(encryptedData, 0, compressedLength); + + crc32.update(encryptedData, 0, compressedLength); + byte[] decryptedData = decrypt(encryptedData, encryptedData.length, keys); + + if (stream.remaining() >= 2) + { + revision = stream.readUnsignedShort(); + assert revision != -1; + } + + data = decryptedData; + + break; + } + case CompressionType.BZ2: + { + byte[] encryptedData = new byte[compressedLength + 4]; + stream.readBytes(encryptedData); + + crc32.update(encryptedData, 0, encryptedData.length); + byte[] decryptedData = decrypt(encryptedData, encryptedData.length, keys); + + if (stream.remaining() >= 2) + { + revision = stream.readUnsignedShort(); + assert revision != -1; + } + + stream = new InputStream(decryptedData); + + int decompressedLength = stream.readInt(); + data = BZip2.decompress(stream.getRemaining(), compressedLength); + + if (data == null) + { + return null; + } + + assert data.length == decompressedLength; + + break; + } + case CompressionType.GZ: + { + byte[] encryptedData = new byte[compressedLength + 4]; + stream.readBytes(encryptedData); + + crc32.update(encryptedData, 0, encryptedData.length); + byte[] decryptedData = decrypt(encryptedData, encryptedData.length, keys); + + if (stream.remaining() >= 2) + { + revision = stream.readUnsignedShort(); + assert revision != -1; + } + + stream = new InputStream(decryptedData); + + int decompressedLength = stream.readInt(); + data = GZip.decompress(stream.getRemaining(), compressedLength); + + if (data == null) + { + return null; + } + + assert data.length == decompressedLength; + + break; + } + default: + throw new RuntimeException("Unknown decompression type"); + } + + Container container = new Container(compression, revision); + container.data = data; + container.crc = crc32.getHash(); + return container; + } + + private static byte[] decrypt(byte[] data, int length, int[] keys) + { + if (keys == null) + { + return data; + } + + Xtea xtea = new Xtea(keys); + return xtea.decrypt(data, length); + } + + private static byte[] encrypt(byte[] data, int length, int[] keys) + { + if (keys == null) + { + return data; + } + + Xtea xtea = new Xtea(keys); + return xtea.encrypt(data, length); + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/FSFile.java b/cache/src/main/java/net/runelite/cache/fs/FSFile.java new file mode 100644 index 0000000000..4046c40820 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/FSFile.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.fs; + +import java.util.Arrays; + +public class FSFile +{ + private final int fileId; + private int nameHash; + private byte[] contents; + + public FSFile(int fileId) + { + this.fileId = fileId; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 97 * hash + this.fileId; + hash = 97 * hash + this.nameHash; + hash = 97 * hash + Arrays.hashCode(this.contents); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final FSFile other = (FSFile) obj; + if (this.fileId != other.fileId) + { + return false; + } + if (this.nameHash != other.nameHash) + { + return false; + } + if (!Arrays.equals(this.contents, other.contents)) + { + return false; + } + return true; + } + + public int getFileId() + { + return fileId; + } + + public int getNameHash() + { + return nameHash; + } + + public void setNameHash(int nameHash) + { + this.nameHash = nameHash; + } + + public byte[] getContents() + { + return contents; + } + + public void setContents(byte[] contents) + { + this.contents = contents; + } + + public int getSize() + { + return contents.length; + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/Index.java b/cache/src/main/java/net/runelite/cache/fs/Index.java new file mode 100644 index 0000000000..6e915f9336 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/Index.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import net.runelite.cache.index.ArchiveData; +import net.runelite.cache.index.FileData; +import net.runelite.cache.index.IndexData; +import net.runelite.cache.util.Djb2; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Index +{ + private static final Logger logger = LoggerFactory.getLogger(Index.class); + + private final int id; + + private int protocol = 6; + private boolean named = true; + private int revision; + private int crc; + private int compression; // compression method of this index's data in 255 + + private final List archives = new ArrayList<>(); + + public Index(int id) + { + this.id = id; + } + + @Override + public int hashCode() + { + int hash = 3; + hash = 97 * hash + this.id; + hash = 97 * hash + this.revision; + hash = 97 * hash + Objects.hashCode(this.archives); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final Index other = (Index) obj; + if (this.id != other.id) + { + return false; + } + if (this.revision != other.revision) + { + return false; + } + if (!Objects.equals(this.archives, other.archives)) + { + return false; + } + return true; + } + + public int getId() + { + return id; + } + + public int getProtocol() + { + return protocol; + } + + public void setProtocol(int protocol) + { + this.protocol = protocol; + } + + public boolean isNamed() + { + return named; + } + + public void setNamed(boolean named) + { + this.named = named; + } + + public int getRevision() + { + return revision; + } + + public void setRevision(int revision) + { + this.revision = revision; + } + + public int getCrc() + { + return crc; + } + + public void setCrc(int crc) + { + this.crc = crc; + } + + public int getCompression() + { + return compression; + } + + public void setCompression(int compression) + { + this.compression = compression; + } + + public List getArchives() + { + return archives; + } + + public Archive addArchive(int id) + { + Archive archive = new Archive(this, id); + this.archives.add(archive); + return archive; + } + + public Archive getArchive(int id) + { + for (Archive a : archives) + { + if (a.getArchiveId() == id) + { + return a; + } + } + return null; + } + + public Archive findArchiveByName(String name) + { + int hash = Djb2.hash(name); + for (Archive a : archives) + { + if (a.getNameHash() == hash) + { + return a; + } + } + return null; + } + + public IndexData toIndexData() + { + IndexData data = new IndexData(); + data.setProtocol(protocol); + data.setRevision(revision); + data.setNamed(named); + + ArchiveData[] archiveDatas = new ArchiveData[archives.size()]; + data.setArchives(archiveDatas); + + int idx = 0; + for (Archive archive : archives) + { + ArchiveData ad = archiveDatas[idx++] = new ArchiveData(); + ad.setId(archive.getArchiveId()); + ad.setNameHash(archive.getNameHash()); + ad.setCrc(archive.getCrc()); + ad.setRevision(archive.getRevision()); + + FileData[] files = archive.getFileData(); + ad.setFiles(files); + } + return data; + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/Storage.java b/cache/src/main/java/net/runelite/cache/fs/Storage.java new file mode 100644 index 0000000000..6bcdb88819 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/Storage.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import java.io.IOException; + +public interface Storage extends AutoCloseable +{ + void init(Store store) throws IOException; + + @Override + void close() throws IOException; + + void load(Store store) throws IOException; + + void save(Store store) throws IOException; + + byte[] loadArchive(Archive archive) throws IOException; + + void saveArchive(Archive archive, byte[] data) throws IOException; +} diff --git a/cache/src/main/java/net/runelite/cache/fs/Store.java b/cache/src/main/java/net/runelite/cache/fs/Store.java new file mode 100644 index 0000000000..6423a8039e --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/Store.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import java.io.Closeable; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import net.runelite.cache.IndexType; +import net.runelite.cache.fs.jagex.DiskStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class Store implements Closeable +{ + private static final Logger logger = LoggerFactory.getLogger(Store.class); + + private final Storage storage; + private final List indexes = new ArrayList<>(); + + public Store(File folder) throws IOException + { + storage = new DiskStorage(folder); + storage.init(this); + } + + public Store(Storage storage) throws IOException + { + this.storage = storage; + + storage.init(this); + } + + public Storage getStorage() + { + return storage; + } + + @Override + public void close() throws IOException + { + storage.close(); + } + + @Override + public int hashCode() + { + int hash = 5; + hash = 79 * hash + Objects.hashCode(this.indexes); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final Store other = (Store) obj; + if (!Objects.equals(this.indexes, other.indexes)) + { + return false; + } + return true; + } + + public final Index addIndex(int id) throws FileNotFoundException + { + for (Index i : indexes) + { + if (i.getId() == id) + { + throw new IllegalArgumentException("index " + id + " already exists"); + } + } + + Index index = new Index(id); + this.indexes.add(index); + + return index; + } + + public void removeIndex(Index index) + { + assert indexes.contains(index); + indexes.remove(index); + } + + public void load() throws IOException + { + storage.load(this); + } + + public void save() throws IOException + { + storage.save(this); + } + + public List getIndexes() + { + return indexes; + } + + public Index getIndex(IndexType type) + { + return findIndex(type.getNumber()); + } + + public Index findIndex(int id) + { + for (Index i : indexes) + { + if (i.getId() == id) + { + return i; + } + } + return null; + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/flat/FlatStorage.java b/cache/src/main/java/net/runelite/cache/fs/flat/FlatStorage.java new file mode 100644 index 0000000000..8c5d7e77a7 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/flat/FlatStorage.java @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.flat; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.index.FileData; + +/** + * A Storage that stores the cache as a series of flat files, designed + * to be git revisioned. + */ +public class FlatStorage implements Storage +{ + protected static final String EXTENSION = ".flatcache"; + + private final File directory; + private final Map data = new HashMap<>(); + + public FlatStorage(File directory) throws IOException + { + this.directory = directory; + } + + protected FlatStorage() + { + this.directory = null; + } + + protected InputStream openReader(String filename) throws IOException + { + return new FileInputStream(new File(directory, filename)); + } + + protected OutputStream openWriter(String filename) throws IOException + { + return new FileOutputStream(new File(directory, filename)); + } + + protected String[] listFlatcacheFiles() throws IOException + { + return directory.list((dir, name) -> name.endsWith(EXTENSION)); + } + + @Override + public void init(Store store) throws IOException + { + String[] idxs = listFlatcacheFiles(); + for (String idx : idxs) + { + int id = Integer.parseInt(idx.substring(0, idx.length() - EXTENSION.length())); + store.addIndex(id); + } + } + + @Override + public void close() throws IOException + { + } + + @Override + public void load(Store store) throws IOException + { + for (Index idx : store.getIndexes()) + { + String file = idx.getId() + EXTENSION; + try (BufferedReader br = new BufferedReader(new InputStreamReader(openReader(file)))) + { + int lineNo = 0; + Archive archive = null; + List fileData = null; + for (String line = br.readLine(); line != null; line = br.readLine()) + { + lineNo++; + + try + { + int lidx = line.indexOf('='); + String key = line.substring(0, lidx); + String value = line.substring(lidx + 1); + + if ("file".equals(key)) + { + if (fileData == null) + { + fileData = new ArrayList<>(); + } + + int vidx = value.indexOf('='); + FileData fd = new FileData(); + fd.setId(Integer.parseInt(value.substring(0, vidx))); + fd.setNameHash(Integer.parseInt(value.substring(vidx + 1))); + fileData.add(fd); + continue; + } + else if (fileData != null) + { + archive.setFileData(fileData.toArray(new FileData[0])); + fileData = null; + } + + if ("id".equals(key)) + { + archive = idx.addArchive(Integer.parseInt(value)); + continue; + } + + if (archive == null) + { + switch (key) + { + case "protocol": + idx.setProtocol(Integer.parseInt(value)); + continue; + case "revision": + idx.setRevision(Integer.parseInt(value)); + continue; + case "compression": + idx.setCompression(Integer.parseInt(value)); + continue; + case "crc": + idx.setCrc(Integer.parseInt(value)); + continue; + case "named": + idx.setNamed(Boolean.parseBoolean(value)); + continue; + } + } + else + { + switch (key) + { + case "namehash": + archive.setNameHash(Integer.parseInt(value)); + continue; + case "revision": + archive.setRevision(Integer.parseInt(value)); + continue; + case "crc": + archive.setCrc(Integer.parseInt(value)); + continue; + case "hash": + archive.setHash(Base64.getDecoder().decode(value)); + continue; + case "compression": + archive.setCompression(Integer.parseInt(value)); + continue; + case "contents": + data.put((long) idx.getId() << 32 | archive.getArchiveId(), Base64.getDecoder().decode(value)); + continue; + } + } + throw new IOException("unknown key: \"" + key + "\""); + } + catch (Exception e) + { + throw new IOException("error reading flatcache at " + file + ":" + lineNo, e); + } + } + + if (fileData != null) + { + archive.setFileData(fileData.toArray(new FileData[0])); + fileData = null; + } + } + } + } + + @Override + public void save(Store store) throws IOException + { + store.getIndexes().sort(Comparator.comparing(Index::getId)); + for (Index idx : store.getIndexes()) + { + String file = idx.getId() + EXTENSION; + try (PrintStream br = new PrintStream(openWriter(file))) + { + br.printf("protocol=%d\n", idx.getProtocol()); + br.printf("revision=%d\n", idx.getRevision()); + br.printf("compression=%d\n", idx.getCompression()); + br.printf("crc=%d\n", idx.getCrc()); + br.printf("named=%b\n", idx.getCompression()); + + idx.getArchives().sort(Comparator.comparing(Archive::getArchiveId)); + for (Archive archive : idx.getArchives()) + { + br.printf("id=%d\n", archive.getArchiveId()); + br.printf("namehash=%d\n", archive.getNameHash()); + br.printf("revision=%d\n", archive.getRevision()); + br.printf("crc=%d\n", archive.getCrc()); + + if (archive.getHash() != null) + { + br.append("hash="); + br.write(Base64.getEncoder().encode(archive.getHash())); + br.append("\n"); + } + + byte[] contents = store.getStorage().loadArchive(archive); + if (contents != null) + { + br.append("contents="); + br.write(Base64.getEncoder().encode(contents)); + br.append("\n"); + } + + br.printf("compression=%d\n", archive.getCompression()); + for (FileData fd : archive.getFileData()) + { + br.printf("file=%d=%d\n", fd.getId(), fd.getNameHash()); + } + } + } + } + } + + @Override + public byte[] loadArchive(Archive archive) throws IOException + { + return data.get((long) archive.getIndex().getId() << 32 | archive.getArchiveId()); + } + + @Override + public void saveArchive(Archive archive, byte[] bytes) throws IOException + { + data.put((long) archive.getIndex().getId() << 32 | archive.getArchiveId(), bytes); + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/jagex/CompressionType.java b/cache/src/main/java/net/runelite/cache/fs/jagex/CompressionType.java new file mode 100644 index 0000000000..d11b3e276b --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/jagex/CompressionType.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.jagex; + +public class CompressionType +{ + public static final int NONE = 0; + public static final int BZ2 = 1; + public static final int GZ = 2; +} diff --git a/cache/src/main/java/net/runelite/cache/fs/jagex/DataFile.java b/cache/src/main/java/net/runelite/cache/fs/jagex/DataFile.java new file mode 100644 index 0000000000..89eb607eee --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/jagex/DataFile.java @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.jagex; + +import java.io.Closeable; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DataFile implements Closeable +{ + private static final Logger logger = LoggerFactory.getLogger(DataFile.class); + + private static final int SECTOR_SIZE = 520; + + private final RandomAccessFile dat; + + public DataFile(File file) throws FileNotFoundException + { + this.dat = new RandomAccessFile(file, "rw"); + } + + @Override + public void close() throws IOException + { + dat.close(); + } + + public void clear() throws IOException + { + dat.setLength(0L); + } + + /** + * + * @param indexId expected index of archive of contents being read + * @param archiveId expected archive of contents being read + * @param sector sector to start reading at + * @param size size of file + * @return + * @throws IOException + */ + public byte[] read(int indexId, int archiveId, int sector, int size) throws IOException + { + if (sector <= 0L || dat.length() / SECTOR_SIZE < (long) sector) + { + logger.warn("bad read, dat length {}, requested sector {}", dat.length(), sector); + return null; + } + + byte[] readBuffer = new byte[SECTOR_SIZE]; + ByteBuffer buffer = ByteBuffer.allocate(size); + + for (int part = 0, readBytesCount = 0, nextSector; + size > readBytesCount; + sector = nextSector) + { + if (sector == 0) + { + logger.warn("Unexpected end of file"); + return null; + } + + dat.seek(SECTOR_SIZE * sector); + + int dataBlockSize = size - readBytesCount; + byte headerSize; + int currentIndex; + int currentPart; + int currentArchive; + if (archiveId > 0xFFFF) + { + headerSize = 10; + if (dataBlockSize > SECTOR_SIZE - headerSize) + { + dataBlockSize = SECTOR_SIZE - headerSize; + } + + int i = dat.read(readBuffer, 0, headerSize + dataBlockSize); + if (i != headerSize + dataBlockSize) + { + logger.warn("Short read when reading file data for {}/{}", indexId, archiveId); + return null; + } + + currentArchive = ((readBuffer[0] & 0xFF) << 24) + | ((readBuffer[1] & 0xFF) << 16) + | ((readBuffer[2] & 0xFF) << 8) + | (readBuffer[3] & 0xFF); + currentPart = ((readBuffer[4] & 0xFF) << 8) + (readBuffer[5] & 0xFF); + nextSector = ((readBuffer[6] & 0xFF) << 16) + | ((readBuffer[7] & 0xFF) << 8) + | (readBuffer[8] & 0xFF); + currentIndex = readBuffer[9] & 0xFF; + } + else + { + headerSize = 8; + if (dataBlockSize > SECTOR_SIZE - headerSize) + { + dataBlockSize = SECTOR_SIZE - headerSize; + } + + int i = dat.read(readBuffer, 0, headerSize + dataBlockSize); + if (i != headerSize + dataBlockSize) + { + logger.warn("short read"); + return null; + } + + currentArchive = ((readBuffer[0] & 0xFF) << 8) + | (readBuffer[1] & 0xFF); + currentPart = ((readBuffer[2] & 0xFF) << 8) + | (readBuffer[3] & 0xFF); + nextSector = ((readBuffer[4] & 0xFF) << 16) + | ((readBuffer[5] & 0xFF) << 8) + | (readBuffer[6] & 0xFF); + currentIndex = readBuffer[7] & 0xFF; + } + + if (archiveId != currentArchive || currentPart != part || indexId != currentIndex) + { + logger.warn("data mismatch {} != {}, {} != {}, {} != {}", + archiveId, currentArchive, + part, currentPart, + indexId, currentIndex); + return null; + } + + if (nextSector < 0 || dat.length() / SECTOR_SIZE < (long) nextSector) + { + logger.warn("Invalid next sector"); + return null; + } + + buffer.put(readBuffer, headerSize, dataBlockSize); + readBytesCount += dataBlockSize; + + ++part; + } + + buffer.flip(); + return buffer.array(); + } + + public DataFileWriteResult write(int indexId, int archiveId, byte[] compressedData) throws IOException + { + int sector; + int startSector; + + byte[] writeBuffer = new byte[SECTOR_SIZE]; + ByteBuffer data = ByteBuffer.wrap(compressedData); + + sector = (int) ((dat.length() + (long) (SECTOR_SIZE - 1)) / (long) SECTOR_SIZE); + if (sector == 0) + { + sector = 1; + } + startSector = sector; + + for (int part = 0; data.hasRemaining(); ++part) + { + int nextSector = sector + 1; // we always just append sectors + int dataToWrite; + + if (0xFFFF < archiveId) + { + if (data.remaining() <= 510) + { + nextSector = 0; + } + + writeBuffer[0] = (byte) (archiveId >> 24); + writeBuffer[1] = (byte) (archiveId >> 16); + writeBuffer[2] = (byte) (archiveId >> 8); + writeBuffer[3] = (byte) archiveId; + writeBuffer[4] = (byte) (part >> 8); + writeBuffer[5] = (byte) part; + writeBuffer[6] = (byte) (nextSector >> 16); + writeBuffer[7] = (byte) (nextSector >> 8); + writeBuffer[8] = (byte) nextSector; + writeBuffer[9] = (byte) indexId; + dat.seek(SECTOR_SIZE * sector); + dat.write(writeBuffer, 0, 10); + + dataToWrite = data.remaining(); + if (dataToWrite > 510) + { + dataToWrite = 510; + } + } + else + { + if (data.remaining() <= 512) + { + nextSector = 0; + } + + writeBuffer[0] = (byte) (archiveId >> 8); + writeBuffer[1] = (byte) archiveId; + writeBuffer[2] = (byte) (part >> 8); + writeBuffer[3] = (byte) part; + writeBuffer[4] = (byte) (nextSector >> 16); + writeBuffer[5] = (byte) (nextSector >> 8); + writeBuffer[6] = (byte) nextSector; + writeBuffer[7] = (byte) indexId; + dat.seek(SECTOR_SIZE * sector); + dat.write(writeBuffer, 0, 8); + + dataToWrite = data.remaining(); + if (dataToWrite > 512) + { + dataToWrite = 512; + } + } + + data.get(writeBuffer, 0, dataToWrite); + dat.write(writeBuffer, 0, dataToWrite); + sector = nextSector; + } + + DataFileWriteResult res = new DataFileWriteResult(); + res.sector = startSector; + res.compressedLength = compressedData.length; + return res; + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/jagex/DataFileWriteResult.java b/cache/src/main/java/net/runelite/cache/fs/jagex/DataFileWriteResult.java new file mode 100644 index 0000000000..7a7d651d74 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/jagex/DataFileWriteResult.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.fs.jagex; + +public class DataFileWriteResult +{ + public int sector, compressedLength; +} diff --git a/cache/src/main/java/net/runelite/cache/fs/jagex/DiskStorage.java b/cache/src/main/java/net/runelite/cache/fs/jagex/DiskStorage.java new file mode 100644 index 0000000000..bebcc9711f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/jagex/DiskStorage.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.jagex; + +import com.google.common.primitives.Ints; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Container; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.index.ArchiveData; +import net.runelite.cache.index.IndexData; +import net.runelite.cache.util.Crc32; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DiskStorage implements Storage +{ + private static final Logger logger = LoggerFactory.getLogger(DiskStorage.class); + + private static final String MAIN_FILE_CACHE_DAT = "main_file_cache.dat2"; + private static final String MAIN_FILE_CACHE_IDX = "main_file_cache.idx"; + + private final File folder; + + private final DataFile data; + private final IndexFile index255; + private final List indexFiles = new ArrayList<>(); + + public DiskStorage(File folder) throws IOException + { + this.folder = folder; + + this.data = new DataFile(new File(folder, MAIN_FILE_CACHE_DAT)); + this.index255 = new IndexFile(255, new File(folder, MAIN_FILE_CACHE_IDX + "255")); + } + + @Override + public void init(Store store) throws IOException + { + for (int i = 0; i < index255.getIndexCount(); ++i) + { + store.addIndex(i); + getIndex(i); + } + + assert store.getIndexes().size() == indexFiles.size(); + } + + @Override + public void close() throws IOException + { + data.close(); + index255.close(); + for (IndexFile indexFile : indexFiles) + { + indexFile.close(); + } + } + + private IndexFile getIndex(int i) throws FileNotFoundException + { + for (IndexFile indexFile : indexFiles) + { + if (indexFile.getIndexFileId() == i) + { + return indexFile; + } + } + + IndexFile indexFile = new IndexFile(i, new File(folder, MAIN_FILE_CACHE_IDX + i)); + indexFiles.add(indexFile); + return indexFile; + } + + @Override + public void load(Store store) throws IOException + { + for (Index index : store.getIndexes()) + { + loadIndex(index); + } + } + + public byte[] readIndex(int indexId) throws IOException + { + IndexEntry entry = index255.read(indexId); + byte[] indexData = data.read(index255.getIndexFileId(), entry.getId(), entry.getSector(), entry.getLength()); + return indexData; + } + + private void loadIndex(Index index) throws IOException + { + logger.trace("Loading index {}", index.getId()); + + byte[] indexData = readIndex(index.getId()); + Container res = Container.decompress(indexData, null); + byte[] data = res.data; + + IndexData id = new IndexData(); + id.load(data); + + index.setProtocol(id.getProtocol()); + index.setRevision(id.getRevision()); + index.setNamed(id.isNamed()); + + for (ArchiveData ad : id.getArchives()) + { + Archive archive = index.addArchive(ad.getId()); + archive.setNameHash(ad.getNameHash()); + archive.setCrc(ad.getCrc()); + archive.setRevision(ad.getRevision()); + archive.setFileData(ad.getFiles()); + + assert ad.getFiles().length > 0; + } + + index.setCrc(res.crc); + index.setCompression(res.compression); + assert res.revision == -1; + } + + @Override + public byte[] loadArchive(Archive archive) throws IOException + { + Index index = archive.getIndex(); + IndexFile indexFile = getIndex(index.getId()); + + assert indexFile.getIndexFileId() == index.getId(); + + IndexEntry entry = indexFile.read(archive.getArchiveId()); + if (entry == null) + { + logger.debug("can't read archive " + archive.getArchiveId() + " from index " + index.getId()); + return null; + } + + assert entry.getId() == archive.getArchiveId(); + + logger.trace("Loading archive {} for index {} from sector {} length {}", + archive.getArchiveId(), index.getId(), entry.getSector(), entry.getLength()); + + byte[] archiveData = data.read(index.getId(), entry.getId(), entry.getSector(), entry.getLength()); + return archiveData; + } + + @Override + public void save(Store store) throws IOException + { + logger.debug("Saving store"); + + for (Index i : store.getIndexes()) + { + saveIndex(i); + } + } + + private void saveIndex(Index index) throws IOException + { + IndexData indexData = index.toIndexData(); + byte[] data = indexData.writeIndexData(); + + Container container = new Container(index.getCompression(), -1); // index data revision is always -1 + container.compress(data, null); + byte[] compressedData = container.data; + DataFileWriteResult res = this.data.write(index255.getIndexFileId(), index.getId(), compressedData); + + index255.write(new IndexEntry(index255, index.getId(), res.sector, res.compressedLength)); + + Crc32 crc = new Crc32(); + crc.update(compressedData, 0, compressedData.length); + index.setCrc(crc.getHash()); + } + + @Override + public void saveArchive(Archive a, byte[] archiveData) throws IOException + { + Index index = a.getIndex(); + IndexFile indexFile = getIndex(index.getId()); + assert indexFile.getIndexFileId() == index.getId(); + + DataFileWriteResult res = data.write(index.getId(), a.getArchiveId(), archiveData); + indexFile.write(new IndexEntry(indexFile, a.getArchiveId(), res.sector, res.compressedLength)); + + byte compression = archiveData[0]; + int compressedSize = Ints.fromBytes(archiveData[1], archiveData[2], + archiveData[3], archiveData[4]); + + // don't crc the appended revision, if it is there + int length = 1 // compression type + + 4 // compressed size + + compressedSize + + (compression != CompressionType.NONE ? 4 : 0); + + Crc32 crc = new Crc32(); + crc.update(archiveData, 0, length); + a.setCrc(crc.getHash()); + + logger.trace("Saved archive {}/{} at sector {}, compressed length {}", + index.getId(), a.getArchiveId(), res.sector, res.compressedLength); + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/jagex/IndexEntry.java b/cache/src/main/java/net/runelite/cache/fs/jagex/IndexEntry.java new file mode 100644 index 0000000000..c41e22323b --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/jagex/IndexEntry.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.fs.jagex; + +import java.util.Objects; + +public class IndexEntry +{ + private final IndexFile indexFile; + private final int id, sector, length; + + public IndexEntry(IndexFile indexFile, int id, int sector, int length) + { + this.indexFile = indexFile; + this.id = id; + this.sector = sector; + this.length = length; + } + + public IndexFile getIndexFile() + { + return indexFile; + } + + public int getId() + { + return id; + } + + public int getSector() + { + return sector; + } + + public int getLength() + { + return length; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 19 * hash + Objects.hashCode(this.indexFile); + hash = 19 * hash + this.id; + hash = 19 * hash + this.sector; + hash = 19 * hash + this.length; + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final IndexEntry other = (IndexEntry) obj; + if (!Objects.equals(this.indexFile, other.indexFile)) + { + return false; + } + if (this.id != other.id) + { + return false; + } + if (this.sector != other.sector) + { + return false; + } + if (this.length != other.length) + { + return false; + } + return true; + } +} diff --git a/cache/src/main/java/net/runelite/cache/fs/jagex/IndexFile.java b/cache/src/main/java/net/runelite/cache/fs/jagex/IndexFile.java new file mode 100644 index 0000000000..b95ae70e30 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/fs/jagex/IndexFile.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.jagex; + +import java.io.Closeable; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IndexFile implements Closeable +{ + private static final Logger logger = LoggerFactory.getLogger(IndexFile.class); + + private static final int INDEX_ENTRY_LEN = 6; + + private final int indexFileId; + private final File file; + private final RandomAccessFile idx; + private final byte[] buffer = new byte[INDEX_ENTRY_LEN]; + + public IndexFile(int indexFileId, File file) throws FileNotFoundException + { + this.indexFileId = indexFileId; + this.file = file; + this.idx = new RandomAccessFile(file, "rw"); + } + + @Override + public void close() throws IOException + { + idx.close(); + } + + public void clear() throws IOException + { + idx.setLength(0L); + } + + @Override + public int hashCode() + { + int hash = 3; + hash = 41 * hash + Objects.hashCode(this.file); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final IndexFile other = (IndexFile) obj; + if (!Objects.equals(this.file, other.file)) + { + return false; + } + return true; + } + + public int getIndexFileId() + { + return indexFileId; + } + + public synchronized void write(IndexEntry entry) throws IOException + { + idx.seek(entry.getId() * INDEX_ENTRY_LEN); + + buffer[0] = (byte) (entry.getLength() >> 16); + buffer[1] = (byte) (entry.getLength() >> 8); + buffer[2] = (byte) entry.getLength(); + + buffer[3] = (byte) (entry.getSector() >> 16); + buffer[4] = (byte) (entry.getSector() >> 8); + buffer[5] = (byte) entry.getSector(); + + idx.write(buffer); + } + + public synchronized IndexEntry read(int id) throws IOException + { + idx.seek(id * INDEX_ENTRY_LEN); + int i = idx.read(buffer); + if (i != INDEX_ENTRY_LEN) + { + logger.debug("short read for id {} on index {}: {}", id, indexFileId, i); + return null; + } + + int length = ((buffer[0] & 0xFF) << 16) | ((buffer[1] & 0xFF) << 8) | (buffer[2] & 0xFF); + int sector = ((buffer[3] & 0xFF) << 16) | ((buffer[4] & 0xFF) << 8) | (buffer[5] & 0xFF); + + if (length <= 0 || sector <= 0) + { + logger.debug("invalid length or sector {}/{}", length, sector); + return null; + } + + return new IndexEntry(this, id, sector, length); + } + + public synchronized int getIndexCount() throws IOException + { + return (int) (idx.length() / INDEX_ENTRY_LEN); + } +} diff --git a/cache/src/main/java/net/runelite/cache/index/ArchiveData.java b/cache/src/main/java/net/runelite/cache/index/ArchiveData.java new file mode 100644 index 0000000000..4bc4427cd1 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/index/ArchiveData.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.index; + +public class ArchiveData +{ + int id; + int nameHash; + int crc; + int revision; + FileData[] files; + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public int getNameHash() + { + return nameHash; + } + + public void setNameHash(int nameHash) + { + this.nameHash = nameHash; + } + + public int getCrc() + { + return crc; + } + + public void setCrc(int crc) + { + this.crc = crc; + } + + public int getRevision() + { + return revision; + } + + public void setRevision(int revision) + { + this.revision = revision; + } + + public FileData[] getFiles() + { + return files; + } + + public void setFiles(FileData[] files) + { + this.files = files; + } +} diff --git a/cache/src/main/java/net/runelite/cache/index/FileData.java b/cache/src/main/java/net/runelite/cache/index/FileData.java new file mode 100644 index 0000000000..dfe8f41e48 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/index/FileData.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.index; + +public class FileData +{ + int id; + int nameHash; + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public int getNameHash() + { + return nameHash; + } + + public void setNameHash(int nameHash) + { + this.nameHash = nameHash; + } +} diff --git a/cache/src/main/java/net/runelite/cache/index/IndexData.java b/cache/src/main/java/net/runelite/cache/index/IndexData.java new file mode 100644 index 0000000000..38747bd450 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/index/IndexData.java @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.index; + +import net.runelite.cache.io.InputStream; +import net.runelite.cache.io.OutputStream; + +public class IndexData +{ + private int protocol; + private int revision; + private boolean named; + private ArchiveData[] archives; + + public void load(byte[] data) + { + InputStream stream = new InputStream(data); + protocol = stream.readUnsignedByte(); + if (protocol < 5 || protocol > 7) + { + throw new IllegalArgumentException("Unsupported protocol"); + } + + if (protocol >= 6) + { + this.revision = stream.readInt(); + } + + int hash = stream.readUnsignedByte(); + named = (1 & hash) != 0; + if ((hash & ~1) != 0) + { + throw new IllegalArgumentException("Unknown flags"); + } + assert (hash & ~3) == 0; + int validArchivesCount = protocol >= 7 ? stream.readBigSmart() : stream.readUnsignedShort(); + int lastArchiveId = 0; + + archives = new ArchiveData[validArchivesCount]; + + for (int index = 0; index < validArchivesCount; ++index) + { + int archive = lastArchiveId += protocol >= 7 ? stream.readBigSmart() : stream.readUnsignedShort(); + + ArchiveData ad = new ArchiveData(); + ad.id = archive; + archives[index] = ad; + } + + if (named) + { + for (int index = 0; index < validArchivesCount; ++index) + { + int nameHash = stream.readInt(); + ArchiveData ad = archives[index]; + ad.nameHash = nameHash; + } + } + + for (int index = 0; index < validArchivesCount; ++index) + { + int crc = stream.readInt(); + + ArchiveData ad = archives[index]; + ad.crc = crc; + } + + for (int index = 0; index < validArchivesCount; ++index) + { + int revision = stream.readInt(); + + ArchiveData ad = archives[index]; + ad.revision = revision; + } + + int[] numberOfFiles = new int[validArchivesCount]; + for (int index = 0; index < validArchivesCount; ++index) + { + int num = protocol >= 7 ? stream.readBigSmart() : stream.readUnsignedShort(); + numberOfFiles[index] = num; + } + + for (int index = 0; index < validArchivesCount; ++index) + { + ArchiveData ad = archives[index]; + int num = numberOfFiles[index]; + + ad.files = new FileData[num]; + + int last = 0; + for (int i = 0; i < num; ++i) + { + int fileId = last += protocol >= 7 ? stream.readBigSmart() : stream.readUnsignedShort(); + + FileData fd = ad.files[i] = new FileData(); + fd.id = fileId; + } + } + + if (named) + { + for (int index = 0; index < validArchivesCount; ++index) + { + ArchiveData ad = archives[index]; + int num = numberOfFiles[index]; + + for (int i = 0; i < num; ++i) + { + FileData fd = ad.files[i]; + int name = stream.readInt(); + fd.nameHash = name; + } + } + } + } + + public byte[] writeIndexData() + { + OutputStream stream = new OutputStream(); + stream.writeByte(protocol); + if (protocol >= 6) + { + stream.writeInt(this.revision); + } + + stream.writeByte(named ? 1 : 0); + if (protocol >= 7) + { + stream.writeBigSmart(this.archives.length); + } + else + { + stream.writeShort(this.archives.length); + } + + for (int i = 0; i < this.archives.length; ++i) + { + ArchiveData a = this.archives[i]; + int archive = a.getId(); + + if (i != 0) + { + ArchiveData prev = this.archives[i - 1]; + archive -= prev.getId(); + } + + if (protocol >= 7) + { + stream.writeBigSmart(archive); + } + else + { + stream.writeShort(archive); + } + } + + if (named) + { + for (int i = 0; i < this.archives.length; ++i) + { + ArchiveData a = this.archives[i]; + stream.writeInt(a.getNameHash()); + } + } + + for (int i = 0; i < this.archives.length; ++i) + { + ArchiveData a = this.archives[i]; + stream.writeInt(a.getCrc()); + } + + for (int i = 0; i < this.archives.length; ++i) + { + ArchiveData a = this.archives[i]; + stream.writeInt(a.getRevision()); + } + + for (int i = 0; i < this.archives.length; ++i) + { + ArchiveData a = this.archives[i]; + + int len = a.getFiles().length; + + if (protocol >= 7) + { + stream.writeBigSmart(len); + } + else + { + stream.writeShort(len); + } + } + + for (int i = 0; i < this.archives.length; ++i) + { + ArchiveData a = this.archives[i]; + + for (int j = 0; j < a.getFiles().length; ++j) + { + FileData file = a.getFiles()[j]; + int offset = file.getId(); + + if (j != 0) + { + FileData prev = a.getFiles()[j - 1]; + offset -= prev.getId(); + } + + if (protocol >= 7) + { + stream.writeBigSmart(offset); + } + else + { + stream.writeShort(offset); + } + } + } + + if (named) + { + for (int i = 0; i < this.archives.length; ++i) + { + ArchiveData a = this.archives[i]; + + for (int j = 0; j < a.getFiles().length; ++j) + { + FileData file = a.getFiles()[j]; + stream.writeInt(file.getNameHash()); + } + } + } + + return stream.flip(); + } + + public int getProtocol() + { + return protocol; + } + + public void setProtocol(int protocol) + { + this.protocol = protocol; + } + + public int getRevision() + { + return revision; + } + + public void setRevision(int revision) + { + this.revision = revision; + } + + public boolean isNamed() + { + return named; + } + + public void setNamed(boolean named) + { + this.named = named; + } + + public ArchiveData[] getArchives() + { + return archives; + } + + public void setArchives(ArchiveData[] archives) + { + this.archives = archives; + } +} diff --git a/cache/src/main/java/net/runelite/cache/io/InputStream.java b/cache/src/main/java/net/runelite/cache/io/InputStream.java new file mode 100644 index 0000000000..1fde0d97a3 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/io/InputStream.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.io; + +import java.io.IOException; +import java.nio.ByteBuffer; + +public class InputStream extends java.io.InputStream +{ + private static final char[] CHARACTERS = new char[] + { + '\u20ac', '\u0000', '\u201a', '\u0192', '\u201e', '\u2026', + '\u2020', '\u2021', '\u02c6', '\u2030', '\u0160', '\u2039', + '\u0152', '\u0000', '\u017d', '\u0000', '\u0000', '\u2018', + '\u2019', '\u201c', '\u201d', '\u2022', '\u2013', '\u2014', + '\u02dc', '\u2122', '\u0161', '\u203a', '\u0153', '\u0000', + '\u017e', '\u0178' + }; + + private final ByteBuffer buffer; + + public InputStream(byte[] buffer) + { + this.buffer = ByteBuffer.wrap(buffer); + } + + public byte[] getArray() + { + assert buffer.hasArray(); + return buffer.array(); + } + + @Override + public String toString() + { + return "InputStream{" + "buffer=" + buffer + '}'; + } + + public int read24BitInt() + { + return (this.readUnsignedByte() << 16) + (this.readUnsignedByte() << 8) + this.readUnsignedByte(); + } + + public void skip(int length) + { + int pos = buffer.position(); + pos += length; + buffer.position(pos); + } + + public void setOffset(int offset) + { + buffer.position(offset); + } + + public int getOffset() + { + return buffer.position(); + } + + public int getLength() + { + return buffer.limit(); + } + + public int remaining() + { + return buffer.remaining(); + } + + public byte readByte() + { + return buffer.get(); + } + + public void readBytes(byte[] buffer, int off, int len) + { + this.buffer.get(buffer, off, len); + } + + public void readBytes(byte[] buffer) + { + this.buffer.get(buffer); + } + + public int readUnsignedByte() + { + return this.readByte() & 0xFF; + } + + public int readUnsignedShort() + { + return buffer.getShort() & 0xFFFF; + } + + public short readShort() + { + return buffer.getShort(); + } + + public int readInt() + { + return buffer.getInt(); + } + + public byte peek() + { + return buffer.get(buffer.position()); + } + + public int readBigSmart() + { + return peek() >= 0 ? (this.readUnsignedShort() & 0xFFFF) : (this.readInt() & Integer.MAX_VALUE); + } + + public int readBigSmart2() + { + if (peek() < 0) + { + return readInt() & Integer.MAX_VALUE; // and off sign bit + } + int value = readUnsignedShort(); + return value == 32767 ? -1 : value; + } + + public int readShortSmart() + { + int peek = this.peek() & 0xFF; + return peek < 128 ? this.readUnsignedByte() - 64 : this.readUnsignedShort() - 0xc000; + } + + public int readUnsignedShortSmart() + { + int peek = this.peek() & 0xFF; + return peek < 128 ? this.readUnsignedByte() : this.readUnsignedShort() - 0x8000; + } + + public int readUnsignedIntSmartShortCompat() + { + int var1 = 0; + + int var2; + for (var2 = this.readUnsignedShortSmart(); var2 == 32767; var2 = this.readUnsignedShortSmart()) + { + var1 += 32767; + } + + var1 += var2; + return var1; + } + + public String readString() + { + StringBuilder sb = new StringBuilder(); + + for (; ; ) + { + int ch = this.readUnsignedByte(); + + if (ch == 0) + { + break; + } + + if (ch >= 128 && ch < 160) + { + char var7 = CHARACTERS[ch - 128]; + if (0 == var7) + { + var7 = '?'; + } + + ch = var7; + } + + sb.append((char) ch); + } + return sb.toString(); + } + + public String readStringOrNull() + { + if (this.peek() != 0) + { + return readString(); + } + else + { + this.readByte(); // discard + return null; + } + } + + public int readVarInt() + { + byte var1 = this.readByte(); + + int var2; + for (var2 = 0; var1 < 0; var1 = this.readByte()) + { + var2 = (var2 | var1 & 127) << 7; + } + + return var2 | var1; + } + + public byte[] getRemaining() + { + byte[] b = new byte[buffer.remaining()]; + buffer.get(b); + return b; + } + + @Override + public int read() throws IOException + { + return this.readUnsignedByte(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/io/OutputStream.java b/cache/src/main/java/net/runelite/cache/io/OutputStream.java new file mode 100644 index 0000000000..751905f4fb --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/io/OutputStream.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.io; + +import com.google.common.base.Preconditions; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; + +public final class OutputStream extends java.io.OutputStream +{ + private ByteBuffer buffer; + + public OutputStream(int capacity) + { + buffer = ByteBuffer.allocate(capacity); + } + + public OutputStream() + { + this(16); + } + + public byte[] getArray() + { + assert buffer.hasArray(); + return buffer.array(); + } + + private void ensureRemaining(int remaining) + { + while (remaining > buffer.remaining()) + { + int newCapacity = buffer.capacity() * 2; + + ByteBuffer old = buffer; + old.flip(); + + buffer = ByteBuffer.allocate(newCapacity); + + buffer.put(old); + } + } + + public void skip(int length) + { + int pos = buffer.position(); + pos += length; + buffer.position(pos); + } + + public int getOffset() + { + return buffer.position(); + } + + public void setOffset(int offset) + { + buffer.position(offset); + } + + public void writeBytes(byte[] b) + { + writeBytes(b, 0, b.length); + } + + public void writeBytes(byte[] b, int offset, int length) + { + ensureRemaining(length); + buffer.put(b, offset, length); + } + + public void writeByte(int i) + { + ensureRemaining(1); + buffer.put((byte) i); + } + + public void writeBigSmart(int value) + { + Preconditions.checkArgument(value >= 0); + if (value >= 32768) + { + ensureRemaining(4); + this.writeInt((1 << 31) | value); + } + else + { + ensureRemaining(2); + this.writeShort(value); + } + } + + public void writeShort(int i) + { + ensureRemaining(2); + buffer.putShort((short) i); + } + + public void writeShortSmart(int value) + { + Preconditions.checkArgument(value >= 0); + if (value < 128) + { + writeByte(value); + } + else + { + writeShort(0x8000 | value); + } + } + + public void write24BitInt(int i) + { + ensureRemaining(3); + buffer.put((byte) (i >>> 16)); + buffer.put((byte) (i >>> 8)); + buffer.put((byte) (i & 0xFF)); + } + + public void writeInt(int i) + { + ensureRemaining(4); + buffer.putInt(i); + } + + public void writeVarInt(int var1) + { + if ((var1 & -128) != 0) + { + if ((var1 & -16384) != 0) + { + if ((var1 & -2097152) != 0) + { + if ((var1 & -268435456) != 0) + { + this.writeByte(var1 >>> 28 | 128); + } + + this.writeByte(var1 >>> 21 | 128); + } + + this.writeByte(var1 >>> 14 | 128); + } + + this.writeByte(var1 >>> 7 | 128); + } + + this.writeByte(var1 & 127); + } + + public void writeLengthFromMark(int var1) + { + this.getArray()[this.getOffset() - var1 - 4] = (byte) (var1 >> 24); + this.getArray()[this.getOffset() - var1 - 3] = (byte) (var1 >> 16); + this.getArray()[this.getOffset() - var1 - 2] = (byte) (var1 >> 8); + this.getArray()[this.getOffset() - var1 - 1] = (byte) var1; + } + + public void writeString(String str) + { + byte[] b; + try + { + b = str.getBytes("ISO-8859-1"); + } + catch (UnsupportedEncodingException ex) + { + throw new RuntimeException(ex); + } + writeBytes(b); + writeByte(0); + } + + public byte[] flip() + { + buffer.flip(); + byte[] b = new byte[buffer.limit()]; + buffer.get(b); + return b; + } + + @Override + public void write(int b) throws IOException + { + buffer.put((byte) b); + } + +} diff --git a/cache/src/main/java/net/runelite/cache/item/ColorPalette.java b/cache/src/main/java/net/runelite/cache/item/ColorPalette.java new file mode 100644 index 0000000000..6486afe2fb --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/ColorPalette.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +import lombok.Getter; + +public class ColorPalette +{ + @Getter + private final int[] colorPalette; + + public ColorPalette(double brightness, int var2, int var3) + { + colorPalette = buildColorPalettee(brightness, var2, var3); + } + + private int[] buildColorPalettee(double brightness, int var2, int var3) + { + int[] colorPalette = new int[65536]; + int var4 = var2 * 128; + + for (int var5 = var2; var5 < var3; ++var5) + { + double var6 = (double) (var5 >> 3) / 64.0D + 0.0078125D; + double var8 = (double) (var5 & 7) / 8.0D + 0.0625D; + + for (int var10 = 0; var10 < 128; ++var10) + { + double var11 = (double) var10 / 128.0D; + double var13 = var11; + double var15 = var11; + double var17 = var11; + if (var8 != 0.0D) + { + double var19; + if (var11 < 0.5D) + { + var19 = var11 * (1.0D + var8); + } + else + { + var19 = var11 + var8 - var11 * var8; + } + + double var21 = 2.0D * var11 - var19; + double var23 = var6 + 0.3333333333333333D; + if (var23 > 1.0D) + { + --var23; + } + + double var27 = var6 - 0.3333333333333333D; + if (var27 < 0.0D) + { + ++var27; + } + + if (6.0D * var23 < 1.0D) + { + var13 = var21 + (var19 - var21) * 6.0D * var23; + } + else if (2.0D * var23 < 1.0D) + { + var13 = var19; + } + else if (3.0D * var23 < 2.0D) + { + var13 = var21 + (var19 - var21) * (0.6666666666666666D - var23) * 6.0D; + } + else + { + var13 = var21; + } + + if (6.0D * var6 < 1.0D) + { + var15 = var21 + (var19 - var21) * 6.0D * var6; + } + else if (2.0D * var6 < 1.0D) + { + var15 = var19; + } + else if (3.0D * var6 < 2.0D) + { + var15 = var21 + (var19 - var21) * (0.6666666666666666D - var6) * 6.0D; + } + else + { + var15 = var21; + } + + if (6.0D * var27 < 1.0D) + { + var17 = var21 + (var19 - var21) * 6.0D * var27; + } + else if (2.0D * var27 < 1.0D) + { + var17 = var19; + } + else if (3.0D * var27 < 2.0D) + { + var17 = var21 + (var19 - var21) * (0.6666666666666666D - var27) * 6.0D; + } + else + { + var17 = var21; + } + } + + int var29 = (int) (var13 * 256.0D); + int var20 = (int) (var15 * 256.0D); + int var30 = (int) (var17 * 256.0D); + int var22 = var30 + (var20 << 8) + (var29 << 16); + var22 = adjustRGB(var22, brightness); + if (var22 == 0) + { + var22 = 1; + } + + colorPalette[var4++] = var22; + } + } + return colorPalette; + } + + private static int adjustRGB(int var0, double var1) + { + double var3 = (double) (var0 >> 16) / 256.0D; + double var5 = (double) (var0 >> 8 & 255) / 256.0D; + double var7 = (double) (var0 & 255) / 256.0D; + var3 = Math.pow(var3, var1); + var5 = Math.pow(var5, var1); + var7 = Math.pow(var7, var1); + int var9 = (int) (var3 * 256.0D); + int var10 = (int) (var5 * 256.0D); + int var11 = (int) (var7 * 256.0D); + return var11 + (var10 << 8) + (var9 << 16); + } +} diff --git a/cache/src/main/java/net/runelite/cache/item/Graphics3D.java b/cache/src/main/java/net/runelite/cache/item/Graphics3D.java new file mode 100644 index 0000000000..248ab6c572 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/Graphics3D.java @@ -0,0 +1,2818 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +class Graphics3D extends Rasterizer2D +{ + private static final double UNIT = Math.PI / 1024d; // How much of the circle each unit of SINE/COSINE is + + public static final int[] SINE = new int[2048]; // sine angles for each of the 2048 units, * 65536 and stored as an int + public static final int[] COSINE = new int[2048]; // cosine + + private static int[] field1932 = new int[512]; + static int[] field1933 = new int[2048]; + + static + { + for (int i = 0; i < 2048; ++i) + { + SINE[i] = (int) (65536.0D * Math.sin((double) i * UNIT)); + COSINE[i] = (int) (65536.0D * Math.cos((double) i * UNIT)); + } + + int var0; + for (var0 = 1; var0 < 512; ++var0) + { + field1932[var0] = 32768 / var0; + } + + for (var0 = 1; var0 < 2048; ++var0) + { + field1933[var0] = 65536 / var0; + } + } + + private final RSTextureProvider textureProvider; + boolean rasterClipEnable; + boolean field1909; + boolean lowMem; + public boolean rasterGouraudLowRes = true; + int rasterAlpha; + public int Rasterizer3D_zoom = 512; + int centerX; + int centerY; + int rasterClipX; + int Rasterizer3D_clipHeight; + int Rasterizer3D_clipNegativeMidX; + int Rasterizer3D_clipMidX2; + int Rasterizer3D_clipNegativeMidY; + int Rasterizer3D_clipMidY2; + int[] rasterClipY = new int[1024]; + public int[] colorPalette; + + public Graphics3D(RSTextureProvider textureProvider) + { + this.textureProvider = textureProvider; + } + + public final void setRasterClipping() + { + setRasterClipping(draw_region_x, drawingAreaTop, drawingAreaRight, drawingAreaBottom); + } + + final void setRasterClipping(int var0, int var1, int var2, int var3) + { + rasterClipX = var2 - var0; + Rasterizer3D_clipHeight = var3 - var1; + Rasterizer3D_method3(); + + if (rasterClipY.length < Rasterizer3D_clipHeight) + { + // Find closest 2^n >= v + int v = Rasterizer3D_clipHeight - 1; + v |= v >>> 1; + v |= v >>> 2; + v |= v >>> 4; + v |= v >>> 8; + v |= v >>> 16; + rasterClipY = new int[v + 1]; + } + + int var4 = var0 + graphicsPixelsWidth * var1; + for (int i = 0; i < Rasterizer3D_clipHeight; ++i) + { + rasterClipY[i] = var4; + var4 += graphicsPixelsWidth; + } + + } + + public final void Rasterizer3D_method3() + { + centerX = rasterClipX / 2; + centerY = Rasterizer3D_clipHeight / 2; + Rasterizer3D_clipNegativeMidX = -centerX; + Rasterizer3D_clipMidX2 = rasterClipX - centerX; + Rasterizer3D_clipNegativeMidY = -centerY; + Rasterizer3D_clipMidY2 = Rasterizer3D_clipHeight - centerY; + } + + public final void setOffset(int x, int y) + { + int var2 = rasterClipY[0]; + int var3 = var2 / graphicsPixelsWidth; + int var4 = var2 - var3 * graphicsPixelsWidth; + centerX = x - var4; + centerY = y - var3; + Rasterizer3D_clipNegativeMidX = -centerX; + Rasterizer3D_clipMidX2 = rasterClipX - centerX; + Rasterizer3D_clipNegativeMidY = -centerY; + Rasterizer3D_clipMidY2 = Rasterizer3D_clipHeight - centerY; + } + + public final void setBrightness(double var0) + { + colorPalette = new ColorPalette(var0, 0, 512).getColorPalette(); + } + + final void rasterGouraud(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) + { + int var9 = var4 - var3; + int var10 = var1 - var0; + int var11 = var5 - var3; + int var12 = var2 - var0; + int var13 = var7 - var6; + int var14 = var8 - var6; + int var15; + if (var2 != var1) + { + var15 = (var5 - var4 << 14) / (var2 - var1); + } + else + { + var15 = 0; + } + + int var16; + if (var0 != var1) + { + var16 = (var9 << 14) / var10; + } + else + { + var16 = 0; + } + + int var17; + if (var0 != var2) + { + var17 = (var11 << 14) / var12; + } + else + { + var17 = 0; + } + + int var18 = var9 * var12 - var11 * var10; + if (var18 != 0) + { + int var19 = (var13 * var12 - var14 * var10 << 8) / var18; + int var20 = (var14 * var9 - var13 * var11 << 8) / var18; + if (var0 <= var1 && var0 <= var2) + { + if (var0 < Rasterizer3D_clipHeight) + { + if (var1 > Rasterizer3D_clipHeight) + { + var1 = Rasterizer3D_clipHeight; + } + + if (var2 > Rasterizer3D_clipHeight) + { + var2 = Rasterizer3D_clipHeight; + } + + var6 = var19 + ((var6 << 8) - var3 * var19); + if (var1 < var2) + { + var5 = var3 <<= 14; + if (var0 < 0) + { + var5 -= var0 * var17; + var3 -= var0 * var16; + var6 -= var0 * var20; + var0 = 0; + } + + var4 <<= 14; + if (var1 < 0) + { + var4 -= var15 * var1; + var1 = 0; + } + + if (var0 != var1 && var17 < var16 || var0 == var1 && var17 > var15) + { + var2 -= var1; + var1 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2778(graphicsPixels, var0, 0, 0, var5 >> 14, var4 >> 14, var6, var19); + var5 += var17; + var4 += var15; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var0, 0, 0, var5 >> 14, var3 >> 14, var6, var19); + var5 += var17; + var3 += var16; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + else + { + var2 -= var1; + var1 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2778(graphicsPixels, var0, 0, 0, var4 >> 14, var5 >> 14, var6, var19); + var5 += var17; + var4 += var15; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var0, 0, 0, var3 >> 14, var5 >> 14, var6, var19); + var5 += var17; + var3 += var16; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + } + else + { + var4 = var3 <<= 14; + if (var0 < 0) + { + var4 -= var0 * var17; + var3 -= var0 * var16; + var6 -= var0 * var20; + var0 = 0; + } + + var5 <<= 14; + if (var2 < 0) + { + var5 -= var15 * var2; + var2 = 0; + } + + if (var0 != var2 && var17 < var16 || var0 == var2 && var15 > var16) + { + var1 -= var2; + var2 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2778(graphicsPixels, var0, 0, 0, var5 >> 14, var3 >> 14, var6, var19); + var5 += var15; + var3 += var16; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var0, 0, 0, var4 >> 14, var3 >> 14, var6, var19); + var4 += var17; + var3 += var16; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + else + { + var1 -= var2; + var2 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2778(graphicsPixels, var0, 0, 0, var3 >> 14, var5 >> 14, var6, var19); + var5 += var15; + var3 += var16; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var0, 0, 0, var3 >> 14, var4 >> 14, var6, var19); + var4 += var17; + var3 += var16; + var6 += var20; + var0 += graphicsPixelsWidth; + } + } + } + } + } + else if (var1 <= var2) + { + if (var1 < Rasterizer3D_clipHeight) + { + if (var2 > Rasterizer3D_clipHeight) + { + var2 = Rasterizer3D_clipHeight; + } + + if (var0 > Rasterizer3D_clipHeight) + { + var0 = Rasterizer3D_clipHeight; + } + + var7 = var19 + ((var7 << 8) - var19 * var4); + if (var2 < var0) + { + var3 = var4 <<= 14; + if (var1 < 0) + { + var3 -= var16 * var1; + var4 -= var15 * var1; + var7 -= var20 * var1; + var1 = 0; + } + + var5 <<= 14; + if (var2 < 0) + { + var5 -= var17 * var2; + var2 = 0; + } + + if (var2 != var1 && var16 < var15 || var2 == var1 && var16 > var17) + { + var0 -= var2; + var2 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2778(graphicsPixels, var1, 0, 0, var3 >> 14, var5 >> 14, var7, var19); + var3 += var16; + var5 += var17; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var1, 0, 0, var3 >> 14, var4 >> 14, var7, var19); + var3 += var16; + var4 += var15; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + else + { + var0 -= var2; + var2 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2778(graphicsPixels, var1, 0, 0, var5 >> 14, var3 >> 14, var7, var19); + var3 += var16; + var5 += var17; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var1, 0, 0, var4 >> 14, var3 >> 14, var7, var19); + var3 += var16; + var4 += var15; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + } + else + { + var5 = var4 <<= 14; + if (var1 < 0) + { + var5 -= var16 * var1; + var4 -= var15 * var1; + var7 -= var20 * var1; + var1 = 0; + } + + var3 <<= 14; + if (var0 < 0) + { + var3 -= var0 * var17; + var0 = 0; + } + + if (var16 < var15) + { + var2 -= var0; + var0 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2778(graphicsPixels, var1, 0, 0, var3 >> 14, var4 >> 14, var7, var19); + var3 += var17; + var4 += var15; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var1, 0, 0, var5 >> 14, var4 >> 14, var7, var19); + var5 += var16; + var4 += var15; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + else + { + var2 -= var0; + var0 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2778(graphicsPixels, var1, 0, 0, var4 >> 14, var3 >> 14, var7, var19); + var3 += var17; + var4 += var15; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var1, 0, 0, var4 >> 14, var5 >> 14, var7, var19); + var5 += var16; + var4 += var15; + var7 += var20; + var1 += graphicsPixelsWidth; + } + } + } + } + } + else if (var2 < Rasterizer3D_clipHeight) + { + if (var0 > Rasterizer3D_clipHeight) + { + var0 = Rasterizer3D_clipHeight; + } + + if (var1 > Rasterizer3D_clipHeight) + { + var1 = Rasterizer3D_clipHeight; + } + + var8 = var19 + ((var8 << 8) - var5 * var19); + if (var0 < var1) + { + var4 = var5 <<= 14; + if (var2 < 0) + { + var4 -= var15 * var2; + var5 -= var17 * var2; + var8 -= var20 * var2; + var2 = 0; + } + + var3 <<= 14; + if (var0 < 0) + { + var3 -= var0 * var16; + var0 = 0; + } + + if (var15 < var17) + { + var1 -= var0; + var0 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2778(graphicsPixels, var2, 0, 0, var4 >> 14, var3 >> 14, var8, var19); + var4 += var15; + var3 += var16; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var2, 0, 0, var4 >> 14, var5 >> 14, var8, var19); + var4 += var15; + var5 += var17; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + else + { + var1 -= var0; + var0 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2778(graphicsPixels, var2, 0, 0, var3 >> 14, var4 >> 14, var8, var19); + var4 += var15; + var3 += var16; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var2, 0, 0, var5 >> 14, var4 >> 14, var8, var19); + var4 += var15; + var5 += var17; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + } + else + { + var3 = var5 <<= 14; + if (var2 < 0) + { + var3 -= var15 * var2; + var5 -= var17 * var2; + var8 -= var20 * var2; + var2 = 0; + } + + var4 <<= 14; + if (var1 < 0) + { + var4 -= var16 * var1; + var1 = 0; + } + + if (var15 < var17) + { + var0 -= var1; + var1 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2778(graphicsPixels, var2, 0, 0, var4 >> 14, var5 >> 14, var8, var19); + var4 += var16; + var5 += var17; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var2, 0, 0, var3 >> 14, var5 >> 14, var8, var19); + var3 += var15; + var5 += var17; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + else + { + var0 -= var1; + var1 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2778(graphicsPixels, var2, 0, 0, var5 >> 14, var4 >> 14, var8, var19); + var4 += var16; + var5 += var17; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + + method2778(graphicsPixels, var2, 0, 0, var5 >> 14, var3 >> 14, var8, var19); + var3 += var15; + var5 += var17; + var8 += var20; + var2 += graphicsPixelsWidth; + } + } + } + } + } + } + + + final void method2778(int[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) + { + if (rasterClipEnable) + { + if (var5 > rasterClipX) + { + var5 = rasterClipX; + } + + if (var4 < 0) + { + var4 = 0; + } + } + + if (var4 < var5) + { + var1 += var4; + var6 += var4 * var7; + int var8; + int var9; + int var10; + if (rasterGouraudLowRes) + { + var3 = var5 - var4 >> 2; + var7 <<= 2; + if (rasterAlpha == 0) + { + if (var3 > 0) + { + do + { + var2 = colorPalette[var6 >> 8]; + var6 += var7; + var0[var1++] = var2; + var0[var1++] = var2; + var0[var1++] = var2; + var0[var1++] = var2; + --var3; + } while (var3 > 0); + } + + var3 = var5 - var4 & 3; + if (var3 > 0) + { + var2 = colorPalette[var6 >> 8]; + + do + { + var0[var1++] = var2; + --var3; + } while (var3 > 0); + } + } + else + { + var8 = rasterAlpha; + var9 = 256 - rasterAlpha; + if (var3 > 0) + { + do + { + var2 = colorPalette[var6 >> 8]; + var6 += var7; + var2 = (var9 * (var2 & 65280) >> 8 & 65280) + (var9 * (var2 & 16711935) >> 8 & 16711935); + var10 = var0[var1]; + var0[var1++] = ((var10 & 16711935) * var8 >> 8 & 16711935) + var2 + (var8 * (var10 & 65280) >> 8 & 65280); + var10 = var0[var1]; + var0[var1++] = ((var10 & 16711935) * var8 >> 8 & 16711935) + var2 + (var8 * (var10 & 65280) >> 8 & 65280); + var10 = var0[var1]; + var0[var1++] = ((var10 & 16711935) * var8 >> 8 & 16711935) + var2 + (var8 * (var10 & 65280) >> 8 & 65280); + var10 = var0[var1]; + var0[var1++] = ((var10 & 16711935) * var8 >> 8 & 16711935) + var2 + (var8 * (var10 & 65280) >> 8 & 65280); + --var3; + } while (var3 > 0); + } + + var3 = var5 - var4 & 3; + if (var3 > 0) + { + var2 = colorPalette[var6 >> 8]; + var2 = (var9 * (var2 & 65280) >> 8 & 65280) + (var9 * (var2 & 16711935) >> 8 & 16711935); + + do + { + var10 = var0[var1]; + var0[var1++] = ((var10 & 16711935) * var8 >> 8 & 16711935) + var2 + (var8 * (var10 & 65280) >> 8 & 65280); + --var3; + } while (var3 > 0); + } + } + + } + else + { + var3 = var5 - var4; + if (rasterAlpha == 0) + { + do + { + var0[var1++] = colorPalette[var6 >> 8]; + var6 += var7; + --var3; + } while (var3 > 0); + } + else + { + var8 = rasterAlpha; + var9 = 256 - rasterAlpha; + + do + { + var2 = colorPalette[var6 >> 8]; + var6 += var7; + var2 = (var9 * (var2 & 65280) >> 8 & 65280) + (var9 * (var2 & 16711935) >> 8 & 16711935); + var10 = var0[var1]; + var0[var1++] = ((var10 & 16711935) * var8 >> 8 & 16711935) + var2 + (var8 * (var10 & 65280) >> 8 & 65280); + --var3; + } while (var3 > 0); + } + + } + } + } + + + public final void rasterFlat(int var0, int var1, int var2, int var3, int var4, int var5, int var6) + { + int var7 = 0; + if (var0 != var1) + { + var7 = (var4 - var3 << 14) / (var1 - var0); + } + + int var8 = 0; + if (var2 != var1) + { + var8 = (var5 - var4 << 14) / (var2 - var1); + } + + int var9 = 0; + if (var0 != var2) + { + var9 = (var3 - var5 << 14) / (var0 - var2); + } + + if (var0 <= var1 && var0 <= var2) + { + if (var0 < Rasterizer3D_clipHeight) + { + if (var1 > Rasterizer3D_clipHeight) + { + var1 = Rasterizer3D_clipHeight; + } + + if (var2 > Rasterizer3D_clipHeight) + { + var2 = Rasterizer3D_clipHeight; + } + + if (var1 < var2) + { + var5 = var3 <<= 14; + if (var0 < 0) + { + var5 -= var0 * var9; + var3 -= var0 * var7; + var0 = 0; + } + + var4 <<= 14; + if (var1 < 0) + { + var4 -= var8 * var1; + var1 = 0; + } + + if ((var0 == var1 || var9 >= var7) && (var0 != var1 || var9 <= var8)) + { + var2 -= var1; + var1 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2842(graphicsPixels, var0, var6, 0, var4 >> 14, var5 >> 14); + var5 += var9; + var4 += var8; + var0 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var0, var6, 0, var3 >> 14, var5 >> 14); + var5 += var9; + var3 += var7; + var0 += graphicsPixelsWidth; + } + } + else + { + var2 -= var1; + var1 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2842(graphicsPixels, var0, var6, 0, var5 >> 14, var4 >> 14); + var5 += var9; + var4 += var8; + var0 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var0, var6, 0, var5 >> 14, var3 >> 14); + var5 += var9; + var3 += var7; + var0 += graphicsPixelsWidth; + } + } + } + else + { + var4 = var3 <<= 14; + if (var0 < 0) + { + var4 -= var0 * var9; + var3 -= var0 * var7; + var0 = 0; + } + + var5 <<= 14; + if (var2 < 0) + { + var5 -= var8 * var2; + var2 = 0; + } + + if (var0 != var2 && var9 < var7 || var0 == var2 && var8 > var7) + { + var1 -= var2; + var2 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2842(graphicsPixels, var0, var6, 0, var5 >> 14, var3 >> 14); + var5 += var8; + var3 += var7; + var0 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var0, var6, 0, var4 >> 14, var3 >> 14); + var4 += var9; + var3 += var7; + var0 += graphicsPixelsWidth; + } + } + else + { + var1 -= var2; + var2 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2842(graphicsPixels, var0, var6, 0, var3 >> 14, var5 >> 14); + var5 += var8; + var3 += var7; + var0 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var0, var6, 0, var3 >> 14, var4 >> 14); + var4 += var9; + var3 += var7; + var0 += graphicsPixelsWidth; + } + } + } + } + } + else if (var1 <= var2) + { + if (var1 < Rasterizer3D_clipHeight) + { + if (var2 > Rasterizer3D_clipHeight) + { + var2 = Rasterizer3D_clipHeight; + } + + if (var0 > Rasterizer3D_clipHeight) + { + var0 = Rasterizer3D_clipHeight; + } + + if (var2 < var0) + { + var3 = var4 <<= 14; + if (var1 < 0) + { + var3 -= var7 * var1; + var4 -= var8 * var1; + var1 = 0; + } + + var5 <<= 14; + if (var2 < 0) + { + var5 -= var9 * var2; + var2 = 0; + } + + if ((var2 == var1 || var7 >= var8) && (var2 != var1 || var7 <= var9)) + { + var0 -= var2; + var2 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2842(graphicsPixels, var1, var6, 0, var5 >> 14, var3 >> 14); + var3 += var7; + var5 += var9; + var1 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var1, var6, 0, var4 >> 14, var3 >> 14); + var3 += var7; + var4 += var8; + var1 += graphicsPixelsWidth; + } + } + else + { + var0 -= var2; + var2 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2842(graphicsPixels, var1, var6, 0, var3 >> 14, var5 >> 14); + var3 += var7; + var5 += var9; + var1 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var1, var6, 0, var3 >> 14, var4 >> 14); + var3 += var7; + var4 += var8; + var1 += graphicsPixelsWidth; + } + } + } + else + { + var5 = var4 <<= 14; + if (var1 < 0) + { + var5 -= var7 * var1; + var4 -= var8 * var1; + var1 = 0; + } + + var3 <<= 14; + if (var0 < 0) + { + var3 -= var0 * var9; + var0 = 0; + } + + if (var7 < var8) + { + var2 -= var0; + var0 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2842(graphicsPixels, var1, var6, 0, var3 >> 14, var4 >> 14); + var3 += var9; + var4 += var8; + var1 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var1, var6, 0, var5 >> 14, var4 >> 14); + var5 += var7; + var4 += var8; + var1 += graphicsPixelsWidth; + } + } + else + { + var2 -= var0; + var0 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2842(graphicsPixels, var1, var6, 0, var4 >> 14, var3 >> 14); + var3 += var9; + var4 += var8; + var1 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var1, var6, 0, var4 >> 14, var5 >> 14); + var5 += var7; + var4 += var8; + var1 += graphicsPixelsWidth; + } + } + } + } + } + else if (var2 < Rasterizer3D_clipHeight) + { + if (var0 > Rasterizer3D_clipHeight) + { + var0 = Rasterizer3D_clipHeight; + } + + if (var1 > Rasterizer3D_clipHeight) + { + var1 = Rasterizer3D_clipHeight; + } + + if (var0 < var1) + { + var4 = var5 <<= 14; + if (var2 < 0) + { + var4 -= var8 * var2; + var5 -= var9 * var2; + var2 = 0; + } + + var3 <<= 14; + if (var0 < 0) + { + var3 -= var0 * var7; + var0 = 0; + } + + if (var8 < var9) + { + var1 -= var0; + var0 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2842(graphicsPixels, var2, var6, 0, var4 >> 14, var3 >> 14); + var4 += var8; + var3 += var7; + var2 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var2, var6, 0, var4 >> 14, var5 >> 14); + var4 += var8; + var5 += var9; + var2 += graphicsPixelsWidth; + } + } + else + { + var1 -= var0; + var0 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2842(graphicsPixels, var2, var6, 0, var3 >> 14, var4 >> 14); + var4 += var8; + var3 += var7; + var2 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var2, var6, 0, var5 >> 14, var4 >> 14); + var4 += var8; + var5 += var9; + var2 += graphicsPixelsWidth; + } + } + } + else + { + var3 = var5 <<= 14; + if (var2 < 0) + { + var3 -= var8 * var2; + var5 -= var9 * var2; + var2 = 0; + } + + var4 <<= 14; + if (var1 < 0) + { + var4 -= var7 * var1; + var1 = 0; + } + + if (var8 < var9) + { + var0 -= var1; + var1 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2842(graphicsPixels, var2, var6, 0, var4 >> 14, var5 >> 14); + var4 += var7; + var5 += var9; + var2 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var2, var6, 0, var3 >> 14, var5 >> 14); + var3 += var8; + var5 += var9; + var2 += graphicsPixelsWidth; + } + } + else + { + var0 -= var1; + var1 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2842(graphicsPixels, var2, var6, 0, var5 >> 14, var4 >> 14); + var4 += var7; + var5 += var9; + var2 += graphicsPixelsWidth; + } + } + + method2842(graphicsPixels, var2, var6, 0, var5 >> 14, var3 >> 14); + var3 += var8; + var5 += var9; + var2 += graphicsPixelsWidth; + } + } + } + } + } + + + final void method2842(int[] var0, int var1, int var2, int var3, int var4, int var5) + { + if (rasterClipEnable) + { + if (var5 > rasterClipX) + { + var5 = rasterClipX; + } + + if (var4 < 0) + { + var4 = 0; + } + } + + if (var4 < var5) + { + var1 += var4; + var3 = var5 - var4 >> 2; + if (rasterAlpha != 0) + { + if (rasterAlpha == 254) + { + while (true) + { + --var3; + if (var3 < 0) + { + var3 = var5 - var4 & 3; + + while (true) + { + --var3; + if (var3 < 0) + { + return; + } + + var0[var1++] = var0[var1]; + } + } + + var0[var1++] = var0[var1]; + var0[var1++] = var0[var1]; + var0[var1++] = var0[var1]; + var0[var1++] = var0[var1]; + } + } + else + { + int var6 = rasterAlpha; + int var7 = 256 - rasterAlpha; + var2 = (var7 * (var2 & 65280) >> 8 & 65280) + (var7 * (var2 & 16711935) >> 8 & 16711935); + + while (true) + { + --var3; + int var8; + if (var3 < 0) + { + var3 = var5 - var4 & 3; + + while (true) + { + --var3; + if (var3 < 0) + { + return; + } + + var8 = var0[var1]; + var0[var1++] = ((var8 & 16711935) * var6 >> 8 & 16711935) + var2 + (var6 * (var8 & 65280) >> 8 & 65280); + } + } + + var8 = var0[var1]; + var0[var1++] = ((var8 & 16711935) * var6 >> 8 & 16711935) + var2 + (var6 * (var8 & 65280) >> 8 & 65280); + var8 = var0[var1]; + var0[var1++] = ((var8 & 16711935) * var6 >> 8 & 16711935) + var2 + (var6 * (var8 & 65280) >> 8 & 65280); + var8 = var0[var1]; + var0[var1++] = ((var8 & 16711935) * var6 >> 8 & 16711935) + var2 + (var6 * (var8 & 65280) >> 8 & 65280); + var8 = var0[var1]; + var0[var1++] = ((var8 & 16711935) * var6 >> 8 & 16711935) + var2 + (var6 * (var8 & 65280) >> 8 & 65280); + } + } + } + else + { + while (true) + { + --var3; + if (var3 < 0) + { + var3 = var5 - var4 & 3; + + while (true) + { + --var3; + if (var3 < 0) + { + return; + } + + var0[var1++] = var2; + } + } + + var0[var1++] = var2; + var0[var1++] = var2; + var0[var1++] = var2; + var0[var1++] = var2; + } + } + } + } + + + final void rasterTextureAffine(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16, int var17, int var18) + { + int[] var19 = textureProvider.load(var18); + int var20; + if (var19 == null) + { + var20 = textureProvider.getAverageTextureRGB(var18); + rasterGouraud(var0, var1, var2, var3, var4, var5, method2794(var20, var6), method2794(var20, var7), method2794(var20, var8)); + } + else + { + lowMem = textureProvider.vmethod3066(var18); + field1909 = textureProvider.vmethod3057(var18); + var20 = var4 - var3; + int var21 = var1 - var0; + int var22 = var5 - var3; + int var23 = var2 - var0; + int var24 = var7 - var6; + int var25 = var8 - var6; + int var26 = 0; + if (var0 != var1) + { + var26 = (var4 - var3 << 14) / (var1 - var0); + } + + int var27 = 0; + if (var2 != var1) + { + var27 = (var5 - var4 << 14) / (var2 - var1); + } + + int var28 = 0; + if (var0 != var2) + { + var28 = (var3 - var5 << 14) / (var0 - var2); + } + + int var29 = var20 * var23 - var22 * var21; + if (var29 != 0) + { + int var30 = (var24 * var23 - var25 * var21 << 9) / var29; + int var31 = (var25 * var20 - var24 * var22 << 9) / var29; + var10 = var9 - var10; + var13 = var12 - var13; + var16 = var15 - var16; + var11 -= var9; + var14 -= var12; + var17 -= var15; + int var32 = var11 * var12 - var9 * var14 << 14; + int var33 = (int) (((long) (var15 * var14 - var17 * var12) << 3 << 14) / (long) Rasterizer3D_zoom); + int var34 = (int) (((long) (var17 * var9 - var11 * var15) << 14) / (long) Rasterizer3D_zoom); + int var35 = var10 * var12 - var13 * var9 << 14; + int var36 = (int) (((long) (var13 * var15 - var16 * var12) << 3 << 14) / (long) Rasterizer3D_zoom); + int var37 = (int) (((long) (var16 * var9 - var10 * var15) << 14) / (long) Rasterizer3D_zoom); + int var38 = var13 * var11 - var10 * var14 << 14; + int var39 = (int) (((long) (var16 * var14 - var13 * var17) << 3 << 14) / (long) Rasterizer3D_zoom); + int var40 = (int) (((long) (var17 * var10 - var11 * var16) << 14) / (long) Rasterizer3D_zoom); + int var41; + if (var0 <= var1 && var0 <= var2) + { + if (var0 < Rasterizer3D_clipHeight) + { + if (var1 > Rasterizer3D_clipHeight) + { + var1 = Rasterizer3D_clipHeight; + } + + if (var2 > Rasterizer3D_clipHeight) + { + var2 = Rasterizer3D_clipHeight; + } + + var6 = var30 + ((var6 << 9) - var3 * var30); + if (var1 < var2) + { + var5 = var3 <<= 14; + if (var0 < 0) + { + var5 -= var0 * var28; + var3 -= var0 * var26; + var6 -= var0 * var31; + var0 = 0; + } + + var4 <<= 14; + if (var1 < 0) + { + var4 -= var27 * var1; + var1 = 0; + } + + var41 = var0 - centerY; + var32 += var34 * var41; + var35 += var37 * var41; + var38 += var40 * var41; + if ((var0 == var1 || var28 >= var26) && (var0 != var1 || var28 <= var27)) + { + var2 -= var1; + var1 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var0, var4 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var28; + var4 += var27; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var0, var3 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var28; + var3 += var26; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + else + { + var2 -= var1; + var1 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var0, var5 >> 14, var4 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var28; + var4 += var27; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var0, var5 >> 14, var3 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var28; + var3 += var26; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + } + else + { + var4 = var3 <<= 14; + if (var0 < 0) + { + var4 -= var0 * var28; + var3 -= var0 * var26; + var6 -= var0 * var31; + var0 = 0; + } + + var5 <<= 14; + if (var2 < 0) + { + var5 -= var27 * var2; + var2 = 0; + } + + var41 = var0 - centerY; + var32 += var34 * var41; + var35 += var37 * var41; + var38 += var40 * var41; + if (var0 != var2 && var28 < var26 || var0 == var2 && var27 > var26) + { + var1 -= var2; + var2 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var0, var5 >> 14, var3 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var27; + var3 += var26; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var0, var4 >> 14, var3 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var4 += var28; + var3 += var26; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + else + { + var1 -= var2; + var2 -= var0; + var0 = rasterClipY[var0]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var0, var3 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var27; + var3 += var26; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var0, var3 >> 14, var4 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var4 += var28; + var3 += var26; + var6 += var31; + var0 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + } + } + } + else if (var1 <= var2) + { + if (var1 < Rasterizer3D_clipHeight) + { + if (var2 > Rasterizer3D_clipHeight) + { + var2 = Rasterizer3D_clipHeight; + } + + if (var0 > Rasterizer3D_clipHeight) + { + var0 = Rasterizer3D_clipHeight; + } + + var7 = var30 + ((var7 << 9) - var30 * var4); + if (var2 < var0) + { + var3 = var4 <<= 14; + if (var1 < 0) + { + var3 -= var26 * var1; + var4 -= var27 * var1; + var7 -= var31 * var1; + var1 = 0; + } + + var5 <<= 14; + if (var2 < 0) + { + var5 -= var28 * var2; + var2 = 0; + } + + var41 = var1 - centerY; + var32 += var34 * var41; + var35 += var37 * var41; + var38 += var40 * var41; + if ((var2 == var1 || var26 >= var27) && (var2 != var1 || var26 <= var28)) + { + var0 -= var2; + var2 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var1, var5 >> 14, var3 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var26; + var5 += var28; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var1, var4 >> 14, var3 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var26; + var4 += var27; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + else + { + var0 -= var2; + var2 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var2; + if (var2 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var1, var3 >> 14, var5 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var26; + var5 += var28; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var1, var3 >> 14, var4 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var26; + var4 += var27; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + } + else + { + var5 = var4 <<= 14; + if (var1 < 0) + { + var5 -= var26 * var1; + var4 -= var27 * var1; + var7 -= var31 * var1; + var1 = 0; + } + + var3 <<= 14; + if (var0 < 0) + { + var3 -= var0 * var28; + var0 = 0; + } + + var41 = var1 - centerY; + var32 += var34 * var41; + var35 += var37 * var41; + var38 += var40 * var41; + if (var26 < var27) + { + var2 -= var0; + var0 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var1, var3 >> 14, var4 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var28; + var4 += var27; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var1, var5 >> 14, var4 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var5 += var26; + var4 += var27; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + else + { + var2 -= var0; + var0 -= var1; + var1 = rasterClipY[var1]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var2; + if (var2 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var1, var4 >> 14, var3 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var28; + var4 += var27; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var1, var4 >> 14, var5 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var5 += var26; + var4 += var27; + var7 += var31; + var1 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + } + } + } + else if (var2 < Rasterizer3D_clipHeight) + { + if (var0 > Rasterizer3D_clipHeight) + { + var0 = Rasterizer3D_clipHeight; + } + + if (var1 > Rasterizer3D_clipHeight) + { + var1 = Rasterizer3D_clipHeight; + } + + var8 = (var8 << 9) - var5 * var30 + var30; + if (var0 < var1) + { + var4 = var5 <<= 14; + if (var2 < 0) + { + var4 -= var27 * var2; + var5 -= var28 * var2; + var8 -= var31 * var2; + var2 = 0; + } + + var3 <<= 14; + if (var0 < 0) + { + var3 -= var0 * var26; + var0 = 0; + } + + var41 = var2 - centerY; + var32 += var34 * var41; + var35 += var37 * var41; + var38 += var40 * var41; + if (var27 < var28) + { + var1 -= var0; + var0 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var2, var4 >> 14, var3 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var4 += var27; + var3 += var26; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var2, var4 >> 14, var5 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var4 += var27; + var5 += var28; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + else + { + var1 -= var0; + var0 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var0; + if (var0 < 0) + { + while (true) + { + --var1; + if (var1 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var2, var3 >> 14, var4 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var4 += var27; + var3 += var26; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var2, var5 >> 14, var4 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var4 += var27; + var5 += var28; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + } + else + { + var3 = var5 <<= 14; + if (var2 < 0) + { + var3 -= var27 * var2; + var5 -= var28 * var2; + var8 -= var31 * var2; + var2 = 0; + } + + var4 <<= 14; + if (var1 < 0) + { + var4 -= var26 * var1; + var1 = 0; + } + + var41 = var2 - centerY; + var32 += var34 * var41; + var35 += var37 * var41; + var38 += var40 * var41; + if (var27 < var28) + { + var0 -= var1; + var1 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var2, var4 >> 14, var5 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var4 += var26; + var5 += var28; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var2, var3 >> 14, var5 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var3 += var27; + var5 += var28; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + else + { + var0 -= var1; + var1 -= var2; + var2 = rasterClipY[var2]; + + while (true) + { + --var1; + if (var1 < 0) + { + while (true) + { + --var0; + if (var0 < 0) + { + return; + } + + method2791(graphicsPixels, var19, 0, 0, var2, var5 >> 14, var4 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var4 += var26; + var5 += var28; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + method2791(graphicsPixels, var19, 0, 0, var2, var5 >> 14, var3 >> 14, var8, var30, var32, var35, var38, var33, var36, var39); + var3 += var27; + var5 += var28; + var8 += var31; + var2 += graphicsPixelsWidth; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + } + } + } + } + } + + + final void method2791(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14) + { + if (rasterClipEnable) + { + if (var6 > rasterClipX) + { + var6 = rasterClipX; + } + + if (var5 < 0) + { + var5 = 0; + } + } + + if (var5 < var6) + { + var4 += var5; + var7 += var5 * var8; + int var17 = var6 - var5; + int var15; + int var16; + int var10000; + int var18; + int var19; + int var20; + int var21; + int var22; + int var23; + if (lowMem) + { + var23 = var5 - centerX; + var9 += var23 * (var12 >> 3); + var10 += (var13 >> 3) * var23; + var11 += var23 * (var14 >> 3); + var22 = var11 >> 12; + if (var22 != 0) + { + var18 = var9 / var22; + var19 = var10 / var22; + if (var18 < 0) + { + var18 = 0; + } + else if (var18 > 4032) + { + var18 = 4032; + } + } + else + { + var18 = 0; + var19 = 0; + } + + var9 += var12; + var10 += var13; + var11 += var14; + var22 = var11 >> 12; + if (var22 != 0) + { + var20 = var9 / var22; + var21 = var10 / var22; + if (var20 < 0) + { + var20 = 0; + } + else if (var20 > 4032) + { + var20 = 4032; + } + } + else + { + var20 = 0; + var21 = 0; + } + + var2 = (var18 << 20) + var19; + var16 = (var21 - var19 >> 3) + (var20 - var18 >> 3 << 20); + var17 >>= 3; + var8 <<= 3; + var15 = var7 >> 8; + if (field1909) + { + if (var17 > 0) + { + do + { + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var10000 = var16 + var2; + var18 = var20; + var19 = var21; + var9 += var12; + var10 += var13; + var11 += var14; + var22 = var11 >> 12; + if (var22 != 0) + { + var20 = var9 / var22; + var21 = var10 / var22; + if (var20 < 0) + { + var20 = 0; + } + else if (var20 > 4032) + { + var20 = 4032; + } + } + else + { + var20 = 0; + var21 = 0; + } + + var2 = (var18 << 20) + var19; + var16 = (var21 - var19 >> 3) + (var20 - var18 >> 3 << 20); + var7 += var8; + var15 = var7 >> 8; + --var17; + } while (var17 > 0); + } + + var17 = var6 - var5 & 7; + if (var17 > 0) + { + do + { + var3 = var1[(var2 >>> 26) + (var2 & 4032)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + --var17; + } while (var17 > 0); + } + } + else + { + if (var17 > 0) + { + do + { + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var10000 = var16 + var2; + var18 = var20; + var19 = var21; + var9 += var12; + var10 += var13; + var11 += var14; + var22 = var11 >> 12; + if (var22 != 0) + { + var20 = var9 / var22; + var21 = var10 / var22; + if (var20 < 0) + { + var20 = 0; + } + else if (var20 > 4032) + { + var20 = 4032; + } + } + else + { + var20 = 0; + var21 = 0; + } + + var2 = (var18 << 20) + var19; + var16 = (var21 - var19 >> 3) + (var20 - var18 >> 3 << 20); + var7 += var8; + var15 = var7 >> 8; + --var17; + } while (var17 > 0); + } + + var17 = var6 - var5 & 7; + if (var17 > 0) + { + do + { + if ((var3 = var1[(var2 >>> 26) + (var2 & 4032)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + --var17; + } while (var17 > 0); + } + } + } + else + { + var23 = var5 - centerX; + var9 += var23 * (var12 >> 3); + var10 += (var13 >> 3) * var23; + var11 += var23 * (var14 >> 3); + var22 = var11 >> 14; + if (var22 != 0) + { + var18 = var9 / var22; + var19 = var10 / var22; + if (var18 < 0) + { + var18 = 0; + } + else if (var18 > 16256) + { + var18 = 16256; + } + } + else + { + var18 = 0; + var19 = 0; + } + + var9 += var12; + var10 += var13; + var11 += var14; + var22 = var11 >> 14; + if (var22 != 0) + { + var20 = var9 / var22; + var21 = var10 / var22; + if (var20 < 0) + { + var20 = 0; + } + else if (var20 > 16256) + { + var20 = 16256; + } + } + else + { + var20 = 0; + var21 = 0; + } + + var2 = (var18 << 18) + var19; + var16 = (var21 - var19 >> 3) + (var20 - var18 >> 3 << 18); + var17 >>= 3; + var8 <<= 3; + var15 = var7 >> 8; + if (field1909) + { + if (var17 > 0) + { + do + { + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var10000 = var16 + var2; + var18 = var20; + var19 = var21; + var9 += var12; + var10 += var13; + var11 += var14; + var22 = var11 >> 14; + if (var22 != 0) + { + var20 = var9 / var22; + var21 = var10 / var22; + if (var20 < 0) + { + var20 = 0; + } + else if (var20 > 16256) + { + var20 = 16256; + } + } + else + { + var20 = 0; + var21 = 0; + } + + var2 = (var18 << 18) + var19; + var16 = (var21 - var19 >> 3) + (var20 - var18 >> 3 << 18); + var7 += var8; + var15 = var7 >> 8; + --var17; + } while (var17 > 0); + } + + var17 = var6 - var5 & 7; + if (var17 > 0) + { + do + { + var3 = var1[(var2 & 16256) + (var2 >>> 25)]; + var0[var4++] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + var2 += var16; + --var17; + } while (var17 > 0); + } + } + else + { + if (var17 > 0) + { + do + { + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var10000 = var16 + var2; + var18 = var20; + var19 = var21; + var9 += var12; + var10 += var13; + var11 += var14; + var22 = var11 >> 14; + if (var22 != 0) + { + var20 = var9 / var22; + var21 = var10 / var22; + if (var20 < 0) + { + var20 = 0; + } + else if (var20 > 16256) + { + var20 = 16256; + } + } + else + { + var20 = 0; + var21 = 0; + } + + var2 = (var18 << 18) + var19; + var16 = (var21 - var19 >> 3) + (var20 - var18 >> 3 << 18); + var7 += var8; + var15 = var7 >> 8; + --var17; + } while (var17 > 0); + } + + var17 = var6 - var5 & 7; + if (var17 > 0) + { + do + { + if ((var3 = var1[(var2 & 16256) + (var2 >>> 25)]) != 0) + { + var0[var4] = (var15 * (var3 & 65280) & 16711680) + ((var3 & 16711935) * var15 & -16711936) >> 8; + } + + ++var4; + var2 += var16; + --var17; + } while (var17 > 0); + } + } + } + + } + } + + static final int method2794(int var0, int var1) + { + var1 = (var0 & 127) * var1 >> 7; + if (var1 < 2) + { + var1 = 2; + } + else if (var1 > 126) + { + var1 = 126; + } + + return (var0 & 65408) + var1; + } +} diff --git a/cache/src/main/java/net/runelite/cache/item/ItemSpriteFactory.java b/cache/src/main/java/net/runelite/cache/item/ItemSpriteFactory.java new file mode 100644 index 0000000000..dc8922535e --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/ItemSpriteFactory.java @@ -0,0 +1,439 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import net.runelite.cache.definitions.ItemDefinition; +import net.runelite.cache.definitions.ModelDefinition; +import net.runelite.cache.definitions.providers.ItemProvider; +import net.runelite.cache.definitions.providers.ModelProvider; +import net.runelite.cache.definitions.providers.SpriteProvider; +import net.runelite.cache.definitions.providers.TextureProvider; +import net.runelite.cache.models.FaceNormal; +import net.runelite.cache.models.VertexNormal; + +public class ItemSpriteFactory +{ + public static final BufferedImage createSprite(ItemProvider itemProvider, ModelProvider modelProvider, + SpriteProvider spriteProvider, TextureProvider textureProvider, + int itemId, int quantity, int border, int shadowColor, + boolean noted) throws IOException + { + Sprite spritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider, + itemId, quantity, border, shadowColor, noted); + return spritePixels == null ? null : spritePixels.toBufferedImage(); + } + + private static final Sprite createSpritePixels(ItemProvider itemProvider, ModelProvider modelProvider, + SpriteProvider spriteProvider, TextureProvider textureProvider, + int itemId, int quantity, int border, int shadowColor, + boolean noted) throws IOException + { + ItemDefinition item = itemProvider.provide(itemId); + + if (quantity > 1 && item.countObj != null) + { + int stackItemID = -1; + + for (int i = 0; i < 10; ++i) + { + if (quantity >= item.countCo[i] && item.countCo[i] != 0) + { + stackItemID = item.countObj[i]; + } + } + + if (stackItemID != -1) + { + item = itemProvider.provide(stackItemID); + } + } + + if (item.notedTemplate != -1) + { + item.updateNote(itemProvider.provide(item.notedTemplate), itemProvider.provide(item.notedID)); + } + + Model itemModel = getModel(modelProvider, item); + if (itemModel == null) + { + return null; + } + + Sprite auxSpritePixels = null; + if (item.notedTemplate != -1) + { + auxSpritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider, + item.notedID, 10, 1, 0, true); + if (auxSpritePixels == null) + { + return null; + } + } + else if (item.boughtTemplateId != -1) + { + auxSpritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider, + item.boughtId, quantity, border, shadowColor, false); + if (auxSpritePixels == null) + { + return null; + } + } + else if (item.placeholderTemplateId != -1) + { + auxSpritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider, + item.placeholderId, quantity, 0, 0, false); + if (auxSpritePixels == null) + { + return null; + } + } + + RSTextureProvider rsTextureProvider = new RSTextureProvider(textureProvider, spriteProvider); + + Sprite spritePixels = new Sprite(36, 32); + Graphics3D graphics = new Graphics3D(rsTextureProvider); + graphics.setBrightness(0.6d); + graphics.setRasterBuffer(spritePixels.pixels, 36, 32); + graphics.reset(); + graphics.setRasterClipping(); + graphics.setOffset(16, 16); + graphics.rasterGouraudLowRes = false; + if (item.placeholderTemplateId != -1) + { + auxSpritePixels.drawAtOn(graphics, 0, 0); + } + + int zoom2d = item.zoom2d; + if (noted) + { + zoom2d = (int) ((double) zoom2d * 1.5D); + } + else if (border == 2) + { + zoom2d = (int) ((double) zoom2d * 1.04D); + } + + int var17 = zoom2d * Graphics3D.SINE[item.xan2d] >> 16; + int var18 = zoom2d * Graphics3D.COSINE[item.xan2d] >> 16; + + itemModel.calculateBoundsCylinder(); + itemModel.rotateAndProject(graphics, 0, + item.yan2d, + item.zan2d, + item.xan2d, + item.xOffset2d, + itemModel.modelHeight / 2 + var17 + item.yOffset2d, + var18 + item.yOffset2d); + if (item.boughtTemplateId != -1) + { + auxSpritePixels.drawAtOn(graphics, 0, 0); + } + + if (border >= 1) + { + spritePixels.drawBorder(1); + } + + if (border >= 2) + { + spritePixels.drawBorder(0xffffff); + } + + if (shadowColor != 0) + { + spritePixels.drawShadow(shadowColor); + } + + graphics.setRasterBuffer(spritePixels.pixels, 36, 32); + if (item.notedTemplate != -1) + { + auxSpritePixels.drawAtOn(graphics, 0, 0); + } + + graphics.setRasterBuffer(graphics.graphicsPixels, + graphics.graphicsPixelsWidth, + graphics.graphicsPixelsHeight); + + graphics.setRasterClipping(); + graphics.rasterGouraudLowRes = true; + return spritePixels; + } + + private static Model getModel(ModelProvider modelProvider, ItemDefinition item) throws IOException + { + Model itemModel; + ModelDefinition inventoryModel = modelProvider.provide(item.inventoryModel); + if (inventoryModel == null) + { + return null; + } + + if (item.resizeX != 128 || item.resizeY != 128 || item.resizeZ != 128) + { + inventoryModel.resize(item.resizeX, item.resizeY, item.resizeZ); + } + + if (item.colorFind != null) + { + for (int i = 0; i < item.colorFind.length; ++i) + { + inventoryModel.recolor(item.colorFind[i], item.colorReplace[i]); + } + } + + if (item.textureFind != null) + { + for (int i = 0; i < item.textureFind.length; ++i) + { + inventoryModel.retexture(item.textureFind[i], item.textureReplace[i]); + } + } + + itemModel = light(inventoryModel, item.ambient + 64, item.contrast + 768, -50, -10, -50); + itemModel.isItemModel = true; + return itemModel; + } + + private static Model light(ModelDefinition def, int ambient, int contrast, int x, int y, int z) + { + def.computeNormals(); + int somethingMagnitude = (int) Math.sqrt((double) (z * z + x * x + y * y)); + int var7 = somethingMagnitude * contrast >> 8; + Model litModel = new Model(); + litModel.field1856 = new int[def.faceCount]; + litModel.field1854 = new int[def.faceCount]; + litModel.field1823 = new int[def.faceCount]; + if (def.textureTriangleCount > 0 && def.textureCoordinates != null) + { + int[] var9 = new int[def.textureTriangleCount]; + + int var10; + for (var10 = 0; var10 < def.faceCount; ++var10) + { + if (def.textureCoordinates[var10] != -1) + { + ++var9[def.textureCoordinates[var10] & 255]; + } + } + + litModel.field1852 = 0; + + for (var10 = 0; var10 < def.textureTriangleCount; ++var10) + { + if (var9[var10] > 0 && def.textureRenderTypes[var10] == 0) + { + ++litModel.field1852; + } + } + + litModel.field1844 = new int[litModel.field1852]; + litModel.field1865 = new int[litModel.field1852]; + litModel.field1846 = new int[litModel.field1852]; + var10 = 0; + + + for (int i = 0; i < def.textureTriangleCount; ++i) + { + if (var9[i] > 0 && def.textureRenderTypes[i] == 0) + { + litModel.field1844[var10] = def.textureTriangleVertexIndices1[i] & '\uffff'; + litModel.field1865[var10] = def.textureTriangleVertexIndices2[i] & '\uffff'; + litModel.field1846[var10] = def.textureTriangleVertexIndices3[i] & '\uffff'; + var9[i] = var10++; + } + else + { + var9[i] = -1; + } + } + + litModel.field1840 = new byte[def.faceCount]; + + for (int i = 0; i < def.faceCount; ++i) + { + if (def.textureCoordinates[i] != -1) + { + litModel.field1840[i] = (byte) var9[def.textureCoordinates[i] & 255]; + } + else + { + litModel.field1840[i] = -1; + } + } + } + + for (int faceIdx = 0; faceIdx < def.faceCount; ++faceIdx) + { + byte faceType; + if (def.faceRenderTypes == null) + { + faceType = 0; + } + else + { + faceType = def.faceRenderTypes[faceIdx]; + } + + byte faceAlpha; + if (def.faceAlphas == null) + { + faceAlpha = 0; + } + else + { + faceAlpha = def.faceAlphas[faceIdx]; + } + + short faceTexture; + if (def.faceTextures == null) + { + faceTexture = -1; + } + else + { + faceTexture = def.faceTextures[faceIdx]; + } + + if (faceAlpha == -2) + { + faceType = 3; + } + + if (faceAlpha == -1) + { + faceType = 2; + } + + VertexNormal vertexNormal; + int tmp; + FaceNormal faceNormal; + if (faceTexture == -1) + { + if (faceType != 0) + { + if (faceType == 1) + { + faceNormal = def.faceNormals[faceIdx]; + tmp = (y * faceNormal.y + z * faceNormal.z + x * faceNormal.x) / (var7 / 2 + var7) + ambient; + litModel.field1856[faceIdx] = method2608(def.faceColors[faceIdx] & '\uffff', tmp); + litModel.field1823[faceIdx] = -1; + } + else if (faceType == 3) + { + litModel.field1856[faceIdx] = 128; + litModel.field1823[faceIdx] = -1; + } + else + { + litModel.field1823[faceIdx] = -2; + } + } + else + { + int var15 = def.faceColors[faceIdx] & '\uffff'; + vertexNormal = def.vertexNormals[def.faceVertexIndices1[faceIdx]]; + + tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient; + litModel.field1856[faceIdx] = method2608(var15, tmp); + vertexNormal = def.vertexNormals[def.faceVertexIndices2[faceIdx]]; + + tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient; + litModel.field1854[faceIdx] = method2608(var15, tmp); + vertexNormal = def.vertexNormals[def.faceVertexIndices3[faceIdx]]; + + tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient; + litModel.field1823[faceIdx] = method2608(var15, tmp); + } + } + else if (faceType != 0) + { + if (faceType == 1) + { + faceNormal = def.faceNormals[faceIdx]; + tmp = (y * faceNormal.y + z * faceNormal.z + x * faceNormal.x) / (var7 / 2 + var7) + ambient; + litModel.field1856[faceIdx] = bound2to126(tmp); + litModel.field1823[faceIdx] = -1; + } + else + { + litModel.field1823[faceIdx] = -2; + } + } + else + { + vertexNormal = def.vertexNormals[def.faceVertexIndices1[faceIdx]]; + + tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient; + litModel.field1856[faceIdx] = bound2to126(tmp); + vertexNormal = def.vertexNormals[def.faceVertexIndices2[faceIdx]]; + + tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient; + litModel.field1854[faceIdx] = bound2to126(tmp); + vertexNormal = def.vertexNormals[def.faceVertexIndices3[faceIdx]]; + + tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient; + litModel.field1823[faceIdx] = bound2to126(tmp); + } + } + + litModel.verticesCount = def.vertexCount; + litModel.verticesX = def.vertexPositionsX; + litModel.verticesY = def.vertexPositionsY; + litModel.verticesZ = def.vertexPositionsZ; + litModel.indicesCount = def.faceCount; + litModel.indices1 = def.faceVertexIndices1; + litModel.indices2 = def.faceVertexIndices2; + litModel.indices3 = def.faceVertexIndices3; + litModel.field1838 = def.faceRenderPriorities; + litModel.field1882 = def.faceAlphas; + litModel.field1842 = def.priority; + litModel.field1841 = def.faceTextures; + return litModel; + } + + static final int method2608(int var0, int var1) + { + var1 = ((var0 & 127) * var1) >> 7; + var1 = bound2to126(var1); + + return (var0 & 65408) + var1; + } + + static final int bound2to126(int var0) + { + if (var0 < 2) + { + var0 = 2; + } + else if (var0 > 126) + { + var0 = 126; + } + + return var0; + } +} diff --git a/cache/src/main/java/net/runelite/cache/item/Model.java b/cache/src/main/java/net/runelite/cache/item/Model.java new file mode 100644 index 0000000000..e35943acfb --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/Model.java @@ -0,0 +1,773 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +class Model extends Renderable +{ + boolean[] field1887 = new boolean[4700]; + boolean[] field1885 = new boolean[4700]; + int[] modelViewportYs = new int[4700]; + int[] modelViewportXs = new int[4700]; + int[] modelViewportZs = new int[4700]; + int[] yViewportBuffer = new int[4700]; + int[] field1839 = new int[4700]; + int[] field1869 = new int[4700]; + int[] field1871 = new int[1600]; + int[][] field1868 = new int[1600][512]; + int[] field1872 = new int[12]; + int[][] field1874 = new int[12][2000]; + int[] field1857 = new int[2000]; + int[] field1863 = new int[2000]; + int[] field1877 = new int[12]; + int[] field1831 = new int[10]; + int[] field1837 = new int[10]; + int[] xViewportBuffer = new int[10]; + static int[] Model_sine; + static int[] Model_cosine; + static int[] field1890; + int verticesCount; + int[] verticesX; + int[] verticesY; + int[] verticesZ; + int indicesCount; + int[] indices1; + int[] indices2; + int[] indices3; + int[] field1856; + int[] field1854; + int[] field1823; + byte[] field1838; + byte[] field1882; + byte[] field1840; + short[] field1841; + byte field1842; + int field1852; + int[] field1844; + int[] field1865; + int[] field1846; + public boolean isItemModel; + int boundsType; + int bottomY; + int XYZMag; + int diameter; + int radius; + public int extremeX; + public int extremeY; + public int extremeZ; + + static + { + Model_sine = Graphics3D.SINE; + Model_cosine = Graphics3D.COSINE; + field1890 = Graphics3D.field1933; + } + + Model() + { + this.verticesCount = 0; + this.indicesCount = 0; + this.field1842 = 0; + this.field1852 = 0; + this.isItemModel = false; + this.extremeX = -1; + this.extremeY = -1; + this.extremeZ = -1; + } + + public void calculateBoundsCylinder() + { + if (this.boundsType != 1) + { + this.boundsType = 1; + super.modelHeight = 0; + this.bottomY = 0; + this.XYZMag = 0; + + for (int var1 = 0; var1 < this.verticesCount; ++var1) + { + int var2 = this.verticesX[var1]; + int var3 = this.verticesY[var1]; + int var4 = this.verticesZ[var1]; + if (-var3 > super.modelHeight) + { + super.modelHeight = -var3; + } + + if (var3 > this.bottomY) + { + this.bottomY = var3; + } + + int var5 = var2 * var2 + var4 * var4; + if (var5 > this.XYZMag) + { + this.XYZMag = var5; + } + } + + this.XYZMag = (int) (Math.sqrt((double) this.XYZMag) + 0.99D); + this.radius = (int) (Math.sqrt((double) (this.XYZMag * this.XYZMag + super.modelHeight * super.modelHeight)) + 0.99D); + this.diameter = this.radius + (int) (Math.sqrt((double) (this.XYZMag * this.XYZMag + this.bottomY * this.bottomY)) + 0.99D); + } + } + + public final void rotateAndProject(Graphics3D graphics, int rotation_1, int yRotation, int zRotation, int xRotation, int xOffset, int yOffset, int zOffset) + { + field1871[0] = -1; + // (re?)Calculate magnitude as necessary + if (this.boundsType != 2 && this.boundsType != 1) + { + this.boundsType = 2; + this.XYZMag = 0; + + for (int var1 = 0; var1 < this.verticesCount; ++var1) + { + int x = this.verticesX[var1]; + int y = this.verticesY[var1]; + int z = this.verticesZ[var1]; + int magnitude_squared = x * x + z * z + y * y; + if (magnitude_squared > this.XYZMag) + { + this.XYZMag = magnitude_squared; + } + } + + this.XYZMag = (int) (Math.sqrt((double) this.XYZMag) + 0.99D); + this.radius = this.XYZMag; + this.diameter = this.XYZMag + this.XYZMag; + } + + // rotate + perspective transform + int sinX = Model_sine[xRotation]; + int cosX = Model_cosine[xRotation]; + int zRelatedVariable = sinX * yOffset + cosX * zOffset >> 16; + + for (int i = 0; i < this.verticesCount; ++i) + { + int x = this.verticesX[i]; + int y = this.verticesY[i]; + int z = this.verticesZ[i]; + if (zRotation != 0) + { + int sinZ = Model_sine[zRotation]; + int cosZ = Model_cosine[zRotation]; + int tmp; + tmp = y * sinZ + x * cosZ >> 16; + y = y * cosZ - x * sinZ >> 16; + x = tmp; + } + + if (rotation_1 != 0) + { + int sinR1 = Model_sine[rotation_1]; + int cosR1 = Model_cosine[rotation_1]; + int tmp; + tmp = y * cosR1 - z * sinR1 >> 16; + z = y * sinR1 + z * cosR1 >> 16; + y = tmp; + } + + if (yRotation != 0) + { + int sinY = Model_sine[yRotation]; + int cosY = Model_cosine[yRotation]; + int tmp; + tmp = z * sinY + x * cosY >> 16; + z = z * cosY - x * sinY >> 16; + x = tmp; + } + + x += xOffset; + y += yOffset; + z += zOffset; + int tmp = y * cosX - z * sinX >> 16; + z = y * sinX + z * cosX >> 16; + modelViewportZs[i] = z - zRelatedVariable; + modelViewportYs[i] = x * graphics.Rasterizer3D_zoom / z + graphics.centerX; + modelViewportXs[i] = tmp * graphics.Rasterizer3D_zoom / z + graphics.centerY; + if (this.field1852 > 0) + { + yViewportBuffer[i] = x; + field1839[i] = tmp; + field1869[i] = z; + } + } + + this.method0(graphics, false, false, 0); + } + + + private void method0(Graphics3D graphics, boolean var1, boolean var3, int var4) + { + if (this.diameter < 1600) + { + for (int var5 = 0; var5 < this.diameter; ++var5) + { + field1871[var5] = 0; + } + + int var7; + int var9; + int var10; + int var11; + int var12; + int var13; + int var14; + int var15; + int var16; + int var17; + int var18; + int var19; + int var20; + int var27; + + int var26; + for (var26 = 0; var26 < this.indicesCount; ++var26) + { + if (this.field1823[var26] != -2) + { + var7 = this.indices1[var26]; + var27 = this.indices2[var26]; + var9 = this.indices3[var26]; + var10 = modelViewportYs[var7]; + var11 = modelViewportYs[var27]; + var12 = modelViewportYs[var9]; + if (var1 && (var10 == -5000 || var11 == -5000 || var12 == -5000)) + { + var13 = yViewportBuffer[var7]; + var14 = yViewportBuffer[var27]; + var15 = yViewportBuffer[var9]; + var16 = field1839[var7]; + var17 = field1839[var27]; + var18 = field1839[var9]; + var19 = field1869[var7]; + var20 = field1869[var27]; + int var21 = field1869[var9]; + var13 -= var14; + var15 -= var14; + var16 -= var17; + var18 -= var17; + var19 -= var20; + var21 -= var20; + int var22 = var16 * var21 - var19 * var18; + int var23 = var19 * var15 - var13 * var21; + int var24 = var13 * var18 - var16 * var15; + if (var14 * var22 + var17 * var23 + var20 * var24 > 0) + { + field1885[var26] = true; + int var25 = (modelViewportZs[var7] + modelViewportZs[var27] + modelViewportZs[var9]) / 3 + this.radius; + field1868[var25][field1871[var25]++] = var26; + } + } + else + { + if ((var10 - var11) * (modelViewportXs[var9] - modelViewportXs[var27]) - (var12 - var11) * (modelViewportXs[var7] - modelViewportXs[var27]) > 0) + { + field1885[var26] = false; + if (var10 >= 0 && var11 >= 0 && var12 >= 0 && var10 <= graphics.rasterClipX && var11 <= graphics.rasterClipX && var12 <= graphics.rasterClipX) + { + field1887[var26] = false; + } + else + { + field1887[var26] = true; + } + + var13 = (modelViewportZs[var7] + modelViewportZs[var27] + modelViewportZs[var9]) / 3 + this.radius; + field1868[var13][field1871[var13]++] = var26; + } + } + } + } + + int[] var8; + if (this.field1838 == null) + { + for (var26 = this.diameter - 1; var26 >= 0; --var26) + { + var7 = field1871[var26]; + if (var7 > 0) + { + var8 = field1868[var26]; + + for (var9 = 0; var9 < var7; ++var9) + { + this.method2706(graphics, var8[var9]); + } + } + } + + } + else + { + for (var26 = 0; var26 < 12; ++var26) + { + field1872[var26] = 0; + field1877[var26] = 0; + } + + for (var26 = this.diameter - 1; var26 >= 0; --var26) + { + var7 = field1871[var26]; + if (var7 > 0) + { + var8 = field1868[var26]; + + for (var9 = 0; var9 < var7; ++var9) + { + var10 = var8[var9]; + byte var31 = this.field1838[var10]; + var12 = field1872[var31]++; + field1874[var31][var12] = var10; + if (var31 < 10) + { + field1877[var31] += var26; + } + else if (var31 == 10) + { + field1857[var12] = var26; + } + else + { + field1863[var12] = var26; + } + } + } + } + + var26 = 0; + if (field1872[1] > 0 || field1872[2] > 0) + { + var26 = (field1877[1] + field1877[2]) / (field1872[1] + field1872[2]); + } + + var7 = 0; + if (field1872[3] > 0 || field1872[4] > 0) + { + var7 = (field1877[3] + field1877[4]) / (field1872[3] + field1872[4]); + } + + var27 = 0; + if (field1872[6] > 0 || field1872[8] > 0) + { + var27 = (field1877[8] + field1877[6]) / (field1872[8] + field1872[6]); + } + + var10 = 0; + var11 = field1872[10]; + int[] var28 = field1874[10]; + int[] var29 = field1857; + if (var10 == var11) + { + var10 = 0; + var11 = field1872[11]; + var28 = field1874[11]; + var29 = field1863; + } + + if (var10 < var11) + { + var9 = var29[var10]; + } + else + { + var9 = -1000; + } + + for (var14 = 0; var14 < 10; ++var14) + { + while (var14 == 0 && var9 > var26) + { + this.method2706(graphics, var28[var10++]); + if (var10 == var11 && var28 != field1874[11]) + { + var10 = 0; + var11 = field1872[11]; + var28 = field1874[11]; + var29 = field1863; + } + + if (var10 < var11) + { + var9 = var29[var10]; + } + else + { + var9 = -1000; + } + } + + while (var14 == 3 && var9 > var7) + { + this.method2706(graphics, var28[var10++]); + if (var10 == var11 && var28 != field1874[11]) + { + var10 = 0; + var11 = field1872[11]; + var28 = field1874[11]; + var29 = field1863; + } + + if (var10 < var11) + { + var9 = var29[var10]; + } + else + { + var9 = -1000; + } + } + + while (var14 == 5 && var9 > var27) + { + this.method2706(graphics, var28[var10++]); + if (var10 == var11 && var28 != field1874[11]) + { + var10 = 0; + var11 = field1872[11]; + var28 = field1874[11]; + var29 = field1863; + } + + if (var10 < var11) + { + var9 = var29[var10]; + } + else + { + var9 = -1000; + } + } + + var15 = field1872[var14]; + int[] var30 = field1874[var14]; + + for (var17 = 0; var17 < var15; ++var17) + { + this.method2706(graphics, var30[var17]); + } + } + + while (var9 != -1000) + { + this.method2706(graphics, var28[var10++]); + if (var10 == var11 && var28 != field1874[11]) + { + var10 = 0; + var28 = field1874[11]; + var11 = field1872[11]; + var29 = field1863; + } + + if (var10 < var11) + { + var9 = var29[var10]; + } + else + { + var9 = -1000; + } + } + + } + } + } + + private void method2706(Graphics3D graphics, int var1) + { + if (field1885[var1]) + { + this.method2707(graphics, var1); + } + else + { + int var2 = this.indices1[var1]; + int var3 = this.indices2[var1]; + int var4 = this.indices3[var1]; + graphics.rasterClipEnable = field1887[var1]; + if (this.field1882 == null) + { + graphics.rasterAlpha = 0; + } + else + { + graphics.rasterAlpha = this.field1882[var1] & 255; + } + + if (this.field1841 != null && this.field1841[var1] != -1) + { + int var5; + int var6; + int var7; + if (this.field1840 != null && this.field1840[var1] != -1) + { + int var8 = this.field1840[var1] & 255; + var5 = this.field1844[var8]; + var6 = this.field1865[var8]; + var7 = this.field1846[var8]; + } + else + { + var5 = var2; + var6 = var3; + var7 = var4; + } + + if (this.field1823[var1] == -1) + { + graphics.rasterTextureAffine(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var5], yViewportBuffer[var6], yViewportBuffer[var7], field1839[var5], field1839[var6], field1839[var7], field1869[var5], field1869[var6], field1869[var7], this.field1841[var1]); + } + else + { + graphics.rasterTextureAffine(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], this.field1856[var1], this.field1854[var1], this.field1823[var1], yViewportBuffer[var5], yViewportBuffer[var6], yViewportBuffer[var7], field1839[var5], field1839[var6], field1839[var7], field1869[var5], field1869[var6], field1869[var7], this.field1841[var1]); + } + } + else if (this.field1823[var1] == -1) + { + int[] field1889 = graphics.colorPalette; + graphics.rasterFlat(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], field1889[this.field1856[var1]]); + } + else + { + graphics.rasterGouraud(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], this.field1856[var1], this.field1854[var1], this.field1823[var1]); + } + + } + } + + + private void method2707(Graphics3D graphics, int var1) + { + int var2 = graphics.centerX; + int var3 = graphics.centerY; + int var4 = 0; + int var5 = this.indices1[var1]; + int var6 = this.indices2[var1]; + int var7 = this.indices3[var1]; + int var8 = field1869[var5]; + int var9 = field1869[var6]; + int var10 = field1869[var7]; + if (this.field1882 == null) + { + graphics.rasterAlpha = 0; + } + else + { + graphics.rasterAlpha = this.field1882[var1] & 255; + } + + int var11; + int var12; + int var13; + int var14; + if (var8 >= 50) + { + field1831[var4] = modelViewportYs[var5]; + field1837[var4] = modelViewportXs[var5]; + xViewportBuffer[var4++] = this.field1856[var1]; + } + else + { + var11 = yViewportBuffer[var5]; + var12 = field1839[var5]; + var13 = this.field1856[var1]; + if (var10 >= 50) + { + var14 = field1890[var10 - var8] * (50 - var8); + field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var7] - var11) * var14 >> 16)) / 50; + field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var7] - var12) * var14 >> 16)) / 50; + xViewportBuffer[var4++] = var13 + ((this.field1823[var1] - var13) * var14 >> 16); + } + + if (var9 >= 50) + { + var14 = field1890[var9 - var8] * (50 - var8); + field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var6] - var11) * var14 >> 16)) / 50; + field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var6] - var12) * var14 >> 16)) / 50; + xViewportBuffer[var4++] = var13 + ((this.field1854[var1] - var13) * var14 >> 16); + } + } + + if (var9 >= 50) + { + field1831[var4] = modelViewportYs[var6]; + field1837[var4] = modelViewportXs[var6]; + xViewportBuffer[var4++] = this.field1854[var1]; + } + else + { + var11 = yViewportBuffer[var6]; + var12 = field1839[var6]; + var13 = this.field1854[var1]; + if (var8 >= 50) + { + var14 = field1890[var8 - var9] * (50 - var9); + field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var5] - var11) * var14 >> 16)) / 50; + field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var5] - var12) * var14 >> 16)) / 50; + xViewportBuffer[var4++] = var13 + ((this.field1856[var1] - var13) * var14 >> 16); + } + + if (var10 >= 50) + { + var14 = field1890[var10 - var9] * (50 - var9); + field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var7] - var11) * var14 >> 16)) / 50; + field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var7] - var12) * var14 >> 16)) / 50; + xViewportBuffer[var4++] = var13 + ((this.field1823[var1] - var13) * var14 >> 16); + } + } + + if (var10 >= 50) + { + field1831[var4] = modelViewportYs[var7]; + field1837[var4] = modelViewportXs[var7]; + xViewportBuffer[var4++] = this.field1823[var1]; + } + else + { + var11 = yViewportBuffer[var7]; + var12 = field1839[var7]; + var13 = this.field1823[var1]; + if (var9 >= 50) + { + var14 = field1890[var9 - var10] * (50 - var10); + field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var6] - var11) * var14 >> 16)) / 50; + field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var6] - var12) * var14 >> 16)) / 50; + xViewportBuffer[var4++] = var13 + ((this.field1854[var1] - var13) * var14 >> 16); + } + + if (var8 >= 50) + { + var14 = field1890[var8 - var10] * (50 - var10); + field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var5] - var11) * var14 >> 16)) / 50; + field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var5] - var12) * var14 >> 16)) / 50; + xViewportBuffer[var4++] = var13 + ((this.field1856[var1] - var13) * var14 >> 16); + } + } + + var11 = field1831[0]; + var12 = field1831[1]; + var13 = field1831[2]; + var14 = field1837[0]; + int var15 = field1837[1]; + int var16 = field1837[2]; + graphics.rasterClipEnable = false; + int var17; + int var18; + int var19; + int var20; + if (var4 == 3) + { + if (var11 < 0 || var12 < 0 || var13 < 0 || var11 > graphics.rasterClipX || var12 > graphics.rasterClipX || var13 > graphics.rasterClipX) + { + graphics.rasterClipEnable = true; + } + + if (this.field1841 != null && this.field1841[var1] != -1) + { + if (this.field1840 != null && this.field1840[var1] != -1) + { + var20 = this.field1840[var1] & 255; + var17 = this.field1844[var20]; + var18 = this.field1865[var20]; + var19 = this.field1846[var20]; + } + else + { + var17 = var5; + var18 = var6; + var19 = var7; + } + + if (this.field1823[var1] == -1) + { + graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], this.field1841[var1]); + } + else + { + graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], this.field1841[var1]); + } + } + else if (this.field1823[var1] == -1) + { + int[] field1889 = graphics.colorPalette; + graphics.rasterFlat(var14, var15, var16, var11, var12, var13, field1889[this.field1856[var1]]); + } + else + { + graphics.rasterGouraud(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2]); + } + } + + if (var4 == 4) + { + if (var11 < 0 || var12 < 0 || var13 < 0 || var11 > graphics.rasterClipX || var12 > graphics.rasterClipX || var13 > graphics.rasterClipX || field1831[3] < 0 || field1831[3] > graphics.rasterClipX) + { + graphics.rasterClipEnable = true; + } + + if (this.field1841 != null && this.field1841[var1] != -1) + { + if (this.field1840 != null && this.field1840[var1] != -1) + { + var20 = this.field1840[var1] & 255; + var17 = this.field1844[var20]; + var18 = this.field1865[var20]; + var19 = this.field1846[var20]; + } + else + { + var17 = var5; + var18 = var6; + var19 = var7; + } + + short var21 = this.field1841[var1]; + if (this.field1823[var1] == -1) + { + graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21); + graphics.rasterTextureAffine(var14, var16, field1837[3], var11, var13, field1831[3], this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21); + } + else + { + graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21); + graphics.rasterTextureAffine(var14, var16, field1837[3], var11, var13, field1831[3], xViewportBuffer[0], xViewportBuffer[2], xViewportBuffer[3], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21); + } + } + else if (this.field1823[var1] == -1) + { + int[] field1889 = graphics.colorPalette; + var17 = field1889[this.field1856[var1]]; + graphics.rasterFlat(var14, var15, var16, var11, var12, var13, var17); + graphics.rasterFlat(var14, var16, field1837[3], var11, var13, field1831[3], var17); + } + else + { + graphics.rasterGouraud(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2]); + graphics.rasterGouraud(var14, var16, field1837[3], var11, var13, field1831[3], xViewportBuffer[0], xViewportBuffer[2], xViewportBuffer[3]); + } + } + + } +} \ No newline at end of file diff --git a/cache/src/main/java/net/runelite/cache/item/RSTextureProvider.java b/cache/src/main/java/net/runelite/cache/item/RSTextureProvider.java new file mode 100644 index 0000000000..a38f14dce3 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/RSTextureProvider.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +import net.runelite.cache.definitions.TextureDefinition; +import net.runelite.cache.definitions.providers.SpriteProvider; +import net.runelite.cache.definitions.providers.TextureProvider; + +public class RSTextureProvider +{ + private final SpriteProvider spriteProvider; + TextureDefinition[] textures; + int maxSize; + int size; + double brightness; + int width; + + public RSTextureProvider(TextureProvider textureProvider, SpriteProvider spriteProvider) + { + this.spriteProvider = spriteProvider; + this.size = 0; + this.brightness = 1.0D; + this.width = 128; + this.maxSize = 20; + this.size = this.maxSize; + this.brightness = 0.8D; + this.width = 128; + + int max = -1; + for (TextureDefinition textureDefinition : textureProvider.provide()) + { + if (textureDefinition.getId() > max) + { + max = textureDefinition.getId(); + } + } + + textures = new TextureDefinition[max + 1]; + for (TextureDefinition textureDefinition : textureProvider.provide()) + { + textures[textureDefinition.getId()] = textureDefinition; + } + } + + public int[] load(int var1) + { + TextureDefinition var2 = this.textures[var1]; + if (var2 != null) + { + if (var2.pixels != null) + { + return var2.pixels; + } + + boolean var3 = var2.method2680(this.brightness, this.width, spriteProvider); + return var2.pixels; + } + + return null; + } + + + public int getAverageTextureRGB(int var1) + { + return this.textures[var1] != null ? this.textures[var1].field1777 : 0; + } + + + public boolean vmethod3057(int var1) + { + return this.textures[var1].field1778; + } + + + public boolean vmethod3066(int var1) + { + return this.width == 64; + } +} diff --git a/cache/src/main/java/net/runelite/cache/item/Rasterizer2D.java b/cache/src/main/java/net/runelite/cache/item/Rasterizer2D.java new file mode 100644 index 0000000000..b3d03fdd61 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/Rasterizer2D.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +class Rasterizer2D +{ + public int[] graphicsPixels; + public int graphicsPixelsWidth; + public int graphicsPixelsHeight; + public int drawingAreaTop; + public int drawingAreaBottom; + public int draw_region_x; + protected int drawingAreaRight; + + public void setRasterBuffer(int[] var0, int var1, int var2) + { + graphicsPixels = var0; + graphicsPixelsWidth = var1; + graphicsPixelsHeight = var2; + setDrawRegion(0, 0, var1, var2); + } + + public void setDrawRegion(int var0, int var1, int var2, int var3) + { + if (var0 < 0) + { + var0 = 0; + } + + if (var1 < 0) + { + var1 = 0; + } + + if (var2 > graphicsPixelsWidth) + { + var2 = graphicsPixelsWidth; + } + + if (var3 > graphicsPixelsHeight) + { + var3 = graphicsPixelsHeight; + } + + draw_region_x = var0; + drawingAreaTop = var1; + drawingAreaRight = var2; + drawingAreaBottom = var3; + } + + public void reset() + { + int var0 = 0; + + int var1; + for (var1 = graphicsPixelsWidth * graphicsPixelsHeight - 7; var0 < var1; graphicsPixels[var0++] = 0) + { + graphicsPixels[var0++] = 0; + graphicsPixels[var0++] = 0; + graphicsPixels[var0++] = 0; + graphicsPixels[var0++] = 0; + graphicsPixels[var0++] = 0; + graphicsPixels[var0++] = 0; + graphicsPixels[var0++] = 0; + } + + for (var1 += 7; var0 < var1; graphicsPixels[var0++] = 0) + { + ; + } + + } + +} \ No newline at end of file diff --git a/cache/src/main/java/net/runelite/cache/item/Renderable.java b/cache/src/main/java/net/runelite/cache/item/Renderable.java new file mode 100644 index 0000000000..e1ef1b427a --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/Renderable.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +abstract class Renderable +{ + public int modelHeight; + + protected Renderable() + { + this.modelHeight = 1000; + } +} diff --git a/cache/src/main/java/net/runelite/cache/item/SpritePixels.java b/cache/src/main/java/net/runelite/cache/item/SpritePixels.java new file mode 100644 index 0000000000..ed8be85a18 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/item/SpritePixels.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +import java.awt.image.BufferedImage; + +class Sprite +{ + public int[] pixels; + public int width; + public int height; + public int offsetX; + int offsetY; + + public Sprite(int[] var1, int var2, int var3) + { + this.pixels = var1; + this.width = var2; + this.height = var3; + this.offsetY = 0; + this.offsetX = 0; + } + + public Sprite(int var1, int var2) + { + this(new int[var2 * var1], var1, var2); + } + + public void drawBorder(int color) + { + int[] newPixels = new int[this.width * this.height]; + int pixelIndex = 0; + + for (int y = 0; y < this.height; ++y) + { + for (int x = 0; x < this.width; ++x) + { + int pixel = this.pixels[pixelIndex]; + if (pixel == 0) + { + // W + if (x > 0 && this.pixels[pixelIndex - 1] != 0) + { + pixel = color; + } + // N + else if (y > 0 && this.pixels[pixelIndex - this.width] != 0) + { + pixel = color; + } + // E + else if (x < this.width - 1 && this.pixels[pixelIndex + 1] != 0) + { + pixel = color; + } + // S + else if (y < this.height - 1 && this.pixels[pixelIndex + this.width] != 0) + { + pixel = color; + } + } + + newPixels[pixelIndex++] = pixel; + } + } + + this.pixels = newPixels; + } + + + public void drawShadow(int color) + { + for (int y = this.height - 1; y > 0; --y) + { + int rowOffset = y * this.width; + + for (int x = this.width - 1; x > 0; --x) + { + // if *this* pixel is black/unset AND the pixel to the NW isn't black/unset + if (this.pixels[x + rowOffset] == 0 && this.pixels[x + rowOffset - 1 - this.width] != 0) + { + this.pixels[x + rowOffset] = color; + } + } + } + + } + + public void drawAtOn(Rasterizer2D graphics, int x, int y) + { + x += this.offsetX; + y += this.offsetY; + int pixelIndex = x + y * graphics.graphicsPixelsWidth; + int deltaIndex = 0; + int height = this.height; + int width = this.width; + int var7 = graphics.graphicsPixelsWidth - width; + int var8 = 0; + if (y < graphics.drawingAreaTop) + { + int deltaY = graphics.drawingAreaTop - y; + height -= deltaY; + y = graphics.drawingAreaTop; + deltaIndex += deltaY * width; + pixelIndex += deltaY * graphics.graphicsPixelsWidth; + } + + if (height + y > graphics.drawingAreaBottom) + { + height -= height + y - graphics.drawingAreaBottom; + } + + if (x < graphics.draw_region_x) + { + int deltaX = graphics.draw_region_x - x; + width -= deltaX; + x = graphics.draw_region_x; + deltaIndex += deltaX; + pixelIndex += deltaX; + var8 += deltaX; + var7 += deltaX; + } + + if (width + x > graphics.drawingAreaRight) + { + int deltaX = width + x - graphics.drawingAreaRight; + width -= deltaX; + var8 += deltaX; + var7 += deltaX; + } + + if (width > 0 && height > 0) + { + method5843(graphics.graphicsPixels, this.pixels, 0, deltaIndex, pixelIndex, width, height, var7, var8); + } + } + + static void method5843(int[] rasterizerPixels, int[] spritePixels, int var2, int var3, int pixelIndex, int width, int height, int var7, int var8) + { + int var9 = -(width >> 2); + width = -(width & 3); + + for (int var10 = -height; var10 < 0; ++var10) + { + for (int i = var9 * 4; i < 0; ++i) + { + var2 = spritePixels[var3++]; + if (var2 != 0) + { + rasterizerPixels[pixelIndex++] = var2; + } + else + { + ++pixelIndex; + } + } + + for (int i = width; i < 0; ++i) + { + var2 = spritePixels[var3++]; + if (var2 != 0) + { + rasterizerPixels[pixelIndex++] = var2; + } + else + { + ++pixelIndex; + } + } + + pixelIndex += var7; + var3 += var8; + } + + } + + public BufferedImage toBufferedImage() + { + int[] transPixels = new int[pixels.length]; + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + + for (int i = 0; i < pixels.length; i++) + { + if (pixels[i] != 0) + { + transPixels[i] = pixels[i] | 0xff000000; + } + } + + img.setRGB(0, 0, width, height, transPixels, 0, width); + return img; + } + +} diff --git a/cache/src/main/java/net/runelite/cache/models/CircularAngle.java b/cache/src/main/java/net/runelite/cache/models/CircularAngle.java new file mode 100644 index 0000000000..b93f1eec5c --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/models/CircularAngle.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.models; + +public class CircularAngle +{ + private static final double UNIT = Math.PI / 1024d; // How much of the circle each unit of SINE/COSINE is + + public static final int[] SINE = new int[2048]; // sine angles for each of the 2048 units, * 65536 and stored as an int + public static final int[] COSINE = new int[2048]; // cosine + + static + { + for (int i = 0; i < 2048; ++i) + { + SINE[i] = (int) (65536.0D * Math.sin((double) i * UNIT)); + COSINE[i] = (int) (65536.0D * Math.cos((double) i * UNIT)); + } + } +} diff --git a/cache/src/main/java/net/runelite/cache/models/FaceNormal.java b/cache/src/main/java/net/runelite/cache/models/FaceNormal.java new file mode 100644 index 0000000000..387db6a335 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/models/FaceNormal.java @@ -0,0 +1,8 @@ +package net.runelite.cache.models; + +public class FaceNormal +{ + public int x; + public int y; + public int z; +} diff --git a/cache/src/main/java/net/runelite/cache/models/ObjExporter.java b/cache/src/main/java/net/runelite/cache/models/ObjExporter.java new file mode 100644 index 0000000000..8913610177 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/models/ObjExporter.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.models; + +import java.awt.Color; +import java.io.PrintWriter; +import net.runelite.cache.TextureManager; +import net.runelite.cache.definitions.ModelDefinition; +import net.runelite.cache.definitions.TextureDefinition; + +public class ObjExporter +{ + private final TextureManager textureManager; + private final ModelDefinition model; + + public ObjExporter(TextureManager textureManager, ModelDefinition model) + { + this.textureManager = textureManager; + this.model = model; + } + + public void export(PrintWriter objWriter, PrintWriter mtlWriter) + { + model.computeNormals(); + model.computeTextureUVCoordinates(); + + objWriter.println("mtllib " + model.id + ".mtl"); + + objWriter.println("o runescapemodel"); + + for (int i = 0; i < model.vertexCount; ++i) + { + objWriter.println("v " + model.vertexPositionsX[i] + " " + + model.vertexPositionsY[i] * -1 + " " + + model.vertexPositionsZ[i] * -1); + } + + if (model.faceTextures != null) + { + float[][] u = model.faceTextureUCoordinates; + float[][] v = model.faceTextureVCoordinates; + + for (int i = 0; i < model.faceCount; ++i) + { + objWriter.println("vt " + u[i][0] + " " + v[i][0]); + objWriter.println("vt " + u[i][1] + " " + v[i][1]); + objWriter.println("vt " + u[i][2] + " " + v[i][2]); + } + } + + for (VertexNormal normal : model.vertexNormals) + { + objWriter.println("vn " + normal.x + " " + normal.y + " " + normal.z); + } + + for (int i = 0; i < model.faceCount; ++i) + { + int x = model.faceVertexIndices1[i] + 1; + int y = model.faceVertexIndices2[i] + 1; + int z = model.faceVertexIndices3[i] + 1; + + objWriter.println("usemtl m" + i); + if (model.faceTextures != null) + { + objWriter.println("f " + + x + "/" + (i * 3 + 1) + " " + + y + "/" + (i * 3 + 2) + " " + + z + "/" + (i * 3 + 3)); + + } + else + { + objWriter.println("f " + x + " " + y + " " + z); + } + objWriter.println(""); + } + + // Write material + for (int i = 0; i < model.faceCount; ++i) + { + short textureId = -1; + + if (model.faceTextures != null) + { + textureId = model.faceTextures[i]; + } + + mtlWriter.println("newmtl m" + i); + + if (textureId == -1) + { + Color color = rs2hsbToColor(model.faceColors[i]); + + double r = color.getRed() / 255.0; + double g = color.getGreen() / 255.0; + double b = color.getBlue() / 255.0; + + mtlWriter.println("Kd " + r + " " + g + " " + b); + } + else + { + TextureDefinition texture = textureManager.findTexture(textureId); + assert texture != null; + + mtlWriter.println("map_Kd sprite/" + texture.getFileIds()[0] + "-0.png"); + } + + int alpha = 0; + + if (model.faceAlphas != null) + { + alpha = model.faceAlphas[i] & 0xFF; + } + + if (alpha != 0) + { + mtlWriter.println("d " + (alpha / 255.0)); + } + } + } + + private static Color rs2hsbToColor(int hsb) + { + int decode_hue = (hsb >> 10) & 0x3f; + int decode_saturation = (hsb >> 7) & 0x07; + int decode_brightness = (hsb & 0x7f); + return Color.getHSBColor((float) decode_hue / 63, (float) decode_saturation / 7, (float) decode_brightness / 127); + } +} diff --git a/cache/src/main/java/net/runelite/cache/models/Vector3f.java b/cache/src/main/java/net/runelite/cache/models/Vector3f.java new file mode 100644 index 0000000000..a93e1cd1ff --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/models/Vector3f.java @@ -0,0 +1,103 @@ +package net.runelite.cache.models; + +public class Vector3f +{ + public float x; + public float y; + public float z; + + public Vector3f() + { + } + + public Vector3f(float x, float y, float z) + { + this.x = x; + this.y = y; + this.z = z; + } + + public Vector3f(Vector3f other) + { + this.x = other.x; + this.y = other.y; + this.z = other.z; + } + + @Override + public String toString() + { + return "Vector3f{" + "x=" + x + ", y=" + y + ", z=" + z + '}'; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 23 * hash + Float.floatToIntBits(this.x); + hash = 23 * hash + Float.floatToIntBits(this.y); + hash = 23 * hash + Float.floatToIntBits(this.z); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final Vector3f other = (Vector3f) obj; + if (Float.floatToIntBits(this.x) != Float.floatToIntBits(other.x)) + { + return false; + } + if (Float.floatToIntBits(this.y) != Float.floatToIntBits(other.y)) + { + return false; + } + if (Float.floatToIntBits(this.z) != Float.floatToIntBits(other.z)) + { + return false; + } + return true; + } + + public float getX() + { + return x; + } + + public void setX(float x) + { + this.x = x; + } + + public float getY() + { + return y; + } + + public void setY(float y) + { + this.y = y; + } + + public float getZ() + { + return z; + } + + public void setZ(float z) + { + this.z = z; + } +} diff --git a/cache/src/main/java/net/runelite/cache/models/VertexNormal.java b/cache/src/main/java/net/runelite/cache/models/VertexNormal.java new file mode 100644 index 0000000000..b1635ed1c9 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/models/VertexNormal.java @@ -0,0 +1,30 @@ +package net.runelite.cache.models; + +public class VertexNormal +{ + public int x; + public int y; + public int z; + public int magnitude; + + public Vector3f normalize() + { + Vector3f v = new Vector3f(); + + int length = (int) Math.sqrt((double) (x * x + y * y + z * z)); + if (length == 0) + { + length = 1; + } + + v.x = (float) x / length; + v.y = (float) y / length; + v.z = (float) z / length; + + assert v.x >= -1f && v.x <= 1f; + assert v.y >= -1f && v.y <= 1f; + assert v.z >= -1f && v.z <= 1f; + + return v; + } +} diff --git a/cache/src/main/java/net/runelite/cache/region/HeightCalc.java b/cache/src/main/java/net/runelite/cache/region/HeightCalc.java new file mode 100644 index 0000000000..18b291e89f --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/region/HeightCalc.java @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2015 Kyle Friz + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package net.runelite.cache.region; + +/** + * @author Kyle Friz + * @since Feb 20, 2016 + */ +public class HeightCalc +{ + private static final int JAGEX_CIRCULAR_ANGLE = 2048; + private static final double ANGULAR_RATIO = 360D / JAGEX_CIRCULAR_ANGLE; + private static final double JAGEX_RADIAN = Math.toRadians(ANGULAR_RATIO); + + private static final int[] SIN = new int[JAGEX_CIRCULAR_ANGLE]; + private static final int[] COS = new int[JAGEX_CIRCULAR_ANGLE]; + + static + { + for (int i = 0; i < JAGEX_CIRCULAR_ANGLE; i++) + { + SIN[i] = (int) (65536.0D * Math.sin((double) i * JAGEX_RADIAN)); + COS[i] = (int) (65536.0D * Math.cos((double) i * JAGEX_RADIAN)); + } + } + + public static int calculate(int x, int y) + { + int n = interpolateNoise(x + 45365, y + 91923, 4) - 128 + + (interpolateNoise(10294 + x, y + 37821, 2) - 128 >> 1) + + (interpolateNoise(x, y, 1) - 128 >> 2); + n = 35 + (int) ((double) n * 0.3D); + if (n < 10) + { + n = 10; + } + else if (n > 60) + { + n = 60; + } + + return n; + } + + public static int interpolateNoise(int x, int y, int frequency) + { + int intX = x / frequency; + int fracX = x & frequency - 1; + int intY = y / frequency; + int fracY = y & frequency - 1; + int v1 = smoothedNoise1(intX, intY); + int v2 = smoothedNoise1(intX + 1, intY); + int v3 = smoothedNoise1(intX, intY + 1); + int v4 = smoothedNoise1(1 + intX, 1 + intY); + int i1 = interpolate(v1, v2, fracX, frequency); + int i2 = interpolate(v3, v4, fracX, frequency); + return interpolate(i1, i2, fracY, frequency); + } + + public static int smoothedNoise1(int x, int y) + { + int corners = noise(x - 1, y - 1) + noise(x + 1, y - 1) + noise(x - 1, 1 + y) + noise(x + 1, y + 1); + int sides = noise(x - 1, y) + noise(1 + x, y) + noise(x, y - 1) + noise(x, 1 + y); + int center = noise(x, y); + return center / 4 + sides / 8 + corners / 16; + } + + public static int noise(int x, int y) + { + int n = x + y * 57; + n ^= n << 13; + return ((n * (n * n * 15731 + 789221) + 1376312589) & Integer.MAX_VALUE) >> 19 & 255; + } + + public static int interpolate(int a, int b, int x, int y) + { + int f = 65536 - COS[1024 * x / y] >> 1; + return (f * b >> 16) + (a * (65536 - f) >> 16); + } + +} diff --git a/cache/src/main/java/net/runelite/cache/region/Location.java b/cache/src/main/java/net/runelite/cache/region/Location.java new file mode 100644 index 0000000000..7cf59f8e1c --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/region/Location.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.region; + +import lombok.Value; + +@Value +public class Location +{ + private final int id; + private final int type; + private final int orientation; + private final Position position; +} diff --git a/cache/src/main/java/net/runelite/cache/region/Position.java b/cache/src/main/java/net/runelite/cache/region/Position.java new file mode 100644 index 0000000000..d80144c80a --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/region/Position.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.region; + +public class Position +{ + private final int x; + private final int y; + private final int z; + + public Position(int x, int y, int z) + { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String toString() + { + return "Position{" + "x=" + x + ", y=" + y + ", z=" + z + '}'; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 67 * hash + this.x; + hash = 67 * hash + this.y; + hash = 67 * hash + this.z; + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final Position other = (Position) obj; + if (this.x != other.x) + { + return false; + } + if (this.y != other.y) + { + return false; + } + if (this.z != other.z) + { + return false; + } + return true; + } + + public int getX() + { + return x; + } + + public int getY() + { + return y; + } + + public int getZ() + { + return z; + } +} diff --git a/cache/src/main/java/net/runelite/cache/region/Region.java b/cache/src/main/java/net/runelite/cache/region/Region.java new file mode 100644 index 0000000000..7dbda27534 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/region/Region.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.region; + +import java.util.ArrayList; +import java.util.List; +import net.runelite.cache.definitions.LocationsDefinition; +import net.runelite.cache.definitions.MapDefinition; +import net.runelite.cache.definitions.MapDefinition.Tile; + +public class Region +{ + + public static final int X = 64; + public static final int Y = 64; + public static final int Z = 4; + + private final int regionID; + private final int baseX; + private final int baseY; + + private final int[][][] tileHeights = new int[Z][X][Y]; + private final byte[][][] tileSettings = new byte[Z][X][Y]; + private final byte[][][] overlayIds = new byte[Z][X][Y]; + private final byte[][][] overlayPaths = new byte[Z][X][Y]; + private final byte[][][] overlayRotations = new byte[Z][X][Y]; + private final byte[][][] underlayIds = new byte[Z][X][Y]; + + private final List locations = new ArrayList<>(); + + public Region(int id) + { + this.regionID = id; + this.baseX = ((id >> 8) & 0xFF) << 6; // local coords are in bottom 6 bits (64*64) + this.baseY = (id & 0xFF) << 6; + } + + public Region(int x, int y) + { + this.regionID = x << 8 | y; + this.baseX = x << 6; + this.baseY = y << 6; + } + + public void loadTerrain(MapDefinition map) + { + Tile[][][] tiles = map.getTiles(); + for (int z = 0; z < Z; z++) + { + for (int x = 0; x < X; x++) + { + for (int y = 0; y < Y; y++) + { + Tile tile = tiles[z][x][y]; + + if (tile.height == null) + { + if (z == 0) + { + tileHeights[0][x][y] = -HeightCalc.calculate(baseX + x + 0xe3b7b, baseY + y + 0x87cce) * 8; + } + else + { + tileHeights[z][x][y] = tileHeights[z - 1][x][y] - 240; + } + } + else + { + int height = tile.getHeight(); + if (height == 1) + { + height = 0; + } + + if (z == 0) + { + tileHeights[0][x][y] = -height * 8; + } + else + { + tileHeights[z][x][y] = tileHeights[z - 1][x][y] - height * 8; + } + } + + overlayIds[z][x][y] = tile.getOverlayId(); + overlayPaths[z][x][y] = tile.getOverlayPath(); + overlayRotations[z][x][y] = tile.getOverlayRotation(); + + tileSettings[z][x][y] = tile.getSettings(); + underlayIds[z][x][y] = tile.getUnderlayId(); + } + } + } + } + + public void loadLocations(LocationsDefinition locs) + { + for (Location loc : locs.getLocations()) + { + Location newLoc = new Location(loc.getId(), loc.getType(), loc.getOrientation(), + new Position(getBaseX() + loc.getPosition().getX(), + getBaseY() + loc.getPosition().getY(), + loc.getPosition().getZ())); + locations.add(newLoc); + } + } + + public int getRegionID() + { + return regionID; + } + + public int getBaseX() + { + return baseX; + } + + public int getBaseY() + { + return baseY; + } + + public int getTileHeight(int z, int x, int y) + { + return tileHeights[z][x][y]; + } + + public byte getTileSetting(int z, int x, int y) + { + return tileSettings[z][x][y]; + } + + public int getOverlayId(int z, int x, int y) + { + return overlayIds[z][x][y] & 0xFF; + } + + public byte getOverlayPath(int z, int x, int y) + { + return overlayPaths[z][x][y]; + } + + public byte getOverlayRotation(int z, int x, int y) + { + return overlayRotations[z][x][y]; + } + + public int getUnderlayId(int z, int x, int y) + { + return underlayIds[z][x][y] & 0xFF; + } + + public List getLocations() + { + return locations; + } + + public int getRegionX() + { + return baseX >> 6; + } + + public int getRegionY() + { + return baseY >> 6; + } +} diff --git a/cache/src/main/java/net/runelite/cache/region/RegionLoader.java b/cache/src/main/java/net/runelite/cache/region/RegionLoader.java new file mode 100644 index 0000000000..a15e25a868 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/region/RegionLoader.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.region; + +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import net.runelite.cache.IndexType; +import net.runelite.cache.definitions.LocationsDefinition; +import net.runelite.cache.definitions.MapDefinition; +import net.runelite.cache.definitions.loaders.LocationsLoader; +import net.runelite.cache.definitions.loaders.MapLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.util.XteaKeyManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RegionLoader +{ + private static final Logger logger = LoggerFactory.getLogger(RegionLoader.class); + + private static final int MAX_REGION = 32768; + + private final Store store; + private final Index index; + private final XteaKeyManager keyManager; + + private final Map regions = new HashMap<>(); + private Region lowestX = null, lowestY = null; + private Region highestX = null, highestY = null; + + public RegionLoader(Store store) + { + this.store = store; + index = store.getIndex(IndexType.MAPS); + keyManager = new XteaKeyManager(); + keyManager.loadKeys(); + } + + public void loadRegions() throws IOException + { + for (int i = 0; i < MAX_REGION; ++i) + { + Region region = this.loadRegionFromArchive(i); + if (region != null) + { + regions.put(i, region); + } + } + } + + public Region loadRegionFromArchive(int i) throws IOException + { + int x = i >> 8; + int y = i & 0xFF; + + Storage storage = store.getStorage(); + Archive map = index.findArchiveByName("m" + x + "_" + y); + Archive land = index.findArchiveByName("l" + x + "_" + y); + + assert (map == null) == (land == null); + + if (map == null || land == null) + { + return null; + } + + byte[] data = map.decompress(storage.loadArchive(map)); + + MapDefinition mapDef = new MapLoader().load(x, y, data); + + Region region = new Region(i); + region.loadTerrain(mapDef); + + int[] keys = keyManager.getKeys(i); + if (keys != null) + { + try + { + data = land.decompress(storage.loadArchive(land), keys); + LocationsDefinition locDef = new LocationsLoader().load(x, y, data); + region.loadLocations(locDef); + } + catch (IOException ex) + { + logger.debug("Can't decrypt region " + i, ex); + } + } + + return region; + } + + public void calculateBounds() + { + for (Region region : regions.values()) + { + if (lowestX == null || region.getBaseX() < lowestX.getBaseX()) + { + lowestX = region; + } + + if (highestX == null || region.getBaseX() > highestX.getBaseX()) + { + highestX = region; + } + + if (lowestY == null || region.getBaseY() < lowestY.getBaseY()) + { + lowestY = region; + } + + if (highestY == null || region.getBaseY() > highestY.getBaseY()) + { + highestY = region; + } + } + } + + public Collection getRegions() + { + return regions.values(); + } + + public Region findRegionForWorldCoordinates(int x, int y) + { + x >>>= 6; + y >>>= 6; + return regions.get((x << 8) | y); + } + + public Region getLowestX() + { + return lowestX; + } + + public Region getLowestY() + { + return lowestY; + } + + public Region getHighestX() + { + return highestX; + } + + public Region getHighestY() + { + return highestY; + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/Instruction.java b/cache/src/main/java/net/runelite/cache/script/Instruction.java new file mode 100644 index 0000000000..b369c97de5 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/Instruction.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script; + +public class Instruction +{ + private final int opcode; + private String name; + + public Instruction(int opcode) + { + this.opcode = opcode; + } + + public int getOpcode() + { + return opcode; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/Instructions.java b/cache/src/main/java/net/runelite/cache/script/Instructions.java new file mode 100644 index 0000000000..17dfabfcd1 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/Instructions.java @@ -0,0 +1,534 @@ +/* + * Copyright (c) 2017, Adam + * Copyright (c) 2018-2019, Hunter WB + * Copyright (c) 2019, Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script; + +import java.util.HashMap; +import java.util.Map; +import static net.runelite.cache.script.Opcodes.*; + +public class Instructions +{ + private final Map instructions = new HashMap<>(); + private final Map instructionsByName = new HashMap<>(); + + public void init() + { + add(ICONST, "iconst"); + add(GET_VARP, "get_varp"); + add(SET_VARP, "set_varp"); + add(SCONST, "sconst"); + add(JUMP, "jump"); + add(IF_ICMPNE, "if_icmpne"); + add(IF_ICMPEQ, "if_icmpeq"); + add(IF_ICMPLT, "if_icmplt"); + add(IF_ICMPGT, "if_icmpgt"); + add(RETURN, "return"); + add(GET_VARBIT, "get_varbit"); + add(SET_VARBIT, "set_varbit"); + add(IF_ICMPLE, "if_icmple"); + add(IF_ICMPGE, "if_icmpge"); + add(ILOAD, "iload"); + add(ISTORE, "istore"); + add(SLOAD, "sload"); + add(SSTORE, "sstore"); + add(JOIN_STRING, "join_string"); + add(POP_INT, "pop_int"); + add(POP_STRING, "pop_string"); + add(INVOKE, "invoke"); + add(GET_VARC_INT, "get_varc_int"); + add(SET_VARC_INT, "set_varc_int"); + add(DEFINE_ARRAY, "define_array"); + add(GET_ARRAY_INT, "get_array_int"); + add(SET_ARRAY_INT, "set_array_int"); + add(GET_VARC_STRING_OLD, "get_varc_string_old"); + add(SET_VARC_STRING_OLD, "set_varc_string_old"); + add(GET_VARC_STRING, "get_varc_string"); + add(SET_VARC_STRING, "set_varc_string"); + add(SWITCH, "switch"); + add(CC_CREATE, "cc_create"); + add(CC_DELETE, "cc_delete"); + add(CC_DELETEALL, "cc_deleteall"); + add(CC_FIND, "cc_find"); + add(IF_FIND, "if_find"); + add(CC_SETPOSITION, "cc_setposition"); + add(CC_SETSIZE, "cc_setsize"); + add(CC_SETHIDE, "cc_sethide"); + add(CC_SETNOCLICKTHROUGH, "cc_setnoclickthrough"); + add(CC_SETSCROLLPOS, "cc_setscrollpos"); + add(CC_SETCOLOUR, "cc_setcolour"); + add(CC_SETFILL, "cc_setfill"); + add(CC_SETTRANS, "cc_settrans"); + add(CC_SETLINEWID, "cc_setlinewid"); + add(CC_SETGRAPHIC, "cc_setgraphic"); + add(CC_SET2DANGLE, "cc_set2dangle"); + add(CC_SETTILING, "cc_settiling"); + add(CC_SETMODEL, "cc_setmodel"); + add(CC_SETMODELANGLE, "cc_setmodelangle"); + add(CC_SETMODELANIM, "cc_setmodelanim"); + add(CC_SETMODELORTHOG, "cc_setmodelorthog"); + add(CC_SETTEXT, "cc_settext"); + add(CC_SETTEXTFONT, "cc_settextfont"); + add(CC_SETTEXTALIGN, "cc_settextalign"); + add(CC_SETTEXTSHADOW, "cc_settextshadow"); + add(CC_SETOUTLINE, "cc_setoutline"); + add(CC_SETGRAPHICSHADOW, "cc_setgraphicshadow"); + add(CC_SETVFLIP, "cc_setvflip"); + add(CC_SETHFLIP, "cc_sethflip"); + add(CC_SETSCROLLSIZE, "cc_setscrollsize"); + add(CC_RESUME_PAUSEBUTTON, "cc_resume_pausebutton"); + add(CC_SETFILLCOLOUR, "cc_setfillcolour"); + add(CC_SETLINEDIRECTION, "cc_setlinedirection"); + add(CC_SETOBJECT, "cc_setobject"); + add(CC_SETNPCHEAD, "cc_setnpchead"); + add(CC_SETPLAYERHEAD_SELF, "cc_setplayerhead_self"); + add(CC_SETOBJECT_NONUM, "cc_setobject_nonum"); + add(CC_SETOBJECT_ALWAYS_NUM, "cc_setobject_always_num"); + add(CC_SETOP, "cc_setop"); + add(CC_SETDRAGGABLE, "cc_setdraggable"); + add(CC_SETDRAGGABLEBEHAVIOR, "cc_setdraggablebehavior"); + add(CC_SETDRAGDEADZONE, "cc_setdragdeadzone"); + add(CC_SETDRAGDEADTIME, "cc_setdragdeadtime"); + add(CC_SETOPBASE, "cc_setopbase"); + add(CC_SETTARGETVERB, "cc_settargetverb"); + add(CC_CLEAROPS, "cc_clearops"); + add(CC_SETONCLICK, "cc_setonclick"); + add(CC_SETONHOLD, "cc_setonhold"); + add(CC_SETONRELEASE, "cc_setonrelease"); + add(CC_SETONMOUSEOVER, "cc_setonmouseover"); + add(CC_SETONMOUSELEAVE, "cc_setonmouseleave"); + add(CC_SETONDRAG, "cc_setondrag"); + add(CC_SETONTARGETLEAVE, "cc_setontargetleave"); + add(CC_SETONVARTRANSMIT, "cc_setonvartransmit"); + add(CC_SETONTIMER, "cc_setontimer"); + add(CC_SETONOP, "cc_setonop"); + add(CC_SETONDRAGCOMPLETE, "cc_setondragcomplete"); + add(CC_SETONCLICKREPEAT, "cc_setonclickrepeat"); + add(CC_SETONMOUSEREPEAT, "cc_setonmouserepeat"); + add(CC_SETONINVTRANSMIT, "cc_setoninvtransmit"); + add(CC_SETONSTATTRANSMIT, "cc_setonstattransmit"); + add(CC_SETONTARGETENTER, "cc_setontargetenter"); + add(CC_SETONSCROLLWHEEL, "cc_setonscrollwheel"); + add(CC_SETONCHATTRANSMIT, "cc_setonchattransmit"); + add(CC_SETONKEY, "cc_setonkey"); + add(CC_SETONFRIENDTRANSMIT, "cc_setonfriendtransmit"); + add(CC_SETONCLANTRANSMIT, "cc_setonclantransmit"); + add(CC_SETONMISCTRANSMIT, "cc_setonmisctransmit"); + add(CC_SETONDIALOGABORT, "cc_setondialogabort"); + add(CC_SETONSUBCHANGE, "cc_setonsubchange"); + add(CC_SETONSTOCKTRANSMIT, "cc_setonstocktransmit"); + add(CC_SETONRESIZE, "cc_setonresize"); + add(CC_GETX, "cc_getx"); + add(CC_GETY, "cc_gety"); + add(CC_GETWIDTH, "cc_getwidth"); + add(CC_GETHEIGHT, "cc_getheight"); + add(CC_GETHIDE, "cc_gethide"); + add(CC_GETLAYER, "cc_getlayer"); + add(CC_GETSCROLLX, "cc_getscrollx"); + add(CC_GETSCROLLY, "cc_getscrolly"); + add(CC_GETTEXT, "cc_gettext"); + add(CC_GETSCROLLWIDTH, "cc_getscrollwidth"); + add(CC_GETSCROLLHEIGHT, "cc_getscrollheight"); + add(CC_GETMODELZOOM, "cc_getmodelzoom"); + add(CC_GETMODELANGLE_X, "cc_getmodelangle_x"); + add(CC_GETMODELANGLE_Z, "cc_getmodelangle_z"); + add(CC_GETMODELANGLE_Y, "cc_getmodelangle_y"); + add(CC_GETTRANS, "cc_gettrans"); + add(CC_GETCOLOUR, "cc_getcolour"); + add(CC_GETFILLCOLOUR, "cc_getfillcolour"); + add(CC_GETINVOBJECT, "cc_getinvobject"); + add(CC_GETINVCOUNT, "cc_getinvcount"); + add(CC_GETID, "cc_getid"); + add(CC_GETTARGETMASK, "cc_gettargetmask"); + add(CC_GETOP, "cc_getop"); + add(CC_GETOPBASE, "cc_getopbase"); + add(CC_CALLONRESIZE, "cc_callonresize"); + add(IF_SETPOSITION, "if_setposition"); + add(IF_SETSIZE, "if_setsize"); + add(IF_SETHIDE, "if_sethide"); + add(IF_SETNOCLICKTHROUGH, "if_setnoclickthrough"); + add(IF_SETSCROLLPOS, "if_setscrollpos"); + add(IF_SETCOLOUR, "if_setcolour"); + add(IF_SETFILL, "if_setfill"); + add(IF_SETTRANS, "if_settrans"); + add(IF_SETLINEWID, "if_setlinewid"); + add(IF_SETGRAPHIC, "if_setgraphic"); + add(IF_SET2DANGLE, "if_set2dangle"); + add(IF_SETTILING, "if_settiling"); + add(IF_SETMODEL, "if_setmodel"); + add(IF_SETMODELANGLE, "if_setmodelangle"); + add(IF_SETMODELANIM, "if_setmodelanim"); + add(IF_SETMODELORTHOG, "if_setmodelorthog"); + add(IF_SETTEXT, "if_settext"); + add(IF_SETTEXTFONT, "if_settextfont"); + add(IF_SETTEXTALIGN, "if_settextalign"); + add(IF_SETTEXTSHADOW, "if_settextshadow"); + add(IF_SETOUTLINE, "if_setoutline"); + add(IF_SETGRAPHICSHADOW, "if_setgraphicshadow"); + add(IF_SETVFLIP, "if_setvflip"); + add(IF_SETHFLIP, "if_sethflip"); + add(IF_SETSCROLLSIZE, "if_setscrollsize"); + add(IF_RESUME_PAUSEBUTTON, "if_resume_pausebutton"); + add(IF_SETFILLCOLOUR, "if_setfillcolour"); + add(IF_SETLINEDIRECTION, "if_setlinedirection"); + add(IF_SETOBJECT, "if_setobject"); + add(IF_SETNPCHEAD, "if_setnpchead"); + add(IF_SETPLAYERHEAD_SELF, "if_setplayerhead_self"); + add(IF_SETOBJECT_NONUM, "if_setobject_nonum"); + add(IF_SETOBJECT_ALWAYS_NUM, "if_setobject_always_num"); + add(IF_SETOP, "if_setop"); + add(IF_SETDRAGGABLE, "if_setdraggable"); + add(IF_SETDRAGGABLEBEHAVIOR, "if_setdraggablebehavior"); + add(IF_SETDRAGDEADZONE, "if_setdragdeadzone"); + add(IF_SETDRAGDEADTIME, "if_setdragdeadtime"); + add(IF_SETOPBASE, "if_setopbase"); + add(IF_SETTARGETVERB, "if_settargetverb"); + add(IF_CLEAROPS, "if_clearops"); + add(IF_SETOPKEY, "if_setopkey"); + add(IF_SETOPTKEY, "if_setoptkey"); + add(IF_SETOPKEYRATE, "if_setopkeyrate"); + add(IF_SETOPTKEYRATE, "if_setoptkeyrate"); + add(IF_SETOPKEYIGNOREHELD, "if_setopkeyignoreheld"); + add(IF_SETOPTKEYIGNOREHELD, "if_setoptkeyignoreheld"); + add(IF_SETONCLICK, "if_setonclick"); + add(IF_SETONHOLD, "if_setonhold"); + add(IF_SETONRELEASE, "if_setonrelease"); + add(IF_SETONMOUSEOVER, "if_setonmouseover"); + add(IF_SETONMOUSELEAVE, "if_setonmouseleave"); + add(IF_SETONDRAG, "if_setondrag"); + add(IF_SETONTARGETLEAVE, "if_setontargetleave"); + add(IF_SETONVARTRANSMIT, "if_setonvartransmit"); + add(IF_SETONTIMER, "if_setontimer"); + add(IF_SETONOP, "if_setonop"); + add(IF_SETONDRAGCOMPLETE, "if_setondragcomplete"); + add(IF_SETONCLICKREPEAT, "if_setonclickrepeat"); + add(IF_SETONMOUSEREPEAT, "if_setonmouserepeat"); + add(IF_SETONINVTRANSMIT, "if_setoninvtransmit"); + add(IF_SETONSTATTRANSMIT, "if_setonstattransmit"); + add(IF_SETONTARGETENTER, "if_setontargetenter"); + add(IF_SETONSCROLLWHEEL, "if_setonscrollwheel"); + add(IF_SETONCHATTRANSMIT, "if_setonchattransmit"); + add(IF_SETONKEY, "if_setonkey"); + add(IF_SETONFRIENDTRANSMIT, "if_setonfriendtransmit"); + add(IF_SETONCLANTRANSMIT, "if_setonclantransmit"); + add(IF_SETONMISCTRANSMIT, "if_setonmisctransmit"); + add(IF_SETONDIALOGABORT, "if_setondialogabort"); + add(IF_SETONSUBCHANGE, "if_setonsubchange"); + add(IF_SETONSTOCKTRANSMIT, "if_setonstocktransmit"); + add(IF_SETONRESIZE, "if_setonresize"); + add(IF_GETX, "if_getx"); + add(IF_GETY, "if_gety"); + add(IF_GETWIDTH, "if_getwidth"); + add(IF_GETHEIGHT, "if_getheight"); + add(IF_GETHIDE, "if_gethide"); + add(IF_GETLAYER, "if_getlayer"); + add(IF_GETSCROLLX, "if_getscrollx"); + add(IF_GETSCROLLY, "if_getscrolly"); + add(IF_GETTEXT, "if_gettext"); + add(IF_GETSCROLLWIDTH, "if_getscrollwidth"); + add(IF_GETSCROLLHEIGHT, "if_getscrollheight"); + add(IF_GETMODELZOOM, "if_getmodelzoom"); + add(IF_GETMODELANGLE_X, "if_getmodelangle_x"); + add(IF_GETMODELANGLE_Z, "if_getmodelangle_z"); + add(IF_GETMODELANGLE_Y, "if_getmodelangle_y"); + add(IF_GETTRANS, "if_gettrans"); + add(IF_GETCOLOUR, "if_getcolour"); + add(IF_GETFILLCOLOUR, "if_getfillcolour"); + add(IF_GETINVOBJECT, "if_getinvobject"); + add(IF_GETINVCOUNT, "if_getinvcount"); + add(IF_HASSUB, "if_hassub"); + add(IF_GETTOP, "if_gettop"); + add(IF_GETTARGETMASK, "if_gettargetmask"); + add(IF_GETOP, "if_getop"); + add(IF_GETOPBASE, "if_getopbase"); + add(IF_CALLONRESIZE, "if_callonresize"); + add(MES, "mes"); + add(ANIM, "anim"); + add(IF_CLOSE, "if_close"); + add(RESUME_COUNTDIALOG, "resume_countdialog"); + add(RESUME_NAMEDIALOG, "resume_namedialog"); + add(RESUME_STRINGDIALOG, "resume_stringdialog"); + add(OPPLAYER, "opplayer"); + add(IF_DRAGPICKUP, "if_dragpickup"); + add(CC_DRAGPICKUP, "cc_dragpickup"); + add(MOUSECAM, "mousecam"); + add(GETREMOVEROOFS, "getremoveroofs"); + add(SETREMOVEROOFS, "setremoveroofs"); + add(OPENURL, "openurl"); + add(RESUME_OBJDIALOG, "resume_objdialog"); + add(BUG_REPORT, "bug_report"); + add(SETSHIFTCLICKDROP, "setshiftclickdrop"); + add(SETSHOWMOUSEOVERTEXT, "setshowmouseovertext"); + add(RENDERSELF, "renderself"); + add(SETSHOWMOUSECROSS, "setshowmousecross"); + add(SETSHOWLOADINGMESSAGES, "setshowloadingmessages"); + add(SETTAPTODROP, "settaptodrop"); + add(GETTAPTODROP, "gettaptodrop"); + add(GETCANVASSIZE, "getcanvassize"); + add(SETHIDEUSERNAME, "sethideusername"); + add(GETHIDEUSERNAME, "gethideusername"); + add(SETREMEMBERUSERNAME, "setrememberusername"); + add(GETREMEMBERUSERNAME, "getrememberusername"); + add(SOUND_SYNTH, "sound_synth"); + add(SOUND_SONG, "sound_song"); + add(SOUND_JINGLE, "sound_jingle"); + add(CLIENTCLOCK, "clientclock"); + add(INV_GETOBJ, "inv_getobj"); + add(INV_GETNUM, "inv_getnum"); + add(INV_TOTAL, "inv_total"); + add(INV_SIZE, "inv_size"); + add(STAT, "stat"); + add(STAT_BASE, "stat_base"); + add(STAT_XP, "stat_xp"); + add(COORD, "coord"); + add(COORDX, "coordx"); + add(COORDZ, "coordz"); + add(COORDY, "coordy"); + add(MAP_MEMBERS, "map_members"); + add(INVOTHER_GETOBJ, "invother_getobj"); + add(INVOTHER_GETNUM, "invother_getnum"); + add(INVOTHER_TOTAL, "invother_total"); + add(STAFFMODLEVEL, "staffmodlevel"); + add(REBOOTTIMER, "reboottimer"); + add(MAP_WORLD, "map_world"); + add(RUNENERGY_VISIBLE, "runenergy_visible"); + add(RUNWEIGHT_VISIBLE, "runweight_visible"); + add(PLAYERMOD, "playermod"); + add(WORLDFLAGS, "worldflags"); + add(MOVECOORD, "movecoord"); + add(ENUM_STRING, "enum_string"); + add(ENUM, "enum"); + add(ENUM_GETOUTPUTCOUNT, "enum_getoutputcount"); + add(FRIEND_COUNT, "friend_count"); + add(FRIEND_GETNAME, "friend_getname"); + add(FRIEND_GETWORLD, "friend_getworld"); + add(FRIEND_GETRANK, "friend_getrank"); + add(FRIEND_SETRANK, "friend_setrank"); + add(FRIEND_ADD, "friend_add"); + add(FRIEND_DEL, "friend_del"); + add(IGNORE_ADD, "ignore_add"); + add(IGNORE_DEL, "ignore_del"); + add(FRIEND_TEST, "friend_test"); + add(CLAN_GETCHATDISPLAYNAME, "clan_getchatdisplayname"); + add(CLAN_GETCHATCOUNT, "clan_getchatcount"); + add(CLAN_GETCHATUSERNAME, "clan_getchatusername"); + add(CLAN_GETCHATUSERWORLD, "clan_getchatuserworld"); + add(CLAN_GETCHATUSERRANK, "clan_getchatuserrank"); + add(CLAN_GETCHATMINKICK, "clan_getchatminkick"); + add(CLAN_KICKUSER, "clan_kickuser"); + add(CLAN_GETCHATRANK, "clan_getchatrank"); + add(CLAN_JOINCHAT, "clan_joinchat"); + add(CLAN_LEAVECHAT, "clan_leavechat"); + add(IGNORE_COUNT, "ignore_count"); + add(IGNORE_GETNAME, "ignore_getname"); + add(IGNORE_TEST, "ignore_test"); + add(CLAN_ISSELF, "clan_isself"); + add(CLAN_GETCHATOWNERNAME, "clan_getchatownername"); + add(CLAN_ISFRIEND, "clan_isfriend"); + add(CLAN_ISIGNORE, "clan_isignore"); + add(STOCKMARKET_GETOFFERTYPE, "stockmarket_getoffertype"); + add(STOCKMARKET_GETOFFERITEM, "stockmarket_getofferitem"); + add(STOCKMARKET_GETOFFERPRICE, "stockmarket_getofferprice"); + add(STOCKMARKET_GETOFFERCOUNT, "stockmarket_getoffercount"); + add(STOCKMARKET_GETOFFERCOMPLETEDCOUNT, "stockmarket_getoffercompletedcount"); + add(STOCKMARKET_GETOFFERCOMPLETEDGOLD, "stockmarket_getoffercompletedgold"); + add(STOCKMARKET_ISOFFEREMPTY, "stockmarket_isofferempty"); + add(STOCKMARKET_ISOFFERSTABLE, "stockmarket_isofferstable"); + add(STOCKMARKET_ISOFFERFINISHED, "stockmarket_isofferfinished"); + add(STOCKMARKET_ISOFFERADDING, "stockmarket_isofferadding"); + add(TRADINGPOST_SORTBY_NAME, "tradingpost_sortby_name"); + add(TRADINGPOST_SORTBY_PRICE, "tradingpost_sortby_price"); + add(TRADINGPOST_SORTFILTERBY_WORLD, "tradingpost_sortfilterby_world"); + add(TRADINGPOST_SORTBY_AGE, "tradingpost_sortby_age"); + add(TRADINGPOST_SORTBY_COUNT, "tradingpost_sortby_count"); + add(TRADINGPOST_GETTOTALOFFERS, "tradingpost_gettotaloffers"); + add(TRADINGPOST_GETOFFERWORLD, "tradingpost_getofferworld"); + add(TRADINGPOST_GETOFFERNAME, "tradingpost_getoffername"); + add(TRADINGPOST_GETOFFERPREVIOUSNAME, "tradingpost_getofferpreviousname"); + add(TRADINGPOST_GETOFFERAGE, "tradingpost_getofferage"); + add(TRADINGPOST_GETOFFERCOUNT, "tradingpost_getoffercount"); + add(TRADINGPOST_GETOFFERPRICE, "tradingpost_getofferprice"); + add(TRADINGPOST_GETOFFERITEM, "tradingpost_getofferitem"); + add(ADD, "add"); + add(SUB, "sub"); + add(MULTIPLY, "multiply"); + add(DIV, "div"); + add(RANDOM, "random"); + add(RANDOMINC, "randominc"); + add(INTERPOLATE, "interpolate"); + add(ADDPERCENT, "addpercent"); + add(SETBIT, "setbit"); + add(CLEARBIT, "clearbit"); + add(TESTBIT, "testbit"); + add(MOD, "mod"); + add(POW, "pow"); + add(INVPOW, "invpow"); + add(AND, "and"); + add(OR, "or"); + add(SCALE, "scale"); + add(APPEND_NUM, "append_num"); + add(APPEND, "append"); + add(APPEND_SIGNNUM, "append_signnum"); + add(LOWERCASE, "lowercase"); + add(FROMDATE, "fromdate"); + add(TEXT_GENDER, "text_gender"); + add(TOSTRING, "tostring"); + add(COMPARE, "compare"); + add(PARAHEIGHT, "paraheight"); + add(PARAWIDTH, "parawidth"); + add(TEXT_SWITCH, "text_switch"); + add(ESCAPE, "escape"); + add(APPEND_CHAR, "append_char"); + add(CHAR_ISPRINTABLE, "char_isprintable"); + add(CHAR_ISALPHANUMERIC, "char_isalphanumeric"); + add(CHAR_ISALPHA, "char_isalpha"); + add(CHAR_ISNUMERIC, "char_isnumeric"); + add(STRING_LENGTH, "string_length"); + add(SUBSTRING, "substring"); + add(REMOVETAGS, "removetags"); + add(STRING_INDEXOF_CHAR, "string_indexof_char"); + add(STRING_INDEXOF_STRING, "string_indexof_string"); + add(OC_NAME, "oc_name"); + add(OC_OP, "oc_op"); + add(OC_IOP, "oc_iop"); + add(OC_COST, "oc_cost"); + add(OC_STACKABLE, "oc_stackable"); + add(OC_CERT, "oc_cert"); + add(OC_UNCERT, "oc_uncert"); + add(OC_MEMBERS, "oc_members"); + add(OC_PLACEHOLDER, "oc_placeholder"); + add(OC_UNPLACEHOLDER, "oc_unplaceholder"); + add(OC_FIND, "oc_find"); + add(OC_FINDNEXT, "oc_findnext"); + add(OC_FINDRESET, "oc_findreset"); + add(CHAT_GETFILTER_PUBLIC, "chat_getfilter_public"); + add(CHAT_SETFILTER, "chat_setfilter"); + add(CHAT_SENDABUSEREPORT, "chat_sendabusereport"); + add(CHAT_GETHISTORY_BYTYPEANDLINE, "chat_gethistory_bytypeandline"); + add(CHAT_GETHISTORY_BYUID, "chat_gethistory_byuid"); + add(CHAT_GETFILTER_PRIVATE, "chat_getfilter_private"); + add(CHAT_SENDPUBLIC, "chat_sendpublic"); + add(CHAT_SENDPRIVATE, "chat_sendprivate"); + add(CHAT_PLAYERNAME, "chat_playername"); + add(CHAT_GETFILTER_TRADE, "chat_getfilter_trade"); + add(CHAT_GETHISTORYLENGTH, "chat_gethistorylength"); + add(CHAT_GETNEXTUID, "chat_getnextuid"); + add(CHAT_GETPREVUID, "chat_getprevuid"); + add(DOCHEAT, "docheat"); + add(CHAT_SETMESSAGEFILTER, "chat_setmessagefilter"); + add(CHAT_GETMESSAGEFILTER, "chat_getmessagefilter"); + add(GETWINDOWMODE, "getwindowmode"); + add(SETWINDOWMODE, "setwindowmode"); + add(GETDEFAULTWINDOWMODE, "getdefaultwindowmode"); + add(SETDEFAULTWINDOWMODE, "setdefaultwindowmode"); + add(CAM_FORCEANGLE, "cam_forceangle"); + add(CAM_GETANGLE_XA, "cam_getangle_xa"); + add(CAM_GETANGLE_YA, "cam_getangle_ya"); + add(CAM_SETFOLLOWHEIGHT, "cam_setfollowheight"); + add(CAM_GETFOLLOWHEIGHT, "cam_getfollowheight"); + add(LOGOUT, "logout"); + add(VIEWPORT_SETFOV, "viewport_setfov"); + add(VIEWPORT_SETZOOM, "viewport_setzoom"); + add(VIEWPORT_CLAMPFOV, "viewport_clampfov"); + add(VIEWPORT_GETEFFECTIVESIZE, "viewport_geteffectivesize"); + add(VIEWPORT_GETZOOM, "viewport_getzoom"); + add(VIEWPORT_GETFOV, "viewport_getfov"); + add(WORLDLIST_FETCH, "worldlist_fetch"); + add(WORLDLIST_START, "worldlist_start"); + add(WORLDLIST_NEXT, "worldlist_next"); + add(WORLDLIST_SPECIFIC, "worldlist_specific"); + add(WORLDLIST_SORT, "worldlist_sort"); + add(SETFOLLOWEROPSLOWPRIORITY, "setfolloweropslowpriority"); + add(NC_PARAM, "nc_param"); + add(LC_PARAM, "lc_param"); + add(OC_PARAM, "oc_param"); + add(STRUCT_PARAM, "struct_param"); + add(ON_MOBILE, "on_mobile"); + add(CLIENTTYPE, "clienttype"); + add(BATTERYLEVEL, "batterylevel"); + add(BATTERYCHARGING, "batterycharging"); + add(WIFIAVAILABLE, "wifiavailable"); + add(WORLDMAP_GETMAPNAME, "worldmap_getmapname"); + add(WORLDMAP_SETMAP, "worldmap_setmap"); + add(WORLDMAP_GETZOOM, "worldmap_getzoom"); + add(WORLDMAP_SETZOOM, "worldmap_setzoom"); + add(WORLDMAP_ISLOADED, "worldmap_isloaded"); + add(WORLDMAP_JUMPTODISPLAYCOORD, "worldmap_jumptodisplaycoord"); + add(WORLDMAP_JUMPTODISPLAYCOORD_INSTANT, "worldmap_jumptodisplaycoord_instant"); + add(WORLDMAP_JUMPTOSOURCECOORD, "worldmap_jumptosourcecoord"); + add(WORLDMAP_JUMPTOSOURCECOORD_INSTANT, "worldmap_jumptosourcecoord_instant"); + add(WORLDMAP_GETDISPLAYPOSITION, "worldmap_getdisplayposition"); + add(WORLDMAP_GETCONFIGORIGIN, "worldmap_getconfigorigin"); + add(WORLDMAP_GETCONFIGSIZE, "worldmap_getconfigsize"); + add(WORLDMAP_GETCONFIGBOUNDS, "worldmap_getconfigbounds"); + add(WORLDMAP_GETCONFIGZOOM, "worldmap_getconfigzoom"); + add(WORLDMAP_GETCURRENTMAP, "worldmap_getcurrentmap"); + add(WORLDMAP_GETDISPLAYCOORD, "worldmap_getdisplaycoord"); + add(WORLDMAP_COORDINMAP, "worldmap_coordinmap"); + add(WORLDMAP_GETSIZE, "worldmap_getsize"); + add(WORLDMAP_PERPETUALFLASH, "worldmap_perpetualflash"); + add(WORLDMAP_FLASHELEMENT, "worldmap_flashelement"); + add(WORLDMAP_FLASHELEMENTCATEGORY, "worldmap_flashelementcategory"); + add(WORLDMAP_STOPCURRENTFLASHES, "worldmap_stopcurrentflashes"); + add(WORLDMAP_DISABLEELEMENTS, "worldmap_disableelements"); + add(WORLDMAP_DISABLEELEMENT, "worldmap_disableelement"); + add(WORLDMAP_DISABLEELEMENTCATEGORY, "worldmap_disableelementcategory"); + add(WORLDMAP_GETDISABLEELEMENTS, "worldmap_getdisableelements"); + add(WORLDMAP_GETDISABLEELEMENT, "worldmap_getdisableelement"); + add(WORLDMAP_GETDISABLEELEMENTCATEGORY, "worldmap_getdisableelementcategory"); + add(WORLDMAP_LISTELEMENT_START, "worldmap_listelement_start"); + add(WORLDMAP_LISTELEMENT_NEXT, "worldmap_listelement_next"); + add(MEC_TEXT, "mec_text"); + add(MEC_TEXTSIZE, "mec_textsize"); + add(MEC_CATEGORY, "mec_category"); + add(MEC_SPRITE, "mec_sprite"); + } + + protected void add(int opcode, String name) + { + Instruction i = new Instruction(opcode); + i.setName(name); + + assert instructions.containsKey(opcode) == false; + instructions.put(opcode, i); + + if (name != null) + { + assert instructionsByName.containsKey(name) == false; + instructionsByName.put(name, i); + } + } + + public Instruction find(int opcode) + { + return instructions.get(opcode); + } + + public Instruction find(String name) + { + return instructionsByName.get(name); + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/Opcodes.java b/cache/src/main/java/net/runelite/cache/script/Opcodes.java new file mode 100644 index 0000000000..e69a1ef5ef --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/Opcodes.java @@ -0,0 +1,499 @@ +/* + * Copyright (c) 2017, Adam + * Copyright (c) 2018-2019, Hunter WB + * Copyright (c) 2019, Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script; + +public class Opcodes +{ + public static final int ICONST = 0; + public static final int GET_VARP = 1; + public static final int SET_VARP = 2; + public static final int SCONST = 3; + public static final int JUMP = 6; + public static final int IF_ICMPNE = 7; + public static final int IF_ICMPEQ = 8; + public static final int IF_ICMPLT = 9; + public static final int IF_ICMPGT = 10; + public static final int RETURN = 21; + public static final int GET_VARBIT = 25; + public static final int SET_VARBIT = 27; + public static final int IF_ICMPLE = 31; + public static final int IF_ICMPGE = 32; + public static final int ILOAD = 33; + public static final int ISTORE = 34; + public static final int SLOAD = 35; + public static final int SSTORE = 36; + public static final int JOIN_STRING = 37; + public static final int POP_INT = 38; + public static final int POP_STRING = 39; + public static final int INVOKE = 40; + public static final int GET_VARC_INT = 42; + public static final int SET_VARC_INT = 43; + public static final int DEFINE_ARRAY = 44; + public static final int GET_ARRAY_INT = 45; + public static final int SET_ARRAY_INT = 46; + public static final int GET_VARC_STRING_OLD = 47; + public static final int SET_VARC_STRING_OLD = 48; + public static final int GET_VARC_STRING = 49; + public static final int SET_VARC_STRING = 50; + public static final int SWITCH = 60; + public static final int CC_CREATE = 100; + public static final int CC_DELETE = 101; + public static final int CC_DELETEALL = 102; + public static final int CC_FIND = 200; + public static final int IF_FIND = 201; + public static final int CC_SETPOSITION = 1000; + public static final int CC_SETSIZE = 1001; + public static final int CC_SETHIDE = 1003; + public static final int CC_SETNOCLICKTHROUGH = 1005; + public static final int CC_SETSCROLLPOS = 1100; + public static final int CC_SETCOLOUR = 1101; + public static final int CC_SETFILL = 1102; + public static final int CC_SETTRANS = 1103; + public static final int CC_SETLINEWID = 1104; + public static final int CC_SETGRAPHIC = 1105; + public static final int CC_SET2DANGLE = 1106; + public static final int CC_SETTILING = 1107; + public static final int CC_SETMODEL = 1108; + public static final int CC_SETMODELANGLE = 1109; + public static final int CC_SETMODELANIM = 1110; + public static final int CC_SETMODELORTHOG = 1111; + public static final int CC_SETTEXT = 1112; + public static final int CC_SETTEXTFONT = 1113; + public static final int CC_SETTEXTALIGN = 1114; + public static final int CC_SETTEXTSHADOW = 1115; + public static final int CC_SETOUTLINE = 1116; + public static final int CC_SETGRAPHICSHADOW = 1117; + public static final int CC_SETVFLIP = 1118; + public static final int CC_SETHFLIP = 1119; + public static final int CC_SETSCROLLSIZE = 1120; + public static final int CC_RESUME_PAUSEBUTTON = 1121; + public static final int CC_SETFILLCOLOUR = 1123; + public static final int CC_SETLINEDIRECTION = 1126; + public static final int CC_SETOBJECT = 1200; + public static final int CC_SETNPCHEAD = 1201; + public static final int CC_SETPLAYERHEAD_SELF = 1202; + public static final int CC_SETOBJECT_NONUM = 1205; + public static final int CC_SETOBJECT_ALWAYS_NUM = 1212; + public static final int CC_SETOP = 1300; + public static final int CC_SETDRAGGABLE = 1301; + public static final int CC_SETDRAGGABLEBEHAVIOR = 1302; + public static final int CC_SETDRAGDEADZONE = 1303; + public static final int CC_SETDRAGDEADTIME = 1304; + public static final int CC_SETOPBASE = 1305; + public static final int CC_SETTARGETVERB = 1306; + public static final int CC_CLEAROPS = 1307; + public static final int CC_SETONCLICK = 1400; + public static final int CC_SETONHOLD = 1401; + public static final int CC_SETONRELEASE = 1402; + public static final int CC_SETONMOUSEOVER = 1403; + public static final int CC_SETONMOUSELEAVE = 1404; + public static final int CC_SETONDRAG = 1405; + public static final int CC_SETONTARGETLEAVE = 1406; + public static final int CC_SETONVARTRANSMIT = 1407; + public static final int CC_SETONTIMER = 1408; + public static final int CC_SETONOP = 1409; + public static final int CC_SETONDRAGCOMPLETE = 1410; + public static final int CC_SETONCLICKREPEAT = 1411; + public static final int CC_SETONMOUSEREPEAT = 1412; + public static final int CC_SETONINVTRANSMIT = 1414; + public static final int CC_SETONSTATTRANSMIT = 1415; + public static final int CC_SETONTARGETENTER = 1416; + public static final int CC_SETONSCROLLWHEEL = 1417; + public static final int CC_SETONCHATTRANSMIT = 1418; + public static final int CC_SETONKEY = 1419; + public static final int CC_SETONFRIENDTRANSMIT = 1420; + public static final int CC_SETONCLANTRANSMIT = 1421; + public static final int CC_SETONMISCTRANSMIT = 1422; + public static final int CC_SETONDIALOGABORT = 1423; + public static final int CC_SETONSUBCHANGE = 1424; + public static final int CC_SETONSTOCKTRANSMIT = 1425; + public static final int CC_SETONRESIZE = 1427; + public static final int CC_GETX = 1500; + public static final int CC_GETY = 1501; + public static final int CC_GETWIDTH = 1502; + public static final int CC_GETHEIGHT = 1503; + public static final int CC_GETHIDE = 1504; + public static final int CC_GETLAYER = 1505; + public static final int CC_GETSCROLLX = 1600; + public static final int CC_GETSCROLLY = 1601; + public static final int CC_GETTEXT = 1602; + public static final int CC_GETSCROLLWIDTH = 1603; + public static final int CC_GETSCROLLHEIGHT = 1604; + public static final int CC_GETMODELZOOM = 1605; + public static final int CC_GETMODELANGLE_X = 1606; + public static final int CC_GETMODELANGLE_Z = 1607; + public static final int CC_GETMODELANGLE_Y = 1608; + public static final int CC_GETTRANS = 1609; + public static final int CC_GETCOLOUR = 1611; + public static final int CC_GETFILLCOLOUR = 1612; + public static final int CC_GETINVOBJECT = 1700; + public static final int CC_GETINVCOUNT = 1701; + public static final int CC_GETID = 1702; + public static final int CC_GETTARGETMASK = 1800; + public static final int CC_GETOP = 1801; + public static final int CC_GETOPBASE = 1802; + public static final int CC_CALLONRESIZE = 1927; + public static final int IF_SETPOSITION = 2000; + public static final int IF_SETSIZE = 2001; + public static final int IF_SETHIDE = 2003; + public static final int IF_SETNOCLICKTHROUGH = 2005; + public static final int IF_SETSCROLLPOS = 2100; + public static final int IF_SETCOLOUR = 2101; + public static final int IF_SETFILL = 2102; + public static final int IF_SETTRANS = 2103; + public static final int IF_SETLINEWID = 2104; + public static final int IF_SETGRAPHIC = 2105; + public static final int IF_SET2DANGLE = 2106; + public static final int IF_SETTILING = 2107; + public static final int IF_SETMODEL = 2108; + public static final int IF_SETMODELANGLE = 2109; + public static final int IF_SETMODELANIM = 2110; + public static final int IF_SETMODELORTHOG = 2111; + public static final int IF_SETTEXT = 2112; + public static final int IF_SETTEXTFONT = 2113; + public static final int IF_SETTEXTALIGN = 2114; + public static final int IF_SETTEXTSHADOW = 2115; + public static final int IF_SETOUTLINE = 2116; + public static final int IF_SETGRAPHICSHADOW = 2117; + public static final int IF_SETVFLIP = 2118; + public static final int IF_SETHFLIP = 2119; + public static final int IF_SETSCROLLSIZE = 2120; + public static final int IF_RESUME_PAUSEBUTTON = 2121; + public static final int IF_SETFILLCOLOUR = 2123; + public static final int IF_SETLINEDIRECTION = 2126; + public static final int IF_SETOBJECT = 2200; + public static final int IF_SETNPCHEAD = 2201; + public static final int IF_SETPLAYERHEAD_SELF = 2202; + public static final int IF_SETOBJECT_NONUM = 2205; + public static final int IF_SETOBJECT_ALWAYS_NUM = 2212; + public static final int IF_SETOP = 2300; + public static final int IF_SETDRAGGABLE = 2301; + public static final int IF_SETDRAGGABLEBEHAVIOR = 2302; + public static final int IF_SETDRAGDEADZONE = 2303; + public static final int IF_SETDRAGDEADTIME = 2304; + public static final int IF_SETOPBASE = 2305; + public static final int IF_SETTARGETVERB = 2306; + public static final int IF_CLEAROPS = 2307; + public static final int IF_SETOPKEY = 2350; + public static final int IF_SETOPTKEY = 2351; + public static final int IF_SETOPKEYRATE = 2352; + public static final int IF_SETOPTKEYRATE = 2353; + public static final int IF_SETOPKEYIGNOREHELD = 2354; + public static final int IF_SETOPTKEYIGNOREHELD = 2355; + public static final int IF_SETONCLICK = 2400; + public static final int IF_SETONHOLD = 2401; + public static final int IF_SETONRELEASE = 2402; + public static final int IF_SETONMOUSEOVER = 2403; + public static final int IF_SETONMOUSELEAVE = 2404; + public static final int IF_SETONDRAG = 2405; + public static final int IF_SETONTARGETLEAVE = 2406; + public static final int IF_SETONVARTRANSMIT = 2407; + public static final int IF_SETONTIMER = 2408; + public static final int IF_SETONOP = 2409; + public static final int IF_SETONDRAGCOMPLETE = 2410; + public static final int IF_SETONCLICKREPEAT = 2411; + public static final int IF_SETONMOUSEREPEAT = 2412; + public static final int IF_SETONINVTRANSMIT = 2414; + public static final int IF_SETONSTATTRANSMIT = 2415; + public static final int IF_SETONTARGETENTER = 2416; + public static final int IF_SETONSCROLLWHEEL = 2417; + public static final int IF_SETONCHATTRANSMIT = 2418; + public static final int IF_SETONKEY = 2419; + public static final int IF_SETONFRIENDTRANSMIT = 2420; + public static final int IF_SETONCLANTRANSMIT = 2421; + public static final int IF_SETONMISCTRANSMIT = 2422; + public static final int IF_SETONDIALOGABORT = 2423; + public static final int IF_SETONSUBCHANGE = 2424; + public static final int IF_SETONSTOCKTRANSMIT = 2425; + public static final int IF_SETONRESIZE = 2427; + public static final int IF_GETX = 2500; + public static final int IF_GETY = 2501; + public static final int IF_GETWIDTH = 2502; + public static final int IF_GETHEIGHT = 2503; + public static final int IF_GETHIDE = 2504; + public static final int IF_GETLAYER = 2505; + public static final int IF_GETSCROLLX = 2600; + public static final int IF_GETSCROLLY = 2601; + public static final int IF_GETTEXT = 2602; + public static final int IF_GETSCROLLWIDTH = 2603; + public static final int IF_GETSCROLLHEIGHT = 2604; + public static final int IF_GETMODELZOOM = 2605; + public static final int IF_GETMODELANGLE_X = 2606; + public static final int IF_GETMODELANGLE_Z = 2607; + public static final int IF_GETMODELANGLE_Y = 2608; + public static final int IF_GETTRANS = 2609; + public static final int IF_GETCOLOUR = 2611; + public static final int IF_GETFILLCOLOUR = 2612; + public static final int IF_GETINVOBJECT = 2700; + public static final int IF_GETINVCOUNT = 2701; + public static final int IF_HASSUB = 2702; + public static final int IF_GETTOP = 2706; + public static final int IF_GETTARGETMASK = 2800; + public static final int IF_GETOP = 2801; + public static final int IF_GETOPBASE = 2802; + public static final int IF_CALLONRESIZE = 2927; + public static final int MES = 3100; + public static final int ANIM = 3101; + public static final int IF_CLOSE = 3103; + public static final int RESUME_COUNTDIALOG = 3104; + public static final int RESUME_NAMEDIALOG = 3105; + public static final int RESUME_STRINGDIALOG = 3106; + public static final int OPPLAYER = 3107; + public static final int IF_DRAGPICKUP = 3108; + public static final int CC_DRAGPICKUP = 3109; + public static final int MOUSECAM = 3110; + public static final int GETREMOVEROOFS = 3111; + public static final int SETREMOVEROOFS = 3112; + public static final int OPENURL = 3113; + public static final int RESUME_OBJDIALOG = 3115; + public static final int BUG_REPORT = 3116; + public static final int SETSHIFTCLICKDROP = 3117; + public static final int SETSHOWMOUSEOVERTEXT = 3118; + public static final int RENDERSELF = 3119; + public static final int SETSHOWMOUSECROSS = 3125; + public static final int SETSHOWLOADINGMESSAGES = 3126; + public static final int SETTAPTODROP = 3127; + public static final int GETTAPTODROP = 3128; + public static final int GETCANVASSIZE = 3132; + public static final int SETHIDEUSERNAME = 3141; + public static final int GETHIDEUSERNAME = 3142; + public static final int SETREMEMBERUSERNAME = 3143; + public static final int GETREMEMBERUSERNAME = 3144; + public static final int SOUND_SYNTH = 3200; + public static final int SOUND_SONG = 3201; + public static final int SOUND_JINGLE = 3202; + public static final int CLIENTCLOCK = 3300; + public static final int INV_GETOBJ = 3301; + public static final int INV_GETNUM = 3302; + public static final int INV_TOTAL = 3303; + public static final int INV_SIZE = 3304; + public static final int STAT = 3305; + public static final int STAT_BASE = 3306; + public static final int STAT_XP = 3307; + public static final int COORD = 3308; + public static final int COORDX = 3309; + public static final int COORDZ = 3310; + public static final int COORDY = 3311; + public static final int MAP_MEMBERS = 3312; + public static final int INVOTHER_GETOBJ = 3313; + public static final int INVOTHER_GETNUM = 3314; + public static final int INVOTHER_TOTAL = 3315; + public static final int STAFFMODLEVEL = 3316; + public static final int REBOOTTIMER = 3317; + public static final int MAP_WORLD = 3318; + public static final int RUNENERGY_VISIBLE = 3321; + public static final int RUNWEIGHT_VISIBLE = 3322; + public static final int PLAYERMOD = 3323; + public static final int WORLDFLAGS = 3324; + public static final int MOVECOORD = 3325; + public static final int ENUM_STRING = 3400; + public static final int ENUM = 3408; + public static final int ENUM_GETOUTPUTCOUNT = 3411; + public static final int FRIEND_COUNT = 3600; + public static final int FRIEND_GETNAME = 3601; + public static final int FRIEND_GETWORLD = 3602; + public static final int FRIEND_GETRANK = 3603; + public static final int FRIEND_SETRANK = 3604; + public static final int FRIEND_ADD = 3605; + public static final int FRIEND_DEL = 3606; + public static final int IGNORE_ADD = 3607; + public static final int IGNORE_DEL = 3608; + public static final int FRIEND_TEST = 3609; + public static final int CLAN_GETCHATDISPLAYNAME = 3611; + public static final int CLAN_GETCHATCOUNT = 3612; + public static final int CLAN_GETCHATUSERNAME = 3613; + public static final int CLAN_GETCHATUSERWORLD = 3614; + public static final int CLAN_GETCHATUSERRANK = 3615; + public static final int CLAN_GETCHATMINKICK = 3616; + public static final int CLAN_KICKUSER = 3617; + public static final int CLAN_GETCHATRANK = 3618; + public static final int CLAN_JOINCHAT = 3619; + public static final int CLAN_LEAVECHAT = 3620; + public static final int IGNORE_COUNT = 3621; + public static final int IGNORE_GETNAME = 3622; + public static final int IGNORE_TEST = 3623; + public static final int CLAN_ISSELF = 3624; + public static final int CLAN_GETCHATOWNERNAME = 3625; + public static final int CLAN_ISFRIEND = 3626; + public static final int CLAN_ISIGNORE = 3627; + public static final int STOCKMARKET_GETOFFERTYPE = 3903; + public static final int STOCKMARKET_GETOFFERITEM = 3904; + public static final int STOCKMARKET_GETOFFERPRICE = 3905; + public static final int STOCKMARKET_GETOFFERCOUNT = 3906; + public static final int STOCKMARKET_GETOFFERCOMPLETEDCOUNT = 3907; + public static final int STOCKMARKET_GETOFFERCOMPLETEDGOLD = 3908; + public static final int STOCKMARKET_ISOFFEREMPTY = 3910; + public static final int STOCKMARKET_ISOFFERSTABLE = 3911; + public static final int STOCKMARKET_ISOFFERFINISHED = 3912; + public static final int STOCKMARKET_ISOFFERADDING = 3913; + public static final int TRADINGPOST_SORTBY_NAME = 3914; + public static final int TRADINGPOST_SORTBY_PRICE = 3915; + public static final int TRADINGPOST_SORTFILTERBY_WORLD = 3916; + public static final int TRADINGPOST_SORTBY_AGE = 3917; + public static final int TRADINGPOST_SORTBY_COUNT = 3918; + public static final int TRADINGPOST_GETTOTALOFFERS = 3919; + public static final int TRADINGPOST_GETOFFERWORLD = 3920; + public static final int TRADINGPOST_GETOFFERNAME = 3921; + public static final int TRADINGPOST_GETOFFERPREVIOUSNAME = 3922; + public static final int TRADINGPOST_GETOFFERAGE = 3923; + public static final int TRADINGPOST_GETOFFERCOUNT = 3924; + public static final int TRADINGPOST_GETOFFERPRICE = 3925; + public static final int TRADINGPOST_GETOFFERITEM = 3926; + public static final int ADD = 4000; + public static final int SUB = 4001; + public static final int MULTIPLY = 4002; + public static final int DIV = 4003; + public static final int RANDOM = 4004; + public static final int RANDOMINC = 4005; + public static final int INTERPOLATE = 4006; + public static final int ADDPERCENT = 4007; + public static final int SETBIT = 4008; + public static final int CLEARBIT = 4009; + public static final int TESTBIT = 4010; + public static final int MOD = 4011; + public static final int POW = 4012; + public static final int INVPOW = 4013; + public static final int AND = 4014; + public static final int OR = 4015; + public static final int SCALE = 4018; + public static final int APPEND_NUM = 4100; + public static final int APPEND = 4101; + public static final int APPEND_SIGNNUM = 4102; + public static final int LOWERCASE = 4103; + public static final int FROMDATE = 4104; + public static final int TEXT_GENDER = 4105; + public static final int TOSTRING = 4106; + public static final int COMPARE = 4107; + public static final int PARAHEIGHT = 4108; + public static final int PARAWIDTH = 4109; + public static final int TEXT_SWITCH = 4110; + public static final int ESCAPE = 4111; + public static final int APPEND_CHAR = 4112; + public static final int CHAR_ISPRINTABLE = 4113; + public static final int CHAR_ISALPHANUMERIC = 4114; + public static final int CHAR_ISALPHA = 4115; + public static final int CHAR_ISNUMERIC = 4116; + public static final int STRING_LENGTH = 4117; + public static final int SUBSTRING = 4118; + public static final int REMOVETAGS = 4119; + public static final int STRING_INDEXOF_CHAR = 4120; + public static final int STRING_INDEXOF_STRING = 4121; + public static final int OC_NAME = 4200; + public static final int OC_OP = 4201; + public static final int OC_IOP = 4202; + public static final int OC_COST = 4203; + public static final int OC_STACKABLE = 4204; + public static final int OC_CERT = 4205; + public static final int OC_UNCERT = 4206; + public static final int OC_MEMBERS = 4207; + public static final int OC_PLACEHOLDER = 4208; + public static final int OC_UNPLACEHOLDER = 4209; + public static final int OC_FIND = 4210; + public static final int OC_FINDNEXT = 4211; + public static final int OC_FINDRESET = 4212; + public static final int CHAT_GETFILTER_PUBLIC = 5000; + public static final int CHAT_SETFILTER = 5001; + public static final int CHAT_SENDABUSEREPORT = 5002; + public static final int CHAT_GETHISTORY_BYTYPEANDLINE = 5003; + public static final int CHAT_GETHISTORY_BYUID = 5004; + public static final int CHAT_GETFILTER_PRIVATE = 5005; + public static final int CHAT_SENDPUBLIC = 5008; + public static final int CHAT_SENDPRIVATE = 5009; + public static final int CHAT_PLAYERNAME = 5015; + public static final int CHAT_GETFILTER_TRADE = 5016; + public static final int CHAT_GETHISTORYLENGTH = 5017; + public static final int CHAT_GETNEXTUID = 5018; + public static final int CHAT_GETPREVUID = 5019; + public static final int DOCHEAT = 5020; + public static final int CHAT_SETMESSAGEFILTER = 5021; + public static final int CHAT_GETMESSAGEFILTER = 5022; + public static final int GETWINDOWMODE = 5306; + public static final int SETWINDOWMODE = 5307; + public static final int GETDEFAULTWINDOWMODE = 5308; + public static final int SETDEFAULTWINDOWMODE = 5309; + public static final int CAM_FORCEANGLE = 5504; + public static final int CAM_GETANGLE_XA = 5505; + public static final int CAM_GETANGLE_YA = 5506; + public static final int CAM_SETFOLLOWHEIGHT = 5530; + public static final int CAM_GETFOLLOWHEIGHT = 5531; + public static final int LOGOUT = 5630; + public static final int VIEWPORT_SETFOV = 6200; + public static final int VIEWPORT_SETZOOM = 6201; + public static final int VIEWPORT_CLAMPFOV = 6202; + public static final int VIEWPORT_GETEFFECTIVESIZE = 6203; + public static final int VIEWPORT_GETZOOM = 6204; + public static final int VIEWPORT_GETFOV = 6205; + public static final int WORLDLIST_FETCH = 6500; + public static final int WORLDLIST_START = 6501; + public static final int WORLDLIST_NEXT = 6502; + public static final int WORLDLIST_SPECIFIC = 6506; + public static final int WORLDLIST_SORT = 6507; + public static final int SETFOLLOWEROPSLOWPRIORITY = 6512; + public static final int NC_PARAM = 6513; + public static final int LC_PARAM = 6514; + public static final int OC_PARAM = 6515; + public static final int STRUCT_PARAM = 6516; + public static final int ON_MOBILE = 6518; + public static final int CLIENTTYPE = 6519; + public static final int BATTERYLEVEL = 6524; + public static final int BATTERYCHARGING = 6525; + public static final int WIFIAVAILABLE = 6526; + public static final int WORLDMAP_GETMAPNAME = 6601; + public static final int WORLDMAP_SETMAP = 6602; + public static final int WORLDMAP_GETZOOM = 6603; + public static final int WORLDMAP_SETZOOM = 6604; + public static final int WORLDMAP_ISLOADED = 6605; + public static final int WORLDMAP_JUMPTODISPLAYCOORD = 6606; + public static final int WORLDMAP_JUMPTODISPLAYCOORD_INSTANT = 6607; + public static final int WORLDMAP_JUMPTOSOURCECOORD = 6608; + public static final int WORLDMAP_JUMPTOSOURCECOORD_INSTANT = 6609; + public static final int WORLDMAP_GETDISPLAYPOSITION = 6610; + public static final int WORLDMAP_GETCONFIGORIGIN = 6611; + public static final int WORLDMAP_GETCONFIGSIZE = 6612; + public static final int WORLDMAP_GETCONFIGBOUNDS = 6613; + public static final int WORLDMAP_GETCONFIGZOOM = 6614; + public static final int WORLDMAP_GETCURRENTMAP = 6616; + public static final int WORLDMAP_GETDISPLAYCOORD = 6617; + public static final int WORLDMAP_COORDINMAP = 6621; + public static final int WORLDMAP_GETSIZE = 6622; + public static final int WORLDMAP_PERPETUALFLASH = 6628; + public static final int WORLDMAP_FLASHELEMENT = 6629; + public static final int WORLDMAP_FLASHELEMENTCATEGORY = 6630; + public static final int WORLDMAP_STOPCURRENTFLASHES = 6631; + public static final int WORLDMAP_DISABLEELEMENTS = 6632; + public static final int WORLDMAP_DISABLEELEMENT = 6633; + public static final int WORLDMAP_DISABLEELEMENTCATEGORY = 6634; + public static final int WORLDMAP_GETDISABLEELEMENTS = 6635; + public static final int WORLDMAP_GETDISABLEELEMENT = 6636; + public static final int WORLDMAP_GETDISABLEELEMENTCATEGORY = 6637; + public static final int WORLDMAP_LISTELEMENT_START = 6639; + public static final int WORLDMAP_LISTELEMENT_NEXT = 6640; + public static final int MEC_TEXT = 6693; + public static final int MEC_TEXTSIZE = 6694; + public static final int MEC_CATEGORY = 6695; + public static final int MEC_SPRITE = 6696; +} diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/Assembler.java b/cache/src/main/java/net/runelite/cache/script/assembler/Assembler.java new file mode 100644 index 0000000000..643057911e --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/assembler/Assembler.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.assembler; + +import java.io.IOException; +import java.io.InputStream; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.script.Instructions; +import net.runelite.cache.script.assembler.rs2asmParser.ProgContext; +import org.antlr.v4.runtime.ANTLRInputStream; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.tree.ParseTreeWalker; + +public class Assembler +{ + private final Instructions instructions; + + public Assembler(Instructions instructions) + { + this.instructions = instructions; + } + + public ScriptDefinition assemble(InputStream in) throws IOException + { + // Get our lexer + rs2asmLexer lexer = new rs2asmLexer(new ANTLRInputStream(in)); + + LexerErrorListener errorListener = new LexerErrorListener(); + lexer.addErrorListener(errorListener); + + // Get a list of matched tokens + CommonTokenStream tokens = new CommonTokenStream(lexer); + + // Pass the tokens to the parser + rs2asmParser parser = new rs2asmParser(tokens); + + // Specify our entry point + ProgContext progContext = parser.prog(); + + if (errorListener.getErrors() > 0) + { + throw new RuntimeException("syntax error"); + } + + // Walk it and attach our listener + ParseTreeWalker walker = new ParseTreeWalker(); + + // walk through first and resolve labels + LabelVisitor labelVisitor = new LabelVisitor(); + walker.walk(labelVisitor, progContext); + + ScriptWriter listener = new ScriptWriter(instructions, labelVisitor); + walker.walk(listener, progContext); + + return listener.buildScript(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/LabelVisitor.java b/cache/src/main/java/net/runelite/cache/script/assembler/LabelVisitor.java new file mode 100644 index 0000000000..b78cfd6523 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/assembler/LabelVisitor.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.assembler; + +import java.util.HashMap; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LabelVisitor extends rs2asmBaseListener +{ + private static final Logger logger = LoggerFactory.getLogger(LabelVisitor.class); + + private int pos; + private final Map map = new HashMap<>(); + + @Override + public void exitInstruction(rs2asmParser.InstructionContext ctx) + { + ++pos; + } + + @Override + public void enterLabel(rs2asmParser.LabelContext ctx) + { + String text = ctx.getText(); + text = text.substring(0, text.length() - 1); // remove trailing : + + logger.debug("Label {} is on instruction {}", text, pos); + + map.put(text, pos); + } + + public Integer getInstructionForLabel(String label) + { + return map.get(label); + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/LexerErrorListener.java b/cache/src/main/java/net/runelite/cache/script/assembler/LexerErrorListener.java new file mode 100644 index 0000000000..bd3463a946 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/assembler/LexerErrorListener.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.assembler; + +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; + +public class LexerErrorListener extends BaseErrorListener +{ + private int errors; + + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) + { + ++errors; + } + + public int getErrors() + { + return errors; + } + +} diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/LookupCase.java b/cache/src/main/java/net/runelite/cache/script/assembler/LookupCase.java new file mode 100644 index 0000000000..8c97feef3d --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/assembler/LookupCase.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.assembler; + +public class LookupCase +{ + private int value; + private int offset; + + public int getValue() + { + return value; + } + + public void setValue(int value) + { + this.value = value; + } + + public int getOffset() + { + return offset; + } + + public void setOffset(int offset) + { + this.offset = offset; + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/LookupSwitch.java b/cache/src/main/java/net/runelite/cache/script/assembler/LookupSwitch.java new file mode 100644 index 0000000000..e1d305d40e --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/assembler/LookupSwitch.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.assembler; + +import java.util.ArrayList; +import java.util.List; + +public class LookupSwitch +{ + private final List cases = new ArrayList<>(); + + public List getCases() + { + return cases; + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/ScriptWriter.java b/cache/src/main/java/net/runelite/cache/script/assembler/ScriptWriter.java new file mode 100644 index 0000000000..2797d4a4c6 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/assembler/ScriptWriter.java @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.assembler; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.script.Instruction; +import net.runelite.cache.script.Instructions; +import net.runelite.cache.script.Opcodes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ScriptWriter extends rs2asmBaseListener +{ + private static final Logger logger = LoggerFactory.getLogger(ScriptWriter.class); + + private final Instructions instructions; + private final LabelVisitor labelVisitor; + + private int id; + private int pos; + private int intStackCount; + private int stringStackCount; + private int localIntCount; + private int localStringCount; + private List opcodes = new ArrayList<>(); + private List iops = new ArrayList<>(); + private List sops = new ArrayList<>(); + private List switches = new ArrayList<>(); + + public ScriptWriter(Instructions instructions, LabelVisitor labelVisitor) + { + this.instructions = instructions; + this.labelVisitor = labelVisitor; + } + + @Override + public void enterId_value(rs2asmParser.Id_valueContext ctx) + { + int value = Integer.parseInt(ctx.getText()); + id = value; + } + + @Override + public void enterInt_stack_value(rs2asmParser.Int_stack_valueContext ctx) + { + int value = Integer.parseInt(ctx.getText()); + intStackCount = value; + } + + @Override + public void enterString_stack_value(rs2asmParser.String_stack_valueContext ctx) + { + int value = Integer.parseInt(ctx.getText()); + stringStackCount = value; + } + + @Override + public void enterInt_var_value(rs2asmParser.Int_var_valueContext ctx) + { + int value = Integer.parseInt(ctx.getText()); + localIntCount = value; + } + + @Override + public void enterString_var_value(rs2asmParser.String_var_valueContext ctx) + { + int value = Integer.parseInt(ctx.getText()); + localStringCount = value; + } + + @Override + public void exitInstruction(rs2asmParser.InstructionContext ctx) + { + ++pos; + } + + @Override + public void enterName_string(rs2asmParser.Name_stringContext ctx) + { + String text = ctx.getText(); + Instruction i = instructions.find(text); + if (i == null) + { + logger.warn("Unknown instruction {}", text); + throw new RuntimeException("Unknown instruction " + text); + } + + int opcode = i.getOpcode(); + addOpcode(opcode); + } + + @Override + public void enterName_opcode(rs2asmParser.Name_opcodeContext ctx) + { + String text = ctx.getText(); + int opcode = Integer.parseInt(text); + addOpcode(opcode); + } + + private void addOpcode(int opcode) + { + assert opcodes.size() == pos; + assert iops.size() == pos; + assert sops.size() == pos; + assert switches.size() == pos; + + opcodes.add(opcode); + iops.add(null); + sops.add(null); + switches.add(null); + } + + @Override + public void enterOperand_int(rs2asmParser.Operand_intContext ctx) + { + String text = ctx.getText(); + int value = Integer.parseInt(text); + iops.set(pos, value); + } + + @Override + public void enterOperand_qstring(rs2asmParser.Operand_qstringContext ctx) + { + String text = ctx.getText(); + text = text.substring(1, text.length() - 1); + sops.set(pos, text); + } + + @Override + public void enterOperand_label(rs2asmParser.Operand_labelContext ctx) + { + String text = ctx.getText(); + Integer instruction = labelVisitor.getInstructionForLabel(text); + if (instruction == null) + { + throw new RuntimeException("reference to unknown label " + text); + } + + int target = instruction - pos - 1; // -1 to go to the instruction prior + iops.set(pos, target); + } + + @Override + public void enterSwitch_lookup(rs2asmParser.Switch_lookupContext ctx) + { + if (switches.get(pos - 1) != null) + { + return; + } + + LookupSwitch ls = new LookupSwitch(); + switches.set(pos - 1, ls); + } + + @Override + public void exitSwitch_key(rs2asmParser.Switch_keyContext ctx) + { + String text = ctx.getText(); + int key = Integer.parseInt(text); + + LookupSwitch ls = switches.get(pos - 1); + assert ls != null; + + LookupCase scase = new LookupCase(); + scase.setValue(key); + + ls.getCases().add(scase); + } + + @Override + public void exitSwitch_value(rs2asmParser.Switch_valueContext ctx) + { + String text = ctx.getText(); + Integer instruction = labelVisitor.getInstructionForLabel(text); + if (instruction == null) + { + throw new RuntimeException("reference to unknown label " + text); + } + + int target = instruction // target instruction index + - (pos - 1) // pos is already at the instruction after the switch, so - 1 + - 1; // to go to the instruction prior to target + + LookupSwitch ls = switches.get(pos - 1); + assert ls != null; + + LookupCase scase = ls.getCases().get(ls.getCases().size() - 1); + scase.setOffset(target); + } + + public ScriptDefinition buildScript() + { + setSwitchOperands(); + + ScriptDefinition script = new ScriptDefinition(); + script.setId(id); + script.setIntStackCount(intStackCount); + script.setStringStackCount(stringStackCount); + script.setLocalIntCount(localIntCount); + script.setLocalStringCount(localStringCount); + script.setInstructions(opcodes.stream().mapToInt(Integer::valueOf).toArray()); + script.setIntOperands(iops.stream() + .map(i -> i == null ? 0 : i) + .mapToInt(Integer::valueOf) + .toArray()); + script.setStringOperands(sops.toArray(new String[0])); + script.setSwitches(buildSwitches()); + return script; + } + + private void setSwitchOperands() + { + int count = 0; + for (int i = 0; i < opcodes.size(); ++i) + { + if (opcodes.get(i) != Opcodes.SWITCH) + { + continue; + } + + iops.set(i, count++); + } + } + + private Map[] buildSwitches() + { + int count = (int) switches.stream().filter(Objects::nonNull).count(); + + if (count == 0) + { + return null; + } + + int index = 0; + Map[] maps = new Map[count]; + for (LookupSwitch lswitch : switches) + { + if (lswitch == null) + { + continue; + } + + Map map = maps[index++] = new HashMap<>(); + + for (LookupCase scase : lswitch.getCases()) + { + map.put(scase.getValue(), scase.getOffset()); + } + } + return maps; + } +} diff --git a/cache/src/main/java/net/runelite/cache/script/disassembler/Disassembler.java b/cache/src/main/java/net/runelite/cache/script/disassembler/Disassembler.java new file mode 100644 index 0000000000..0a6382fec8 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/script/disassembler/Disassembler.java @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.disassembler; + +import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.script.Instruction; +import net.runelite.cache.script.Instructions; +import net.runelite.cache.script.Opcodes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Disassembler +{ + private static final Logger logger = LoggerFactory.getLogger(Disassembler.class); + + private final Instructions instructions = new Instructions(); + + public Disassembler() + { + instructions.init(); + } + + private boolean isJump(int opcode) + { + switch (opcode) + { + case Opcodes.JUMP: + case Opcodes.IF_ICMPEQ: + case Opcodes.IF_ICMPGE: + case Opcodes.IF_ICMPGT: + case Opcodes.IF_ICMPLE: + case Opcodes.IF_ICMPLT: + case Opcodes.IF_ICMPNE: + return true; + default: + return false; + } + } + + private boolean[] needLabel(ScriptDefinition script) + { + int[] instructions = script.getInstructions(); + int[] iops = script.getIntOperands(); + Map[] switches = script.getSwitches(); + + boolean[] jumped = new boolean[instructions.length]; + + for (int i = 0; i < instructions.length; ++i) + { + int opcode = instructions[i]; + int iop = iops[i]; + + if (opcode == Opcodes.SWITCH) + { + Map switchMap = switches[iop]; + + for (Entry entry : switchMap.entrySet()) + { + int offset = entry.getValue(); + + int to = i + offset + 1; + assert to >= 0 && to < instructions.length; + jumped[to] = true; + } + } + + if (!isJump(opcode)) + { + continue; + } + + // + 1 because the jumps go to the instructions prior to the + // one you really want, because the pc is incremented on the + // next loop + int to = i + iop + 1; + assert to >= 0 && to < instructions.length; + + jumped[to] = true; + } + + return jumped; + } + + public String disassemble(ScriptDefinition script) throws IOException + { + int[] instructions = script.getInstructions(); + int[] iops = script.getIntOperands(); + String[] sops = script.getStringOperands(); + Map[] switches = script.getSwitches(); + + assert iops.length == instructions.length; + assert sops.length == instructions.length; + + boolean[] jumps = needLabel(script); + + StringBuilder writer = new StringBuilder(); + writerHeader(writer, script); + + for (int i = 0; i < instructions.length; ++i) + { + int opcode = instructions[i]; + int iop = iops[i]; + String sop = sops[i]; + + Instruction ins = this.instructions.find(opcode); + if (ins == null) + { + logger.warn("Unknown instruction {} in script {}", opcode, script.getId()); + } + + if (jumps[i]) + { + // something jumps here + writer.append("LABEL").append(i).append(":\n"); + } + + String name; + if (ins != null && ins.getName() != null) + { + name = ins.getName(); + } + else + { + name = String.format("%03d", opcode); + } + + writer.append(String.format(" %-22s", name)); + + if (shouldWriteIntOperand(opcode, iop)) + { + if (isJump(opcode)) + { + writer.append(" LABEL").append(i + iop + 1); + } + else + { + writer.append(" ").append(iop); + } + } + + if (sop != null) + { + writer.append(" \"").append(sop).append("\""); + } + + if (opcode == Opcodes.SWITCH) + { + Map switchMap = switches[iop]; + + for (Entry entry : switchMap.entrySet()) + { + int value = entry.getKey(); + int jump = entry.getValue(); + + writer.append("\n"); + writer.append(" ").append(value).append(": LABEL").append(i + jump + 1); + } + } + + writer.append("\n"); + } + + return writer.toString(); + } + + private boolean shouldWriteIntOperand(int opcode, int operand) + { + if (opcode == Opcodes.SWITCH) + { + // table follows instruction + return false; + } + + if (operand != 0) + { + // always write non-zero operand + return true; + } + + switch (opcode) + { + case Opcodes.ICONST: + case Opcodes.ILOAD: + case Opcodes.SLOAD: + case Opcodes.ISTORE: + case Opcodes.SSTORE: + return true; + } + + // int operand is not used, don't write it + return false; + } + + private void writerHeader(StringBuilder writer, ScriptDefinition script) + { + int id = script.getId(); + int intStackCount = script.getIntStackCount(); + int stringStackCount = script.getStringStackCount(); + int localIntCount = script.getLocalIntCount(); + int localStringCount = script.getLocalStringCount(); + + writer.append(".id ").append(id).append('\n'); + writer.append(".int_stack_count ").append(intStackCount).append('\n'); + writer.append(".string_stack_count ").append(stringStackCount).append('\n'); + writer.append(".int_var_count ").append(localIntCount).append('\n'); + writer.append(".string_var_count ").append(localStringCount).append('\n'); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/BZip2.java b/cache/src/main/java/net/runelite/cache/util/BZip2.java new file mode 100644 index 0000000000..cde6fc55da --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/BZip2.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream; +import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream; +import org.apache.commons.compress.utils.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BZip2 +{ + private static final Logger logger = LoggerFactory.getLogger(BZip2.class); + + private static final byte[] BZIP_HEADER = new byte[] + { + 'B', 'Z', // magic + 'h', // 'h' for Bzip2 ('H'uffman coding) + '1' // block size + }; + + public static byte[] compress(byte[] bytes) throws IOException + { + InputStream is = new ByteArrayInputStream(bytes); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + try (OutputStream os = new BZip2CompressorOutputStream(bout, 1)) + { + IOUtils.copy(is, os); + } + + byte[] out = bout.toByteArray(); + + assert BZIP_HEADER[0] == out[0]; + assert BZIP_HEADER[1] == out[1]; + assert BZIP_HEADER[2] == out[2]; + assert BZIP_HEADER[3] == out[3]; + + return Arrays.copyOfRange(out, BZIP_HEADER.length, out.length); // remove header.. + } + + public static byte[] decompress(byte[] bytes, int len) throws IOException + { + byte[] data = new byte[len + BZIP_HEADER.length]; + + // add header + System.arraycopy(BZIP_HEADER, 0, data, 0, BZIP_HEADER.length); + System.arraycopy(bytes, 0, data, BZIP_HEADER.length, len); + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + try (InputStream is = new BZip2CompressorInputStream(new ByteArrayInputStream(data))) + { + IOUtils.copy(is, os); + } + + return os.toByteArray(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/Crc32.java b/cache/src/main/java/net/runelite/cache/util/Crc32.java new file mode 100644 index 0000000000..929ddd44e0 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/Crc32.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.util; + +import java.util.zip.CRC32; + +public class Crc32 +{ + private final CRC32 crc32 = new CRC32(); + + public void update(byte[] data, int offset, int length) + { + crc32.update(data, offset, length); + } + + public int getHash() + { + return (int) crc32.getValue(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/Djb2.java b/cache/src/main/java/net/runelite/cache/util/Djb2.java new file mode 100644 index 0000000000..e6ccc13e05 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/Djb2.java @@ -0,0 +1,28 @@ +package net.runelite.cache.util; + +/** + * An implementation of the {@code djb2} hash function. + * + * @author Graham + * @author `Discardedx2 + */ +public final class Djb2 +{ + /** + * An implementation of Dan Bernstein's {@code djb2} hash function which + * is slightly modified. Instead of the initial hash being 5381, it is + * zero. + * + * @param str The string to hash. + * @return The hash code. + */ + public static int hash(String str) + { + int hash = 0; + for (int i = 0; i < str.length(); i++) + { + hash = str.charAt(i) + ((hash << 5) - hash); + } + return hash; + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/Djb2Manager.java b/cache/src/main/java/net/runelite/cache/util/Djb2Manager.java new file mode 100644 index 0000000000..5db676fd26 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/Djb2Manager.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Djb2Manager +{ + private static final Logger logger = LoggerFactory.getLogger(Djb2Manager.class); + + private final Map hashes = new HashMap<>(); + + public void load() throws IOException + { + Properties properties = new Properties(); + properties.load(Djb2Manager.class.getResourceAsStream("/djb2.properties")); + + for (Object key : properties.keySet()) + { + int hash = Integer.parseInt((String) key); + String value = properties.getProperty((String) key); + + hashes.put(hash, value); + } + + logger.info("Loaded {} djb2 hashes", hashes.size()); + } + + public String getName(int hash) + { + return hashes.get(hash); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/GZip.java b/cache/src/main/java/net/runelite/cache/util/GZip.java new file mode 100644 index 0000000000..faae86eaa8 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/GZip.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache.util; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import org.apache.commons.compress.utils.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GZip +{ + private static final Logger logger = LoggerFactory.getLogger(GZip.class); + + public static byte[] compress(byte[] bytes) throws IOException + { + InputStream is = new ByteArrayInputStream(bytes); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + + try (OutputStream os = new GZIPOutputStream(bout)) + { + IOUtils.copy(is, os); + } + + return bout.toByteArray(); + } + + public static byte[] decompress(byte[] bytes, int len) throws IOException + { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + try (InputStream is = new GZIPInputStream(new ByteArrayInputStream(bytes, 0, len))) + { + IOUtils.copy(is, os); + } + + return os.toByteArray(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/IDClass.java b/cache/src/main/java/net/runelite/cache/util/IDClass.java new file mode 100644 index 0000000000..e647fb27e1 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/IDClass.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; + +public class IDClass extends PrintWriter +{ + private final Namer namer = new Namer(); + + private IDClass(File file) throws FileNotFoundException + { + super(file); + } + + public static IDClass create(File directory, String name) throws IOException + { + IDClass c = new IDClass(new File(directory, name + ".java")); + c.println("/* This file is automatically generated. Do not edit. */"); + c.println("package net.runelite.api;"); + c.println(); + c.print("public final class "); + c.println(name); + c.println("{"); + return c; + } + + public void add(String name, int id) + { + String javaName = namer.name(name, id); + if (javaName == null) + { + return; + } + + println(" public static final int " + javaName + " = " + id + ";"); + } + + @Override + public void println() + { + // Java 9+ only reads line.separator on startup, so we have to override it here + write('\n'); + } + + @Override + public void close() + { + println("\t/* This file is automatically generated. Do not edit. */"); + println("}"); + super.close(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/Namer.java b/cache/src/main/java/net/runelite/cache/util/Namer.java new file mode 100644 index 0000000000..834da31f98 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/Namer.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2017, Adam + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import java.util.HashSet; +import java.util.Set; + +public class Namer +{ + private final Set used = new HashSet<>(); + + public String name(String name, int id) + { + name = sanitize(name); + + if (name == null) + { + return null; + } + + if (used.contains(name)) + { + name = name + "_" + id; + assert !used.contains(name); + } + + used.add(name); + + return name; + } + + private static String sanitize(String in) + { + String s = removeTags(in) + .toUpperCase() + .replace(' ', '_') + .replaceAll("[^a-zA-Z0-9_]", ""); + if (s.isEmpty()) + { + return null; + } + if (Character.isDigit(s.charAt(0))) + { + return "_" + s; + } + else + { + return s; + } + } + + public static String removeTags(String str) + { + StringBuilder builder = new StringBuilder(str.length()); + boolean inTag = false; + + for (int i = 0; i < str.length(); i++) + { + char currentChar = str.charAt(i); + + if (currentChar == '<') + { + inTag = true; + } + else if (currentChar == '>') + { + inTag = false; + } + else if (!inTag) + { + builder.append(currentChar); + } + } + + return builder.toString(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/ScriptVarType.java b/cache/src/main/java/net/runelite/cache/util/ScriptVarType.java new file mode 100644 index 0000000000..2ff3bdf515 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/ScriptVarType.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import java.util.HashMap; +import java.util.Map; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum ScriptVarType +{ + INTEGER('i', "integer"), + BOOLEAN('1', "boolean"), + SEQ('A', "seq"), + COLOUR('C', "colour"), + /** + * Also known as {@code Widget}. + */ + COMPONENT('I', "component"), + IDKIT('K', "idkit"), + MIDI('M', "midi"), + SYNTH('P', "synth"), + STAT('S', "stat"), + COORDGRID('c', "coordgrid"), + GRAPHIC('d', "graphic"), + FONTMETRICS('f', "fontmetrics"), + ENUM('g', "enum"), + JINGLE('j', "jingle"), + /** + * Also known as {@code Object}. + */ + LOC('l', "loc"), + MODEL('m', "model"), + NPC('n', "npc"), + /** + * Also known as {@code Item}. + */ + OBJ('o', "obj"), + /** + * Another version of {@code OBJ}, but means that on Jagex's side they used the internal name for an item. + */ + NAMEDOBJ('O', "namedobj"), + STRING('s', "string"), + SPOTANIM('t', "spotanim"), + INV('v', "inv"), + TEXTURE('x', "texture"), + CHAR('z', "char"), + MAPSCENEICON('£', "mapsceneicon"), + MAPELEMENT('µ', "mapelement"), + HITMARK('×', "hitmark"), + STRUCT('J', "struct"); + + private static final Map keyToTypeMap = new HashMap<>(); + + static + { + for (ScriptVarType type : values()) + { + keyToTypeMap.put(type.keyChar, type); + } + } + + public static ScriptVarType forCharKey(char key) + { + return keyToTypeMap.get(key); + } + + /** + * The character used when encoding or decoding types. + */ + private final char keyChar; + + /** + * The full name of the var type. + */ + private final String fullName; + +} diff --git a/cache/src/main/java/net/runelite/cache/util/Xtea.java b/cache/src/main/java/net/runelite/cache/util/Xtea.java new file mode 100644 index 0000000000..c79dc5a511 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/Xtea.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +public class Xtea +{ + private static final int GOLDEN_RATIO = 0x9E3779B9; + + private static final int ROUNDS = 32; + + private final int[] key; + + public Xtea(int[] key) + { + this.key = key; + } + + public byte[] encrypt(byte[] data, int len) + { + ByteBuf buf = Unpooled.wrappedBuffer(data, 0, len); + ByteBuf out = Unpooled.buffer(len); + int numBlocks = len / 8; + for (int block = 0; block < numBlocks; ++block) + { + int v0 = buf.readInt(); + int v1 = buf.readInt(); + int sum = 0; + for (int i = 0; i < ROUNDS; ++i) + { + v0 += (((v1 << 4) ^ (v1 >>> 5)) + v1) ^ (sum + key[sum & 3]); + sum += GOLDEN_RATIO; + v1 += (((v0 << 4) ^ (v0 >>> 5)) + v0) ^ (sum + key[(sum >>> 11) & 3]); + } + out.writeInt(v0); + out.writeInt(v1); + } + out.writeBytes(buf); + return out.array(); + } + + public byte[] decrypt(byte[] data, int len) + { + ByteBuf buf = Unpooled.wrappedBuffer(data, 0, len); + ByteBuf out = Unpooled.buffer(len); + int numBlocks = len / 8; + for (int block = 0; block < numBlocks; ++block) + { + int v0 = buf.readInt(); + int v1 = buf.readInt(); + int sum = GOLDEN_RATIO * ROUNDS; + for (int i = 0; i < ROUNDS; ++i) + { + v1 -= (((v0 << 4) ^ (v0 >>> 5)) + v0) ^ (sum + key[(sum >>> 11) & 3]); + sum -= GOLDEN_RATIO; + v0 -= (((v1 << 4) ^ (v1 >>> 5)) + v1) ^ (sum + key[sum & 3]); + } + out.writeInt(v0); + out.writeInt(v1); + } + out.writeBytes(buf); + return out.array(); + } +} diff --git a/cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java b/cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java new file mode 100644 index 0000000000..80f8dbf981 --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import net.runelite.http.api.xtea.XteaClient; +import net.runelite.http.api.xtea.XteaKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class XteaKeyManager +{ + private static final Logger logger = LoggerFactory.getLogger(XteaKeyManager.class); + + private final Map keys = new HashMap<>(); + + public void loadKeys() + { + XteaClient xteaClient = new XteaClient(); + + try + { + for (XteaKey key : xteaClient.get()) + { + keys.put(key.getRegion(), key.getKeys()); + } + } + catch (IOException ex) + { + // happens on release when it is not deployed yet + logger.debug("unable to load xtea keys", ex); + return; + } + + logger.info("Loaded {} keys", keys.size()); + } + + public int[] getKeys(int region) + { + return keys.get(region); + } +} diff --git a/cache/src/main/resources/djb2.properties b/cache/src/main/resources/djb2.properties new file mode 100644 index 0000000000..87c3bb8a6c --- /dev/null +++ b/cache/src/main/resources/djb2.properties @@ -0,0 +1,1403 @@ +#Wed Nov 29 15:08:06 PST 2017 +-1863637185=miscgraphics,4 +-1863637184=miscgraphics,5 +-1863637187=miscgraphics,2 +-1863637186=miscgraphics,3 +-1863637181=miscgraphics,8 +-1863637180=miscgraphics,9 +-440204630=alls fairy in love n war +-1863637183=miscgraphics,6 +-1253085654=scorpia_dances +-1863637182=miscgraphics,7 +1356196826=backvmid3 +-751102526=high seas +1356196825=backvmid2 +-1863637189=miscgraphics,0 +549358875=camelot +-1863637188=miscgraphics,1 +-1619800378=emotes_locked,19 +-1619800379=emotes_locked,18 +792536868=understanding +1356196824=backvmid1 +-1773559904=title_mute +-342013218=p11_full +1523653533=pirates of peril +696768774=harmony +-1701556831=magicoff2,27 +281586976=orb_icon,3 +286265996=ready for battle +-1701556832=magicoff2,26 +281586977=orb_icon,4 +-645977478=scape scared +-1701556833=magicoff2,25 +281586978=orb_icon,5 +-1701556834=magicoff2,24 +-1701556830=magicoff2,28 +-1052794696=dance of death +-1619800383=emotes_locked,14 +-1619800384=emotes_locked,13 +-1619800385=emotes_locked,12 +-1556842207=sl_flags +-1619800386=emotes_locked,11 +1614826739=mapletree +-1619800387=emotes_locked,10 +-1701556835=magicoff2,23 +-1701556836=magicoff2,22 +1363656441=serenade +-1701556837=magicoff2,21 +3089326=door +-1701556838=magicoff2,20 +-1619800380=emotes_locked,17 +-1619800381=emotes_locked,16 +-1619800382=emotes_locked,15 +-1037172987=tomorrow +825974316=melodrama +281586973=orb_icon,0 +281586974=orb_icon,1 +281586975=orb_icon,2 +-1701556864=magicoff2,15 +-1701556865=magicoff2,14 +-1701556866=magicoff2,13 +1509400204=sarcophagus +-1701556867=magicoff2,12 +-1701556860=magicoff2,19 +-1701556861=magicoff2,18 +-1701556862=magicoff2,17 +1868377358=lower_depths +-1701556863=magicoff2,16 +1086036315=reggae2 +-1220755677=hermit +-1544597765=sl_stars +-1619800350=emotes_locked,26 +-1619800351=emotes_locked,25 +-1636062434=tex_brown +-1619800352=emotes_locked,24 +-1619800353=emotes_locked,23 +-2122174648=back to life +-1619800354=emotes_locked,22 +-1701556868=magicoff2,11 +-1619800355=emotes_locked,21 +-1701556869=magicoff2,10 +-1619800356=emotes_locked,20 +1619539773=side_icons,7 +1121239524=scape wild +368271413=diango's little helpers +1619539772=side_icons,6 +1619539775=side_icons,9 +1619539774=side_icons,8 +-1938172321=miscgraphics2,0 +1619539771=side_icons,5 +1619539770=side_icons,4 +-926977577=the enchanter +1202794514=doorways +1343649581=schools out +-1097177625=q8_full +756012174=wornicons,4 +756012173=wornicons,3 +756012176=wornicons,6 +756012175=wornicons,5 +756012170=wornicons,0 +827249681=ogre the top +756012172=wornicons,2 +756012171=wornicons,1 +-1741764817=poles apart +756012178=wornicons,8 +-1938172320=miscgraphics2,1 +756012177=wornicons,7 +-43136286=the last shanty +756012179=wornicons,9 +837131331=mapback +-1938172313=miscgraphics2,8 +907740319=the depths +-1938172312=miscgraphics2,9 +-2099722614=cave of beasts +-1938172317=miscgraphics2,4 +-1938172316=miscgraphics2,5 +-1938172315=miscgraphics2,6 +-1938172314=miscgraphics2,7 +1619539769=side_icons,3 +-1367483767=cavern +-1938172319=miscgraphics2,2 +50474489=treestump +-1938172318=miscgraphics2,3 +1619539766=side_icons,0 +1619539768=side_icons,2 +1619539767=side_icons,1 +-607416954=prayeron,11 +1837251043=melzars maze +-607416953=prayeron,12 +1318893900=have an ice day +-607416952=prayeron,13 +-1701556800=magicoff2,37 +-607416951=prayeron,14 +-1701556801=magicoff2,36 +-56804840=woodland +-607416950=prayeron,15 +1120636327=scape cave +358884868=button_red +-1701556806=magicoff2,31 +-1701556807=magicoff2,30 +-1701556802=magicoff2,35 +-1701556803=magicoff2,34 +-1701556804=magicoff2,33 +-1858265682=monster melee +-1701556805=magicoff2,32 +-649484675=land of the dwarves +-1789903512=golden touch +1328851780=close_buttons,6 +1080306793=shayzien_march +-1339126929=damage +4820960=monkey sadness +-1951786153=bone dance +1328851781=close_buttons,7 +939546513=forlorn_homestead +-1019905269=shadowland +-607416955=prayeron,10 +-2048535896=pheasant peasant +-1025233830=monkey madness +1121125956=scape soft +-1562452687=etcetera +1969878996=emotes,47 +1969878994=emotes,45 +-1228279872=ge_icons,3 +1969878995=emotes,46 +-1228279871=ge_icons,4 +1969878992=emotes,43 +-1228279870=ge_icons,5 +1969878993=emotes,44 +1959803992=invback +399048409=mage arena +1969878990=emotes,41 +-47057524=lasting +1969878991=emotes,42 +-1228279875=ge_icons,0 +-1228279874=ge_icons,1 +-1228279873=ge_icons,2 +-1860080918=inspiration +1997757502=redstone2 +1997757503=redstone3 +-1060046352=tribal2 +1997757501=redstone1 +-1701556829=magicoff2,29 +1890607210=magicon2,37 +1890607211=magicon2,38 +1890607212=magicon2,39 +-1408684838=ascent +-848436598=fishing +-119984250=combaticons2,17 +-119984251=combaticons2,16 +1769177816=jungle island +-119984252=combaticons2,15 +-119984253=combaticons2,14 +-119984254=combaticons2,13 +-119984255=combaticons2,12 +-119984256=combaticons2,11 +-119984257=combaticons2,10 +1890607205=magicon2,32 +1890607206=magicon2,33 +1890607207=magicon2,34 +1890607208=magicon2,35 +135141185=zeah_combat +1890607209=magicon2,36 +-180851958=norse code +112903447=water +922007495=talking forest +-672706748=miracle dance +-1110089645=lament +-1237461365=grotto +1890607203=magicon2,30 +1890607204=magicon2,31 +-1073910849=mirror +-988841056=still night +-1857025509=sunburn +-468596910=easter jig +796868952=major miner +-1066798491=trawler +1640556978=wonderous +-1624274920=emperor +740093634=find my way +1890607238=magicon2,44 +1890607239=magicon2,45 +3559837=tick +-1839713245=sideicons +1029455878=hells bells +1890607234=magicon2,40 +1890607235=magicon2,41 +1890607236=magicon2,42 +1890607237=magicon2,43 +1503566841=forbidden +-895763669=spooky +-276138668=ham attack +500433071=combaticons,5 +-1021014225=catch me if you can +500433070=combaticons,4 +500433073=combaticons,7 +500433072=combaticons,6 +500433075=combaticons,9 +1533565119=mind over matter +500433074=combaticons,8 +2025958358=emotes_locked,4 +500433066=combaticons,0 +2025958357=emotes_locked,3 +862821975=far away +-1228392498=artistry +2025958356=emotes_locked,2 +500433068=combaticons,2 +2025958355=emotes_locked,1 +500433067=combaticons,1 +1085444827=refresh +500433069=combaticons,3 +2025958359=emotes_locked,5 +1427043851=on the up +2025958354=emotes_locked,0 +1316697938=whistle +347955347=venture +1959211608=mapfunction,77 +1959211609=mapfunction,78 +881850881=the chosen +1959211601=mapfunction,70 +1959211602=mapfunction,71 +584643951=lost soul +582140282=rising damp +1959211603=mapfunction,72 +1740872686=soulfall +1959211604=mapfunction,73 +1959211605=mapfunction,74 +-119984248=combaticons2,19 +1959211606=mapfunction,75 +-119984249=combaticons2,18 +1609255038=slither and thither +82917947=sarim's vermin +1959211607=mapfunction,76 +1728911401=natural +-1189743137=duel arena +108698078=roof2 +214634021=head to head +2025958361=emotes_locked,7 +-448773288=isle of everywhere +2025958360=emotes_locked,6 +-1869996941=titlebox +-338347745=showdown +-2075972251=long ago +2025958363=emotes_locked,9 +2025958362=emotes_locked,8 +-1487589606=7th realm +-1253087691=garden +-2133902017=zeah_farming +-492926285=impetuous +3314014=lair +907815588=the desert +-1960860275=barbarianism +1890607241=magicon2,47 +1890607242=magicon2,48 +1890607243=magicon2,49 +-919642451=jungle bells +795515487=underground +561438836=fountain +-1418827919=illusive +-634763748=fruits de mer +1890607240=magicon2,46 +1694458038=large_button +1393517697=bandit camp +1959211632=mapfunction,80 +1884773718=magicoff2,2 +1884773719=magicoff2,3 +1884773716=magicoff2,0 +2121900771=backtop1 +1884773717=magicoff2,1 +-103077377=gnomeball +-1947119982=blistering barnacles +828650857=autumn voyage +92909147=alone +1691516951=undead dungeon +122265833=expecting +-1320617626=dunjun +1959211633=mapfunction,81 +1959211634=mapfunction,82 +1959211635=mapfunction,83 +1959211636=mapfunction,84 +1959211637=mapfunction,85 +777534707=army of darkness +1959211638=mapfunction,86 +1959211639=mapfunction,87 +1884773721=magicoff2,5 +1884773722=magicoff2,6 +1884773720=magicoff2,4 +1959211640=mapfunction,88 +1959211641=mapfunction,89 +-327707013=anywhere +1884773725=magicoff2,9 +1884773723=magicoff2,7 +1884773724=magicoff2,8 +1116844876=incantation +-728886272=temple of light +685934899=in the clink +-1237289460=grumpy +1945133711=inferno +466902883=strange place +-418223472=phasmatys +817472004=zombiism +106578554=zeah_book,0 +106578555=zeah_book,1 +1509070203=eagle peak +-485932799=expedition +1171923143=emotes,8 +-675357975=attack1 +1171923144=emotes,9 +1959211610=mapfunction,79 +-675357974=attack2 +-675357973=attack3 +-675357972=attack4 +-675357971=attack5 +40246002=masquerade +-675357970=attack6 +-734206983=arrival +-1980407601=sea shanty xmas +284435223=pharoah's tomb +-148552909=down below +1171923141=emotes,6 +1171923142=emotes,7 +1171923140=emotes,5 +-1077789440=mellow +-710537653=kingdom +1171923138=emotes,3 +1171923139=emotes,4 +1171923136=emotes,1 +-2098286081=venture2 +1171923137=emotes,2 +1171923135=emotes,0 +-1094248165=sigmunds showdown +-271106892=rat a tat tat +3288564=keys +-143163121=ham fisted +-900633031=medieval +944208821=life's a beach\! +-1228279453=riverside +-1666444059=combaticons,10 +825919125=options_icons,24 +825919126=options_icons,25 +1179379180=the trade parade +-1666444057=combaticons,12 +825919123=options_icons,22 +-1666444058=combaticons,11 +825919124=options_icons,23 +825919121=options_icons,20 +1884768169=magicoff,32 +825919122=options_icons,21 +1884768167=magicoff,30 +1884768168=magicoff,31 +1318818808=chainmail +582031337=intrepid +783525419=beetle juice +432605856=untouchable +-969918857=neverland +79789174=narnode's theme +-705938181=zealot +117588=web +-1666444051=combaticons,18 +-1666444052=combaticons,17 +1687654733=troubled +-1666444050=combaticons,19 +-1666444055=combaticons,14 +825919129=options_icons,28 +-1666444056=combaticons,13 +-1666444053=combaticons,16 +825919127=options_icons,26 +-1666444054=combaticons,15 +825919128=options_icons,27 +1320694328=magical journey +364185053=roll the bones +-1254483584=jungly1 +981183822=right on track +-1254483583=jungly2 +-1254483582=jungly3 +3075958=dark +-2038936746=deep down +1512143976=everlasting fire +-1392319985=beyond +46273615=tale of keldagrim +-651951461=goblin game +3522941=save +104084791=mossy +1250935993=the monsters below +794539501=garden of summer +1814277765=elven mist +2110556093=the golem +-1475251658=where eagles lair +1884768143=magicoff,27 +1884768144=magicoff,28 +1884768141=magicoff,25 +1529837717=bubble and squeak +1884768142=magicoff,26 +-1679325940=technology +1884768145=magicoff,29 +-826562194=troubled_waters +1884768140=magicoff,24 +-1359348243=painting1 +1267356434=the power of tears +-1359348242=painting2 +-860755690=jungle hunt +1884768138=magicoff,22 +-1197347961=magic magic magic +1884768139=magicoff,23 +1134405764=hypnotized +1959211539=mapfunction,50 +1381363755=my arms journey +-1644401602=complication +1959211540=mapfunction,51 +1959211541=mapfunction,52 +1884768136=magicoff,20 +1959211542=mapfunction,53 +2111304827=warning_icons,0 +1884768137=magicoff,21 +-440187560=zogre dance +1959211543=mapfunction,54 +2111304828=warning_icons,1 +-2002535437=corridors of power +825919130=options_icons,29 +580384095=jungle troubles +1301622585=slice of station +1959211544=mapfunction,55 +2111304829=warning_icons,2 +-1294172031=escape +-1309477156=expanse +-1526067851=alternative root +2124773424=dynasty +1743765602=leftarrow +-1482676188=romancing the crone +-1891851953=island of the trolls +736457293=small_button_pressed +-1106172890=letter +986170990=dreamstate +1959211545=mapfunction,56 +1959211546=mapfunction,57 +1765722413=spirits of elid +1959211547=mapfunction,58 +1959211548=mapfunction,59 +-2075333010=lonesome +3314400=lava +1355033875=worldmap_icon,1 +1814357716=knightmare +1690742645=nox_irae +94935104=cross +-1249495153=frogland +-1642689926=athletes foot +107944162=quest +1355033874=worldmap_icon,0 +-2130741313=joy of the hunt +-28982081=labyrinth +250959119=marooned +-1522984472=altar_ego +1326424637=the lost melody +-1779111734=arabique +-398925062=sea shanty2 +1884768110=magicoff,15 +1884768111=magicoff,16 +1817249074=woe of the wyvern +1884768114=magicoff,19 +1884768112=magicoff,17 +-1624760229=emotion +1884768113=magicoff,18 +-353951458=attention +279431252=garden of autumn +422652266=small_button +1884768107=magicoff,12 +1884768108=magicoff,13 +375695247=the far side +1884768105=magicoff,10 +1884768106=magicoff,11 +-528864109=crystal sword +1884768109=magicoff,14 +1959211570=mapfunction,60 +-158141423=prayeron,7 +-158141424=prayeron,6 +1959211571=mapfunction,61 +-158141421=prayeron,9 +1959211572=mapfunction,62 +-158141422=prayeron,8 +1959211573=mapfunction,63 +1959211574=mapfunction,64 +688840255=piscarilius_sigil +1959211575=mapfunction,65 +1959211576=mapfunction,66 +1170407052=headicons_prayer +1959211577=mapfunction,67 +-324496873=soundscape +-1418445703=tex_red +1961540869=wornicons,10 +-1028580907=that_sullen_hall +397136995=elfpainting +-2092714094=haunted mine +1959211578=mapfunction,68 +1959211579=mapfunction,69 +-158141429=prayeron,1 +-158141427=prayeron,3 +-140492390=bunny_sugar_rush +-158141428=prayeron,2 +-158141425=prayeron,5 +1827366203=righteousness +-649601274=darkness_in_the_depths +-158141426=prayeron,4 +1961540870=wornicons,11 +-158141430=prayeron,0 +910299584=principality +-734028978=arrow,1 +-734028979=arrow,0 +790067275=garden of spring +35762567=workshop +-1095396929=competition +96463963=egypt +-1154441378=jollyr +-1685231711=cave background +-2078908549=time out +-1172405897=wildwood +-170561624=spookyjungle +2110231453=mod_icons +2061491048=shining +-1063411723=tremble +94627585=chest +-520702427=ice melody +1346720899=backleft1 +-607416919=prayeron,25 +-607416918=prayeron,26 +900197712=staticons,6 +-607416917=prayeron,27 +900197713=staticons,7 +-607416916=prayeron,28 +900197710=staticons,4 +-607416915=prayeron,29 +900197711=staticons,5 +957931606=courage +900197714=staticons,8 +900197715=staticons,9 +-720253066=the other side +-1655721374=prayeroff,31 +-607416921=prayeron,23 +-1655721375=prayeroff,30 +-607416920=prayeron,24 +-710515142=the mad mole +-1350228392=stratosphere +-1666438445=combaticons2,3 +-1666438446=combaticons2,2 +-1666438443=combaticons2,5 +-1666438444=combaticons2,4 +-1106570438=legion +-1666438441=combaticons2,7 +-1666438442=combaticons2,6 +1398587265=flute salad +-1666438440=combaticons2,8 +837223705=mapedge +900197709=staticons,3 +-243680393=peng_emotes,7 +900197707=staticons,1 +378300078=everlasting +900197708=staticons,2 +-944748869=witching +-243680396=peng_emotes,4 +-1335336992=logo_deadman_mode +-1368714737=small_button_blue +-795140435=wander +-243680397=peng_emotes,3 +-243680394=peng_emotes,6 +-1666438447=combaticons2,1 +-243680395=peng_emotes,5 +-1666438448=combaticons2,0 +-243680398=peng_emotes,2 +-243680399=peng_emotes,1 +-607416924=prayeron,20 +900197706=staticons,0 +-607416923=prayeron,21 +-607416922=prayeron,22 +3016376=bark +-89244313=romper chomper +346288985=dorgeshun deep +1585002399=magicon,21 +-1725263140=chef surprize +1585002398=magicon,20 +-993528987=making waves +-628963539=ham and seek +-1666438439=combaticons2,9 +-333224315=baroque +-1236252722=prime time +280241284=waking dream +-564582358=distant land +115411843=castlewars +1513246078=al kharid +-1377700863=unknown land +1264132816=miles away +1185785872=barbassault_icons,3 +1185785873=barbassault_icons,4 +-1655721397=prayeroff,29 +-1655721398=prayeroff,28 +1185785874=barbassault_icons,5 +-1655721399=prayeroff,27 +1185785875=barbassault_icons,6 +1711341885=fight or flight +1185785870=barbassault_icons,1 +1185785871=barbassault_icons,2 +3530505=sire +-309570839=pick_and_shovel +647234089=distillery hilarity +-127408236=gnome_village_party +1337378554=backbase2 +109757537=stars +1337378553=backbase1 +109757538=start +819884325=wilderness3 +1328851775=close_buttons,1 +658759958=side_background +1328851774=close_buttons,0 +-782211141=wonder +1328851777=close_buttons,3 +-1995718284=wall_white +819884324=wilderness2 +1328851776=close_buttons,2 +1328851779=close_buttons,5 +-943885542=scape hunter +1328851778=close_buttons,4 +1185785869=barbassault_icons,0 +-607416949=prayeron,16 +-607416948=prayeron,17 +-1779684630=rune essence +-607416947=prayeron,18 +-607416946=prayeron,19 +1119460311=bandos battalion +-967559823=creature cruelty +-1904094243=zeah_fishing +-1913214770=wilderness +460367020=village +825919161=options_icons,39 +1585002375=magicon,18 +94839810=coins +1585002376=magicon,19 +825919160=options_icons,38 +-1282090556=faerie +-521895311=the adventurer +788399136=tree spirits +-1902858744=beneath_the_stronghold +-356730043=pirates of penance +1185785876=barbassault_icons,7 +825919158=options_icons,36 +825919159=options_icons,37 +825919156=options_icons,34 +-1455241861=victory is mine +825919157=options_icons,35 +-1333874720=side_icons,17 +825919154=options_icons,32 +825919155=options_icons,33 +825919152=options_icons,30 +825919153=options_icons,31 +1437805631=chatback +-1623296531=ground scape +685190118=in the brine +1366257555=nightfall +110327241=theme +-1333874725=side_icons,12 +-1333874726=side_icons,11 +-1333874727=side_icons,10 +-1333874721=side_icons,16 +-1333874722=side_icons,15 +-1124681475=darkly_altared +-8976533=throne of the demon +-1333874723=side_icons,14 +-1333874724=side_icons,13 +-1989106719=assault and battery +1958759012=greatness +1057075019=b12_full +1143353537=chain of command +-51091830=desert voyage +-1073927447=mirage +-91048728=number_button +3165239=gaol +-1380919269=breeze +445640248=rugged_terrain +106079=key +-655784411=overlay_multiway +-1025835715=backright2 +-1025835716=backright1 +1120933843=scape main +3225350=iban +-956253112=title fight +-123912401=la mort +1585002367=magicon,10 +-2128736428=startgame +1585002368=magicon,11 +-925031874=royale +1585002369=magicon,12 +1585002370=magicon,13 +1585002373=magicon,16 +1585002374=magicon,17 +-1307116191=superstition +1585002371=magicon,14 +1585002372=magicon,15 +-587569902=path of peril +3392903=null +-1601127242=inadequacy +2136330800=staticons2,0 +2136330801=staticons2,1 +344336468=grip of the talon +2136330804=staticons2,4 +2136330805=staticons2,5 +2136330802=staticons2,2 +2136330803=staticons2,3 +1960215130=barking mad +-43712789=scape original +621171714=cellar song +1585002461=magicon,41 +1585002462=magicon,42 +1585002460=magicon,40 +111485446=upass +2136330808=staticons2,8 +694847251=in the manor +2136330809=staticons2,9 +2136330806=staticons2,6 +2136330807=staticons2,7 +-1385847955=rightarrow +1343200077=the slayer +1585002465=magicon,45 +1585002466=magicon,46 +1585002463=magicon,43 +1585002464=magicon,44 +1585002469=magicon,49 +-95571520=volcanic vikings +1585002467=magicon,47 +1585002468=magicon,48 +-1032629963=shipwrecked +93330745=aztec +-881372797=tabs,1 +1377351472=oriental +121641580=headicons_hint +-881372798=tabs,0 +1585002438=magicon,39 +-1661605940=elfwood +-607416893=prayeron,30 +-822106577=jungle island xmas +-607416892=prayeron,31 +332368736=mad eadgar +1585002432=magicon,33 +-143368781=side_background_right +1585002433=magicon,34 +-1081494434=malady +1585002430=magicon,31 +1585002431=magicon,32 +1585002436=magicon,37 +1585002437=magicon,38 +1585002434=magicon,35 +1585002435=magicon,36 +-1938171360=miscgraphics3,0 +-1059680853=trinity +781557721=dies_irae +-1938171359=miscgraphics3,1 +497375231=stillness +-1938171358=miscgraphics3,2 +-1938171357=miscgraphics3,3 +-960709976=dogs of war +2129339089=magicon,1 +2129339088=magicon,0 +755433248=headicons_pk +108392383=regal +-213632750=waterfall +-1367706280=canvas +73828649=settlement +848123561=into the abyss +478781900=last stand +1339486127=the shadow +-1055503808=roc and roll +837204902=mapdots +950484242=compass +-1082154559=fanfare +747848680=nether_realm +788224888=dead quiet +1532279978=monarch waltz +-149029727=side_background_left1 +812947089=fanfare2 +-149029726=side_background_left2 +1006643748=high spirits +-2136059388=starlight +2122572442=the tower +-1998869913=spooky2 +1411067174=gnome village2 +-2065077267=wild side +812947090=fanfare3 +1585002429=magicon,30 +1294629755=on the wing +2097127567=monkey badness +-2032107216=sojourn +1020264019=pest control +3237038=info +1473393027=fe fi fo fum +-1686202291=upper_depths +3540994=stop +1742080803=darkwood +740392969=little cave of horrors +-158379532=prayerglow +-691855347=in between +-200702983=the noble rodent +1652745754=forgotten +-1895307673=hitmark,3 +-1895307674=hitmark,2 +-1895307675=hitmark,1 +-1895307676=hitmark,0 +-1895307670=hitmark,6 +-1895307671=hitmark,5 +-1895307672=hitmark,4 +1968917071=bone dry +-850506182=trawler minor +197029040=mapscene +-808772318=in the pits +-1165315580=looking back +-1763090403=scape_ape +-1938177931=miscgraphics,11 +-1938177932=miscgraphics,10 +1936130561=thrall_of_the_serpent +1258863383=yesteryear +1994744000=slice of silent movie +-1691854169=dead can dance +1585002407=magicon,29 +1585002405=magicon,27 +1585002406=magicon,28 +271319484=frostbite +-499867199=meridian +1585002400=magicon,22 +-1938177930=miscgraphics,12 +-84626226=mudskipper melody +1585002403=magicon,25 +1585002404=magicon,26 +3641802=wall +1585002401=magicon,23 +1585002402=magicon,24 +-606457701=wolf mountain +1276599785=button_brown +1969878899=emotes,13 +1969878897=emotes,11 +1969878898=emotes,12 +1969878896=emotes,10 +-1938177928=miscgraphics,14 +-907669678=brew hoo hoo +-1938177929=miscgraphics,13 +72999866=subterranea +619237947=the galleon +-1764950404=scape sad +295831445=heart and mind +908430134=dangerous road +738888631=tradebacking +-174800339=verdana_11pt_regular +686705631=lightwalk +-601591436=side_background_bottom +-1479412376=the navigator +-359173459=zamorak zoo +744536246=null and void +-1701556798=magicoff2,39 +-1701556799=magicoff2,38 +-1396384012=bamboo +-200388662=lighthouse +133626717=suspicious +-810515425=voyage +3061973=crag +1802291895=big chords +-1661619479=elfwall +113315621=wood2 +1813041183=steelborder2,0 +429244831=slug a bug ball +1813041184=steelborder2,1 +-1658386264=shining_spirit +738909086=chamber +526264239=verdana_13pt_regular +-877351859=temple +2142215577=the mollusc menace +1124498189=warpath +-2136649922=no way out +-339706871=grimly_fiendish +547534551=wrath and ruin +544229147=lore and order +3327206=load +1610073470=lovakengj_sigil +-419218284=long way home +-662489856=food for thought +1306461568=stagnant +-1662171955=elfdoor +-1043985601=meddling kids +947464074=titlebutton +-1309055712=exposed +-1487348923=ambient jungle +-1829469821=lament of meiyerditch +233203434=leftarrow_small +-1216167350=dangerous +114464611=railings +-1106574323=legend +-1701556767=magicoff2,49 +-999707515=time to mine +-1701556768=magicoff2,48 +2129339097=magicon,9 +2129339096=magicon,8 +1959211510=mapfunction,42 +2129339095=magicon,7 +1959211511=mapfunction,43 +2129339094=magicon,6 +2129339093=magicon,5 +2129339092=magicon,4 +2129339091=magicon,3 +2129339090=magicon,2 +3522472=saga +-1701556769=magicoff2,47 +-544722449=rellekka +1033441676=tribal background +1915718129=the desolate isle +1890607150=magicon2,19 +1787618597=stranded +1717999087=forgettable melody +1959211512=mapfunction,44 +-243680400=peng_emotes,0 +1959211513=mapfunction,45 +1959211514=mapfunction,46 +1959211515=mapfunction,47 +1959211516=mapfunction,48 +1959211517=mapfunction,49 +1705947058=the cellar dwellers +1216634785=landlubber +1884768198=magicoff,40 +-1588113323=the rogues den +1884768199=magicoff,41 +-905842564=serene +-607599698=prayeroff,2 +-607599699=prayeroff,1 +1890607142=magicon2,11 +1389384362=monkey trouble +1890607143=magicon2,12 +1890607144=magicon2,13 +1890607145=magicon2,14 +1890607146=magicon2,15 +1890607147=magicon2,16 +1890607148=magicon2,17 +1966766798=mausoleum +1890607149=magicon2,18 +1808345541=armadyl alliance +290391725=options_slider,7 +1890607141=magicon2,10 +290391722=options_slider,4 +-607599696=prayeroff,4 +290391721=options_slider,3 +-607599697=prayeroff,3 +290391724=options_slider,6 +-607599694=prayeroff,6 +290391723=options_slider,5 +-607599695=prayeroff,5 +-607599692=prayeroff,8 +-607599693=prayeroff,7 +290391720=options_slider,2 +-607599691=prayeroff,9 +1334775925=chat_background +-1779127378=arabian2 +-1779127377=arabian3 +528722471=island life +1890607175=magicon2,23 +1890607176=magicon2,24 +949634504=mouse trap +1890607177=magicon2,25 +1890607178=magicon2,26 +1890607179=magicon2,27 +3327403=logo +290391719=options_slider,1 +1092249049=storm brew +290391718=options_slider,0 +404357804=everywhere +1890607172=magicon2,20 +1890607173=magicon2,21 +951530772=contest +1890607174=magicon2,22 +-1701556776=magicoff2,40 +1884768176=magicoff,39 +-395250469=corporal punishment +1749113330=newbie melody +1884768174=magicoff,37 +1884768175=magicoff,38 +-1701556772=magicoff2,44 +-1701556773=magicoff2,43 +-1701556774=magicoff2,42 +-1701556775=magicoff2,41 +-858121616=tzhaar +1884768172=magicoff,35 +1884768173=magicoff,36 +666772244=combat_shield +1884768170=magicoff,33 +1884768171=magicoff,34 +1959211509=mapfunction,41 +1639695510=mapmarker +-1661748240=friends_icons +-552301350=knightly +-1918044851=mastermindless +-1701556770=magicoff2,46 +-1701556771=magicoff2,45 +201526300=corporealbeast +1959211508=mapfunction,40 +105001967=nomad +-70910145=clickcross,3 +-1737914947=mapfunction,5 +1801745440=staticons2,11 +-70910146=clickcross,2 +-865479038=tribal +-1737914946=mapfunction,6 +1801745441=staticons2,12 +-70910147=clickcross,1 +-1737914945=mapfunction,7 +1801745442=staticons2,13 +-70910148=clickcross,0 +-1737914944=mapfunction,8 +1801745443=staticons2,14 +-1737914943=mapfunction,9 +1801745444=staticons2,15 +1801745445=staticons2,16 +1801745446=staticons2,17 +-1877545169=land down under +93921962=books +-1737914949=mapfunction,3 +-1737914948=mapfunction,4 +-1655721428=prayeroff,19 +-2136884405=title.jpg +-1655721429=prayeroff,18 +1584819628=magicoff,6 +1584819629=magicoff,7 +437480876=voodoo cult +1584819624=magicoff,2 +1584819625=magicoff,3 +1584819626=magicoff,4 +-1737914952=mapfunction,0 +1584819627=magicoff,5 +-1737914951=mapfunction,1 +124995564=harmony2 +1584819622=magicoff,0 +1801745439=staticons2,10 +1584819623=magicoff,1 +346263512=dorgeshun city +-1665011705=down and out +1890607180=magicon2,28 +1890607181=magicon2,29 +1417471781=titlescroll +1959211446=mapfunction,20 +1956141536=options_radio_buttons,0 +736568812=ballad of enchantment +-1737914950=mapfunction,2 +1959211447=mapfunction,21 +1959211448=mapfunction,22 +1959211449=mapfunction,23 +-1890130256=morytania +-70910141=clickcross,7 +-70910142=clickcross,6 +1956141539=options_radio_buttons,3 +-70910143=clickcross,5 +1956141538=options_radio_buttons,2 +284766976=splendour +-70910144=clickcross,4 +1956141537=options_radio_buttons,1 +196677638=the quizmaster +530068296=overture +-1123094568=sl_button +-700552779=hosidius_sigil +-614076819=sad meadow +1956141543=options_radio_buttons,7 +1956141542=options_radio_buttons,6 +1956141541=options_radio_buttons,5 +1956141540=options_radio_buttons,4 +1584819631=magicoff,9 +1846633612=gnome village +-2128560371=sl_back +1969878905=emotes,19 +306819362=crystal castle +1584819630=magicoff,8 +1969878903=emotes,17 +303737220=options_icons,7 +1969878904=emotes,18 +1969878901=emotes,15 +-78220817=devils_may_care +1969878902=emotes,16 +-40521666=dimension x +1969878900=emotes,14 +673424924=the lunar isle +789609582=brimstail's scales +303737222=options_icons,9 +303737221=options_icons,8 +1959211415=mapfunction,10 +3059343=coil +1959211416=mapfunction,11 +1959211417=mapfunction,12 +-1256560486=last_man_standing +1959211418=mapfunction,13 +336238005=rightarrow_small +1959211419=mapfunction,14 +-677662361=forever +-1655721430=prayeroff,17 +-1655721431=prayeroff,16 +-1655721432=prayeroff,15 +1959211420=mapfunction,15 +1959211663=mapfunction,90 +1959211421=mapfunction,16 +1959211422=mapfunction,17 +1959211423=mapfunction,18 +303737217=options_icons,4 +303737216=options_icons,3 +303737215=options_icons,2 +-1665005042=funny bunnies +303737214=options_icons,1 +303737219=options_icons,6 +303737218=options_icons,5 +303737213=options_icons,0 +95997798=we are the fairies +2001751835=desert heat +1959211424=mapfunction,19 +-1655721437=prayeroff,10 +687938017=clanwars +-1776024210=desolate_mage +-650944128=strength of saradomin +-1655721433=prayeroff,14 +1160873524=aye car rum ba +-1655721434=prayeroff,13 +-1655721435=prayeroff,12 +-1081314499=marble +-1655721436=prayeroff,11 +1097075475=reset,0 +1959211477=mapfunction,30 +-693313916=warriors guild +3506388=roof +1959211478=mapfunction,31 +1097075476=reset,1 +-2134967800=dagannoth dawn +-985763247=planks +1959211479=mapfunction,32 +1999746381=fenkenstrain's refrain +898010371=garden of winter +359174830=rat hunt +1959211482=mapfunction,35 +686441581=lightness +1959211483=mapfunction,36 +1959211484=mapfunction,37 +1959211485=mapfunction,38 +1959211486=mapfunction,39 +2023201035=dwarf theme +1959211480=mapfunction,33 +1959211481=mapfunction,34 +-1065532022=combatboxes,1 +-1065532021=combatboxes,2 +-1065532020=combatboxes,3 +1867160429=old_tiles +394756979=scape santa +25205919=elfroof2 +-663428071=dangerous way +-1065532023=combatboxes,0 +1959211450=mapfunction,24 +-895939599=spirit +1959211451=mapfunction,25 +1959211452=mapfunction,26 +1959211453=mapfunction,27 +1959211454=mapfunction,28 +1959211455=mapfunction,29 +-275310687=undercurrent +212205923=goblin village +-303898981=faithless +-1381531001=tomb raider +260940912=marzipan +1343267530=backhmid1 +1343267531=backhmid2 +1097468315=horizon +-1655721404=prayeroff,22 +623451622=kourend_the_magnificent +-1655721405=prayeroff,21 +-1655721406=prayeroff,20 +-1655721400=prayeroff,26 +-313384067=p12_full +-1655721401=prayeroff,25 +-1655721402=prayeroff,24 +-1655721403=prayeroff,23 +95848451=dream +1966781751=maws_jaws_claws +-995428255=parade +95734525=method of madness +-1308064877=hitmarks +1030045177=mutant medley +1333034828=blackmark +851641665=davy jones locker +417793574=scrollbar +1346720900=backleft2 +1884768206=magicoff,48 +1884768207=magicoff,49 +1801140808=fangs for the memory +1884768204=magicoff,46 +1345432055=pinball wizard +1884768205=magicoff,47 +-783693496=dance of the undead +1274780903=chompy hunt +465278529=the lost tribe +-1666437481=combaticons3,6 +2032696205=cabin fever +-1666437480=combaticons3,7 +1825640471=borderland +415928477=zeah_mining +1884768202=magicoff,44 +-607599700=prayeroff,0 +1884768203=magicoff,45 +1884768200=magicoff,42 +1884768201=magicoff,43 +-1666437487=combaticons3,0 +-1666437486=combaticons3,1 +813726263=crystal cave +1235442953=pathways +518814479=lullaby +-1666437483=combaticons3,4 +1585007985=magicon2,7 +-1666437482=combaticons3,5 +1585007986=magicon2,8 +-1666437485=combaticons3,2 +1585007987=magicon2,9 +-1666437484=combaticons3,3 +104080482=moody +1969878967=emotes,39 +-665666447=work work work +1364992651=evil bobs island +1969878965=emotes,37 +1227328817=verdana_15pt_regular +1969878966=emotes,38 +1969878963=emotes,35 +1581724013=monkey business +1969878964=emotes,36 +-74307138=miscellania +1969878961=emotes,33 +1969878962=emotes,34 +1969878960=emotes,32 +1131171307=wayward +-1154558416=sl_arrows +529929957=overpass +1258058669=huffman +-694094064=adventure +1171698653=orb_xp,1 +1171698652=orb_xp,0 +1171698655=orb_xp,3 +1171698654=orb_xp,2 +1802171733=arceuus_sigil +221109227=tears of guthix +-1661754893=elfroof +-1666437478=combaticons3,9 +1124565314=warrior +1969878958=emotes,30 +1969878959=emotes,31 +-934797897=reggae +2110260221=the genie +-1666437479=combaticons3,8 +104257585=mummy +-1923924724=sworddecor,0 +2136325196=staticons,17 +-1332194002=background +2136164423=homescape +-1923924721=sworddecor,3 +2136325194=staticons,15 +-1923924722=sworddecor,2 +-873564465=tiptoe +2136325195=staticons,16 +-1923924723=sworddecor,1 +123560953=espionage +2136325192=staticons,13 +2136325193=staticons,14 +1038911415=gnome king +2136325190=staticons,11 +2136325191=staticons,12 +1854274741=karamja jam +1969878989=emotes,40 +-1242708793=glyphs +563269755=the terrible tower +1650323088=twilight +-12868552=sea shanty +289742397=book of spells +1880989696=dragontooth island +2136325189=staticons,10 +110873=pen +-454421102=out of the deep +825919099=options_icons,19 +825919097=options_icons,17 +825919098=options_icons,18 +-1349119470=cursed +1585007978=magicon2,0 +825919095=options_icons,15 +1585007979=magicon2,1 +825919096=options_icons,16 +825919093=options_icons,13 +825919094=options_icons,14 +825919091=options_icons,11 +825919092=options_icons,12 +-895977880=sphinx +-874529881=city of the dead +825919090=options_icons,10 +1585007981=magicon2,3 +1585007982=magicon2,4 +1585007983=magicon2,5 +-1618729246=body parts +1585007984=magicon2,6 +1585007980=magicon2,2 +1086075866=shayzien_sigil +2103661451=jester minute +-911346307=steelborder,2 +-1809781334=button_brown_big +-911346306=steelborder,3 +-816227352=vision +-911346309=steelborder,0 +109407595=shine +-911346308=steelborder,1 +-119954464=combaticons3,12 +-119954465=combaticons3,11 +-1846853118=armageddon +-119954462=combaticons3,14 +-119954463=combaticons3,13 +-119954460=combaticons3,16 +-908183966=scarab +-119954461=combaticons3,15 +-282886672=home sweet home +103666243=march +1969878929=emotes,22 +1643875326=fire and brimstone +1969878927=emotes,20 +-119954466=combaticons3,10 +1969878928=emotes,21 +-839455633=close quarters +941457503=way of the enchanter +-1453405761=mor-ul-rek +-415134015=have a blast +-1658514874=floating free +1213477442=chickened out +-1619800349=emotes_locked,27 +-599680631=fear and loathing +-1081041422=insect queen +-1268786147=forest +-119954459=combaticons3,17 +-119954457=combaticons3,19 +-119954458=combaticons3,18 +-850395529=trouble brewing +-1773920521=cave of the goblins +-771284962=claustrophobia +1310729739=bankbuttons,2 +1306691868=upcoming +1465443077=over to nardah +1310729744=bankbuttons,7 +1310729743=bankbuttons,6 +1310729742=bankbuttons,5 +1234827707=deep wildy +-90350772=xenophobe +-750127868=arabian +1310729741=bankbuttons,4 +1310729740=bankbuttons,3 +1041911129=waterlogged +108875897=runes +1447063382=barb wire +-378865792=magic dance +285466503=overlay_duel +1814287296=zeah_magic +1976894499=down to earth +1969878936=emotes,29 +1969878934=emotes,27 +-1567437308=deadlands +1969878935=emotes,28 +1310729738=bankbuttons,1 +1969878932=emotes,25 +-957019274=too many cooks +1310729737=bankbuttons,0 +2092627105=silence +1969878933=emotes,26 +1969878930=emotes,23 +1969878931=emotes,24 +-901674570=well of voyage diff --git a/cache/src/test/java/net/runelite/cache/AreaDumper.java b/cache/src/test/java/net/runelite/cache/AreaDumper.java new file mode 100644 index 0000000000..2aab1db48b --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/AreaDumper.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.AreaDefinition; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AreaDumper +{ + private static final Logger logger = LoggerFactory.getLogger(AreaDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + AreaManager areaManager = new AreaManager(store); + areaManager.load(); + + for (AreaDefinition area : areaManager.getAreas()) + { + Files.asCharSink(new File(outDir, area.id + ".json"), Charset.defaultCharset()).write(gson.toJson(area)); + ++count; + } + } + + logger.info("Dumped {} areas to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/CacheProperties.java b/cache/src/test/java/net/runelite/cache/CacheProperties.java new file mode 100644 index 0000000000..5614563f72 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/CacheProperties.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class CacheProperties +{ + private static Properties getProperties() throws IOException + { + Properties properties = new Properties(); + InputStream resourceAsStream = StoreLocation.class.getResourceAsStream("/cache.properties"); + properties.load(resourceAsStream); + return properties; + } + + public static int getRsVersion() throws IOException + { + return Integer.parseInt(getProperties().getProperty("rs.version")); + } + + public static int getCacheVersion() throws IOException + { + return Integer.parseInt(getProperties().getProperty("cache.version")); + } +} diff --git a/cache/src/test/java/net/runelite/cache/EnumDumperTest.java b/cache/src/test/java/net/runelite/cache/EnumDumperTest.java new file mode 100644 index 0000000000..705356b0b5 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/EnumDumperTest.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.EnumDefinition; +import net.runelite.cache.definitions.loaders.EnumLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EnumDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(EnumDumperTest.class); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(); + int count = 0; + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.ENUM.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + EnumLoader loader = new EnumLoader(); + + for (FSFile file : files.getFiles()) + { + byte[] b = file.getContents(); + + EnumDefinition def = loader.load(file.getFileId(), b); + + if (def != null) + { + Files.asCharSink(new File(dumpDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); + ++count; + } + } + } + + logger.info("Dumped {} enums to {}", count, dumpDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/FrameDumper.java b/cache/src/test/java/net/runelite/cache/FrameDumper.java new file mode 100644 index 0000000000..8e856cd2f8 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/FrameDumper.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import net.runelite.cache.definitions.FrameDefinition; +import net.runelite.cache.definitions.FramemapDefinition; +import net.runelite.cache.definitions.loaders.FrameLoader; +import net.runelite.cache.definitions.loaders.FramemapLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FrameDumper +{ + private static final Logger logger = LoggerFactory.getLogger(FrameDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + @Ignore + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index frameIndex = store.getIndex(IndexType.FRAMES); + Index framemapIndex = store.getIndex(IndexType.FRAMEMAPS); + + for (Archive archive : frameIndex.getArchives()) + { + List frames = new ArrayList<>(); + + byte[] archiveData = storage.loadArchive(archive); + + ArchiveFiles archiveFiles = archive.getFiles(archiveData); + for (FSFile archiveFile : archiveFiles.getFiles()) + { + byte[] contents = archiveFile.getContents(); + + int framemapArchiveId = (contents[0] & 0xff) << 8 | contents[1] & 0xff; + + Archive framemapArchive = framemapIndex.getArchives().get(framemapArchiveId); + archiveData = storage.loadArchive(framemapArchive); + byte[] framemapContents = framemapArchive.decompress(archiveData); + + FramemapLoader fmloader = new FramemapLoader(); + FramemapDefinition framemap = fmloader.load(framemapArchive.getArchiveId(), framemapContents); + + FrameLoader frameLoader = new FrameLoader(); + FrameDefinition frame = frameLoader.load(framemap, archiveFile.getFileId(), contents); + + frames.add(frame); + } + + Files.asCharSink(new File(outDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()).write(gson.toJson(frames)); + ++count; + } + } + + logger.info("Dumped {} frames to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/FramemapDumper.java b/cache/src/test/java/net/runelite/cache/FramemapDumper.java new file mode 100644 index 0000000000..f95e92c9fa --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/FramemapDumper.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.FramemapDefinition; +import net.runelite.cache.definitions.loaders.FramemapLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FramemapDumper +{ + private static final Logger logger = LoggerFactory.getLogger(FramemapDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.FRAMEMAPS); + + for (Archive archive : index.getArchives()) + { + byte[] archiveData = storage.loadArchive(archive); + byte[] contents = archive.decompress(archiveData); + + FramemapLoader loader = new FramemapLoader(); + FramemapDefinition framemap = loader.load(0, contents); + + Files.asCharSink(new File(outDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()).write(gson.toJson(framemap)); + ++count; + } + } + + logger.info("Dumped {} framemaps to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/HeightMapDumperTest.java b/cache/src/test/java/net/runelite/cache/HeightMapDumperTest.java new file mode 100644 index 0000000000..92327f50d7 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/HeightMapDumperTest.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HeightMapDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(HeightMapDumperTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + //@Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + try (Store store = new Store(base)) + { + store.load(); + + HeightMapDumper dumper = new HeightMapDumper(store); + dumper.load(); + + BufferedImage image = dumper.drawHeightMap(0); + + File imageFile = new File(outDir, "heightmap-0.png"); + + ImageIO.write(image, "png", imageFile); + logger.info("Wrote image {}", imageFile); + } + } +} diff --git a/cache/src/test/java/net/runelite/cache/InterfaceManagerTest.java b/cache/src/test/java/net/runelite/cache/InterfaceManagerTest.java new file mode 100644 index 0000000000..060aae5d57 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/InterfaceManagerTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InterfaceManagerTest +{ + private static final Logger logger = LoggerFactory.getLogger(InterfaceManagerTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(), + javaDir = folder.newFolder(); + + Store store = new Store(StoreLocation.LOCATION); + store.load(); + + InterfaceManager dumper = new InterfaceManager( + store + ); + dumper.load(); + dumper.export(dumpDir); + dumper.java(javaDir); + + logger.info("Dumped to {}, java {}", dumpDir, javaDir); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/InventoryDumper.java b/cache/src/test/java/net/runelite/cache/InventoryDumper.java new file mode 100644 index 0000000000..f74c4ce188 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/InventoryDumper.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.InventoryDefinition; +import net.runelite.cache.definitions.loaders.InventoryLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InventoryDumper +{ + private static final Logger logger = LoggerFactory.getLogger(InventoryDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.INV.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + InventoryLoader loader = new InventoryLoader(); + InventoryDefinition inv = loader.load(file.getFileId(), file.getContents()); + + Files.asCharSink(new File(outDir, inv.id + ".json"), Charset.defaultCharset()).write(gson.toJson(inv)); + ++count; + } + } + + logger.info("Dumped {} inventories to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/ItemManagerTest.java b/cache/src/test/java/net/runelite/cache/ItemManagerTest.java new file mode 100644 index 0000000000..e3ac0b3324 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/ItemManagerTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ItemManagerTest +{ + private static final Logger logger = LoggerFactory.getLogger(ItemManagerTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(), + javaDir = folder.newFolder(); + + Store store = new Store(StoreLocation.LOCATION); + store.load(); + + ItemManager dumper = new ItemManager( + store + ); + dumper.load(); + dumper.export(dumpDir); + dumper.java(javaDir); + + logger.info("Dumped to {}, java {}", dumpDir, javaDir); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/KitDumperTest.java b/cache/src/test/java/net/runelite/cache/KitDumperTest.java new file mode 100644 index 0000000000..4db1267506 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/KitDumperTest.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.KitDefinition; +import net.runelite.cache.definitions.loaders.KitLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class KitDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(KitDumperTest.class); + + private Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(); + int count = 0; + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.IDENTKIT.getId()); + + KitLoader loader = new KitLoader(); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + byte[] b = file.getContents(); + + KitDefinition def = loader.load(file.getFileId(), b); + + Files.asCharSink(new File(dumpDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); + ++count; + } + } + + logger.info("Dumped {} kits to {}", count, dumpDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/MapDumperTest.java b/cache/src/test/java/net/runelite/cache/MapDumperTest.java new file mode 100644 index 0000000000..8d1fffd7cb --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/MapDumperTest.java @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import net.runelite.cache.definitions.LocationsDefinition; +import net.runelite.cache.definitions.MapDefinition; +import net.runelite.cache.definitions.loaders.LocationsLoader; +import net.runelite.cache.definitions.loaders.MapLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.util.XteaKeyManager; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MapDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(MapDumperTest.class); + + private static final int MAX_REGIONS = 32768; + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + @Ignore + public void dumpRaw() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + XteaKeyManager keyManager = new XteaKeyManager(); + keyManager.loadKeys(); + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.MAPS); + + for (int i = 0; i < MAX_REGIONS; i++) + { + int[] keys = keyManager.getKeys(i); + + int x = i >> 8; + int y = i & 0xFF; + + Archive map = index.findArchiveByName("m" + x + "_" + y); + Archive land = index.findArchiveByName("l" + x + "_" + y); + + assert (map == null) == (land == null); + + if (map == null || land == null) + { + continue; + } + + byte[] data = map.decompress(storage.loadArchive(map)); + + Files.write(data, new File(outDir, "m" + x + "_" + y + ".dat")); + + if (keys != null) + { + try + { + data = land.decompress(storage.loadArchive(land), keys); + } + catch (IOException ex) + { + logger.info("Unable to decompress and load land " + x + "," + y + " (bad keys?)", ex); + continue; + } + + logger.info("Decrypted region {} coords {},{}", i, x, y); + + Files.write(data, new File(outDir, "l" + x + "_" + y + ".dat")); + } + } + } + } + + private Map loadRegions(Store store) throws IOException + { + Map mapMap = new HashMap<>(); + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.MAPS); + XteaKeyManager keyManager = new XteaKeyManager(); + keyManager.loadKeys(); + + for (int i = 0; i < MAX_REGIONS; ++i) + { + int x = i >> 8; + int y = i & 0xFF; + + Archive map = index.findArchiveByName("m" + x + "_" + y); + Archive land = index.findArchiveByName("l" + x + "_" + y); + + assert (map == null) == (land == null); + + if (map == null || land == null) + { + continue; + } + + byte[] data = map.decompress(storage.loadArchive(map)); + MapDefinition mapDef = new MapLoader().load(x, y, data); + LocationsDefinition locDef = null; + + int[] keys = keyManager.getKeys(i); + if (keys != null) + { + try + { + data = land.decompress(storage.loadArchive(land), keys); + } + catch (IOException ex) + { + continue; + } + + locDef = new LocationsLoader().load(x, y, data); + } + + mapMap.put(mapDef, locDef); + } + + return mapMap; + } + + @Test + @Ignore + public void dumpJson() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + try (Store store = new Store(base)) + { + store.load(); + + Map regions = loadRegions(store); + + for (Entry entry : regions.entrySet()) + { + MapDefinition key = entry.getKey(); + LocationsDefinition value = entry.getValue(); + + int x = key.getRegionX(); + int y = key.getRegionY(); + Files.write(gson.toJson(key).getBytes(), new File(outDir, "m" + x + "_" + y + ".json")); + if (value != null) + { + Files.write(gson.toJson(value).getBytes(), new File(outDir, "l" + x + "_" + y + ".json")); + } + } + } + + logger.info("Dumped regions to {}", outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/MapImageDumperTest.java b/cache/src/test/java/net/runelite/cache/MapImageDumperTest.java new file mode 100644 index 0000000000..7491e54b58 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/MapImageDumperTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; +import net.runelite.cache.fs.Store; +import net.runelite.cache.region.Region; +import net.runelite.cache.region.RegionLoader; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MapImageDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(MapImageDumperTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + @Ignore + public void dumpMap() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + try (Store store = new Store(base)) + { + store.load(); + + MapImageDumper dumper = new MapImageDumper(store); + dumper.load(); + + for (int i = 0; i < Region.Z; ++i) + { + BufferedImage image = dumper.drawMap(i); + + File imageFile = new File(outDir, "img-" + i + ".png"); + + ImageIO.write(image, "png", imageFile); + logger.info("Wrote image {}", imageFile); + } + } + } + + @Test + @Ignore + public void dumpRegions() throws Exception + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + try (Store store = new Store(base)) + { + store.load(); + + RegionLoader regionLoader = new RegionLoader(store); + regionLoader.loadRegions(); + + MapImageDumper dumper = new MapImageDumper(store); + dumper.load(); + + int z = 0; + for (Region region : regionLoader.getRegions()) + { + File imageFile = new File(outDir, "img-" + z + "-" + region.getRegionID() + ".png"); + BufferedImage image = dumper.drawRegion(region, z); + ImageIO.write(image, "png", imageFile); + } + } + } +} diff --git a/cache/src/test/java/net/runelite/cache/ModelDumperTest.java b/cache/src/test/java/net/runelite/cache/ModelDumperTest.java new file mode 100644 index 0000000000..32f5879ac1 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/ModelDumperTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.cache; + + +import com.google.common.io.Files; +import java.io.File; +import java.io.IOException; +import net.runelite.cache.definitions.loaders.ModelLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ModelDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(ModelDumperTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File modelDir = folder.newFolder("models"); + int count = 0; + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.MODELS); + + for (Archive archive : index.getArchives()) + { + byte[] contents = archive.decompress(storage.loadArchive(archive)); + + ModelLoader loader = new ModelLoader(); + loader.load(archive.getArchiveId(), contents); + + Files.write(contents, new File(modelDir, archive.getArchiveId() + ".model")); + ++count; + } + } + + logger.info("Dumped {} models to {}", count, modelDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/NpcManagerTest.java b/cache/src/test/java/net/runelite/cache/NpcManagerTest.java new file mode 100644 index 0000000000..cdccac0cfb --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/NpcManagerTest.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NpcManagerTest +{ + private static final Logger logger = LoggerFactory.getLogger(NpcManagerTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(), + javaDir = folder.newFolder(); + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + NpcManager dumper = new NpcManager( + store + ); + dumper.load(); + dumper.dump(dumpDir); + dumper.java(javaDir); + } + + logger.info("Dumped to {}, java {}", dumpDir, javaDir); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/ObjectManagerTest.java b/cache/src/test/java/net/runelite/cache/ObjectManagerTest.java new file mode 100644 index 0000000000..f50196734e --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/ObjectManagerTest.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ObjectManagerTest +{ + private static final Logger logger = LoggerFactory.getLogger(ObjectManagerTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(), + javaDir = folder.newFolder(); + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + ObjectManager dumper = new ObjectManager( + store + ); + dumper.load(); + dumper.dump(dumpDir); + dumper.java(javaDir); + } + + logger.info("Dumped to {}, java {}", dumpDir, javaDir); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/OverlayDumper.java b/cache/src/test/java/net/runelite/cache/OverlayDumper.java new file mode 100644 index 0000000000..51457192b7 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/OverlayDumper.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.OverlayDefinition; +import net.runelite.cache.definitions.loaders.OverlayLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OverlayDumper +{ + private static final Logger logger = LoggerFactory.getLogger(OverlayDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.OVERLAY.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + OverlayLoader loader = new OverlayLoader(); + OverlayDefinition overlay = loader.load(file.getFileId(), file.getContents()); + + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(overlay)); + ++count; + } + } + + logger.info("Dumped {} overlays to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/SequenceDumper.java b/cache/src/test/java/net/runelite/cache/SequenceDumper.java new file mode 100644 index 0000000000..485bd3d84f --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/SequenceDumper.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.SequenceDefinition; +import net.runelite.cache.definitions.loaders.SequenceLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SequenceDumper +{ + private static final Logger logger = LoggerFactory.getLogger(SequenceDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.SEQUENCE.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + SequenceLoader loader = new SequenceLoader(); + SequenceDefinition seq = loader.load(file.getFileId(), file.getContents()); + + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(seq)); + ++count; + } + } + + logger.info("Dumped {} sequences to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java new file mode 100644 index 0000000000..5ac0c9e1c5 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.loaders.sound.SoundEffectLoader; +import net.runelite.cache.definitions.sound.SoundEffectDefinition; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SoundEffectsDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(SoundEffectsDumperTest.class); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(); + int count = 0; + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.SOUNDEFFECTS); + + for (Archive archive : index.getArchives()) + { + byte[] contents = archive.decompress(storage.loadArchive(archive)); + + SoundEffectLoader soundEffectLoader = new SoundEffectLoader(); + SoundEffectDefinition soundEffect = soundEffectLoader.load(contents); + + Files.asCharSink(new File(dumpDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()).write(gson.toJson(soundEffect)); + ++count; + } + } + + logger.info("Dumped {} sound effects to {}", count, dumpDir); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Round.java b/cache/src/test/java/net/runelite/cache/SpriteManagerTest.java similarity index 62% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Round.java rename to cache/src/test/java/net/runelite/cache/SpriteManagerTest.java index caa87af6c9..f8a103ccb8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Round.java +++ b/cache/src/test/java/net/runelite/cache/SpriteManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Cameron + * Copyright (c) 2016-2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,47 +22,40 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.barbarianassault; +package net.runelite.cache; -import java.time.Duration; -import java.time.Instant; -import javax.inject.Inject; -import lombok.Getter; -import lombok.Setter; -import api.Constants; +import java.io.File; +import java.io.IOException; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -class Round +public class SpriteManagerTest { - private final Instant roundStartTime; + private static final Logger logger = LoggerFactory.getLogger(SpriteManagerTest.class); - @Getter - private final Role roundRole; + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); - @Getter - @Setter - private boolean runnersKilled; - - @Getter - @Setter - private boolean rangersKilled; - - @Getter - @Setter - private boolean healersKilled; - - @Getter - @Setter - private boolean fightersKilled; - - @Inject - public Round(Role role) + @Test + public void test() throws IOException { - this.roundRole = role; - this.roundStartTime = Instant.now().plusMillis(2 * Constants.GAME_TICK_LENGTH); - } + File dumpDir = folder.newFolder(); - long getTimeToChange() - { - return 30 + (Duration.between(Instant.now(), roundStartTime).getSeconds() % 30); + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + SpriteManager dumper = new SpriteManager( + store + ); + dumper.load(); + dumper.export(dumpDir); + } + + logger.info("Dumped to {}", dumpDir); } } diff --git a/cache/src/test/java/net/runelite/cache/StoreLocation.java b/cache/src/test/java/net/runelite/cache/StoreLocation.java new file mode 100644 index 0000000000..890e43e5eb --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/StoreLocation.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.base.Strings; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class StoreLocation +{ + private static final Logger logger = LoggerFactory.getLogger(StoreLocation.class); + + private static final int NUM_INDEXES = 16; + + public static File LOCATION; + private static File TMP; + + static + { + String cacheTmpDir = System.getProperty("cache.tmpdir"); + if (!Strings.isNullOrEmpty(cacheTmpDir)) + { + System.setProperty("java.io.tmpdir", cacheTmpDir); + TMP = new File(cacheTmpDir); + } + + try + { + LOCATION = setupCacheDir(); + } + catch (IOException ex) + { + logger.warn("unable to initialize cache tmp area", ex); + } + } + + private static File setupCacheDir() throws IOException + { + File file = new File(System.getProperty("java.io.tmpdir"), "cache-" + CacheProperties.getCacheVersion()); + + if (file.exists()) + { + logger.info("Using preexisting cache working directory {}", file); + return file; + } + + file.mkdir(); + + // Copy over files + InputStream in = StoreLocation.class.getResourceAsStream("/main_file_cache.dat2"); + Files.copy(in, new File(file, "main_file_cache.dat2").toPath()); + + in = StoreLocation.class.getResourceAsStream("/main_file_cache.idx255"); + Files.copy(in, new File(file, "main_file_cache.idx255").toPath()); + + for (int i = 0; i <= NUM_INDEXES; ++i) + { + in = StoreLocation.class.getResourceAsStream("/main_file_cache.idx" + i); + Files.copy(in, new File(file, "main_file_cache.idx" + i).toPath()); + } + + logger.info("Set up cache working directory to {}", file); + + return file; + } + + public static TemporaryFolder getTemporaryFolder() + { + return new TemporaryFolder() + { + @Override + public void after() + { + // don't cleanup if using cache tmpdir + if (TMP == null) + { + super.after(); + } + } + }; + } +} diff --git a/cache/src/test/java/net/runelite/cache/StructManagerTest.java b/cache/src/test/java/net/runelite/cache/StructManagerTest.java new file mode 100644 index 0000000000..f1a1fb22ca --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/StructManagerTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Map; +import net.runelite.cache.definitions.StructDefinition; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class StructManagerTest +{ + private static final Logger logger = LoggerFactory.getLogger(StructManagerTest.class); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File dumpDir = folder.newFolder(); + int count = 0; + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + StructManager loader = new StructManager(store); + loader.load(); + + for (Map.Entry struct : loader.getStructs().entrySet()) + { + StructDefinition def = struct.getValue(); + + Files.asCharSink(new File(dumpDir, struct.getKey() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); + ++count; + } + } + + logger.info("Dumped {} structs to {}", count, dumpDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/TextureDumper.java b/cache/src/test/java/net/runelite/cache/TextureDumper.java new file mode 100644 index 0000000000..0aba683504 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/TextureDumper.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.TextureDefinition; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TextureDumper +{ + private static final Logger logger = LoggerFactory.getLogger(TextureDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + TextureManager tm = new TextureManager(store); + tm.load(); + + for (TextureDefinition texture : tm.getTextures()) + { + Files.asCharSink(new File(outDir, texture.getId() + ".json"), Charset.defaultCharset()).write(gson.toJson(texture)); + ++count; + } + } + + logger.info("Dumped {} textures to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/TitleDumper.java b/cache/src/test/java/net/runelite/cache/TitleDumper.java new file mode 100644 index 0000000000..c611ddf04a --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/TitleDumper.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TitleDumper +{ + private static final Logger logger = LoggerFactory.getLogger(TitleDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outFile = folder.newFolder(); + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.BINARY); + Archive archive = index.findArchiveByName("title.jpg"); + byte[] contents = archive.decompress(storage.loadArchive(archive)); + + Files.write(outFile.toPath(), contents); + } + + logger.info("Dumped to {}", outFile); + } +} diff --git a/cache/src/test/java/net/runelite/cache/TrackDumperTest.java b/cache/src/test/java/net/runelite/cache/TrackDumperTest.java new file mode 100644 index 0000000000..dc70a798ef --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/TrackDumperTest.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.Sequencer; +import net.runelite.cache.definitions.TrackDefinition; +import net.runelite.cache.definitions.loaders.TrackLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import net.runelite.cache.util.Djb2Manager; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TrackDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(TrackDumperTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Djb2Manager djb2 = new Djb2Manager(); + + @Test + public void test() throws IOException + { + File dumpDir1 = folder.newFolder(), + dumpDir2 = folder.newFolder(); + int idx1 = 0, idx2 = 0; + + djb2.load(); + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.TRACK1); + Index index2 = store.getIndex(IndexType.TRACK2); + + for (Archive archive : index.getArchives()) + { + dumpTrackArchive(dumpDir1, storage, archive); + ++idx1; + } + + for (Archive archive : index2.getArchives()) + { + dumpTrackArchive(dumpDir2, storage, archive); + ++idx2; + } + } + + logger.info("Dumped {} sound tracks ({} idx1, {} idx2) to {} and {}", idx1 + idx2, idx1, idx2, dumpDir1, dumpDir2); + } + + private void dumpTrackArchive(File dumpDir, Storage storage, Archive archive) throws IOException + { + byte[] contents = archive.decompress(storage.loadArchive(archive)); + + if (contents == null) + { + return; + } + + TrackLoader loader = new TrackLoader(); + TrackDefinition def = loader.load(contents); + + String name; + if (archive.getNameHash() != 0) + { + name = djb2.getName(archive.getNameHash()); + if (name == null) + { + name = "name-" + archive.getNameHash(); + } + } + else + { + name = "archive-" + archive.getArchiveId(); + } + + File dest = new File(dumpDir, name + ".midi"); + assert !dest.exists(); + + Files.write(def.midi, dest); + } + + @Test + @Ignore + public void play() throws Exception + { + // Obtains the default Sequencer connected to a default device. + Sequencer sequencer = MidiSystem.getSequencer(); + + // Opens the device, indicating that it should now acquire any + // system resources it requires and become operational. + sequencer.open(); + + try + { + // create a stream from a file + java.io.InputStream is = new FileInputStream(new File("D:\\rs\\07\\cache\\track1\\name-687938017.midi")); + + // Sets the current sequence on which the sequencer operates. + // The stream must point to MIDI file data. + sequencer.setSequence(is); + + // Starts playback of the MIDI data in the currently loaded sequence. + sequencer.start(); + + while (sequencer.isRunning()) + { + Thread.sleep(1000L); + } + } + finally + { + sequencer.close(); + } + } +} diff --git a/cache/src/test/java/net/runelite/cache/UnderlayDumper.java b/cache/src/test/java/net/runelite/cache/UnderlayDumper.java new file mode 100644 index 0000000000..04f2997530 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/UnderlayDumper.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.UnderlayDefinition; +import net.runelite.cache.definitions.loaders.UnderlayLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UnderlayDumper +{ + private static final Logger logger = LoggerFactory.getLogger(UnderlayDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.UNDERLAY.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + UnderlayLoader loader = new UnderlayLoader(); + UnderlayDefinition underlay = loader.load(file.getFileId(), file.getContents()); + + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(underlay)); + ++count; + } + } + + logger.info("Dumped {} underlays to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/VarbitDumper.java b/cache/src/test/java/net/runelite/cache/VarbitDumper.java new file mode 100644 index 0000000000..9bcdcf9237 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/VarbitDumper.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.VarbitDefinition; +import net.runelite.cache.definitions.loaders.VarbitLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VarbitDumper +{ + private static final Logger logger = LoggerFactory.getLogger(VarbitDumper.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CONFIGS); + Archive archive = index.getArchive(ConfigType.VARBIT.getId()); + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + VarbitLoader loader = new VarbitLoader(); + VarbitDefinition varbit = loader.load(file.getFileId(), file.getContents()); + + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(varbit)); + ++count; + } + } + + logger.info("Dumped {} varbits to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java b/cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java new file mode 100644 index 0000000000..92b2582a91 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import net.runelite.cache.definitions.WorldMapDefinition; +import net.runelite.cache.definitions.loaders.WorldMapLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class WorldMapDumperTest +{ + private static final Logger logger = LoggerFactory.getLogger(WorldMapDumperTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Test + public void extract() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.WORLDMAP); + Archive archive = index.getArchive(0); // there is also archive 1/2, but their data format is not this + + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + + for (FSFile file : files.getFiles()) + { + WorldMapLoader loader = new WorldMapLoader(); + WorldMapDefinition def = loader.load(file.getContents(), file.getFileId()); + + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); + ++count; + } + } + + logger.info("Dumped {} world map data to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/definitions/savers/InterfaceSaverTest.java b/cache/src/test/java/net/runelite/cache/definitions/savers/InterfaceSaverTest.java new file mode 100644 index 0000000000..e1955a6f79 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/definitions/savers/InterfaceSaverTest.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import java.io.File; +import net.runelite.cache.IndexType; +import net.runelite.cache.StoreLocation; +import net.runelite.cache.definitions.InterfaceDefinition; +import net.runelite.cache.definitions.loaders.InterfaceLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.FSFile; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import static org.junit.Assert.assertArrayEquals; +import org.junit.Test; + +public class InterfaceSaverTest +{ + @Test + public void testSave() throws Exception + { + File base = StoreLocation.LOCATION; + try (Store store = new Store(base)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.INTERFACES); + Archive archive = index.getArchive(31); + byte[] archiveData = storage.loadArchive(archive); + ArchiveFiles files = archive.getFiles(archiveData); + FSFile file = files.findFile(76); + byte[] contents = file.getContents(); + + InterfaceDefinition def = new InterfaceLoader().load(0, contents); + byte[] b = new InterfaceSaver().save(def); + assertArrayEquals(contents, b); + } + } + +} diff --git a/cache/src/test/java/net/runelite/cache/definitions/savers/ScriptSaverTest.java b/cache/src/test/java/net/runelite/cache/definitions/savers/ScriptSaverTest.java new file mode 100644 index 0000000000..4d429632ca --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/definitions/savers/ScriptSaverTest.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.definitions.savers; + +import java.io.IOException; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.definitions.loaders.ScriptLoader; +import net.runelite.cache.script.Instructions; +import net.runelite.cache.script.assembler.Assembler; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +/** + * + * @author Adam + */ +public class ScriptSaverTest +{ + private static final String SCRIPT_RESOURCE = "/net/runelite/cache/script/assembler/91.rs2asm"; + private static final String SCRIPT_RESOURCE_UNICODE = "/net/runelite/cache/script/assembler/Unicode.rs2asm"; + + @Test + public void testSave() throws IOException + { + Instructions instructions = new Instructions(); + instructions.init(); + ScriptDefinition script = new Assembler(instructions).assemble(getClass().getResourceAsStream(SCRIPT_RESOURCE)); + byte[] saved = new ScriptSaver().save(script); + ScriptDefinition loadedScripot = new ScriptLoader().load(91, saved); + assertEquals(script, loadedScripot); + } + + @Test + public void testSaveUnicode() throws IOException + { + Instructions instructions = new Instructions(); + instructions.init(); + ScriptDefinition script = new Assembler(instructions).assemble(getClass().getResourceAsStream(SCRIPT_RESOURCE_UNICODE)); + byte[] saved = new ScriptSaver().save(script); + ScriptDefinition loadedScripot = new ScriptLoader().load(1001, saved); + assertEquals(script, loadedScripot); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/fs/ContainerTest.java b/cache/src/test/java/net/runelite/cache/fs/ContainerTest.java new file mode 100644 index 0000000000..113385909b --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/fs/ContainerTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import java.io.IOException; +import java.util.Random; +import static net.runelite.cache.fs.jagex.CompressionType.GZ; +import static org.junit.Assert.assertArrayEquals; +import org.junit.Test; + +public class ContainerTest +{ + + @Test + public void testCompress() throws IOException + { + int[] keys = new int[] + { + 4, 8, 15, 16 + }; + Random random = new Random(42L); + byte[] data = new byte[1024]; + random.nextBytes(data); + + Container container = new Container(GZ, -1); + container.compress(data, keys); + byte[] compressedData = container.data; + + container = Container.decompress(compressedData, keys); + assertArrayEquals(data, container.data); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/fs/StoreLoadTest.java b/cache/src/test/java/net/runelite/cache/fs/StoreLoadTest.java new file mode 100644 index 0000000000..91bbc3c3f0 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/fs/StoreLoadTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import com.google.common.io.Files; +import java.io.File; +import java.io.IOException; +import net.runelite.cache.StoreLocation; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class StoreLoadTest +{ + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void testLoad() throws IOException + { + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + } + } + + @Test + public void testSave() throws IOException + { + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + File testStoreFile = folder.newFolder(); + for (File f : StoreLocation.LOCATION.listFiles()) + { + Files.copy(f, new File(testStoreFile, f.getName())); + } + + try (Store testStore = new Store(testStoreFile)) + { + testStore.load(); + + Assert.assertTrue(store.equals(testStore)); + + testStore.save(); + } + + try (Store testStore = new Store(testStoreFile)) + { + testStore.load(); + + Assert.assertTrue(store.equals(testStore)); + } + } + } +} diff --git a/cache/src/test/java/net/runelite/cache/fs/StoreTest.java b/cache/src/test/java/net/runelite/cache/fs/StoreTest.java new file mode 100644 index 0000000000..8953d481cf --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/fs/StoreTest.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs; + +import java.io.File; +import java.io.IOException; +import java.util.Random; +import net.runelite.cache.StoreLocation; +import net.runelite.cache.index.FileData; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class StoreTest +{ + private static final int NUMBER_OF_FILES = 1024; + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void testOneFile() throws IOException + { + try (Store store = new Store(folder.getRoot())) + { + Index index = store.addIndex(0); + Archive archive = index.addArchive(0); + archive.setFileData(new FileData[1]); + FileData fileData = archive.getFileData()[0] = new FileData(); + fileData.setId(42); + fileData.setNameHash(7); + + store.save(); + + try (Store store2 = new Store(folder.getRoot())) + { + store2.load(); + + Assert.assertEquals(store, store2); + } + } + } + + @Test + public void testManyFiles() throws IOException + { + Random random = new Random(42L); + File root = folder.newFolder(); + + try (Store store = new Store(root)) + { + Index index = store.addIndex(0); + Archive archive = index.addArchive(0); + archive.setNameHash(random.nextInt()); + archive.setFileData(new FileData[NUMBER_OF_FILES]); + + for (int i = 0; i < NUMBER_OF_FILES; ++i) + { + FileData[] fileData = archive.getFileData(); + FileData file = fileData[i] = new FileData(); + file.setId(i); + file.setNameHash(random.nextInt()); + } + + store.save(); + + try (Store store2 = new Store(root)) + { + store2.load(); + + Assert.assertEquals(store, store2); + } + } + } + + @Test + public void testMultipleArchives() throws IOException + { + Random random = new Random(43L); + File root = folder.newFolder(); + + try (Store store = new Store(root)) + { + Index index = store.addIndex(0); + Index index2 = store.addIndex(1); + + Archive archive = index.addArchive(0); + archive.setNameHash(random.nextInt(Integer.MAX_VALUE)); + archive.setFileData(new FileData[NUMBER_OF_FILES]); + + Archive archive2 = index.addArchive(1); + archive2.setFileData(new FileData[NUMBER_OF_FILES]); + + Archive archive3 = index2.addArchive(0); + archive3.setFileData(new FileData[NUMBER_OF_FILES]); + + for (int i = 0; i < NUMBER_OF_FILES; ++i) + { + FileData[] fileData = archive.getFileData(); + FileData file = fileData[i] = new FileData(); + file.setNameHash(random.nextInt(Integer.MAX_VALUE)); + } + + for (int i = 0; i < NUMBER_OF_FILES; ++i) + { + FileData[] fileData = archive2.getFileData(); + FileData file = fileData[i] = new FileData(); + file.setNameHash(random.nextInt(Integer.MAX_VALUE)); + } + + for (int i = 0; i < NUMBER_OF_FILES; ++i) + { + FileData[] fileData = archive3.getFileData(); + FileData file = fileData[i] = new FileData(); + file.setNameHash(random.nextInt(Integer.MAX_VALUE)); + } + + store.save(); + + try (Store store2 = new Store(root)) + { + store2.load(); + + Assert.assertEquals(store, store2); + } + } + } +} diff --git a/cache/src/test/java/net/runelite/cache/fs/flat/FlatStorageTest.java b/cache/src/test/java/net/runelite/cache/fs/flat/FlatStorageTest.java new file mode 100644 index 0000000000..37eb72c8c4 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/fs/flat/FlatStorageTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.flat; + +import java.io.File; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Container; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Store; +import net.runelite.cache.fs.jagex.DiskStorage; +import net.runelite.cache.index.FileData; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +public class FlatStorageTest +{ + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + @Test + public void testSaveArchive() throws Exception + { + File file = folder.newFolder(); + DiskStorage storage = new DiskStorage(file); + Archive archive; + Archive archive2; + try (Store store = new Store(storage)) + { + Index index = store.addIndex(0); + archive = index.addArchive(0); + archive2 = index.addArchive(1); + + FileData[] fileData = new FileData[1]; + archive.setFileData(fileData); + fileData[0] = new FileData(); + + FileData[] fileData2 = new FileData[1]; + archive2.setFileData(fileData2); + fileData2[0] = new FileData(); + + byte[] data = "test".getBytes(); + Container container = new Container(archive.getCompression(), -1); + container.compress(data, null); + byte[] compressedData = container.data; + storage.saveArchive(archive, compressedData); + + container = new Container(archive.getCompression(), 42); + container.compress(data, null); + compressedData = container.data; + archive2.setRevision(42); + storage.saveArchive(archive2, compressedData); + + store.save(); + } + + storage = new DiskStorage(file); + try (Store store = new Store(storage)) + { + store.load(); + Index index = store.findIndex(0); + Archive archive2_1 = index.getArchive(0); + Archive archive2_2 = index.getArchive(1); + + byte[] comprsesedData = storage.loadArchive(archive2_1); + byte[] data = archive2_1.decompress(comprsesedData); + assertArrayEquals("test".getBytes(), data); + assertEquals(archive.getCrc(), archive2_1.getCrc()); + assertEquals(archive.getRevision(), archive2_1.getRevision()); + + comprsesedData = storage.loadArchive(archive2_2); + data = archive2_2.decompress(comprsesedData); + assertArrayEquals("test".getBytes(), data); + assertEquals(archive2.getCrc(), archive2_2.getCrc()); + assertEquals(archive2.getRevision(), archive2_2.getRevision()); + } + } +} diff --git a/cache/src/test/java/net/runelite/cache/fs/jagex/DataFileTest.java b/cache/src/test/java/net/runelite/cache/fs/jagex/DataFileTest.java new file mode 100644 index 0000000000..7e66d0b1e9 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/fs/jagex/DataFileTest.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.jagex; + +import java.io.File; +import java.io.IOException; +import net.runelite.cache.StoreLocation; +import net.runelite.cache.fs.Container; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class DataFileTest +{ + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test1() throws IOException + { + File file = folder.newFile(); + DataFile df = new DataFile(file); + + Container container = new Container(CompressionType.NONE, 0); + container.compress("test".getBytes(), null); + byte[] compressedData = container.data; + DataFileWriteResult res = df.write(42, 3, compressedData); + + compressedData = df.read(42, 3, res.sector, res.compressedLength); + Container res2 = Container.decompress(compressedData, null); + + byte[] buf = res2.data; + String str = new String(buf); + Assert.assertEquals("test", str); + } + + @Test + public void test2() throws IOException + { + byte[] b = new byte[1024]; + for (int i = 0; i < 1024; ++i) + { + b[i] = (byte) i; + } + + File file = folder.newFile(); + + DataFile df = new DataFile(file); + + Container container = new Container(CompressionType.BZ2, 42); + container.compress(b, null); + byte[] compressedData = container.data; + DataFileWriteResult res = df.write(42, 0x1FFFF, compressedData); + + compressedData = df.read(42, 0x1FFFF, res.sector, res.compressedLength); + Container res2 = Container.decompress(compressedData, null); + + byte[] buf = res2.data; + Assert.assertArrayEquals(b, buf); + } + + @Test + public void testGZipCompression() throws IOException + { + DataFile df = new DataFile(folder.newFile()); + + Container container = new Container(CompressionType.GZ, 0); + container.compress("test".getBytes(), null); + byte[] compressedData = container.data; + DataFileWriteResult res = df.write(41, 4, compressedData); + + compressedData = df.read(41, 4, res.sector, res.compressedLength); + Container res2 = Container.decompress(compressedData, null); + + byte[] buf = res2.data; + String str = new String(buf); + Assert.assertEquals("test", str); + } + + @Test + public void testBZip2Compression() throws IOException + { + DataFile df = new DataFile(folder.newFile()); + + Container container = new Container(CompressionType.BZ2, 5); + container.compress("test".getBytes(), null); + byte[] compressedData = container.data; + DataFileWriteResult res = df.write(41, 4, compressedData); + + compressedData = df.read(41, 4, res.sector, res.compressedLength); + Container res2 = Container.decompress(compressedData, null); + + byte[] buf = res2.data; + String str = new String(buf); + Assert.assertEquals("test", str); + } + + @Test + public void testEnc() throws IOException + { + File file = folder.newFile(); + int[] keys = new int[] + { + 4, 8, 15, 16 + }; + + DataFile df = new DataFile(file); + + Container container = new Container(CompressionType.NONE, 42); + container.compress("testtesttesttest1".getBytes(), keys); + byte[] compressedData = container.data; + DataFileWriteResult res = df.write(42, 3, compressedData); + + compressedData = df.read(42, 3, res.sector, res.compressedLength); + Container res2 = Container.decompress(compressedData, keys); + + byte[] buf = res2.data; + String str = new String(buf); + Assert.assertEquals("testtesttesttest1", str); + Assert.assertEquals(42, res2.revision); + } + + @Test + public void testEncGz() throws IOException + { + File file = folder.newFile(); + int[] keys = new int[] + { + 4, 8, 15, 16 + }; + + DataFile df = new DataFile(file); + + Container container = new Container(CompressionType.GZ, 42); + container.compress("testtesttesttest1".getBytes(), keys); + byte[] compressedData = container.data; + DataFileWriteResult res = df.write(42, 3, compressedData); + + compressedData = df.read(42, 3, res.sector, res.compressedLength); + Container res2 = Container.decompress(compressedData, keys); + + byte[] buf = res2.data; + String str = new String(buf); + Assert.assertEquals("testtesttesttest1", str); + Assert.assertEquals(42, res2.revision); + } +} diff --git a/cache/src/test/java/net/runelite/cache/fs/jagex/DiskStorageTest.java b/cache/src/test/java/net/runelite/cache/fs/jagex/DiskStorageTest.java new file mode 100644 index 0000000000..240b7c67d7 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/fs/jagex/DiskStorageTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.jagex; + +import java.io.File; +import net.runelite.cache.StoreLocation; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Container; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Store; +import net.runelite.cache.index.FileData; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +public class DiskStorageTest +{ + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void testSaveArchive() throws Exception + { + File file = folder.newFolder(); + DiskStorage storage = new DiskStorage(file); + Archive archive; + Archive archive2; + try (Store store = new Store(storage)) + { + Index index = store.addIndex(0); + archive = index.addArchive(0); + archive2 = index.addArchive(1); + + FileData[] fileData = new FileData[1]; + archive.setFileData(fileData); + fileData[0] = new FileData(); + + FileData[] fileData2 = new FileData[1]; + archive2.setFileData(fileData2); + fileData2[0] = new FileData(); + + byte[] data = "test".getBytes(); + Container container = new Container(archive.getCompression(), -1); + container.compress(data, null); + byte[] compressedData = container.data; + storage.saveArchive(archive, compressedData); + + container = new Container(archive.getCompression(), 42); + container.compress(data, null); + compressedData = container.data; + archive2.setRevision(42); + storage.saveArchive(archive2, compressedData); + + store.save(); + } + + storage = new DiskStorage(file); + try (Store store = new Store(storage)) + { + store.load(); + Index index = store.findIndex(0); + Archive archive2_1 = index.getArchive(0); + Archive archive2_2 = index.getArchive(1); + + byte[] comprsesedData = storage.loadArchive(archive2_1); + byte[] data = archive2_1.decompress(comprsesedData); + assertArrayEquals("test".getBytes(), data); + assertEquals(archive.getCrc(), archive2_1.getCrc()); + assertEquals(archive.getRevision(), archive2_1.getRevision()); + + comprsesedData = storage.loadArchive(archive2_2); + data = archive2_2.decompress(comprsesedData); + assertArrayEquals("test".getBytes(), data); + assertEquals(archive2.getCrc(), archive2_2.getCrc()); + assertEquals(archive2.getRevision(), archive2_2.getRevision()); + } + } + +} diff --git a/cache/src/test/java/net/runelite/cache/fs/jagex/IndexFileTest.java b/cache/src/test/java/net/runelite/cache/fs/jagex/IndexFileTest.java new file mode 100644 index 0000000000..e07c6b4771 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/fs/jagex/IndexFileTest.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.fs.jagex; + +import java.io.File; +import java.io.IOException; +import net.runelite.cache.StoreLocation; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class IndexFileTest +{ + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File file = folder.newFile(); + IndexFile index = new IndexFile(5, file); + IndexEntry entry = new IndexEntry(index, 7, 8, 9); + index.write(entry); + IndexEntry entry2 = index.read(7); + Assert.assertEquals(entry, entry2); + } +} diff --git a/cache/src/test/java/net/runelite/cache/io/OutputStreamTest.java b/cache/src/test/java/net/runelite/cache/io/OutputStreamTest.java new file mode 100644 index 0000000000..8fd46d9137 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/io/OutputStreamTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.io; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class OutputStreamTest +{ + @Test + public void testWriteBigSmart() + { + OutputStream os = new OutputStream(); + os.writeBigSmart(42); + os.writeBigSmart(70000); + os.writeBigSmart(65535); + + InputStream is = new InputStream(os.getArray()); + assertEquals(42, is.readBigSmart()); + assertEquals(70000, is.readBigSmart()); + assertEquals(65535, is.readBigSmart()); + } + + @Test + public void testWriteString() + { + char[] c = new char[]{32, 160}; + String str = new String(c, 0, c.length); + + OutputStream os = new OutputStream(); + os.writeString(str); + + // 1 byte length + 32 + 160 + assertEquals(3, os.getOffset()); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java b/cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java new file mode 100644 index 0000000000..30fb140a1b --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.item; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; +import lombok.extern.slf4j.Slf4j; +import net.runelite.cache.IndexType; +import net.runelite.cache.ItemManager; +import net.runelite.cache.SpriteManager; +import net.runelite.cache.StoreLocation; +import net.runelite.cache.TextureManager; +import net.runelite.cache.definitions.ItemDefinition; +import net.runelite.cache.definitions.ModelDefinition; +import net.runelite.cache.definitions.loaders.ModelLoader; +import net.runelite.cache.definitions.providers.ModelProvider; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Store; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +@Slf4j +public class ItemSpriteFactoryTest +{ + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + @Ignore + public void test() throws IOException + { + File base = StoreLocation.LOCATION, + outDir = folder.newFolder(); + + int count = 0; + + try (Store store = new Store(base)) + { + store.load(); + + ItemManager itemManager = new ItemManager(store); + itemManager.load(); + + ModelProvider modelProvider = new ModelProvider() + { + @Override + public ModelDefinition provide(int modelId) throws IOException + { + Index models = store.getIndex(IndexType.MODELS); + Archive archive = models.getArchive(modelId); + + byte[] data = archive.decompress(store.getStorage().loadArchive(archive)); + ModelDefinition inventoryModel = new ModelLoader().load(modelId, data); + return inventoryModel; + } + }; + + SpriteManager spriteManager = new SpriteManager(store); + spriteManager.load(); + + TextureManager textureManager = new TextureManager(store); + textureManager.load(); + + for (ItemDefinition itemDef : itemManager.getItems()) + { + if (itemDef.name == null || itemDef.name.equalsIgnoreCase("null")) + { + continue; + } + + try + { + BufferedImage sprite = ItemSpriteFactory.createSprite(itemManager, modelProvider, spriteManager, textureManager, + itemDef.id, 1, 1, 3153952, false); + + File out = new File(outDir, itemDef.id + ".png"); + BufferedImage img = sprite; + ImageIO.write(img, "PNG", out); + + ++count; + } + catch (Exception ex) + { + log.warn("error dumping item {}", itemDef.id, ex); + } + } + } + + log.info("Dumped {} item images to {}", count, outDir); + } +} \ No newline at end of file diff --git a/cache/src/test/java/net/runelite/cache/models/ObjExporterTest.java b/cache/src/test/java/net/runelite/cache/models/ObjExporterTest.java new file mode 100644 index 0000000000..c7b0aa85f7 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/models/ObjExporterTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.models; + +import java.io.File; +import java.io.FileWriter; +import java.io.PrintWriter; +import java.nio.file.Files; +import net.runelite.cache.StoreLocation; +import net.runelite.cache.TextureManager; +import net.runelite.cache.definitions.ModelDefinition; +import net.runelite.cache.definitions.loaders.ModelLoader; +import net.runelite.cache.fs.Store; +import org.junit.Ignore; +import org.junit.Test; + +public class ObjExporterTest +{ + @Test + @Ignore + public void testExport() throws Exception + { + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + TextureManager tm = new TextureManager(store); + tm.load(); + + ModelLoader loader = new ModelLoader(); + ModelDefinition model = loader.load(9638, Files.readAllBytes(new File("D:\\rs\\07\\cache\\models\\9638.model").toPath())); + + ObjExporter exporter = new ObjExporter(tm, model); + try (PrintWriter objWriter = new PrintWriter(new FileWriter(new File("D:\\rs\\07\\temp\\9638.obj"))); + PrintWriter mtlWriter = new PrintWriter(new FileWriter(new File("D:\\rs\\07\\temp\\9638.mtl")))) + { + exporter.export(objWriter, mtlWriter); + } + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawn.java b/cache/src/test/java/net/runelite/cache/script/InstructionsTest.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawn.java rename to cache/src/test/java/net/runelite/cache/script/InstructionsTest.java index 1c21d04805..477845c5e8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawn.java +++ b/cache/src/test/java/net/runelite/cache/script/InstructionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,18 +22,16 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.vorkath; +package net.runelite.cache.script; -import lombok.Getter; -import api.NPC; +import org.junit.Test; -class ZombifiedSpawn +public class InstructionsTest { - @Getter - private NPC npc; - - ZombifiedSpawn(NPC npc) + @Test + public void testInit() { - this.npc = npc; + new Instructions().init(); } -} \ No newline at end of file + +} diff --git a/cache/src/test/java/net/runelite/cache/script/assembler/AssemblerTest.java b/cache/src/test/java/net/runelite/cache/script/assembler/AssemblerTest.java new file mode 100644 index 0000000000..0e5dccd4f1 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/script/assembler/AssemblerTest.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.assembler; + +import java.io.InputStream; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.script.Instructions; +import net.runelite.cache.script.disassembler.Disassembler; +import org.apache.commons.compress.utils.IOUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@RunWith(Parameterized.class) +public class AssemblerTest +{ + private static final Logger logger = LoggerFactory.getLogger(AssemblerTest.class); + + @Parameter + public String script; + + @Parameters + public static String[] scripts() + { + return new String[] + { + "91.rs2asm", + "681.rs2asm", + "Unicode.rs2asm" + }; + } + + @Test + public void testAssemble() throws Exception + { + InputStream in = AssemblerTest.class.getResourceAsStream(script); + Assert.assertNotNull(in); + + Instructions instructions = new Instructions(); + instructions.init(); + + Assembler assembler = new Assembler(instructions); + ScriptDefinition script = assembler.assemble(in); + + // compare with disassembler + Disassembler disassembler = new Disassembler(); + String out = disassembler.disassemble(script); + + in = AssemblerTest.class.getResourceAsStream(this.script); + Assert.assertNotNull(in); + + String original = new String(IOUtils.toByteArray(in)).replaceAll("\r\n", "\n"); + + logger.info(original); + logger.info("-----------------------"); + logger.info(out); + + Assert.assertEquals(original, out); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/script/disassembler/DisassemblerTest.java b/cache/src/test/java/net/runelite/cache/script/disassembler/DisassemblerTest.java new file mode 100644 index 0000000000..a97ca27586 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/script/disassembler/DisassemblerTest.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.script.disassembler; + +import com.google.common.io.Files; +import java.io.File; +import java.io.IOException; +import net.runelite.cache.IndexType; +import net.runelite.cache.StoreLocation; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.definitions.loaders.ScriptLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Storage; +import net.runelite.cache.fs.Store; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DisassemblerTest +{ + private static final Logger logger = LoggerFactory.getLogger(DisassemblerTest.class); + + @Rule + public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + + @Test + public void test() throws IOException + { + File outDir = folder.newFolder(); + int count = 0; + + try (Store store = new Store(StoreLocation.LOCATION)) + { + store.load(); + + Storage storage = store.getStorage(); + Index index = store.getIndex(IndexType.CLIENTSCRIPT); + ScriptLoader loader = new ScriptLoader(); + + for (Archive archive : index.getArchives()) + { + byte[] contents = archive.decompress(storage.loadArchive(archive)); + + if (contents == null) + { + continue; + } + + ScriptDefinition script = loader.load(archive.getArchiveId(), contents); + + File outFile = new File(outDir, archive.getArchiveId() + ".rs2asm"); + + Disassembler disassembler = new Disassembler(); + String out = disassembler.disassemble(script); + + Files.write(out.getBytes(), outFile); + + ++count; + } + } + + logger.info("Dumped {} scripts to {}", count, outDir); + } +} diff --git a/cache/src/test/java/net/runelite/cache/util/Djb2Test.java b/cache/src/test/java/net/runelite/cache/util/Djb2Test.java new file mode 100644 index 0000000000..49fb44df11 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/util/Djb2Test.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class Djb2Test +{ + + @Test + public void testHash() + { + int hash = Djb2.hash("l49_52"); + assertEquals(-1153204821, hash); + } + +} diff --git a/cache/src/test/java/net/runelite/cache/util/XteaTest.java b/cache/src/test/java/net/runelite/cache/util/XteaTest.java new file mode 100644 index 0000000000..8d6d703989 --- /dev/null +++ b/cache/src/test/java/net/runelite/cache/util/XteaTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.util; + +import static org.junit.Assert.assertArrayEquals; +import org.junit.Test; + +public class XteaTest +{ + @Test + public void test() + { + byte[] data = "testtesttest1".getBytes(); + + int[] key = new int[] + { + 4, 8, 15, 16 + }; + byte[] encrypted = new byte[] + { + 121, -18, 48, 64, 120, -42, -113, 77, 116, 101, 115, 116, 49 + }; + + Xtea xtea = new Xtea(key); + byte[] encData = xtea.encrypt(data, data.length); + assertArrayEquals(encrypted, encData); + + xtea = new Xtea(key); + byte[] decData = xtea.decrypt(encData, encData.length); + + assertArrayEquals(data, decData); + } +} diff --git a/cache/src/test/resources/cache.properties b/cache/src/test/resources/cache.properties new file mode 100644 index 0000000000..03e58d141f --- /dev/null +++ b/cache/src/test/resources/cache.properties @@ -0,0 +1,3 @@ +rs.version=${rs.version} +cache.version=${cache.version} + diff --git a/cache/src/test/resources/net/runelite/cache/script/assembler/681.rs2asm b/cache/src/test/resources/net/runelite/cache/script/assembler/681.rs2asm new file mode 100644 index 0000000000..a5f4222fdb --- /dev/null +++ b/cache/src/test/resources/net/runelite/cache/script/assembler/681.rs2asm @@ -0,0 +1,275 @@ +.id 681 +.int_stack_count 0 +.string_stack_count 0 +.int_var_count 2 +.string_var_count 1 + get_varc_int 5 + iconst 14 + if_icmpeq LABEL4 + jump LABEL7 +LABEL4: + iconst 1 + set_varc_int 66 + return +LABEL7: + iconst -1 + istore 0 + sconst "" + sstore 0 + get_varc_string_old 22 + string_length + istore 1 + iload 1 + iconst 0 + if_icmpgt LABEL18 + jump LABEL193 +LABEL18: + get_varc_int 5 + switch + 1: LABEL21 + 2: LABEL44 + 3: LABEL44 + 4: LABEL23 + 5: LABEL23 + 6: LABEL44 + 7: LABEL110 + 8: LABEL114 + 9: LABEL120 + 10: LABEL123 + 11: LABEL185 + 12: LABEL142 + 13: LABEL160 + 15: LABEL120 + 16: LABEL190 + jump LABEL192 +LABEL21: + return + jump LABEL192 +LABEL23: + ignore_count + iconst 0 + if_icmplt LABEL27 + jump LABEL30 +LABEL27: + sconst "Unable to update ignore list - system busy." + mes + jump LABEL43 +LABEL30: + get_varc_int 5 + iconst 4 + if_icmpeq LABEL34 + jump LABEL37 +LABEL34: + get_varc_string_old 22 + ignore_add + jump LABEL43 +LABEL37: + get_varc_int 5 + iconst 5 + if_icmpeq LABEL41 + jump LABEL43 +LABEL41: + get_varc_string_old 22 + ignore_del +LABEL43: + jump LABEL192 +LABEL44: + friend_count + iconst 0 + if_icmplt LABEL48 + jump LABEL51 +LABEL48: + sconst "Unable to complete action - system busy." + mes + jump LABEL109 +LABEL51: + get_varc_int 5 + iconst 2 + if_icmpeq LABEL55 + jump LABEL58 +LABEL55: + get_varc_string_old 22 + friend_add + jump LABEL109 +LABEL58: + get_varc_int 5 + iconst 3 + if_icmpeq LABEL62 + jump LABEL65 +LABEL62: + get_varc_string_old 22 + friend_del + jump LABEL109 +LABEL65: + get_varc_int 5 + iconst 6 + if_icmpeq LABEL69 + jump LABEL109 +LABEL69: + get_varc_int 203 + iconst 0 + if_icmpeq LABEL76 + get_varc_int 203 + iconst -1 + if_icmpeq LABEL76 + jump LABEL82 +LABEL76: + iconst 1 + iconst 1 + invoke 299 + sconst "You must set a name before you can chat." + mes + return +LABEL82: + chat_getfilter_private + iconst 2 + if_icmpeq LABEL86 + jump LABEL97 +LABEL86: + chat_getfilter_public + iconst 1 + chat_getfilter_trade + chat_setfilter + invoke 178 + invoke 553 + istore 0 + iload 0 + invoke 84 + iload 0 + invoke 89 +LABEL97: + get_varbit 4394 + iconst 1 + if_icmpeq LABEL101 + jump LABEL104 +LABEL101: + get_varc_string_old 23 + friend_del + jump LABEL107 +LABEL104: + get_varc_string_old 23 + get_varc_string_old 22 + chat_sendprivate +LABEL107: + clientclock + set_varc_int 61 +LABEL109: + jump LABEL192 +LABEL110: + get_varc_string_old 22 + invoke 212 + resume_countdialog + jump LABEL192 +LABEL114: + get_varc_string_old 22 + removetags + set_varc_string_old 128 + get_varc_string_old 22 + resume_namedialog + jump LABEL192 +LABEL120: + get_varc_string_old 22 + resume_stringdialog + jump LABEL192 +LABEL123: + get_varc_int 203 + iconst 0 + if_icmpeq LABEL130 + get_varc_int 203 + iconst -1 + if_icmpeq LABEL130 + jump LABEL136 +LABEL130: + iconst 1 + iconst 1 + invoke 299 + sconst "You must set a name before you can chat." + mes + return +LABEL136: + get_varc_string_old 22 + removetags + set_varc_string_old 129 + get_varc_string_old 22 + clan_joinchat + jump LABEL192 +LABEL142: + iload 1 + iconst 10 + if_icmpgt LABEL146 + jump LABEL152 +LABEL146: + get_varc_string_old 22 + iconst 0 + iconst 9 + substring + sstore 0 + jump LABEL154 +LABEL152: + get_varc_string_old 22 + sstore 0 +LABEL154: + sload 0 + lowercase + chat_setmessagefilter + invoke 553 + invoke 84 + jump LABEL192 +LABEL160: + get_varc_int 203 + iconst 0 + if_icmpeq LABEL167 + get_varc_int 203 + iconst -1 + if_icmpeq LABEL167 + jump LABEL173 +LABEL167: + iconst 1 + iconst 1 + invoke 299 + sconst "You must set a name before you can chat." + mes + return +LABEL173: + get_varc_string_old 22 + iconst 0 + set_varc_int 62 + set_varc_string_old 28 + invoke 95 + iconst 552 + iconst -2147483645 + iconst 1 + sconst "I1" + iconst 10616843 + if_setontimer + jump LABEL192 +LABEL185: + iconst 0 + iconst 1 + invoke 299 + return + jump LABEL192 +LABEL190: + get_varc_string_old 22 + invoke 2061 +LABEL192: + jump LABEL199 +LABEL193: + get_varc_int 5 + switch + 16: LABEL198 + 7: LABEL196 + 8: LABEL196 + 9: LABEL196 + 15: LABEL196 + jump LABEL199 +LABEL196: + return + jump LABEL199 +LABEL198: + return +LABEL199: + iconst 1 + iconst 1 + invoke 299 + return diff --git a/cache/src/test/resources/net/runelite/cache/script/assembler/91.rs2asm b/cache/src/test/resources/net/runelite/cache/script/assembler/91.rs2asm new file mode 100644 index 0000000000..25a749a77b --- /dev/null +++ b/cache/src/test/resources/net/runelite/cache/script/assembler/91.rs2asm @@ -0,0 +1,122 @@ +.id 91 +.int_stack_count 2 +.string_stack_count 1 +.int_var_count 2 +.string_var_count 1 + iload 0 + switch + 3: LABEL20 + 5: LABEL54 + 6: LABEL54 + 7: LABEL3 + jump LABEL84 +LABEL3: + iload 1 + get_varc_int 175 + if_icmplt LABEL7 + jump LABEL9 +LABEL7: + iconst 0 + return +LABEL9: + sload 0 + removetags + ignore_test + iconst 1 + if_icmpeq LABEL15 + jump LABEL17 +LABEL15: + iconst 0 + return +LABEL17: + iconst 1 + return + jump LABEL84 +LABEL20: + iload 1 + get_varc_int 175 + if_icmplt LABEL24 + jump LABEL26 +LABEL24: + iconst 0 + return +LABEL26: + sload 0 + removetags + ignore_test + iconst 1 + if_icmpeq LABEL32 + jump LABEL34 +LABEL32: + iconst 0 + return +LABEL34: + chat_getfilter_private + iconst 0 + if_icmpeq LABEL38 + jump LABEL40 +LABEL38: + iconst 1 + return +LABEL40: + chat_getfilter_private + iconst 1 + if_icmpeq LABEL44 + jump LABEL51 +LABEL44: + sload 0 + friend_test + iconst 1 + if_icmpeq LABEL49 + jump LABEL51 +LABEL49: + iconst 1 + return +LABEL51: + iconst 0 + return + jump LABEL84 +LABEL54: + iload 1 + get_varc_int 175 + if_icmplt LABEL58 + jump LABEL60 +LABEL58: + iconst 0 + return +LABEL60: + iload 0 + iconst 5 + if_icmpeq LABEL64 + jump LABEL76 +LABEL64: + get_varbit 1627 + iconst 0 + if_icmpeq LABEL68 + jump LABEL76 +LABEL68: + clientclock + iload 1 + sub + iconst 500 + if_icmpge LABEL74 + jump LABEL76 +LABEL74: + iconst 0 + return +LABEL76: + chat_getfilter_private + iconst 2 + if_icmpne LABEL80 + jump LABEL82 +LABEL80: + iconst 1 + return +LABEL82: + iconst 0 + return +LABEL84: + iconst 0 + return + iconst -1 + return diff --git a/cache/src/test/resources/net/runelite/cache/script/assembler/Unicode.rs2asm b/cache/src/test/resources/net/runelite/cache/script/assembler/Unicode.rs2asm new file mode 100644 index 0000000000..a1fc0a62e1 --- /dev/null +++ b/cache/src/test/resources/net/runelite/cache/script/assembler/Unicode.rs2asm @@ -0,0 +1,7 @@ +.id 1001 +.int_stack_count 0 +.string_stack_count 0 +.int_var_count 0 +.string_var_count 0 + sconst ": " + return diff --git a/cache/src/test/resources/simplelogger.properties b/cache/src/test/resources/simplelogger.properties new file mode 100644 index 0000000000..895eeb2715 --- /dev/null +++ b/cache/src/test/resources/simplelogger.properties @@ -0,0 +1 @@ +org.slf4j.simpleLogger.defaultLogLevel=INFO \ No newline at end of file diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 0000000000..e8669a742c --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deobfuscator/pom.xml b/deobfuscator/pom.xml index c8e216407f..c711697622 100644 --- a/deobfuscator/pom.xml +++ b/deobfuscator/pom.xml @@ -27,9 +27,9 @@ 4.0.0 - com.runeswag - runeswag-parent - 1.0-SNAPSHOT + net.runelite + runelite-parent + 1.5.28-SNAPSHOT deobfuscator @@ -37,9 +37,14 @@ - com.runeswag - api - 1.0-SNAPSHOT + net.runelite + runelite-api + ${project.version} + + + net.runelite.rs + runescape-api + ${project.version} net.runelite @@ -55,7 +60,6 @@ org.slf4j slf4j-api - 1.8.0-beta4 org.slf4j @@ -74,15 +78,15 @@ - com.runeswag + net.runelite.rs rs-client - 1.0-SNAPSHOT + ${project.version} test net.runelite.rs vanilla - 180 + ${rs.version} test @@ -153,6 +157,17 @@ + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + diff --git a/deobfuscator/src/main/java/net/runelite/asm/Method.java b/deobfuscator/src/main/java/net/runelite/asm/Method.java index bc2c8b305b..e8cbdef92b 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/Method.java +++ b/deobfuscator/src/main/java/net/runelite/asm/Method.java @@ -203,9 +203,16 @@ public class Method return (accessFlags & ACC_STATIC) != 0; } - public void setStatic() + public void setStatic(boolean s) { - accessFlags |= ACC_STATIC; + if (s) + { + accessFlags |= ACC_STATIC; + } + else + { + accessFlags &= ~ACC_STATIC; + } } public boolean isSynchronized() diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/InstructionType.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/InstructionType.java index 919da1bb02..0c347d4809 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/InstructionType.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/InstructionType.java @@ -88,7 +88,6 @@ import net.runelite.asm.attributes.code.instructions.IALoad; import net.runelite.asm.attributes.code.instructions.IAStore; import net.runelite.asm.attributes.code.instructions.IAdd; import net.runelite.asm.attributes.code.instructions.IAnd; -import net.runelite.asm.attributes.code.instructions.IConstZero; import net.runelite.asm.attributes.code.instructions.IDiv; import net.runelite.asm.attributes.code.instructions.IInc; import net.runelite.asm.attributes.code.instructions.ILoad; @@ -168,7 +167,6 @@ public enum InstructionType { NOP(0x00, "nop", NOP.class), ACONST_NULL(0x01, "aconst_null", AConstNull.class), - ICONST_0(0x03, "iconst_0", IConstZero.class), BIPUSH(0x10, "bipush", BiPush.class), SIPUSH(0x11, "sipush", SiPush.class), LDC(-1, "ldc", LDC.class), diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instruction/types/LVTInstructionType.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instruction/types/LVTInstructionType.java index d6b4d9c0e7..07c5f17d92 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instruction/types/LVTInstructionType.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instruction/types/LVTInstructionType.java @@ -34,7 +34,7 @@ public enum LVTInstructionType private final int slots; - private LVTInstructionType(int slots) + LVTInstructionType(int slots) { this.slots = slots; } diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java index 469cfe50dc..287c85ba1a 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java @@ -42,6 +42,11 @@ public class AALoad extends Instruction implements ArrayLoad super(instructions, type); } + public AALoad(Instructions instructions) + { + super(instructions, InstructionType.AALOAD); + } + @Override public InstructionContext execute(Frame frame) { diff --git a/deobfuscator/src/main/java/net/runelite/deob/Deob.java b/deobfuscator/src/main/java/net/runelite/deob/Deob.java index 3ac0463b39..d0be2f21d2 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/Deob.java +++ b/deobfuscator/src/main/java/net/runelite/deob/Deob.java @@ -27,15 +27,10 @@ package net.runelite.deob; import com.google.common.base.Stopwatch; import java.io.File; import java.io.IOException; -import net.runelite.asm.ClassFile; import net.runelite.asm.ClassGroup; -import net.runelite.asm.Field; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Annotations; import net.runelite.asm.execution.Execution; -import net.runelite.deob.deobfuscators.transformers.GetPathTransformer; import net.runelite.deob.deobfuscators.CastNull; +import net.runelite.deob.deobfuscators.StaticShouldBeInstance; import net.runelite.deob.deobfuscators.constparam.ConstantParameter; import net.runelite.deob.deobfuscators.EnumDeobfuscator; import net.runelite.deob.deobfuscators.FieldInliner; @@ -57,6 +52,7 @@ import net.runelite.deob.deobfuscators.cfg.ControlFlowDeobfuscator; import net.runelite.deob.deobfuscators.exprargorder.ExprArgOrder; import net.runelite.deob.deobfuscators.menuaction.MenuActionDeobfuscator; import net.runelite.deob.deobfuscators.transformers.ClientErrorTransformer; +import net.runelite.deob.deobfuscators.transformers.GetPathTransformer; import net.runelite.deob.deobfuscators.transformers.MaxMemoryTransformer; import net.runelite.deob.deobfuscators.transformers.OpcodesTransformer; import net.runelite.deob.deobfuscators.transformers.ReflectionTransformer; @@ -85,85 +81,70 @@ public class Deob ClassGroup group = JarUtil.loadJar(new File(args[0])); - for (ClassFile f : group.getClasses()) + if (args.length > 2 && args[2].equals("rl")) { - f.getAnnotations().clearAnnotations(); - for (Method m : f.getMethods()) - { - Annotations an = m.getAnnotations(); - an.clearAnnotations(); - } - for (Field fi : f.getFields()) - { - Annotations an = fi.getAnnotations(); - if (an.find(new Type("Ljavax/inject/Inject;")) == null) - { - an.clearAnnotations(); - } - else - { - logger.info("Class {}, field {} has inject", f.getClassName(), fi.getName()); - } - } + run(group, new StaticShouldBeInstance()); } + else + { + // remove except RuntimeException + run(group, new RuntimeExceptions()); - // remove except RuntimeException - run(group, new RuntimeExceptions()); + run(group, new ControlFlowDeobfuscator()); - run(group, new ControlFlowDeobfuscator()); + run(group, new RenameUnique()); - run(group, new RenameUnique()); + // remove unused methods - this leaves Code with no instructions, + // which is not valid, so unused methods is run after + run(group, new UnreachedCode()); + run(group, new UnusedMethods()); - // remove unused methods - this leaves Code with no instructions, - // which is not valid, so unused methods is run after - run(group, new UnreachedCode()); - run(group, new UnusedMethods()); + // remove illegal state exceptions, frees up some parameters + run(group, new IllegalStateExceptions()); - // remove illegal state exceptions, frees up some parameters - run(group, new IllegalStateExceptions()); + // remove constant logically dead parameters + run(group, new ConstantParameter()); - // remove constant logically dead parameters - run(group, new ConstantParameter()); + // remove unhit blocks + run(group, new UnreachedCode()); + run(group, new UnusedMethods()); - // remove unhit blocks - run(group, new UnreachedCode()); - run(group, new UnusedMethods()); + // remove unused parameters + run(group, new UnusedParameters()); - // remove unused parameters - run(group, new UnusedParameters()); + // remove unused fields + run(group, new UnusedFields()); - // remove unused fields - run(group, new UnusedFields()); + run(group, new FieldInliner()); - run(group, new FieldInliner()); + // order uses class name order for sorting fields/methods, + // so run it before removing classes below + run(group, new Order()); - // order uses class name order for sorting fields/methods, - // so run it before removing classes below - run(group, new Order()); + run(group, new UnusedClass()); - run(group, new UnusedClass()); + runMath(group); - runMath(group); + run(group, new ExprArgOrder()); - run(group, new ExprArgOrder()); + run(group, new Lvt()); - run(group, new Lvt()); + run(group, new CastNull()); - run(group, new CastNull()); + run(group, new EnumDeobfuscator()); - run(group, new EnumDeobfuscator()); + new OpcodesTransformer().transform(group); + //run(group, new PacketHandlerOrder()); + //run(group, new PacketWriteDeobfuscator()); - new OpcodesTransformer().transform(group); - //run(group, new PacketHandlerOrder()); - //run(group, new PacketWriteDeobfuscator()); + run(group, new MenuActionDeobfuscator()); - run(group, new MenuActionDeobfuscator()); - - new GetPathTransformer().transform(group); - new ClientErrorTransformer().transform(group); - new ReflectionTransformer().transform(group); - new MaxMemoryTransformer().transform(group); - //new RuneliteBufferTransformer().transform(group); + new GetPathTransformer().transform(group); + new ClientErrorTransformer().transform(group); + new ReflectionTransformer().transform(group); + new MaxMemoryTransformer().transform(group); + //new RuneliteBufferTransformer().transform(group); + } JarUtil.saveJar(group, new File(args[1])); @@ -173,7 +154,7 @@ public class Deob public static boolean isObfuscated(String name) { - return name.length() <= OBFUSCATED_NAME_MAX_LEN || name.startsWith("method") || name.startsWith("vmethod") || name.startsWith("field") || name.startsWith("class"); + return name.length() <= OBFUSCATED_NAME_MAX_LEN || name.startsWith("method") || name.startsWith("vmethod") || name.startsWith("field") || name.startsWith("class") || name.startsWith("__"); } private static void runMath(ClassGroup group) diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/StaticShouldBeInstance.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/StaticShouldBeInstance.java new file mode 100644 index 0000000000..1cae903698 --- /dev/null +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/StaticShouldBeInstance.java @@ -0,0 +1,171 @@ +package net.runelite.deob.deobfuscators; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Annotations; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instruction.types.ReturnInstruction; +import net.runelite.asm.attributes.code.instructions.InvokeStatic; +import net.runelite.asm.attributes.code.instructions.InvokeVirtual; +import net.runelite.asm.pool.Method; +import net.runelite.asm.signature.Signature; +import net.runelite.deob.Deobfuscator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class StaticShouldBeInstance implements Deobfuscator +{ + private static final Logger logger = LoggerFactory.getLogger(StaticShouldBeInstance.class); + private static Map methods = new HashMap<>(); + + public void run(ClassGroup group) + { + int replacedCalls = 0; + int removedInstructions = 0; + int removedMethods = 0; + int removedAnnotations = 0; + List obfuscatedMethods = new ArrayList<>(); + + for (ClassFile cf : group.getClasses()) + { + // Remove unused annotations + Annotations a = cf.getAnnotations(); + removedAnnotations += a.getAnnotations().size(); + a.clearAnnotations(); + + Type type = new Type('L' + cf.getClassName() + ';'); + obfuscatedMethods.clear(); + + for (net.runelite.asm.Method m : cf.getMethods()) + { + // Remove unused annotations + a = m.getAnnotations(); + removedAnnotations += a.size(); + a.clearAnnotations(); + + if (m.isStatic() && m.getCode() != null) + { + if (checkIfObf(m, type, cf)) + { + removedMethods++; + obfuscatedMethods.add(m); + } + } + } + + + for (net.runelite.asm.Method m : obfuscatedMethods) + { + Signature sig = m.getDescriptor(); + Signature.Builder builder = new Signature.Builder(); + builder.setReturnType(sig.getReturnValue()); + if (sig.getArguments().size() > 1) + { + builder.addArguments(sig.getArguments().subList(1, sig.getArguments().size())); + } + + Signature toFind = builder.build(); + + net.runelite.asm.Method notStatic = cf.findMethod(m.getName(), toFind); + net.runelite.asm.pool.Method oldPool = m.getPoolMethod(); + cf.removeMethod(notStatic); + + m.setDescriptor(toFind); + m.setStatic(false); + Code c = m.getCode(); + Instructions ins = c.getInstructions(); + int startLength = ins.getInstructions().size(); + ListIterator it = ins.getInstructions().listIterator(); + assert it.hasNext(); + Instruction i = it.next(); + while (!(i instanceof ReturnInstruction)) + { + it.remove(); + i = it.next(); + } + it.remove(); + net.runelite.asm.pool.Method newPool = m.getPoolMethod(); + + methods.put(oldPool, newPool); + + removedInstructions += startLength - ins.getInstructions().size(); + } + + for (Field fi : cf.getFields()) + { + a = fi.getAnnotations(); + if (a.find(new Type("Ljavax/inject/Inject;")) == null) + { + removedAnnotations += a.size(); + a.clearAnnotations(); + } + else + { + logger.info("Class {}, field {} has inject", cf.getClassName(), fi.getName()); + } + } + } + + for (ClassFile cf : group.getClasses()) + { + for (net.runelite.asm.Method m : cf.getMethods()) + { + if (m.getCode() == null) + { + continue; + } + + Instructions ins = m.getCode().getInstructions(); + List instructions = ins.getInstructions(); + for (int i1 = 0, instructionsSize = instructions.size(); i1 < instructionsSize; i1++) + { + Instruction i = instructions.get(i1); + if (!(i instanceof InvokeStatic)) + { + continue; + } + + if (methods.containsKey(((InvokeStatic) i).getMethod())) + { + InvokeVirtual invoke = new InvokeVirtual(ins, methods.get(((InvokeStatic) i).getMethod())); + ins.replace(i, invoke); + replacedCalls++; + } + } + } + } + + logger.info("Made {} methods not static, removed {} instructions, replaced {} invokes, and removed {} annotations", removedMethods, removedInstructions, replacedCalls, removedAnnotations); + } + + private static boolean checkIfObf(net.runelite.asm.Method m, Type type, ClassFile cf) + { + Signature sig = m.getDescriptor(); + if (sig.getArguments().size() < 1 || !sig.getTypeOfArg(0).equals(type)) + { + return false; + } + + Signature.Builder builder = new Signature.Builder(); + builder.setReturnType(sig.getReturnValue()); + if (sig.getArguments().size() > 1) + { + builder.addArguments(sig.getArguments().subList(1, sig.getArguments().size())); + } + + Signature toFind = builder.build(); + + net.runelite.asm.Method notStatic = cf.findMethod(m.getName(), toFind); + + return notStatic != null; + } +} diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationIntegrityChecker.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationIntegrityChecker.java index 62cd687078..b8fcb505dd 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationIntegrityChecker.java +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationIntegrityChecker.java @@ -34,7 +34,7 @@ import net.runelite.asm.attributes.Annotations; import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.deob.DeobAnnotations; import net.runelite.mapping.Import; -import rs.api.RSClient; +import net.runelite.rs.api.RSClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +44,7 @@ public class AnnotationIntegrityChecker public static final java.lang.Class CLIENT_CLASS = RSClient.class; - public static final String API_PACKAGE_BASE = "rs.api.RS"; + public static final String API_PACKAGE_BASE = "net.runelite.rs.api.RS"; private final ClassGroup one; private final ClassGroup two; diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/transformers/OpcodesTransformer.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/transformers/OpcodesTransformer.java index 15f9eae248..d515c3bcd4 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/transformers/OpcodesTransformer.java +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/transformers/OpcodesTransformer.java @@ -60,7 +60,7 @@ public class OpcodesTransformer implements Transformer if (clinit == null) { clinit = new Method(runeliteOpcodes, "", new Signature("()V")); - clinit.setStatic(); + clinit.setStatic(true); Code code = new Code(clinit); code.setMaxStack(1); clinit.setCode(code); diff --git a/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java b/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java index 0df369e8ad..db6ed0ef1c 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java +++ b/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java @@ -26,19 +26,24 @@ package net.runelite.deob.updater; import java.io.File; import java.io.IOException; +import java.util.Map; import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.deob.deobfuscators.Renamer; import net.runelite.deob.deobfuscators.mapping.AnnotationIntegrityChecker; import net.runelite.deob.deobfuscators.mapping.AnnotationMapper; import net.runelite.deob.deobfuscators.mapping.Mapper; import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping; import net.runelite.deob.util.JarUtil; +import net.runelite.deob.util.NameMappings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UpdateMappings { private static final Logger logger = LoggerFactory.getLogger(UpdateMappings.class); - + private static boolean renameRL = true; private final ClassGroup group1, group2; public UpdateMappings(ClassGroup group1, ClassGroup group2) @@ -74,6 +79,32 @@ public class UpdateMappings pr.run(); } + public void updateRL() + { + Mapper mapper = new Mapper(group1, group2); + mapper.run(); + ParallelExecutorMapping mapping = mapper.getMapping(); + NameMappings names = new NameMappings(); + + for (Map.Entry e : mapping.getMap().entrySet()) + { + Object k = e.getKey(); + Object v = e.getValue(); + + if (k instanceof Field) + { + names.map(((Field) v).getPoolField(), ((Field) k).getName()); + } + else if (k instanceof Method) + { + names.map(((Method) v).getPoolMethod(), ((Method) k).getName()); + } + } + + Renamer renamer = new Renamer(names); + renamer.run(group2); + } + public void save(File out) throws IOException { JarUtil.saveJar(group2, out); @@ -90,7 +121,14 @@ public class UpdateMappings JarUtil.loadJar(new File(args[0])), JarUtil.loadJar(new File(args[1])) ); - u.update(); + if (renameRL) + { + u.updateRL(); + } + else + { + u.update(); + } u.save(new File(args[2])); } } diff --git a/deobfuscator/src/test/java/net/runelite/asm/ClassUtil.java b/deobfuscator/src/test/java/net/runelite/asm/ClassUtil.java new file mode 100644 index 0000000000..db01b8c95a --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/ClassUtil.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.asm; + +import java.io.IOException; +import java.io.InputStream; +import net.runelite.asm.visitors.ClassFileVisitor; +import org.objectweb.asm.ClassReader; + +public class ClassUtil +{ + public static ClassFile loadClass(InputStream in) throws IOException + { + ClassReader reader = new ClassReader(in); + ClassFileVisitor cv = new ClassFileVisitor(); + + reader.accept(cv, ClassReader.SKIP_FRAMES); + + return cv.getClassFile(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/annotations/AnnotationTest.java b/deobfuscator/src/test/java/net/runelite/asm/annotations/AnnotationTest.java new file mode 100644 index 0000000000..642dbf076f --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/annotations/AnnotationTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.annotations; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Optional; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.asm.Method; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Annotations; +import net.runelite.asm.attributes.annotation.Annotation; +import net.runelite.asm.attributes.annotation.Element; +import net.runelite.deob.util.JarUtil; +import org.junit.Assert; +import org.junit.Test; + +public class AnnotationTest +{ + @Test + public void testAnnotation() throws IOException + { + InputStream in = this.getClass().getClassLoader().getResourceAsStream("net/runelite/asm/annotations/TestClass.class"); + Assert.assertNotNull(in); + + ClassGroup group = new ClassGroup(); + + ClassFile cf = ClassUtil.loadClass(in); + group.addClass(cf); + + byte[] out = JarUtil.writeClass(group, cf); + + // parse it again + cf = ClassUtil.loadClass(new ByteArrayInputStream(out)); + + Method method = cf.getMethods().get(1); + Assert.assertEquals("method1", method.getName()); + + Annotations annotations = method.getAnnotations(); + Assert.assertNotNull(annotations); + + Optional annotation = annotations.getAnnotations().stream().filter(a -> a.getType().equals(new Type("Lnet/runelite/asm/annotations/MyAnnotation;"))).findFirst(); + Assert.assertTrue(annotation.isPresent()); + + Annotation an = annotation.get(); + List elements = an.getElements(); + + Assert.assertEquals(1, elements.size()); + + Element element = elements.get(0); + + Assert.assertEquals("value", element.getName()); + Assert.assertEquals("method1", element.getValue()); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/annotations/MyAnnotation.java b/deobfuscator/src/test/java/net/runelite/asm/annotations/MyAnnotation.java new file mode 100644 index 0000000000..0a9cfde7c1 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/annotations/MyAnnotation.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.asm.annotations; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface MyAnnotation +{ + String value(); +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/annotations/TestClass.java b/deobfuscator/src/test/java/net/runelite/asm/annotations/TestClass.java new file mode 100644 index 0000000000..af86951265 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/annotations/TestClass.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.asm.annotations; + +public class TestClass +{ + @MyAnnotation("field1") + public int field1; + + @MyAnnotation("method1") + public void method1() + { + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/IfEqTest.java b/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/IfEqTest.java new file mode 100644 index 0000000000..4d4d1e1cf6 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/IfEqTest.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.attributes.code.instructions; + +import static net.runelite.asm.Type.INT; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.InstructionType; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.execution.Frame; +import net.runelite.asm.execution.InstructionContext; +import net.runelite.asm.execution.Stack; +import net.runelite.asm.execution.StackContext; +import net.runelite.asm.execution.Value; +import net.runelite.asm.execution.VariableContext; +import net.runelite.asm.execution.Variables; +import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping; +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class IfEqTest +{ + + @Test + public void testIsSame() + { + Instructions ins = mock(Instructions.class); + Frame originalIfEqFrame = mock(Frame.class); + Stack stack = new Stack(42); + + Variables variables = new Variables(42); + when(originalIfEqFrame.getStack()).thenReturn(stack); + when(originalIfEqFrame.getVariables()).thenReturn(variables); + + variables.set(9, new VariableContext(INT)); + + Instruction i = new LDC(ins, 0); + InstructionContext ctx = new InstructionContext(i, originalIfEqFrame); + + // ifeq 0 + IfEq ifeq = new IfEq(ins, InstructionType.IFEQ); + InstructionContext ifeqCtx = new InstructionContext(ifeq, originalIfEqFrame); + ifeqCtx.pop(new StackContext(ctx, INT, new Value(1))); + + // + ins = mock(Instructions.class); + Frame originalIfIcmpNeFrame = mock(Frame.class); + stack = new Stack(42); + variables = new Variables(42); + when(originalIfIcmpNeFrame.getStack()).thenReturn(stack); + when(originalIfIcmpNeFrame.getVariables()).thenReturn(variables); + variables.set(5, new VariableContext(INT)); + + i = new LDC(ins, 1); + InstructionContext ctx1 = new InstructionContext(i, originalIfIcmpNeFrame); + i = new ILoad(ins, 5); + InstructionContext ctx2 = new InstructionContext(i, originalIfIcmpNeFrame); + + // ificmpne 1 + IfICmpNe ificmpne = new IfICmpNe(ins, InstructionType.IF_ICMPNE); + InstructionContext ificmpneCtx = new InstructionContext(ificmpne, originalIfIcmpNeFrame); + ificmpneCtx.pop( + new StackContext(ctx1, INT, new Value(1)), + new StackContext(ctx2, INT, Value.UNKNOWN) + ); + + assertEquals( + ifeq.isSame(ifeqCtx, ificmpneCtx), + ificmpne.isSame(ificmpneCtx, ifeqCtx) + ); + + // check that both frames jump the same direction + + Frame ifeqBranchFrame = mock(Frame.class); + ifeqCtx.branch(ifeqBranchFrame); + + Frame ificmpneBranchFrame = mock(Frame.class); + ificmpneCtx.branch(ificmpneBranchFrame); + + // initially originalIfEqFrame.other == originalIfIcmpNeFrame.other + when(originalIfEqFrame.getOther()).thenReturn(originalIfIcmpNeFrame); + when(originalIfIcmpNeFrame.getOther()).thenReturn(originalIfEqFrame); + + ParallelExecutorMapping mapping = mock(ParallelExecutorMapping.class); + ifeq.map(mapping, ifeqCtx, ificmpneCtx); + + // verify that ifeqBranchFrame.other = ificmpneBranchFrame + ArgumentCaptor frameCapture = ArgumentCaptor.forClass(Frame.class); + verify(ifeqBranchFrame).setOther(frameCapture.capture()); + assertEquals(ificmpneBranchFrame, frameCapture.getValue()); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/IfICmpEqTest.java b/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/IfICmpEqTest.java new file mode 100644 index 0000000000..b6eed89a94 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/IfICmpEqTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.attributes.code.instructions; + +import static net.runelite.asm.Type.INT; +import net.runelite.asm.attributes.code.InstructionType; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.execution.Frame; +import net.runelite.asm.execution.InstructionContext; +import net.runelite.asm.execution.Stack; +import net.runelite.asm.execution.StackContext; +import net.runelite.asm.execution.Value; +import net.runelite.asm.execution.Variables; +import static org.junit.Assert.assertTrue; +import org.junit.Test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class IfICmpEqTest +{ + + @Test + public void testIsSame() + { + Instructions ins = mock(Instructions.class); + Frame frame = mock(Frame.class); + Stack stack = new Stack(42); + + Variables variables = new Variables(42); + when(frame.getStack()).thenReturn(stack); + when(frame.getVariables()).thenReturn(variables); + + IfICmpEq ifeq = new IfICmpEq(ins, InstructionType.IF_ICMPEQ); + InstructionContext ifeqCtx = new InstructionContext(ifeq, frame); + ifeqCtx.pop(new StackContext(getConstantCtx(ins, 1), INT, new Value(1))); + ifeqCtx.pop(new StackContext(getConstantCtx(ins, 1), INT, new Value(1))); + + IfNe ifne = new IfNe(ins, InstructionType.IFNE); + InstructionContext ifneCtx = new InstructionContext(ifne, frame); + ifneCtx.pop(new StackContext(getConstantCtx(ins, 42), INT, new Value(42))); + + assertTrue(ifeq.isSame(ifeqCtx, ifneCtx)); + } + + private InstructionContext getConstantCtx(Instructions ins, int constant) + { + LDC ldc = new LDC(ins, constant); + InstructionContext pushConstantCtx = mock(InstructionContext.class); + when(pushConstantCtx.getInstruction()).thenReturn(ldc); + return pushConstantCtx; + } +} diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/IConstZero.java b/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/LCmpTest.java similarity index 64% rename from deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/IConstZero.java rename to deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/LCmpTest.java index 9740d43314..e6c3ef6faf 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/IConstZero.java +++ b/deobfuscator/src/test/java/net/runelite/asm/attributes/code/instructions/LCmpTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017, Adam + * Copyright (c) 2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,42 +22,45 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package net.runelite.asm.attributes.code.instructions; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.InstructionType; import net.runelite.asm.attributes.code.Instructions; import net.runelite.asm.execution.Frame; import net.runelite.asm.execution.InstructionContext; import net.runelite.asm.execution.Stack; -import net.runelite.asm.execution.StackContext; -import net.runelite.asm.execution.Value; +import net.runelite.asm.execution.Variables; +import org.junit.Assert; +import org.junit.Test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; -public class IConstZero extends Instruction +/** + * + * @author Adam + */ +public class LCmpTest { - public IConstZero(Instructions instructions, InstructionType type) + + @Test + public void testIsSame() { - super(instructions, type); + LCmp cmp = new LCmp(mock(Instructions.class), InstructionType.LCMP); + LCmp cmp2 = new LCmp(mock(Instructions.class), InstructionType.LCMP); + + Frame f1 = mock(Frame.class); + when(f1.getStack()).thenReturn(new Stack(42)); + when(f1.getVariables()).thenReturn(new Variables(42)); + + Frame f2 = mock(Frame.class); + when(f2.getStack()).thenReturn(new Stack(42)); + when(f2.getVariables()).thenReturn(new Variables(42)); + + InstructionContext ctx1 = new InstructionContext(cmp, f1); + InstructionContext ctx2 = new InstructionContext(cmp2, f2); + + boolean result = cmp.isSame(ctx1, ctx2); + Assert.assertTrue(result); } - public IConstZero(Instructions instructions) - { - super(instructions, InstructionType.ICONST_0); - } - - @Override - public InstructionContext execute(Frame frame) - { - InstructionContext ins = new InstructionContext(this, frame); - Stack stack = frame.getStack(); - - StackContext ctx = new StackContext(ins, Type.INT, new Value(0)); - stack.push(ctx); - - ins.push(ctx); - - return ins; - } } diff --git a/deobfuscator/src/test/java/net/runelite/asm/execution/ExecutionTest.java b/deobfuscator/src/test/java/net/runelite/asm/execution/ExecutionTest.java new file mode 100644 index 0000000000..ddc8c728f5 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/execution/ExecutionTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.execution; + +import java.io.File; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.util.JarUtil; +import org.junit.Rule; +import org.junit.Test; + +public class ExecutionTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Test + public void test() throws Exception + { + ClassGroup group1 = JarUtil.loadJar(new File(properties.getVanillaClient())); + Execution e = new Execution(group1); + e.populateInitialMethods(); + e.run(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/execution/ParallelMappingExecutorTest.java b/deobfuscator/src/test/java/net/runelite/asm/execution/ParallelMappingExecutorTest.java new file mode 100644 index 0000000000..ce56a0300c --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/execution/ParallelMappingExecutorTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.execution; + +import java.io.IOException; +import java.io.InputStream; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.asm.Method; +import net.runelite.deob.deobfuscators.mapping.MappingExecutorUtil; +import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping; +import org.junit.Assert; +import org.junit.Test; + +public class ParallelMappingExecutorTest +{ + @Test + public void testTableswitch() throws IOException + { + InputStream in = ParallelMappingExecutorTest.class.getResourceAsStream("tests/TableSwitch.class"); + Assert.assertNotNull(in); + + ClassGroup group = new ClassGroup(); + ClassFile cf = ClassUtil.loadClass(in); + group.addClass(cf); + + in = ParallelMappingExecutorTest.class.getResourceAsStream("tests/TableSwitch.class"); + Assert.assertNotNull(in); + + ClassGroup group2 = new ClassGroup(); + ClassFile cf2 = ClassUtil.loadClass(in); + group2.addClass(cf2); + + Method m1 = cf.findMethod("method"); + Method m2 = cf2.findMethod("method"); + + ParallelExecutorMapping map = MappingExecutorUtil.map(m1, m2); + Assert.assertEquals(cf2.findField("field2"), map.get(cf.findField("field2"))); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/execution/ParallellMappingExecutorTest.java b/deobfuscator/src/test/java/net/runelite/asm/execution/ParallellMappingExecutorTest.java new file mode 100644 index 0000000000..973e1578dc --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/execution/ParallellMappingExecutorTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.execution; + +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.asm.Method; +import net.runelite.deob.deobfuscators.mapping.MappingExecutorUtil; +import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping; +import org.junit.Assert; +import org.junit.Test; + +public class ParallellMappingExecutorTest +{ + @Test + public void testStaticStep() throws Exception + { + ClassFile cf1 = ClassUtil.loadClass(getClass().getResourceAsStream("mapper/StaticStepTest.class")); + ClassFile cf2 = ClassUtil.loadClass(getClass().getResourceAsStream("mapper/StaticStepTest.class")); + + ClassGroup group1 = new ClassGroup(); + ClassGroup group2 = new ClassGroup(); + + group1.addClass(cf1); + group2.addClass(cf2); + + group1.buildClassGraph(); + group1.lookup(); + + group2.buildClassGraph(); + group2.lookup(); + + Method m1 = cf1.findMethod("entry"); + Method m2 = cf2.findMethod("entry"); + + Method map1 = cf1.findMethod("map"), + map2 = cf2.findMethod("map"); + + Assert.assertNotNull(map1); + Assert.assertNotNull(map2); + + ParallelExecutorMapping map = MappingExecutorUtil.map(m1, m2); + Assert.assertEquals(map2, map.get(map1)); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/execution/mapper/StaticStepTest.java b/deobfuscator/src/test/java/net/runelite/asm/execution/mapper/StaticStepTest.java new file mode 100644 index 0000000000..95bb28fdde --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/execution/mapper/StaticStepTest.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.execution.mapper; + +public class StaticStepTest +{ + static void func2() + { + + } + + static void func1() + { + func2(); + } + + void map() + { + } + + static void entry() + { + func1(); + func1(); + new StaticStepTest().map(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/execution/tests/TableSwitch.java b/deobfuscator/src/test/java/net/runelite/asm/execution/tests/TableSwitch.java new file mode 100644 index 0000000000..b388cd5cd6 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/execution/tests/TableSwitch.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.execution.tests; + +public class TableSwitch +{ + public static int field1; + public static int field2; + public static int field3; + public static int field4; + + public static void method() + { + switch (field1) + { + case 0: + field2 = 2; + break; + case 1: + field3 = 3; + break; + case 2: + field4 = 4; + break; + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/signature/SignatureTest.java b/deobfuscator/src/test/java/net/runelite/asm/signature/SignatureTest.java new file mode 100644 index 0000000000..c1a6fddb08 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/signature/SignatureTest.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.asm.signature; + +import net.runelite.asm.Type; +import org.junit.Assert; +import org.junit.Test; + +public class SignatureTest +{ + @Test + public void test() + { + Signature signature = new Signature("f(Ljava/lang/String;II[Lch;[ILce;IIB)V"); + Type type = signature.getTypeOfArg(3); + Assert.assertTrue(type.isArray()); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/asm/visitors/ClassFileVisitorTest.java b/deobfuscator/src/test/java/net/runelite/asm/visitors/ClassFileVisitorTest.java new file mode 100644 index 0000000000..6c9ec91978 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/asm/visitors/ClassFileVisitorTest.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.asm.visitors; + +import java.io.File; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class ClassFileVisitorTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + @Test + public void test() throws Exception + { + ClassGroup group = JarUtil.loadJar(new File(properties.getVanillaClient())); + + JarUtil.saveJar(group, folder.newFile()); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/ClassGroupFactory.java b/deobfuscator/src/test/java/net/runelite/deob/ClassGroupFactory.java new file mode 100644 index 0000000000..3c2a5bebf9 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/ClassGroupFactory.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob; + +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.asm.signature.Signature; + +public class ClassGroupFactory +{ + private static void addVoidMethod(ClassFile cf, String name) + { + Method method = new Method(cf, name, new Signature("()V")); + method.setStatic(true); + cf.addMethod(method); + + Code code = new Code(method); + method.setCode(code); + + Instructions ins = code.getInstructions(); + ins.addInstruction(new VReturn(ins)); + } + + public static ClassGroup generateGroup() + { + ClassGroup group = new ClassGroup(); + + ClassFile cf = new ClassFile(group); + cf.setName("test"); + cf.setSuperName("java/lang/Object"); + group.addClass(cf); + + Field field = new Field(cf, "field", Type.INT); + field.setStatic(); + cf.addField(field); + + Method method = new Method(cf, "func", new Signature("()V")); + method.setStatic(true); + cf.addMethod(method); + + Code code = new Code(method); + method.setCode(code); + + { + method = new Method(cf, "func2", new Signature("(III)V")); + method.setStatic(true); + cf.addMethod(method); + + code = new Code(method); + method.setCode(code); + + Instructions ins = code.getInstructions(); + ins.addInstruction(new VReturn(ins)); + } + + addVoidMethod(cf, "void1"); + addVoidMethod(cf, "void2"); + addVoidMethod(cf, "void3"); + addVoidMethod(cf, "void4"); + + return group; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectile.java b/deobfuscator/src/test/java/net/runelite/deob/DeobTestProperties.java similarity index 63% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectile.java rename to deobfuscator/src/test/java/net/runelite/deob/DeobTestProperties.java index e8b4059a75..b5fd9370d1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectile.java +++ b/deobfuscator/src/test/java/net/runelite/deob/DeobTestProperties.java @@ -2,9 +2,6 @@ * Copyright (c) 2017, Adam * All rights reserved. * - * - * Modified by farhan1666 - * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * @@ -25,43 +22,42 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.aoewarnings; +package net.runelite.deob; -import java.time.Instant; -import api.coords.LocalPoint; +import java.io.InputStream; +import java.util.Properties; +import org.junit.rules.ExternalResource; -class AoeProjectile +public class DeobTestProperties extends ExternalResource { - private final Instant startTime; - private final LocalPoint targetPoint; - private final AoeProjectileInfo aoeProjectileInfo; - private final int projectileLifetime; + private String rsClient; + private int rsVersion; + private String vanillaClient; - AoeProjectile(Instant startTime, LocalPoint targetPoint, AoeProjectileInfo aoeProjectileInfo, int projectileLifetime) + @Override + protected void before() throws Throwable { - this.startTime = startTime; - this.targetPoint = targetPoint; - this.aoeProjectileInfo = aoeProjectileInfo; - this.projectileLifetime = projectileLifetime; + Properties properties = new Properties(); + InputStream resourceAsStream = getClass().getResourceAsStream("/deob-test.properties"); + properties.load(resourceAsStream); + + rsClient = (String) properties.get("rs.client"); + rsVersion = Integer.parseInt((String) properties.get("rs.version")); + vanillaClient = (String) properties.get("vanilla.client"); } - Instant getStartTime() + public String getRsClient() { - return startTime; + return rsClient; } - LocalPoint getTargetPoint() + public int getRsVersion() { - return targetPoint; + return rsVersion; } - AoeProjectileInfo getAoeProjectileInfo() + public String getVanillaClient() { - return aoeProjectileInfo; - } - - int getProjectileLifetime() - { - return projectileLifetime; + return vanillaClient; } } diff --git a/deobfuscator/src/test/java/net/runelite/deob/TemporyFolderLocation.java b/deobfuscator/src/test/java/net/runelite/deob/TemporyFolderLocation.java new file mode 100644 index 0000000000..13b495d38c --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/TemporyFolderLocation.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob; + +import java.io.File; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TemporyFolderLocation +{ + private static final Logger logger = LoggerFactory.getLogger(TemporyFolderLocation.class); + + static + { + File tmp = new File("d:/temp"); + if (tmp.exists() || tmp.mkdir()) + System.setProperty("java.io.tmpdir", "d:/temp"); + } + + public static TemporaryFolder getTemporaryFolder() + { + return new TemporaryFolder(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/clientver/ClientVersionTest.java b/deobfuscator/src/test/java/net/runelite/deob/clientver/ClientVersionTest.java new file mode 100644 index 0000000000..45d42f669b --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/clientver/ClientVersionTest.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.clientver; + +import java.io.File; +import java.io.IOException; +import net.runelite.deob.DeobTestProperties; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; + +public class ClientVersionTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Test + public void test() throws IOException + { + ClientVersion ver = new ClientVersion(new File(properties.getVanillaClient())); + Assert.assertEquals(properties.getRsVersion(), ver.getVersion()); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/CastNullTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/CastNullTest.java new file mode 100644 index 0000000000..be85e620b7 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/CastNullTest.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators; + +import java.util.Optional; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.InstructionType; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.AConstNull; +import net.runelite.asm.attributes.code.instructions.CheckCast; +import net.runelite.asm.attributes.code.instructions.IAdd; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.Return; +import net.runelite.deob.ClassGroupFactory; +import org.junit.Assert; +import org.junit.Test; + +public class CastNullTest +{ + @Test + public void testRun() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(3); + + CheckCast checkCast = new CheckCast(ins); + checkCast.setType(new Type("test")); + + Instruction[] instructions = + { + new LDC(ins, 2), + new AConstNull(ins), + checkCast, + new LDC(ins, 2), + new IAdd(ins), + new Return(ins, InstructionType.IRETURN) + }; + + for (Instruction i : instructions) + { + ins.addInstruction(i); + } + + Assert.assertEquals(6, ins.getInstructions().size()); + + CastNull lvt = new CastNull(); + lvt.run(group); + + Assert.assertEquals(5, ins.getInstructions().size()); + + Optional o = ins.getInstructions().stream().filter(i -> i instanceof CheckCast).findAny(); + Assert.assertFalse(o.isPresent()); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/EnumDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/EnumDeobfuscatorTest.java new file mode 100644 index 0000000000..e601721f10 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/EnumDeobfuscatorTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class EnumDeobfuscatorTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getRsClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() throws Exception + { + new EnumDeobfuscator().run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/FieldInlinerTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/FieldInlinerTest.java new file mode 100644 index 0000000000..873bc2fea8 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/FieldInlinerTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class FieldInlinerTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + FieldInliner fi = new FieldInliner(); + fi.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/IllegalStateExceptionsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/IllegalStateExceptionsTest.java new file mode 100644 index 0000000000..a377150da4 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/IllegalStateExceptionsTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class IllegalStateExceptionsTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + IllegalStateExceptions ise = new IllegalStateExceptions(); + ise.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/LvtTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/LvtTest.java new file mode 100644 index 0000000000..8d2ceab81d --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/LvtTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators; + +import net.runelite.asm.ClassGroup; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.AConstNull; +import net.runelite.asm.attributes.code.instructions.AStore; +import net.runelite.asm.attributes.code.instructions.IStore; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.LStore; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.deob.ClassGroupFactory; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LvtTest +{ + private static final Logger logger = LoggerFactory.getLogger(LvtTest.class); + + @Test + public void testReuseIndex() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + Instruction body[] = + { + // var0 = null + new AConstNull(ins), + new AStore(ins, 0), + // var0 = 0 + // this forces a reindex to varn + new LDC(ins, 0), + new IStore(ins, 0), + // var2 = null + new AConstNull(ins), + new AStore(ins, 2), + // var2 = 0 + // this forces a reindex to varn+1 + new LDC(ins, 0), + new IStore(ins, 2), + //var0 = 0L + new LDC(ins, 0L), + new LStore(ins, 0), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Lvt lvt = new Lvt(); + lvt.run(group); + + AStore astore1 = (AStore) body[1]; + IStore istore1 = (IStore) body[3]; + AStore astore2 = (AStore) body[5]; + IStore istore2 = (IStore) body[7]; + LStore lstore1 = (LStore) body[9]; + + int astore1Idx = astore1.getVariableIndex(); + int istore1Idx = istore1.getVariableIndex(); + int astore2Idx = astore2.getVariableIndex(); + int istore2Idx = istore2.getVariableIndex(); + int lstore1Idx = lstore1.getVariableIndex(); + + logger.debug("{} -> {}", astore1, astore1.getVariableIndex()); + logger.debug("{} -> {}", istore1, istore1.getVariableIndex()); + logger.debug("{} -> {}", astore2, astore2.getVariableIndex()); + logger.debug("{} -> {}", istore2, istore2.getVariableIndex()); + logger.debug("{} -> {}", lstore1, lstore1.getVariableIndex()); + + Assert.assertNotEquals(astore1Idx, istore1Idx); + Assert.assertNotEquals(astore2Idx, istore2Idx); + + // assert that the lstore doesn't overwrite an existing index + Assert.assertNotEquals(lstore1Idx + 1, astore1Idx); + Assert.assertNotEquals(lstore1Idx + 1, istore1Idx); + Assert.assertNotEquals(lstore1Idx + 1, astore2Idx); + Assert.assertNotEquals(lstore1Idx + 1, istore2Idx); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/OrderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/OrderTest.java new file mode 100644 index 0000000000..99ea7e14f9 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/OrderTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class OrderTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() + { + Order order = new Order(); + order.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/PacketHandlerOrderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/PacketHandlerOrderTest.java new file mode 100644 index 0000000000..cbe09d27b1 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/PacketHandlerOrderTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class PacketHandlerOrderTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getRsClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() throws IOException + { + PacketHandlerOrder order = new PacketHandlerOrder(); + order.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RenameUniqueTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RenameUniqueTest.java new file mode 100644 index 0000000000..69d0ccb6a2 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RenameUniqueTest.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.instruction.types.InvokeInstruction; +import net.runelite.deob.Deob; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class RenameUniqueTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + RenameUnique renameUnique = new RenameUnique(); + renameUnique.run(group); + + checkRenamed(); + } + + private void checkRenamed() + { + for (ClassFile cf : group.getClasses()) + { + Assert.assertTrue(cf.getName().startsWith("class") || cf.getName().equals("client")); + + for (Field f : cf.getFields()) + { + // synthetic fields arent obfuscated + if (f.isSynthetic()) + continue; + + Assert.assertTrue(f.getName().startsWith("field")); + } + + for (Method m : cf.getMethods()) + { + Assert.assertTrue(m.getName().length() > 2); + + checkCode(m.getCode()); + } + } + } + + private void checkCode(Code code) + { + if (code == null) + return; + + for (Instruction i : code.getInstructions().getInstructions()) + { + if (!(i instanceof InvokeInstruction)) + continue; + + InvokeInstruction ii = (InvokeInstruction) i; + Assert.assertTrue(ii.getMethod().getName().length() > Deob.OBFUSCATED_NAME_MAX_LEN + || ii.getMethod().getClazz().getName().length() > Deob.OBFUSCATED_NAME_MAX_LEN); + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RuntimeExceptionsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RuntimeExceptionsTest.java new file mode 100644 index 0000000000..90dcf26624 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RuntimeExceptionsTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class RuntimeExceptionsTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + RuntimeExceptions re = new RuntimeExceptions(); + re.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnreachedCodeTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnreachedCodeTest.java new file mode 100644 index 0000000000..fe018ccca6 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnreachedCodeTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators; + +import java.io.IOException; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.code.Label; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class UnreachedCodeTest +{ + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + ClassFile cf = ClassUtil.loadClass(UnreachedCodeTest.class.getResourceAsStream("unreachedcode/UnreachableTest.class")); + Assert.assertNotNull(cf); + + group = new ClassGroup(); + group.addClass(cf); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() throws IOException + { + UnreachedCode uc = new UnreachedCode(); + uc.run(group); + + ClassFile cf = group.getClasses().get(0); + + Method method = cf.findMethod("entry"); + Assert.assertFalse(method.getCode().getExceptions().getExceptions().isEmpty()); + + method = cf.findMethod("method1Unused"); + Assert.assertNotNull(method); + Assert.assertFalse(method.getCode().getInstructions().getInstructions().stream().filter(i -> !(i instanceof Label)).findAny().isPresent()); + Assert.assertTrue(method.getCode().getExceptions().getExceptions().isEmpty()); + + // Method is now invalid, remove so jar can be saved + cf.removeMethod(method); + + // constructor now has no instructions + method = cf.findMethod(""); + Assert.assertNotNull(method); + Assert.assertFalse(method.getCode().getInstructions().getInstructions().stream().filter(i -> !(i instanceof Label)).findAny().isPresent()); + + // remove it too + cf.removeMethod(method); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedClassTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedClassTest.java new file mode 100644 index 0000000000..7944334633 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedClassTest.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators; + +import java.io.IOException; +import java.io.InputStream; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class UnusedClassTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = new ClassGroup(); + + load("EmptyInterface.class"); + load("ClassA.class"); + ClassFile emptyClass = load("EmptyClass.class"); + + emptyClass.removeMethod(emptyClass.findMethod("")); + } + + private ClassFile load(String name) throws IOException + { + InputStream in = UnusedClassTest.class.getResourceAsStream("unusedclass/" + name); + Assert.assertNotNull(in); + + ClassFile cf = ClassUtil.loadClass(in); + group.addClass(cf); + + return cf; + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + UnusedClass uc = new UnusedClass(); + uc.run(group); + + Assert.assertNotNull(group.findClass("net/runelite/deob/deobfuscators/unusedclass/ClassA")); + Assert.assertNull(group.findClass("net/runelite/deob/deobfuscators/unusedclass/EmptyClass")); + Assert.assertNotNull(group.findClass("net/runelite/deob/deobfuscators/unusedclass/EmptyInterface")); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedFieldsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedFieldsTest.java new file mode 100644 index 0000000000..58a92d69ba --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedFieldsTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class UnusedFieldsTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + UnusedFields uf = new UnusedFields(); + uf.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedMethodsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedMethodsTest.java new file mode 100644 index 0000000000..d76e5a929b --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedMethodsTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class UnusedMethodsTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + UnusedMethods um = new UnusedMethods(); + um.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedParametersTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedParametersTest.java new file mode 100644 index 0000000000..12f2113dca --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedParametersTest.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class UnusedParametersTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + public void testRun() + { + RenameUnique r = new RenameUnique(); + r.run(group); + r = null; + System.gc(); + + RuntimeExceptions re = new RuntimeExceptions(); + re.run(group); + re = null; + System.gc(); + + UnreachedCode uc = new UnreachedCode(); + uc.run(group); + uc = null; + System.gc(); + + UnusedMethods um = new UnusedMethods(); + um.run(group); + um = null; + System.gc(); + + IllegalStateExceptions ise = new IllegalStateExceptions(); + ise.run(group); + ise = null; + System.gc(); + + UnusedParameters cp = new UnusedParameters(); + cp.run(group); + cp = null; + System.gc(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/DupDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/DupDeobfuscatorTest.java new file mode 100644 index 0000000000..736d164e53 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/DupDeobfuscatorTest.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.arithmetic; + +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.AConstNull; +import net.runelite.asm.attributes.code.instructions.Dup; +import net.runelite.asm.attributes.code.instructions.Dup_X1; +import net.runelite.asm.attributes.code.instructions.GetField; +import net.runelite.asm.attributes.code.instructions.IAdd; +import net.runelite.asm.attributes.code.instructions.ILoad; +import net.runelite.asm.attributes.code.instructions.IMul; +import net.runelite.asm.attributes.code.instructions.IStore; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.Pop2; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.asm.execution.Execution; +import net.runelite.asm.pool.Class; +import net.runelite.asm.pool.Field; +import net.runelite.deob.ClassGroupFactory; +import net.runelite.deob.Deobfuscator; +import org.junit.Assert; +import org.junit.Test; + +public class DupDeobfuscatorTest +{ + @Test + public void test() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(5); + + Instruction[] prepareVariables = + { + new LDC(ins, 1), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 1129258489), + constant2 = new LDC(ins, -1692330935), + constant3 = new LDC(ins, 1641298955), + constant4 = new LDC(ins, 1043501435); + + Instruction body[] = + { + new AConstNull(ins), // this + new AConstNull(ins), // this + new ILoad(ins, 0), + constant1, + new IMul(ins), + new Dup_X1(ins), + constant2, + new IMul(ins), + new Pop2(ins), // putfield + + constant3, + new IMul(ins), + constant4, + new IMul(ins), + new Pop2(ins), // putfield + + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + assert constant3.getConstantAsInt() * constant4.getConstantAsInt() * constant1.getConstantAsInt() == 1; + + Deobfuscator d = new DupDeobfuscator(); + d.run(group); + + // assert the dup_x1 was removed + long dupCount = ins.getInstructions().stream() + .filter(i -> i instanceof Dup_X1) + .count(); + Assert.assertEquals(0, dupCount); + } + + //035 aload_0 // this + //036 dup // this this + //037 getfield class153/field2097 I // this I + //038 ldc 830083863 + //039 imul // this I + //040 ldc 830083863 + //041 iadd // this I + //042 dup_x1 // I this I + @Test + public void test2() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(3); + + Instruction body[] = + { + new AConstNull(ins), // this + new Dup(ins), // this this + new GetField(ins, new Field(new Class("test"), "field", Type.INT)), + new LDC(ins, 830083863), // this this I I + new IMul(ins), // this this I + new LDC(ins, 830083863), + new IAdd(ins), + new Dup_X1(ins), + new LDC(ins, 636900519), + new IMul(ins), // pops dup + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + Deobfuscator d = new DupDeobfuscator(); + d.run(group); + + // assert the dup wasn't duplicated + long dupCount = ins.getInstructions().stream() + .filter(i -> i instanceof Dup) + .count(); + Assert.assertEquals(1, dupCount); + + // assert the dup_x1 was removed + dupCount = ins.getInstructions().stream() + .filter(i -> i instanceof Dup_X1) + .count(); + Assert.assertEquals(0, dupCount); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/ModArithTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/ModArithTest.java new file mode 100644 index 0000000000..3b9a386d16 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/ModArithTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators.arithmetic; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class ModArithTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() + { + ModArith mod = new ModArith(); + mod.run(group); + + int last = -1, cur; + while ((cur = mod.runOnce()) > 0) + { + new MultiplicationDeobfuscator().run(group); + + new MultiplyOneDeobfuscator(true).run(group); + + new MultiplyZeroDeobfuscator().run(group); + + if (last == cur) + break; + + last = cur; + } + + mod.annotateEncryption(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplicationDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplicationDeobfuscatorTest.java new file mode 100644 index 0000000000..e98ee5f20a --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplicationDeobfuscatorTest.java @@ -0,0 +1,919 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.arithmetic; + +import net.runelite.asm.ClassGroup; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.Label; +import net.runelite.asm.attributes.code.instructions.AConstNull; +import net.runelite.asm.attributes.code.instructions.Dup2_X1; +import net.runelite.asm.attributes.code.instructions.Dup_X1; +import net.runelite.asm.attributes.code.instructions.Goto; +import net.runelite.asm.attributes.code.instructions.IAdd; +import net.runelite.asm.attributes.code.instructions.ILoad; +import net.runelite.asm.attributes.code.instructions.IMul; +import net.runelite.asm.attributes.code.instructions.IStore; +import net.runelite.asm.attributes.code.instructions.IfEq; +import net.runelite.asm.attributes.code.instructions.InvokeStatic; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.LLoad; +import net.runelite.asm.attributes.code.instructions.LMul; +import net.runelite.asm.attributes.code.instructions.LStore; +import net.runelite.asm.attributes.code.instructions.Pop; +import net.runelite.asm.attributes.code.instructions.Pop2; +import net.runelite.asm.attributes.code.instructions.SiPush; +import net.runelite.asm.attributes.code.instructions.Swap; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.asm.execution.Execution; +import net.runelite.deob.ClassGroupFactory; +import net.runelite.deob.Deobfuscator; +import org.junit.Assert; +import org.junit.Test; + +public class MultiplicationDeobfuscatorTest +{ + // aload 2 + // ldc_w 1587543155 + // iload 4 + // imul + // dup_x1 + // ldc_w -2130376517 + // imul + // putfield class2/field279 I + // ldc_w -67313687 + // imul + // putstatic class29/field949 I + @Test + public void test1() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(5); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 1587543155), + constant2 = new LDC(ins, -2130376517), + constant3 = new LDC(ins, -67313687); + + Instruction body[] = + { + new LDC(ins, 0), // for dup_x1 to place before this + constant1, + new ILoad(ins, 0), + new IMul(ins), + new Dup_X1(ins), + constant2, + new IMul(ins), + new Pop(ins), + new Pop(ins), + constant3, + new IMul(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + // check execution runs ok + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + assert constant1.getConstantAsInt() * constant3.getConstantAsInt() == -1_095_175_765; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + Assert.assertEquals(-1_095_175_765, constant3.getConstantAsInt()); + } + + // aload_0 + // dup + // getfield class118/field2201 I + // ldc_w -2079217519 + // imul + // ldc -2079217519 + // iadd + // dup_x1 + // ldc_w 561453169 + // imul + // putfield class118/field2201 I + // ldc 561453169 + // imul + @Test + public void test2() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(4); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, -2079217519), + constant2 = new LDC(ins, -2079217519), + constant3 = new LDC(ins, 561453169), + constant4 = new LDC(ins, 561453169); + + Instruction body[] = + { + new LDC(ins, 0), // for dup_x1 to place before this + new ILoad(ins, 0), + constant1, + new IMul(ins), + constant2, + new IAdd(ins), + new Dup_X1(ins), // result, 0, result + constant3, + new IMul(ins), + new Pop(ins), + new Pop(ins), + constant4, + new IMul(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant3.getConstantAsInt() == 1; + assert constant2.getConstantAsInt() * constant4.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + Assert.assertEquals(1, constant3.getConstantAsInt()); + Assert.assertEquals(1, constant4.getConstantAsInt()); + } + + @Test + public void test3() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0), + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 1381104939), + constant2 = new LDC(ins, 1381104939), + constant3 = new LDC(ins, 981643079), + constant4 = new LDC(ins, 1807370871), + constant5 = new LDC(ins, 981643079); + + Label label1 = new Label(ins); + + Instruction body[] = + { + constant4, + constant1, + new ILoad(ins, 0), + new IMul(ins), + new LDC(ins, 0), + new IfEq(ins, label1), + constant2, + new IMul(ins), + label1, + constant3, + new IMul(ins), + new IMul(ins), // constant4 + constant5, + new IMul(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant4.getConstantAsInt() * constant5.getConstantAsInt() == 1; + +// { +// Collection ctxs = e.getInstructonContexts(body[3]); +// assert ctxs.size() == 1; +// +// InstructionContext ictx = ctxs.iterator().next(); +// boolean onlyPath = MultiplicationDeobfuscator.isOnlyPath(e, ictx); +// Assert.assertFalse(onlyPath); +// } + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1381104939, constant1.getConstantAsInt()); + Assert.assertEquals(1381104939, constant2.getConstantAsInt()); + Assert.assertEquals(1, constant3.getConstantAsInt()); + Assert.assertEquals(1, constant4.getConstantAsInt()); + Assert.assertEquals(981643079, constant5.getConstantAsInt()); // assumes result is moved to the end here. + } + + @Test + public void test4() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0), + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 1807370871); + LDC constant2 = new LDC(ins, 981643079); + + Label label1 = new Label(ins); + + Instruction body[] = + { + new ILoad(ins, 0), + new LDC(ins, 2), + new IMul(ins), + new LDC(ins, 0), + new IfEq(ins, label1), + new Pop(ins), + new LDC(ins, 3), + label1, + constant1, + new IMul(ins), + constant2, + new IMul(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + } + + @Test + public void test5() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0), + new LDC(ins, 2), + new IStore(ins, 1) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, -2079217519), + constant2 = new LDC(ins, -2079217519), + constant3 = new LDC(ins, 561453169); + + Instruction body[] = + { + new ILoad(ins, 0), + constant1, + new IMul(ins), + new IStore(ins, 2), + new ILoad(ins, 2), + new ILoad(ins, 1), + constant2, + new IMul(ins), + new IAdd(ins), + constant3, + new IMul(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant3.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + Assert.assertEquals(1, constant3.getConstantAsInt()); + } + + @Test + public void test6() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0), + new LDC(ins, 2), + new IStore(ins, 1) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 575391417); + LDC constant2 = new LDC(ins, -497786999); + + Instruction body[] = + { + new ILoad(ins, 0), + new ILoad(ins, 1), + new Dup_X1(ins), + new Pop(ins), + new Pop(ins), + constant1, + new IMul(ins), + constant2, + new IMul(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + } + + @Test + public void test7() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0), + new LDC(ins, 2), + new IStore(ins, 1) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 2131037801), + constant2 = new LDC(ins, -1306959399), + constant3 = new LDC(ins, -1); + + Instruction body[] = + { + constant3, + constant1, + new IMul(ins), + constant2, + new IMul(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(-1, constant2.getConstantAsInt()); + Assert.assertEquals(1, constant3.getConstantAsInt()); + } + + @Test + public void test8() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, -1616202347); + LDC constant2 = new LDC(ins, 2747837); + + Label label1 = new Label(ins), + label2 = new Label(ins), + label3 = new Label(ins); + + Instruction body[] = + { + constant1, + constant2, + new IMul(ins), + new ILoad(ins, 0), + new LDC(ins, 42), + new IfEq(ins, label1), + new Goto(ins, label2), + label1, + new LDC(ins, -1), + new Goto(ins, label3), + label2, + new LDC(ins, 0), + new Goto(ins, label3), + label3, + new InvokeStatic(ins, group.findClass("test").findMethod("func2").getPoolMethod()), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + } + + // aload 0 + // aload 0 + // aload 1 + // invokevirtual class226/method4078()J + // ldc2_w -81013729583719545 + // lmul + // dup2_x1 + // ldc2_w -6236978337732675017 + // lmul + // putfield class227/field3204 J + // ldc2_w -6236978337732675017 + // lmul + // putfield class227/field3196 J + @Test + public void test9() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(3); + + Instruction[] prepareVariables = + { + new LDC(ins, 1L), + new LStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, -81013729583719545L), + constant2 = new LDC(ins, -6236978337732675017L), + constant3 = new LDC(ins, -6236978337732675017L); + + Instruction body[] = + { + new LDC(ins, 0), + new LLoad(ins, 0), + constant1, + new LMul(ins), + new Dup2_X1(ins), // lmul, 0, lmul + + constant2, + new LMul(ins), + new Pop(ins), + new Pop(ins), + constant3, + new LMul(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsLong() * constant2.getConstantAsLong() == 1L; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1L, constant1.getConstantAsLong()); + Assert.assertEquals(1L, constant2.getConstantAsLong()); + Assert.assertEquals(1L, constant3.getConstantAsLong()); + } + + @Test + public void test10() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(5); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, -1729723287); + LDC constant2 = new LDC(ins, -143176743); + + Instruction body[] = + { + new ILoad(ins, 0), + constant1, + new IMul(ins), + constant2, + new IMul(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + // check execution runs ok + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + } + + //020 aload_0 + //021 aload_0 + //022 iload_1 + //023 ldc 1129258489 + //024 imul + //025 dup_x1 + //026 ldc -1692330935 + //027 imul + //028 putfield class81/field1351 I + //029 ldc 1641298955 + //030 imul // this pops other side of dup_x1 + //031 ldc 1043501435 + //032 imul + //033 putfield class81/field1326 I + @Test + public void test11() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(5); + + Instruction[] prepareVariables = + { + new LDC(ins, 1), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 1129258489), + constant2 = new LDC(ins, -1692330935), + constant3 = new LDC(ins, 1641298955), + constant4 = new LDC(ins, 1043501435); + + Instruction body[] = + { + new AConstNull(ins), // this + new AConstNull(ins), // this + new ILoad(ins, 0), + constant1, + new IMul(ins), + new Dup_X1(ins), + constant2, + new IMul(ins), + new Pop2(ins), // putfield + + constant3, + new IMul(ins), + constant4, + new IMul(ins), + new Pop2(ins), // putfield + + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + assert constant3.getConstantAsInt() * constant4.getConstantAsInt() * constant1.getConstantAsInt() == 1; + ; + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + Assert.assertEquals(1, constant3.getConstantAsInt()); + Assert.assertEquals(1, constant4.getConstantAsInt()); + } + + //020 aload_0 + //021 aload_0 + //022 iload_1 + //023 ldc 1129258489 + //024 imul // this, this, mul + //025 swap // this, mul s, this + //026 iload_1 + //027 iconst_1 + //028 imul // this, mul s, this, mul + //029 iconst_1 + //030 imul + //031 putfield class81/field1351 I // this, mul + //032 iconst_1 + //033 imul + //034 ldc -1692330935 + //035 imul + //036 putfield class81/field1326 I + @Test + public void test12() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(5); + + Instruction[] prepareVariables = + { + new LDC(ins, 1), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + LDC constant1 = new LDC(ins, 1129258489); + LDC constant2 = new LDC(ins, -1692330935); + + Instruction body[] = + { + new AConstNull(ins), // this + new AConstNull(ins), // this + new ILoad(ins, 0), + constant1, + new IMul(ins), + new Swap(ins), // null, mul, null + + new ILoad(ins, 0), + new Pop2(ins), // putfield + + constant2, + new IMul(ins), + new Pop2(ins), // putfield + + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + } + + //sipush 512 + //ldc -688421113 + //imul + //ldc -585812297 + //imul + //putstatic class134/field2009 I + @Test + public void test13() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + LDC constant1 = new LDC(ins, -688421113); + LDC constant2 = new LDC(ins, -585812297); + + Instruction body[] = + { + new SiPush(ins, (short) 512), + constant1, + new IMul(ins), + constant2, + new IMul(ins), + + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + assert constant1.getConstantAsInt() * constant2.getConstantAsInt() == 1; + + Deobfuscator d = new MultiplicationDeobfuscator(); + d.run(group); + + Assert.assertEquals(1, constant1.getConstantAsInt()); + Assert.assertEquals(1, constant2.getConstantAsInt()); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyOneDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyOneDeobfuscatorTest.java new file mode 100644 index 0000000000..34f982d216 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyOneDeobfuscatorTest.java @@ -0,0 +1,254 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators.arithmetic; + +import net.runelite.asm.ClassGroup; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.Label; +import net.runelite.asm.attributes.code.instructions.Goto; +import net.runelite.asm.attributes.code.instructions.IDiv; +import net.runelite.asm.attributes.code.instructions.ILoad; +import net.runelite.asm.attributes.code.instructions.IMul; +import net.runelite.asm.attributes.code.instructions.IStore; +import net.runelite.asm.attributes.code.instructions.IfEq; +import net.runelite.asm.attributes.code.instructions.IfICmpEq; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.SiPush; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.asm.execution.Execution; +import net.runelite.deob.ClassGroupFactory; +import net.runelite.deob.Deobfuscator; +import org.junit.Assert; +import org.junit.Test; + +public class MultiplyOneDeobfuscatorTest +{ + @Test + public void testDir() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + ins.addInstruction(i); + + Label label = new Label(ins), + label2 = new Label(ins); + + LDC one = new LDC(ins, 1); + + Instruction body[] = + { + new SiPush(ins, (short) 256), + + new ILoad(ins, 0), + new IfEq(ins, label), + + new LDC(ins, 2), + new Goto(ins, label2), + + label, + one, + + label2, + new IMul(ins), + + new VReturn(ins) + }; + + for (Instruction i : body) + ins.addInstruction(i); + + // check execution runs ok + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + Deobfuscator d = new MultiplyOneDeobfuscator(false); + d.run(group); + + Assert.assertTrue(one.getInstructions() != null); + } + + @Test + public void test() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + ins.addInstruction(i); + + Label label = new Label(ins), + label2 = new Label(ins); + + LDC one = new LDC(ins, 1); + IMul mul = new IMul(ins); + + Instruction body[] = { + new SiPush(ins, (short) 256), + + new ILoad(ins, 0), + new IfEq(ins, label), + + label, + one, + + label2, + mul, + + new VReturn(ins) + }; + + for (Instruction i : body) + ins.addInstruction(i); + + // check execution runs ok + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + Deobfuscator d = new MultiplyOneDeobfuscator(false); + d.run(group); + + Assert.assertTrue(one.getInstructions() == null); + Assert.assertTrue(mul.getInstructions() == null); + } + + // iconst_1 + // iconst_m1 + // iload 5 + // if_icmpeq LABEL0x56d1 + // iload 5 + // iconst_1 + // if_icmpne LABEL0x56e8 + // goto LABEL0x56d1 + //LABEL0x56d1: + // getstatic class139/field2130 I + // ldc_w -1440517609 + // imul + // goto LABEL0x5708 + //LABEL0x56e8: + // getstatic class139/field2130 I + // ldc_w -1440517609 + // imul + // getstatic client/field377 I + // iadd + // iconst_2 + // idiv + //LABEL0x5708: + // imul + // putstatic client/field377 I + // + // client.field377 = 1 * (-1 != var5 && var5 != 1?(class139.field2130 + client.field377) / 2:class139.field2130); + @Test + public void test2() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = { + new LDC(ins, 3), + new IStore(ins, 0), + new LDC(ins, 2), + new IStore(ins, 1) + }; + + for (Instruction i : prepareVariables) + ins.addInstruction(i); + + Label label = new Label(ins), + label2 = new Label(ins), + label3 = new Label(ins); + + LDC one = new LDC(ins, 1); + IMul mul = new IMul(ins); + + Instruction body[] = { + one, + + new LDC(ins, -1), + new ILoad(ins, 0), + new IfICmpEq(ins, label), + + new Goto(ins, label2), + + label, + new ILoad(ins, 1), + new LDC(ins, -1440517609), + new IDiv(ins), + new Goto(ins, label3), + + label2, + new ILoad(ins, 1), + new LDC(ins, -1440517609), + new IDiv(ins), + + label3, + mul, + + new VReturn(ins) + }; + + for (Instruction i : body) + ins.addInstruction(i); + + // check execution runs ok + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + Deobfuscator d = new MultiplyOneDeobfuscator(false); + d.run(group); + + Assert.assertTrue(one.getInstructions() == null); + Assert.assertTrue(mul.getInstructions() == null); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyZeroDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyZeroDeobfuscatorTest.java new file mode 100644 index 0000000000..038276978c --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyZeroDeobfuscatorTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators.arithmetic; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class MultiplyZeroDeobfuscatorTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() + { + MultiplyZeroDeobfuscator m = new MultiplyZeroDeobfuscator(); + m.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/SimpleModArithTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/SimpleModArithTest.java new file mode 100644 index 0000000000..7f73117976 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/SimpleModArithTest.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.arithmetic; + +import java.io.IOException; +import java.io.InputStream; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.deob.Deobfuscator; +import org.junit.Assert; +import static org.junit.Assert.assertFalse; +import org.junit.Test; + +class TestClass +{ + private static int dummy(Object... args) + { + return 0; + } + + private int field1051 = -1611704481; + private int field2701; + private int field2138, field2130; + + public void test() + { + TestClass tc = new TestClass(); // to trick executor to call the constructor + int var = 42; + + if (-1 != this.field1051 * 1928543073) + { + dummy(this.field1051 * 1928543073); + this.field1051 = dummy() * 1611704481; + } + + if (field2701 * 1550405721 > 30000) + { + field2701 += -1868498967 * var; + } + + field2138 = tc.dummy() * 1510226873; + field2130 = 572701809 * tc.field2138; + if (-1722291303 * field2130 >= var) + { + var = field2130 * -1722291303; + } + } +} + +class TestClass2 +{ + int field2863; + int array[]; + + public void test() + { + TestClass2 tc = new TestClass2(); + + field2863 = -1446933277; + + array[378529589 * tc.field2863] = 1; + + int var = 32; + + tc.field2863 = var * 1446933277; + + array[378529589 * tc.field2863] = 1; + } +} + +public class SimpleModArithTest +{ + static boolean isBig(int val) + { + if ((val & 0x80000000) != 0) + { + val = ~val + 1; + } + return (val & 0x7ff00000) != 0; + } + + private void checkConstants(ClassFile cf) + { + for (Method m : cf.getMethods()) + { + Code code = m.getCode(); + Instructions instructions = code.getInstructions(); + for (Instruction i : instructions.getInstructions()) + { + if (i instanceof LDC) + { + LDC ldc = (LDC) i; + Integer value = (Integer) ldc.getConstantAsInt(); + assertFalse(isBig(value)); + } + } + } + } + + @Test + public void test() throws IOException + { + InputStream in = this.getClass().getClassLoader().getResourceAsStream("net/runelite/deob/deobfuscators/arithmetic/TestClass.class"); + Assert.assertNotNull(in); + + ClassGroup group = new ClassGroup(); + + ClassFile cf = ClassUtil.loadClass(in); + group.addClass(cf); + + ModArith d1 = new ModArith(); + d1.run(group); + d1.runOnce(); + + Deobfuscator d2 = new MultiplicationDeobfuscator(); + d2.run(group); + + this.checkConstants(cf); + } + + @Test + public void test2() throws IOException + { + InputStream in = this.getClass().getClassLoader().getResourceAsStream("net/runelite/deob/deobfuscators/arithmetic/TestClass2.class"); + Assert.assertNotNull(in); + + ClassGroup group = new ClassGroup(); + + ClassFile cf = ClassUtil.loadClass(in); + group.addClass(cf); + + ModArith d1 = new ModArith(); + d1.run(group); + d1.runOnce(); + + Deobfuscator d2 = new MultiplicationDeobfuscator(); + d2.run(group); + + Encryption e = d1.getEncryption(); + + Pair pair = e.getField(cf.findField("field2863").getPoolField()); + + Assert.assertEquals(378529589, (int) pair.getter); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/cfg/ControlFlowDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/cfg/ControlFlowDeobfuscatorTest.java new file mode 100644 index 0000000000..0b79273ff0 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/cfg/ControlFlowDeobfuscatorTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.cfg; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class ControlFlowDeobfuscatorTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() throws Exception + { + new ControlFlowDeobfuscator().run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/constparam/ConstantParameterTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/constparam/ConstantParameterTest.java new file mode 100644 index 0000000000..e2b5d6f7a4 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/constparam/ConstantParameterTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.constparam; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class ConstantParameterTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() + { + ConstantParameter cp = new ConstantParameter(); + cp.run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/exprargorder/ExprArgOrderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/exprargorder/ExprArgOrderTest.java new file mode 100644 index 0000000000..c3909bbffa --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/exprargorder/ExprArgOrderTest.java @@ -0,0 +1,389 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.exprargorder; + +import java.util.List; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import static net.runelite.asm.attributes.code.InstructionType.IADD; +import static net.runelite.asm.attributes.code.InstructionType.IAND; +import static net.runelite.asm.attributes.code.InstructionType.IF_ICMPEQ; +import static net.runelite.asm.attributes.code.InstructionType.ILOAD; +import static net.runelite.asm.attributes.code.InstructionType.LDC; +import static net.runelite.asm.attributes.code.InstructionType.SIPUSH; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.Label; +import net.runelite.asm.attributes.code.instructions.IAdd; +import net.runelite.asm.attributes.code.instructions.IAnd; +import net.runelite.asm.attributes.code.instructions.ILoad; +import net.runelite.asm.attributes.code.instructions.IMul; +import net.runelite.asm.attributes.code.instructions.IStore; +import net.runelite.asm.attributes.code.instructions.IfICmpEq; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.Pop; +import net.runelite.asm.attributes.code.instructions.SiPush; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.deob.ClassGroupFactory; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class ExprArgOrderTest +{ + @Test + public void test() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + Instruction body[] = + { + // 3 + var0 -> var0 + 3 + new LDC(ins, 3), // 2 + new ILoad(ins, 0), + new IAdd(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + ExprArgOrder exprArgOrder = new ExprArgOrder(); + exprArgOrder.run(group); + + List instructions = ins.getInstructions(); + + assertEquals(ILOAD, instructions.get(2).getType()); + assertEquals(LDC, instructions.get(3).getType()); + assertEquals(IADD, instructions.get(4).getType()); + } + + @Test + public void test2() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + Instruction body[] = + { + // var0 + 3 -> var0 + 3 + new ILoad(ins, 0), // 2 + new LDC(ins, 3), + new IAdd(ins), + new Pop(ins), + // (3 + var0) + 512 -> (var0 + 3) + 512 + new LDC(ins, 3), // 6 + new ILoad(ins, 0), + new IAdd(ins), + new SiPush(ins, (short) 512), + new IAdd(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + ExprArgOrder exprArgOrder = new ExprArgOrder(); + exprArgOrder.run(group); + + List instructions = ins.getInstructions(); + + // ensure this stays the same + assertEquals(ILOAD, instructions.get(2).getType()); + assertEquals(LDC, instructions.get(3).getType()); + assertEquals(IADD, instructions.get(4).getType()); + + // + assertEquals(ILOAD, instructions.get(6).getType()); + assertEquals(SIPUSH, instructions.get(7).getType()); + assertEquals(IADD, instructions.get(8).getType()); + assertEquals(LDC, instructions.get(9).getType()); + assertEquals(IADD, instructions.get(10).getType()); + } + + @Test + public void test3() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + Instruction body[] = + { + // 512 + (3 + var1) -> var1 + 3 + 512 + new LDC(ins, 512), + new LDC(ins, 3), + new ILoad(ins, 0), + new IAdd(ins), + new IAdd(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + ExprArgOrder exprArgOrder = new ExprArgOrder(); + exprArgOrder.run(group); + + List instructions = ins.getInstructions(); + + // 2: iload + // 3: iconst 3 + // 4: iadd + // 5: ldc + // 6: add + assertEquals(IADD, instructions.get(4).getType()); + assertEquals(IADD, instructions.get(6).getType()); + } + + @Test + public void test4() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + Instruction body[] = + { + new SiPush(ins, (short) 600), + new ILoad(ins, 0), + new LDC(ins, 3), + new IMul(ins), + new IAdd(ins), + new Pop(ins), + new ILoad(ins, 0), + new LDC(ins, 3), + new IMul(ins), + new SiPush(ins, (short) 600), + new IAdd(ins), + new Pop(ins), + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + ExprArgOrder exprArgOrder = new ExprArgOrder(); + exprArgOrder.run(group); + + List instructions = ins.getInstructions(); + + for (int i = 2; i <= 7; ++i) + { + assertEquals(instructions.get(i).getType(), instructions.get(i + 6).getType()); + } + } + + @Test + public void test5() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + Label label = new Label(ins); + + Instruction body[] = + { + // if (0 == 3 + var0) -> if (var0 + 3 == 0) + new LDC(ins, 0), + new LDC(ins, 3), + new ILoad(ins, 0), + new IAdd(ins), + new IfICmpEq(ins, label), + label, + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + ExprArgOrder exprArgOrder = new ExprArgOrder(); + exprArgOrder.run(group); + + List instructions = ins.getInstructions(); + + // ldc iload add -> iload ldc iadd + assertEquals(ILOAD, instructions.get(2).getType()); + assertEquals(LDC, instructions.get(3).getType()); + assertEquals(IADD, instructions.get(4).getType()); + + // idc moves from 2 to 5 + assertEquals(LDC, instructions.get(5).getType()); + assertEquals(IF_ICMPEQ, instructions.get(6).getType()); + } + + @Test + public void test6() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = + { + new LDC(ins, 3), + new IStore(ins, 0) + }; + + for (Instruction i : prepareVariables) + { + ins.addInstruction(i); + } + + Label label = new Label(ins); + + /* + iconst_0 + ldc 8388608 + iload_3 + iadd + ldc -16777216 + iand + if_icmpeq LABEL0x49 + */ + Instruction body[] = + { + new LDC(ins, 0), + new LDC(ins, 8388608), + new ILoad(ins, 0), + new IAdd(ins), + new LDC(ins, -16777216), + new IAnd(ins), + new IfICmpEq(ins, label), // 8 + label, + new VReturn(ins) + }; + + for (Instruction i : body) + { + ins.addInstruction(i); + } + + ExprArgOrder exprArgOrder = new ExprArgOrder(); + exprArgOrder.run(group); + + List instructions = ins.getInstructions(); + + assertEquals(ILOAD, instructions.get(2).getType()); + assertEquals(LDC, instructions.get(3).getType()); + assertEquals(IADD, instructions.get(4).getType()); + + assertEquals(LDC, instructions.get(5).getType()); + assertEquals(IAND, instructions.get(6).getType()); + + assertEquals(LDC, instructions.get(7).getType()); + assertEquals(IF_ICMPEQ, instructions.get(8).getType()); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/mapping/MappingDumper.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/mapping/MappingDumper.java new file mode 100644 index 0000000000..d99b6967e1 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/mapping/MappingDumper.java @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.mapping; + +import java.io.File; +import java.io.IOException; +import java.time.Instant; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.Type; +import net.runelite.asm.signature.Signature; +import net.runelite.deob.DeobAnnotations; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.util.JarUtil; +import org.junit.Rule; +import org.junit.Test; + +public class MappingDumper +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Test + public void dump() throws IOException + { + ClassGroup group = JarUtil.loadJar(new File(properties.getRsClient())); + + final String GAP = "%-40s"; + int classes = 0, methods = 0, fields = 0; + + StringBuilder mBuilder = new StringBuilder(); + StringBuilder sBuilder = new StringBuilder(); + StringBuilder tmp; + + for (ClassFile cf : group.getClasses()) + { + String implName = DeobAnnotations.getImplements(cf); + String className = DeobAnnotations.getObfuscatedName(cf.getAnnotations()); + + if (implName != null) + { + mBuilder.append("\n").append(implName).append(" -> ").append(className).append("\n"); + ++classes; + } + + for (Field f : cf.getFields()) + { + String exportName = DeobAnnotations.getExportedName(f.getAnnotations()); + + if (exportName == null) + { + continue; + } + + ++fields; + + String fieldName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); + Type type = f.getType(); + Number getter = DeobAnnotations.getObfuscatedGetter(f); + + String fieldType = typeToString(type); + + if (f.isStatic()) + { + tmp = sBuilder; + } + + else + { + tmp = mBuilder; + } + + tmp.append("\t").append(String.format(GAP, fieldType)).append(String.format(GAP, exportName)) + .append(className).append(".").append(fieldName); + + if (getter != null) + { + tmp.append(" * ").append(getter).append("\n"); + } + + else + { + tmp.append("\n"); + } + } + + for (Method m : cf.getMethods()) + { + String exportName = DeobAnnotations.getExportedName(m.getAnnotations()); + + if (exportName == null) + { + continue; + } + + methods++; + + String methodName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); + Signature signature = DeobAnnotations.getObfuscatedSignature(m); + String garbageValue = DeobAnnotations.getObfuscatedValue(m); + + if (signature == null) + { + signature = m.getDescriptor(); + } + + String returnType = typeToString(m.getDescriptor().getReturnValue()); + String[] paramTypes = new String[signature.size()]; + for (int i = 0; i < paramTypes.length; i++) + { + paramTypes[i] = typeToString(signature.getTypeOfArg(i)); + } + + if (m.isStatic()) + { + tmp = sBuilder; + } + + else + { + tmp = mBuilder; + } + + tmp.append("\t").append(String.format(GAP, returnType)).append(String.format(GAP, exportName)) + .append(className).append(".").append(methodName); + + tmp.append("("); + for (int i = 0; i < paramTypes.length; i++) + { + tmp.append(paramTypes[i]); + + if (i == paramTypes.length - 1) + { + if (garbageValue != null) + { + tmp.append(" = ").append(garbageValue); + } + } + + else + { + tmp.append(", "); + } + } + tmp.append(")\n"); + } + } + + System.out.println("RuneLite http://github.com/runelite"); + System.out.println("Run " + Instant.now()); + System.out.println("Classes: " + classes + ", methods: " + methods + ", fields: " + fields); + System.out.println("Gamepack " + properties.getRsVersion()); + System.out.println(mBuilder.toString()); + System.out.println("Static ->"); + System.out.println(sBuilder.toString()); + } + + @Test + public void dumpJson() throws IOException + { + ClassGroup group = JarUtil.loadJar(new File(properties.getRsClient())); + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + JsonObject jObject = new JsonObject(); + JsonArray jFields = new JsonArray(); + JsonArray jMethods = new JsonArray(); + + for (ClassFile cf : group.getClasses()) + { + String implName = DeobAnnotations.getImplements(cf); + String className = DeobAnnotations.getObfuscatedName(cf.getAnnotations()); + + for (Field f : cf.getFields()) + { + String exportName = DeobAnnotations.getExportedName(f.getAnnotations()); + + if (exportName == null) + { + continue; + } + + String fieldName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); + Type obfType = DeobAnnotations.getObfuscatedType(f); + Number getter = DeobAnnotations.getObfuscatedGetter(f); + + JsonObject jField = new JsonObject(); + + jField.addProperty("name", exportName); + jField.addProperty("owner", f.isStatic() ? "" : implName); + jField.addProperty("class", className); + jField.addProperty("field", fieldName); + jField.addProperty("obfSignature", (obfType != null ? obfType.toString() : "")); + jField.addProperty("signature", f.getType().toString()); + jField.addProperty("multiplier", (getter != null ? getter : 0)); + jField.addProperty("static", f.isStatic()); + + jFields.add(jField); + } + + for (Method m : cf.getMethods()) + { + + String exportName = DeobAnnotations.getExportedName(m.getAnnotations()); + + if (exportName == null) + { + continue; + } + + String methodName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); + Signature obfSignature = DeobAnnotations.getObfuscatedSignature(m); + String predicate = DeobAnnotations.getObfuscatedValue(m); + + JsonObject jMethod = new JsonObject(); + + jMethod.addProperty("name", exportName); + jMethod.addProperty("owner", m.isStatic() ? "" : implName); + jMethod.addProperty("class", className); + jMethod.addProperty("field", methodName); + jMethod.addProperty("obfSignature", (obfSignature != null ? obfSignature.toString() : "")); + jMethod.addProperty("signature", m.getDescriptor().toString()); + jMethod.addProperty("predicate", (predicate != null ? predicate : "")); + jMethod.addProperty("static", m.isStatic()); + + jMethods.add(jMethod); + + } + } + + jObject.addProperty("runelite", "http://github.com/runelite"); + jObject.addProperty("run", Instant.now().toString()); + jObject.addProperty("gamepack", properties.getRsVersion()); + jObject.add("fields", jFields); + jObject.add("methods", jMethods); + + System.out.println(gson.toJson(jObject)); + } + + private static String typeToString(Type type) + { + String subType; + switch (type.toString()) + { + case "B": + subType = byte.class.getCanonicalName(); + break; + case "C": + subType = char.class.getCanonicalName(); + break; + case "I": + subType = int.class.getCanonicalName(); + break; + case "S": + subType = short.class.getCanonicalName(); + break; + case "Z": + subType = boolean.class.getCanonicalName(); + break; + case "D": + subType = double.class.getCanonicalName(); + break; + case "F": + subType = float.class.getCanonicalName(); + break; + case "J": + subType = long.class.getCanonicalName(); + break; + case "V": + subType = void.class.getCanonicalName(); + break; + default: + subType = type.getInternalName(); + break; + } + + if (type.isArray()) + { + for (int i = 0; i < type.getDimensions(); ++i) + { + subType += "[]"; + } + } + + return subType; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/menuaction/MenuActionDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/menuaction/MenuActionDeobfuscatorTest.java new file mode 100644 index 0000000000..04cac6d48b --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/menuaction/MenuActionDeobfuscatorTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.menuaction; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +public class MenuActionDeobfuscatorTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getRsClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() + { + new MenuActionDeobfuscator().run(group); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packethandler/PacketTypeFinderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packethandler/PacketTypeFinderTest.java new file mode 100644 index 0000000000..7d99526284 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packethandler/PacketTypeFinderTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.packethandler; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class PacketTypeFinderTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getRsClient())); + } + + @Test + @Ignore + public void testRun() throws IOException + { + PacketTypeFinder bf = new PacketTypeFinder(group); + bf.find(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packetwrite/PacketWriteDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packetwrite/PacketWriteDeobfuscatorTest.java new file mode 100644 index 0000000000..690994ec9b --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packetwrite/PacketWriteDeobfuscatorTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.packetwrite; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +public class PacketWriteDeobfuscatorTest +{ + + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getRsClient())); + group.removeClass(group.findClass("net/runelite/rs/Reflection")); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, folder.newFile()); + } + + @Test + @Ignore + public void testRun() throws IOException + { + PacketWriteDeobfuscator pw = new PacketWriteDeobfuscator(); + pw.run(group); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/ClientErrorTransformerTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/ClientErrorTransformerTest.java new file mode 100644 index 0000000000..e6652df964 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/ClientErrorTransformerTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.deobfuscators.transformers; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ClientErrorTransformerTest +{ + private static final Logger logger = LoggerFactory.getLogger(ClientErrorTransformerTest.class); + + private static final File GAMEPACK = new File("C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\127.2-SNAPSHOT\\rs-client-127.2-SNAPSHOT.jar"); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(GAMEPACK); + } + + @After + public void after() throws IOException + { + File out = folder.newFile(); + + JarUtil.saveJar(group, out); + + logger.info("Wrote to {}", out); + } + + //@Test + public void testRun() + { + ClientErrorTransformer e = new ClientErrorTransformer(); + e.transform(group); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/BufferFinderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/BufferFinderTest.java new file mode 100644 index 0000000000..b15af465e1 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/BufferFinderTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.transformers.buffer; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class BufferFinderTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getRsClient())); + } + + @Test + @Ignore + public void testRun() throws IOException + { + BufferFinder bf = new BufferFinder(group); + bf.find(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/RuneliteBufferTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/RuneliteBufferTest.java new file mode 100644 index 0000000000..0b7f0ea61e --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/RuneliteBufferTest.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.transformers.buffer; + +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author Adam + */ +public class RuneliteBufferTest +{ + @Test + public void testRuneliteFinishPacket() + { + RuneliteBuffer buffer = new RuneliteBuffer(); + byte[] b = new byte[7]; + + buffer.setPayload(b); + buffer.runeliteWriteByte((byte) 0); + buffer.runeliteInitPacket(); + buffer.runeliteWriteInt(42); + assertEquals(0, b[2]); // non finished lenghts are 0 initialized + buffer.runeliteFinishPacket(); + + assertEquals(7, b.length); + assertEquals(0, b[0]); + + assertEquals(0, b[1]); + assertEquals(4, b[2]); + + assertEquals(0, b[3]); + assertEquals(0, b[4]); + assertEquals(0, b[5]); + assertEquals(42, b[6]); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unreachedcode/UnreachableTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unreachedcode/UnreachableTest.java new file mode 100644 index 0000000000..6551b58438 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unreachedcode/UnreachableTest.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.unreachedcode; + +public class UnreachableTest +{ + public UnreachableTest() + { + } + + public void entry() + { + try + { + System.out.println("used"); + } + catch (Exception ex) + { + System.out.println("should be hit"); + } + } + + public void method1Unused() + { + try + { + System.out.println("unused"); + } + catch (Exception ex) + { + System.out.println("oh no, an exception"); + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/ClassA.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/ClassA.java new file mode 100644 index 0000000000..8fc065b405 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/ClassA.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.unusedclass; + +public class ClassA implements EmptyInterface +{ + public void run() + { + System.out.append("code!"); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/EmptyClass.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/EmptyClass.java new file mode 100644 index 0000000000..371b55daf9 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/EmptyClass.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.unusedclass; + +public class EmptyClass +{ + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/EmptyInterface.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/EmptyInterface.java new file mode 100644 index 0000000000..ffcb0a3188 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/unusedclass/EmptyInterface.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.deobfuscators.unusedclass; + +public interface EmptyInterface +{ + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/injection/TestingClassLoader.java b/deobfuscator/src/test/java/net/runelite/deob/injection/TestingClassLoader.java new file mode 100644 index 0000000000..c4b84600ba --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/injection/TestingClassLoader.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.injection; + +import java.util.HashMap; +import java.util.Map; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.util.JarUtil; + +public class TestingClassLoader extends ClassLoader +{ + private ClassGroup group; + private Map> classes = new HashMap<>(); + + public TestingClassLoader(ClassGroup group) + { + this.group = group; + } + + @Override + public Class findClass(String name) throws ClassNotFoundException + { + ClassFile cf = group.findClass(name); + if (cf == null) + { + return super.findClass(name); + } + + Class c = classes.get(name); + if (c != null) + { + return c; + } + + byte[] clazz = JarUtil.writeClass(group, cf); + return defineClass(name, clazz); + } + + private Class defineClass(String name, byte[] b) + { + Class c = super.defineClass(name.replace('/', '.'), b, 0, b.length); + classes.put(name, c); + return c; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java new file mode 100644 index 0000000000..fe137ec096 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java @@ -0,0 +1,75 @@ +package net.runelite.deob.updater; + +import java.io.File; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Annotations; +import net.runelite.deob.Deob; +import net.runelite.deob.DeobAnnotations; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.util.JarUtil; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Rule; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AnnotationCleaner +{ + private final Logger log = LoggerFactory.getLogger(AnnotationCleaner.class); + + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Test + public void checkMappings() throws Exception + { + File client = new File(properties.getRsClient()); + ClassGroup group = JarUtil.loadJar(client); + + for (ClassFile c : group.getClasses()) + { + if (c.getName().contains("runelite")) + { + continue; + } + + log.debug("Checking {}", c.toString()); + + for (Field f : c.getFields()) + { + Annotations an = f.getAnnotations(); + + String fieldName = f.getName(); + String exportedName = DeobAnnotations.getExportedName(an); + + if (exportedName == null) + { + assertTrue("Field " + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.contains("$")); + continue; + } + + assertEquals("Field " + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName); + } + + for (Method m : c.getMethods()) + { + Annotations an = m.getAnnotations(); + + String fieldName = m.getName(); + String exportedName = DeobAnnotations.getExportedName(an); + + if (exportedName == null) + { + assertTrue("Method " + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.endsWith("init>") || fieldName.equals("values") || fieldName.equals("valueOf") || fieldName.startsWith("compareTo") || fieldName.equals("equals") || fieldName.equals("hashCode") || fieldName.equals("compare")); + continue; + } + + assertEquals("Method " + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName); + } + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCopierTest.java b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCopierTest.java new file mode 100644 index 0000000000..da8f3938d3 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCopierTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.updater; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Type; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; + +public class AnnotationCopierTest +{ + private static final Type EXPORT = new Type("Lnet/runelite/mapping/Export;"); + private static final Type IMPLEMENTS = new Type("Lnet/runelite/mapping/Implements;"); + private static final Type REPLACE = new Type("Lnet/runelite/mapping/Replace;"); + + private static final String JAR1 = "C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\116.2-SNAPSHOT\\in.jar", + JAR2 = "d:/rs/07/gamepack_116_deobfuscated.jar", + OUT = "d:/rs/07/adamout.jar"; + + private ClassGroup group1, group2; + + @Before + public void before() throws IOException + { + group1 = JarUtil.loadJar(new File(JAR1)); + group2 = JarUtil.loadJar(new File(JAR2)); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group2, new File(OUT)); + } + + //@Test + public void testCopy() + { + AnnotationCopier ac = new AnnotationCopier(group1, group2, EXPORT, IMPLEMENTS, REPLACE); + ac.copy(); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationRenamerTest.java b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationRenamerTest.java new file mode 100644 index 0000000000..b13f0754d3 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationRenamerTest.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.deob.updater; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; + +public class AnnotationRenamerTest +{ + private static final String JAR = "C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\120.2-SNAPSHOT\\rs-client-120.2-SNAPSHOT.jar", + OUT = "d:/rs/07/adamout.jar"; + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(JAR)); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, new File(OUT)); + } + + //@Test + public void testRename() + { + AnnotationRenamer ar = new AnnotationRenamer(group); + ar.run(); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/UpdateMappingsTest.java b/deobfuscator/src/test/java/net/runelite/deob/updater/UpdateMappingsTest.java new file mode 100644 index 0000000000..332e2e31b0 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/UpdateMappingsTest.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.deob.updater; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.deob.DeobAnnotations; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.deobfuscators.mapping.AnnotationIntegrityChecker; +import net.runelite.deob.deobfuscators.mapping.AnnotationMapper; +import net.runelite.deob.deobfuscators.mapping.Mapper; +import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping; +import net.runelite.deob.util.JarUtil; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UpdateMappingsTest +{ + private static final Logger logger = LoggerFactory.getLogger(UpdateMappingsTest.class); + + private static final String JAR = "d:/rs/07/gamepack_139_deobfuscated.jar", + OUT = "d:/rs/07/adamout.jar"; + + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Test + @Ignore + public void testManual() throws IOException + { + File client = new File(properties.getRsClient()); + + ClassGroup group1 = JarUtil.loadJar(client); + ClassGroup group2 = JarUtil.loadJar(new File(JAR)); + + map(group1, group2); + + JarUtil.saveJar(group2, new File(OUT)); + } + + @Test + @Ignore + public void testRun() throws IOException + { + File client = new File(properties.getRsClient()); + + ClassGroup group1 = JarUtil.loadJar(client); + ClassGroup group2 = JarUtil.loadJar(client); + + // Remove existing annotations + unannotate(group2); + + // Map the client against itself + map(group1, group2); + + check(group1, group2); + } + + private void unannotate(ClassGroup group) + { + for (ClassFile cf : group.getClasses()) + { + cf.getAnnotations().clearAnnotations(); + + for (Field f : cf.getFields()) + { + f.getAnnotations().clearAnnotations(); + } + + for (Method m : cf.getMethods()) + { + m.getAnnotations().clearAnnotations(); + } + } + } + + private void check(ClassGroup group1, ClassGroup group2) + { + for (ClassFile cf : group1.getClasses()) + { + ClassFile other = group2.findClass(cf.getName()); + + String implname = DeobAnnotations.getImplements(cf); + String otherimplname = DeobAnnotations.getImplements(other); + + Assert.assertEquals(implname, otherimplname); + + for (Field f : cf.getFields()) + { + Field otherf = other.findField(f.getName(), f.getType()); + + assert otherf != null : "unable to find " + f; + + String name = DeobAnnotations.getExportedName(f.getAnnotations()); + String otherName = DeobAnnotations.getExportedName(otherf.getAnnotations()); + + Assert.assertEquals(name + " <-> " + otherName, name, otherName); + } + + for (Method m : cf.getMethods()) + { + Method otherm = other.findMethod(m.getName(), m.getDescriptor()); + + assert otherm != null : "unable to find " + m; + + String name = DeobAnnotations.getExportedName(m.getAnnotations()); + String otherName = DeobAnnotations.getExportedName(otherm.getAnnotations()); + + Assert.assertEquals(name + " <-> " + otherName, name, otherName); + } + } + } + + private void map(ClassGroup group1, ClassGroup group2) + { + logger.info("Mapping group1 ({}) vs group2 ({})", desc(group1), desc(group2)); + + Mapper mapper = new Mapper(group1, group2); + mapper.run(); + ParallelExecutorMapping mapping = mapper.getMapping(); + + summary(mapping, group1); + + AnnotationMapper amapper = new AnnotationMapper(group1, group2, mapping); + amapper.run(); + + AnnotationIntegrityChecker aic = new AnnotationIntegrityChecker(group1, group2, mapping); + aic.run(); + + if (aic.getErrors() > 0) + { + Assert.fail("Errors in annotation integrity checker"); + } + + AnnotationRenamer an = new AnnotationRenamer(group2); + an.run(); + } + + private static String desc(ClassGroup cg) + { + int methods = 0, fields = 0, classes = 0; + for (ClassFile cf : cg.getClasses()) + { + ++classes; + methods += cf.getMethods().size(); + fields += cf.getFields().size(); + } + int total = methods + fields + classes; + return "total: " + total + ", " + methods + " methods, " + fields + " fields, " + classes + " classes"; + } + + public static void summary(ParallelExecutorMapping finalm, ClassGroup in) + { + int fields = 0, staticMethod = 0, method = 0, total = 0, classes = 0; + for (Map.Entry e : finalm.getMap().entrySet()) + { + Object o = e.getKey(); + if (o instanceof Field) + { + ++fields; + + Field f = (Field) o; + assert f.getClassFile().getGroup() == in; + } + else if (o instanceof Method) + { + Method m = (Method) o; + assert m.getClassFile().getGroup() == in; + + if (m.isStatic()) + { + ++staticMethod; + } + else + { + ++method; + } + } + else if (o instanceof ClassFile) + { + ++classes; + } + + ++total; + } + + logger.info("Total mapped: {}. {} fields, {} static methods, {} member methods, {} classes", + total, fields, staticMethod, method, classes); + } + +} diff --git a/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java b/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java new file mode 100644 index 0000000000..bf8e2bed2b --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java @@ -0,0 +1,331 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.osb; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Map; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Annotations; +import net.runelite.asm.attributes.annotation.Annotation; +import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.signature.Signature; +import net.runelite.deob.util.JarUtil; +import net.runelite.osb.inject.ClassHook; +import net.runelite.osb.inject.FieldHook; +import net.runelite.osb.inject.MethodHook; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +public class HookImporter +{ + private static final File IN = new File("C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\114.2-SNAPSHOT\\rs-client-114.2-SNAPSHOT.jar"); + private static final File OUT = new File("c:\\rs\\adamout.jar"); + + private static final Type OBFUSCATED_NAME = new Type("Lnet/runelite/mapping/ObfuscatedName;"); + private static final Type IMPLEMENTS = new Type("Lnet/runelite/mapping/Implements;"); + private static final Type EXPORT = new Type("Lnet/runelite/mapping/Export;"); + private static final Type OBFUSCATED_SIGNATURE = new Type("Lnet/runelite/mapping/ObfuscatedSignature;"); + + private Map hooks; + private ClassGroup group; + + @Before + public void before() throws IOException + { + InputStream is = HookImporter.class.getResourceAsStream("osbmappings-114.json"); + Assert.assertNotNull(is); + + Gson gson = new Gson(); + java.lang.reflect.Type type = new TypeToken>() + { + }.getType(); + hooks = gson.fromJson(new InputStreamReader(is), type); + + group = JarUtil.loadJar(IN); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, OUT); + } + + @Test + @Ignore + public void importHooks() + { + int classes = 0, fields = 0, methods = 0, callbacks = 0; + + for (String deobfuscatedClassName : hooks.keySet()) + { + ClassHook ch = hooks.get(deobfuscatedClassName); + ClassFile cf = this.findClassWithObfuscatedName(ch.getClazz()); + + assert cf != null; + + String implementsName = getAnnotation(cf.getAnnotations(), IMPLEMENTS); + if (implementsName.isEmpty()) + { + cf.getAnnotations().addAnnotation(IMPLEMENTS, "value", deobfuscatedClassName); + ++classes; + } + + for (String deobfuscatedFieldName : ch.getFields().keySet()) + { + FieldHook fh = ch.getFields().get(deobfuscatedFieldName); + + String[] s = fh.getField().split("\\."); + Field f; + + if (s.length == 2) + { + ClassFile cf2 = this.findClassWithObfuscatedName(s[0]); + assert cf2 != null; + + f = this.findFieldWithObfuscatedName(cf2, s[1]); + } + else if (s.length == 1) + { + f = this.findFieldWithObfuscatedName(cf, fh.getField()); + } + else + { + throw new RuntimeException(); + } + + assert f != null; + + String exportedName = getAnnotation(f.getAnnotations(), EXPORT); + if (exportedName.isEmpty()) + { + f.getAnnotations().addAnnotation(EXPORT, "value", deobfuscatedFieldName); + ++fields; + } + } + + for (String deobfuscatedMethodName : ch.getMethods().keySet()) + { + MethodHook mh = ch.getMethods().get(deobfuscatedMethodName); + + String[] s = mh.getMethod().split("\\."); + Method m; + + if (s.length == 2) + { + ClassFile cf2 = this.findClassWithObfuscatedName(s[0]); + assert cf2 != null; + + m = this.findMethodWithObfuscatedName(cf2, s[1], mh.getClientDesc()); + } + else if (s.length == 1) + { + m = this.findMethodWithObfuscatedName(cf, mh.getMethod(), mh.getClientDesc()); + } + else + { + throw new RuntimeException(); + } + + assert m != null; + + String exportedName = getAnnotation(m.getAnnotations(), EXPORT); + if (exportedName.isEmpty()) + { + m.getAnnotations().addAnnotation(EXPORT, "value", deobfuscatedMethodName); + ++methods; + } + } + + for (String deobfuscatedMethodName : ch.getCallbacks().keySet()) + { + MethodHook mh = ch.getCallbacks().get(deobfuscatedMethodName); + + String[] s = mh.getMethod().split("\\."); + Method m; + + if (s.length == 2) + { + ClassFile cf2 = this.findClassWithObfuscatedName(s[0]); + assert cf2 != null; + + m = this.findMethodWithObfuscatedName(cf2, s[1], mh.getClientDesc()); + } + else if (s.length == 1) + { + m = this.findMethodWithObfuscatedName(cf, mh.getMethod(), mh.getClientDesc()); + } + else + { + throw new RuntimeException(); + } + + assert m != null; + + String exportedName = getAnnotation(m.getAnnotations(), EXPORT); + if (exportedName.isEmpty()) + { + m.getAnnotations().addAnnotation(EXPORT, "value", deobfuscatedMethodName); + ++callbacks; + } + } + } + + System.out.println("Imported " + classes + " classes, " + fields + " fields, " + methods + " methods, " + callbacks + " callbacks"); + } + + private ClassFile findClassWithObfuscatedName(String name) + { + for (ClassFile c : group.getClasses()) + { + if (c.getName().equals(name)) + { + return c; + } + + Annotations an = c.getAnnotations(); + if (getAnnotation(an, OBFUSCATED_NAME).equals(name)) + { + return c; + } + } + return null; + } + + private Field findFieldWithObfuscatedName(ClassFile c, String name) + { + for (Field f : c.getFields()) + { + Annotations an = f.getAnnotations(); + if (getAnnotation(an, OBFUSCATED_NAME).equals(name)) + { + return f; + } + } + return null; + } + + private Method findMethodWithObfuscatedName(ClassFile c, String name, String signature) + { + Signature sig = new Signature(signature); + + for (Method m : c.getMethods()) + { + Annotations an = m.getAnnotations(); + if (getAnnotation(an, OBFUSCATED_NAME).equals(name)) + { + Signature methodSig = getObfuscatedMethodSignature(m); + + if (methodSig.equals(sig)) + { + return m; + } + else + { + methodSig.equals(sig); + getObfuscatedMethodSignature(m); + } + } + } + return null; + } + + private String getAnnotation(Annotations an, Type type) + { + if (an == null) + { + return ""; + } + + for (Annotation a : an.getAnnotations()) + { + if (a.getType().equals(type)) + { + for (Element e : a.getElements()) + { + String str = (String) e.getValue(); + return str; + } + } + } + + return ""; + } + + private Signature getObfuscatedMethodSignature(Method method) + { + String sig = getAnnotation(method.getAnnotations(), OBFUSCATED_SIGNATURE); + if (sig.isEmpty() == false) + { + return toObSignature(new Signature(sig)); // if it is annoted, use that + } + else + { + return toObSignature(method.getDescriptor()); + } + } + + private Type toObType(Type t) + { + if (t.isPrimitive()) + { + return t; + } + + if (!t.getInternalName().startsWith("class") && !t.getInternalName().equals("client")) + { + return t; + } + + ClassFile cf = group.findClass(t.getInternalName()); + assert cf != null; + + Annotations an = cf.getAnnotations(); + String obfuscatedName = an.find(OBFUSCATED_NAME).getElement().getString(); + return Type.getType("L" + obfuscatedName + ";", t.getDimensions()); + } + + private Signature toObSignature(Signature s) + { + Signature.Builder builder = new Signature.Builder() + .setReturnType(toObType(s.getReturnValue())); + for (Type t : s.getArguments()) + { + builder.addArgument(toObType(t)); + } + return builder.build(); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/osb/inject/ClassHook.java b/deobfuscator/src/test/java/net/runelite/osb/inject/ClassHook.java new file mode 100644 index 0000000000..c883de970a --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/osb/inject/ClassHook.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.osb.inject; + +import com.google.gson.annotations.SerializedName; +import java.util.HashMap; +import java.util.Map; + +public class ClassHook +{ + @SerializedName("class") + private String clazz; + private Map fields = new HashMap<>(); + private Map methods = new HashMap<>(); + private Map callbacks = new HashMap<>(); + + public String getClazz() + { + return clazz; + } + + public Map getFields() + { + return fields; + } + + public Map getMethods() + { + return methods; + } + + public Map getCallbacks() + { + return callbacks; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/osb/inject/FieldHook.java b/deobfuscator/src/test/java/net/runelite/osb/inject/FieldHook.java new file mode 100644 index 0000000000..746b9b66ed --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/osb/inject/FieldHook.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.osb.inject; + +public class FieldHook +{ + private String field; // obfuscated name + private Number multiplier; + + public String getField() + { + return field; + } + + public Number getMultiplier() + { + return multiplier; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/osb/inject/MethodHook.java b/deobfuscator/src/test/java/net/runelite/osb/inject/MethodHook.java new file mode 100644 index 0000000000..15b6e603fa --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/osb/inject/MethodHook.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.osb.inject; + +public class MethodHook +{ + private String method; // ob method name + private String desc; // deob desc + private String clientDesc; // ob desc + + public String getMethod() + { + return method; + } + + public String getDesc() + { + return desc; + } + + public String getClientDesc() + { + return clientDesc; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/CheckExports.java b/deobfuscator/src/test/java/net/runelite/runeloader/CheckExports.java new file mode 100644 index 0000000000..ef586d7c5c --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/CheckExports.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.runeloader; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; +import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.runeloader.inject.GetterInjectInstruction; +import net.runelite.runeloader.inject.Injection; +import net.runelite.runeloader.inject.InjectionModscript; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +public class CheckExports +{ + private static final File CLIENT = new File("/Users/adam/w/rs/07/rs-client-1.0-SNAPSHOT.jar"); + + private final List classes = new ArrayList<>(); + + @Before + public void before() throws MalformedURLException, ClassNotFoundException + { + ClassLoader loader = new URLClassLoader(new URL[]{CLIENT.toURL()}); + + Class c = loader.loadClass("net.runelite.rs.client.client"); + classes.add(c); + + for (int i = 0; i < 230; ++i) + { + try + { + c = loader.loadClass("net.runelite.rs.client.class" + i); + classes.add(c); + } + catch (ClassNotFoundException ex) + { + } + } + } + + private Class findClassWithObfuscatedName(String name) + { + for (Class c : classes) + { + if (c.getName().equals("net.runelite.rs.client.client") && name.equals("client")) + { + return c; + } + + ObfuscatedName oc = (ObfuscatedName) c.getDeclaredAnnotation(ObfuscatedName.class); + if (oc == null) + { + continue; + } + + if (oc.value().equals(name)) + { + return c; + } + } + return null; + } + + private Field findFieldWithObfuscatedName(Class c, String name) + { + for (Field f : c.getDeclaredFields()) + { + ObfuscatedName oc = f.getDeclaredAnnotation(ObfuscatedName.class); + if (oc == null) + { + continue; + } + + if (oc.value().equals(name)) + { + return f; + } + } + return null; + } + + private boolean isExported(Field f) + { + Export export = f.getDeclaredAnnotation(Export.class); + return export != null; + } + + @Test + @Ignore + public void checkMappings() throws IOException + { + InjectionModscript mod = Injection.load(MappingImporter.class.getResourceAsStream(MappingImporter.RL_INJECTION)); + + for (int i = 0; i < mod.getGetterInjects().size(); ++i) + { + GetterInjectInstruction gii = mod.getGetterInjects().get(i); + + Class c = this.findClassWithObfuscatedName(gii.getGetterClassName()); + Assert.assertNotNull(c); + + Field f = this.findFieldWithObfuscatedName(c, gii.getGetterFieldName()); + Assert.assertNotNull(f); + + Assert.assertTrue(this.isExported(f)); + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java b/deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java new file mode 100644 index 0000000000..691067db31 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.runeloader; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; +import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedGetter; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.runeloader.inject.GetterInjectInstruction; +import net.runelite.runeloader.inject.Injection; +import net.runelite.runeloader.inject.InjectionModscript; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +public class CheckMappings +{ + private static final File CLIENT = new File("d:/rs/07/adamout.jar"); + + private final List classes = new ArrayList<>(); + + @Before + public void before() throws MalformedURLException, ClassNotFoundException + { + ClassLoader loader = new URLClassLoader(new URL[]{CLIENT.toURL()}); + + Class c = loader.loadClass("client"); + classes.add(c); + + for (int i = 0; i < 230; ++i) + { + try + { + c = loader.loadClass("class" + i); + classes.add(c); + } + catch (ClassNotFoundException ex) + { + } + } + } + + private Class findClassWithObfuscatedName(String name) + { + for (Class c : classes) + { + if (c.getName().equals("net.runelite.rs.client.client") && name.equals("client")) + { + return c; + } + + ObfuscatedName oc = (ObfuscatedName) c.getDeclaredAnnotation(ObfuscatedName.class); + if (oc == null) + { + continue; + } + + if (oc.value().equals(name)) + { + return c; + } + } + return null; + } + + private Field findFieldWithObfuscatedName(Class c, String name) + { + for (Field f : c.getDeclaredFields()) + { + ObfuscatedName oc = f.getDeclaredAnnotation(ObfuscatedName.class); + if (oc == null) + { + continue; + } + + if (oc.value().equals(name)) + { + return f; + } + } + return null; + } + + private Integer getIntegerMultiplier(Field f) + { + ObfuscatedGetter getter = f.getDeclaredAnnotation(ObfuscatedGetter.class); + if (getter == null) + { + return null; + } + return getter.intValue() == 0 ? null : getter.intValue(); + } + + private String getExportedName(Field f) + { + Export e = f.getDeclaredAnnotation(Export.class); + if (e == null) + { + return null; + } + return e.value(); + } + + @Test + @Ignore + public void checkMappings() throws IOException + { + InjectionModscript mod = Injection.load(MappingImporter.class.getResourceAsStream(MappingImporter.RL_INJECTION)); + + for (int i = 0; i < mod.getGetterInjects().size(); ++i) + { + GetterInjectInstruction gii = mod.getGetterInjects().get(i); + + Class c = this.findClassWithObfuscatedName(gii.getGetterClassName()); + Assert.assertNotNull(c); + + Field f = this.findFieldWithObfuscatedName(c, gii.getGetterFieldName()); + Assert.assertNotNull(f); + + String exportedName = this.getExportedName(f); + String attrName = gii.getGetterName(); + attrName = Utils.toExportedName(attrName); + + Integer mul = gii.getMultiplier(), + myMul = this.getIntegerMultiplier(f); + + // XXX Check @Export etc names + + //Assert.assertEquals(exportedName, attrName); + Assert.assertEquals(myMul, mul); + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/MappingImporter.java b/deobfuscator/src/test/java/net/runelite/runeloader/MappingImporter.java new file mode 100644 index 0000000000..6e8cbd8c72 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/MappingImporter.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.runeloader; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Annotations; +import net.runelite.asm.attributes.annotation.Annotation; +import net.runelite.asm.attributes.annotation.Element; +import net.runelite.deob.util.JarUtil; +import net.runelite.runeloader.inject.AddInterfaceInstruction; +import net.runelite.runeloader.inject.GetterInjectInstruction; +import net.runelite.runeloader.inject.Injection; +import net.runelite.runeloader.inject.InjectionModscript; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MappingImporter +{ + private static final Logger logger = LoggerFactory.getLogger(MappingImporter.class); + + private static final File IN = new File("d:/rs/07/adamin.jar"); + private static final File OUT = new File("d:/rs/07/adamout.jar"); + + public static final String RL_INJECTION = "injection_130.json"; + + private static final Type OBFUSCATED_NAME = new Type("Lnet/runelite/mapping/ObfuscatedName;"); + private static final Type EXPORT = new Type("Lnet/runelite/mapping/Export;"); + private static final Type IMPLEMENTS = new Type("Lnet/runelite/mapping/Implements;"); + + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(IN); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(group, OUT); + } + + private boolean hasObfuscatedName(Annotations an, String name) + { + if (an == null) + { + return false; + } + + for (Annotation a : an.getAnnotations()) + { + if (a.getType().equals(OBFUSCATED_NAME)) + { + for (Element e : a.getElements()) + { + String str = (String) e.getValue(); + if (str.equals(name)) + { + return true; + } + } + } + } + + return false; + } + + private ClassFile findClassWithObfuscatedName(String name) + { + for (ClassFile c : group.getClasses()) + { + if (c.getName().equals(name)) + { + return c; + } + + Annotations an = c.getAnnotations(); + if (this.hasObfuscatedName(an, name)) + { + return c; + } + } + return null; + } + + private Field findFieldWithObfuscatedName(ClassFile c, String name) + { + for (Field f : c.getFields()) + { + Annotations an = f.getAnnotations(); + if (this.hasObfuscatedName(an, name)) + { + return f; + } + } + return null; + } + + @Test + @Ignore + public void makeMappings() throws IOException + { + InjectionModscript mod = Injection.load(MappingImporter.class.getResourceAsStream(RL_INJECTION)); + int fields = 0, classes = 0; + + for (int i = 0; i < mod.getGetterInjects().size(); ++i) + { + GetterInjectInstruction gii = mod.getGetterInjects().get(i); + + ClassFile cf = this.findClassWithObfuscatedName(gii.getGetterClassName()); + Assert.assertNotNull(cf); + + Field f = this.findFieldWithObfuscatedName(cf, gii.getGetterFieldName()); + if (f == null) + { + // some of their fields they inject getters for they also inject, + // so they don't all exist + continue; + } + + String attrName = gii.getGetterName(); + attrName = Utils.toExportedName(attrName); + + Annotations an = f.getAnnotations(); + + Annotation a = an.find(EXPORT); + if (a != null) + { + String exportedName = a.getElement().getString(); + + if (!attrName.equals(exportedName)) + { + logger.info("Exported field " + f + " with mismatched name. Theirs: " + attrName + ", mine: " + exportedName); + } + } + else + { + an.addAnnotation(EXPORT, "value", attrName); + + logger.info("Exporting field " + f + " with name " + attrName); + ++fields; + } + } + + for (AddInterfaceInstruction aii : mod.getAddInterfaceInjects()) + { + ClassFile cf = this.findClassWithObfuscatedName(aii.getClientClass()); + Assert.assertNotNull(cf); + + String iface = aii.getInterfaceClass(); + + iface = iface.replace("com/runeloader/api/bridge/os/accessor/", ""); + + Annotations an = cf.getAnnotations(); + + Annotation a = an.find(IMPLEMENTS); + if (a != null) + { + String implementsName = a.getElement().getString(); + + if (!iface.equals(implementsName)) + { + logger.info("Implements class " + cf + " with mismatched name. Theirs: " + iface + ", mine: " + implementsName); + } + } + else + { + an.addAnnotation(IMPLEMENTS, "value", iface); + + logger.info("Exporting class " + cf.getName() + " with name " + iface); + ++classes; + } + } + + logger.info("Added {} fields, {} classes", fields, classes); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/Utils.java b/deobfuscator/src/test/java/net/runelite/runeloader/Utils.java new file mode 100644 index 0000000000..b45df877cd --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/Utils.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.runeloader; + +public class Utils +{ + public static String toExportedName(String attrName) + { + if (attrName.startsWith("get")) + { + attrName = attrName.substring(3); + attrName = Character.toLowerCase(attrName.charAt(0)) + attrName.substring(1); + } + + if (attrName.equalsIgnoreCase("fps")) + { + attrName = "FPS"; + } + + return attrName; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddFieldInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddFieldInstruction.java new file mode 100644 index 0000000000..6a51715eba --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddFieldInstruction.java @@ -0,0 +1,17 @@ +package net.runelite.runeloader.inject; + +public class AddFieldInstruction +{ + public String owner; + public String name; + public String desc; + public int access; + + public AddFieldInstruction(String var1, String var2, String var3, int var4) + { + this.owner = var1; + this.name = var2; + this.desc = var3; + this.access = var4; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddInterfaceInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddInterfaceInstruction.java new file mode 100644 index 0000000000..72256683ce --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddInterfaceInstruction.java @@ -0,0 +1,23 @@ +package net.runelite.runeloader.inject; + +public class AddInterfaceInstruction +{ + private final String clientClass; + private final String interfaceClass; + + public AddInterfaceInstruction(String var1, String var2) + { + this.clientClass = var1; + this.interfaceClass = var2; + } + + public String getClientClass() + { + return this.clientClass; + } + + public String getInterfaceClass() + { + return this.interfaceClass; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddMethodInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddMethodInstruction.java new file mode 100644 index 0000000000..904d554a05 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/AddMethodInstruction.java @@ -0,0 +1,25 @@ +package net.runelite.runeloader.inject; + +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; + +public class AddMethodInstruction +{ + private final String clientClass; + private final String methodName; + private final String methodDesc; + private final AbstractInsnNode[] instructions; + + public AddMethodInstruction(String var1, String var2, String var3, AbstractInsnNode[] var4) + { + this.clientClass = var1; + this.methodName = var2; + this.methodDesc = var3; + this.instructions = var4; + } + + public boolean valid(ClassNode var1) + { + return var1.name.equalsIgnoreCase(this.clientClass); + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/GetterInjectInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/GetterInjectInstruction.java new file mode 100644 index 0000000000..3c4a094afd --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/GetterInjectInstruction.java @@ -0,0 +1,64 @@ +package net.runelite.runeloader.inject; + +public class GetterInjectInstruction +{ + private final String className; + private final String getterMethodDesc; + private final String getterName; + private final String getterClassName; + private final String getterFieldName; + private final Integer multiplier; + private final boolean staticField; + + public GetterInjectInstruction(String var1, String var2, String var3, String var4, String var5, Integer var6, boolean var7) + { + this.className = var1; + this.getterMethodDesc = "()" + var3; + this.getterName = var2; + this.getterClassName = var4; + this.getterFieldName = var5; + this.multiplier = var6; + this.staticField = var7; + } + + @Override + public String toString() + { + return "GetterInjectInstruction{" + "className=" + className + ", getterMethodDesc=" + getterMethodDesc + ", getterName=" + getterName + ", getterClassName=" + getterClassName + ", getterFieldName=" + getterFieldName + ", multiplier=" + multiplier + ", staticField=" + staticField + '}'; + } + + public String getClassName() + { + return this.className; + } + + public String getGetterMethodDesc() + { + return this.getterMethodDesc; + } + + public String getGetterName() + { + return this.getterName; + } + + public String getGetterClassName() + { + return this.getterClassName; + } + + public String getGetterFieldName() + { + return this.getterFieldName; + } + + public Integer getMultiplier() + { + return this.multiplier; + } + + public boolean isStaticField() + { + return this.staticField; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/Injection.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/Injection.java new file mode 100644 index 0000000000..3783bd5b02 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/Injection.java @@ -0,0 +1,19 @@ +package net.runelite.runeloader.inject; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.InputStream; +import java.io.InputStreamReader; +import org.objectweb.asm.tree.AbstractInsnNode; + +public class Injection +{ + private static final Gson decoder = (new GsonBuilder()).registerTypeAdapter(AbstractInsnNode.class, new InstructionDeserializer()).create(); + + public InjectionModscript resource; + + public static InjectionModscript load(InputStream in) + { + return decoder.fromJson(new InputStreamReader(in), Injection.class).resource; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/InjectionModscript.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/InjectionModscript.java new file mode 100644 index 0000000000..86df355845 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/InjectionModscript.java @@ -0,0 +1,62 @@ +package net.runelite.runeloader.inject; + +import java.util.LinkedList; +import java.util.List; + +public class InjectionModscript +{ + private int revision; + private List getterInjects = new LinkedList<>(); + private List superChangeInjects = new LinkedList(); + private List addInterfaceInjects = new LinkedList<>(); + private List methodMods = new LinkedList(); + private List addMethods = new LinkedList(); + private List instructionReplacements = new LinkedList(); + private List newMethodMods = new LinkedList(); + private List newFields = new LinkedList(); + + public int getRevision() + { + return revision; + } + + public List getGetterInjects() + { + return this.getterInjects; + } + + public List getSuperChangeInjects() + { + return this.superChangeInjects; + } + + public List getAddInterfaceInjects() + { + return this.addInterfaceInjects; + } + + public List getMethodMods() + { + return this.methodMods; + } + + public List getAddMethods() + { + return this.addMethods; + } + + public List getNewMethodMods() + { + return this.newMethodMods; + } + + public List getInstructionReplacements() + { + return this.instructionReplacements; + } + + public List getNewFields() + { + return this.newFields; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/InstructionDeserializer.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/InstructionDeserializer.java new file mode 100644 index 0000000000..7167204eee --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/InstructionDeserializer.java @@ -0,0 +1,82 @@ +package net.runelite.runeloader.inject; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.lang.reflect.Type; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.IntInsnNode; +import org.objectweb.asm.tree.LdcInsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.TypeInsnNode; +import org.objectweb.asm.tree.VarInsnNode; + +public class InstructionDeserializer implements JsonDeserializer +{ + @Override + public AbstractInsnNode deserialize(JsonElement var1, Type var2, JsonDeserializationContext var3) + { + JsonObject var4 = (JsonObject) var1; + int var5 = var4.get("opcode").getAsInt(); + if (var5 != 21 && var5 != 25 && var5 != 58 && var5 != 54 && var5 != 22 && var5 != 55) + { + String var7; + String var8; + String var10; + if (var5 != 184 && var5 != 182 && var5 != 183) + { + if (var5 == 18) + { + try + { + return new LdcInsnNode(Integer.valueOf(var4.get("cst").getAsInt())); + } + catch (Exception var9) + { + return new LdcInsnNode(var4.get("cst").getAsString()); + } + } + else if (var5 != 187 && var5 != 189) + { + if (var5 != 16 && var5 != 17) + { + if (var5 != 179 && var5 != 178 && var5 != 180 && var5 != 181) + { + return new InsnNode(var5); + } + else + { + var10 = var4.get("owner").getAsString(); + var7 = var4.get("name").getAsString(); + var8 = var4.get("desc").getAsString(); + return new FieldInsnNode(var5, var10, var7, var8); + } + } + else + { + return new IntInsnNode(var5, var4.get("operand").getAsInt()); + } + } + else + { + return new TypeInsnNode(var5, var4.get("desc").getAsString()); + } + } + else + { + var10 = var4.get("owner").getAsString(); + var7 = var4.get("name").getAsString(); + var8 = var4.get("desc").getAsString(); + return new MethodInsnNode(var5, var10, var7, var8); + } + } + else + { + int var6 = var4.get("var").getAsInt(); + return new VarInsnNode(var5, var6); + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/MethodModInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/MethodModInstruction.java new file mode 100644 index 0000000000..d80af979c4 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/MethodModInstruction.java @@ -0,0 +1,79 @@ +package net.runelite.runeloader.inject; + +import java.util.Iterator; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.MethodNode; + +public class MethodModInstruction +{ + private final int startIndex; + private final AbstractInsnNode[] nodes; + public final String owner; + public final String method; + public final String desc; + + public MethodModInstruction(int var1, AbstractInsnNode[] var2, String var3, String var4, String var5) + { + this.startIndex = var1; + this.nodes = var2; + this.owner = var3; + this.method = var4; + this.desc = var5; + } + + public boolean valid(ClassNode var1) + { + return var1.name.equalsIgnoreCase(this.owner); + } + + public void inject(ClassNode var1) + { + Iterator var3 = var1.methods.iterator(); + + while (true) + { + MethodNode var2; + do + { + do + { + if (!var3.hasNext()) + { + return; + } + + var2 = (MethodNode) var3.next(); + } while (!var2.name.equalsIgnoreCase(this.method)); + } while (!var2.desc.equalsIgnoreCase(this.desc)); + + InsnList var4 = var2.instructions; + + try + { + AbstractInsnNode var5 = var4.get(this.startIndex); + AbstractInsnNode var6 = null; + + for (int var7 = 0; var7 < this.nodes.length; ++var7) + { + if (var6 == null) + { + var4.insertBefore(var5, this.nodes[var7]); + } + else + { + var4.insert(var6, this.nodes[var7]); + } + + var6 = this.nodes[var7]; + } + } + catch (Exception var8) + { + System.err.println("Failed on " + this.startIndex + " @ " + this.owner + "." + this.method + " " + this.desc); + var8.printStackTrace(); + } + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/ReplaceNodeInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/ReplaceNodeInstruction.java new file mode 100644 index 0000000000..b672852c98 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/ReplaceNodeInstruction.java @@ -0,0 +1,21 @@ +package net.runelite.runeloader.inject; + +import org.objectweb.asm.tree.AbstractInsnNode; + +public class ReplaceNodeInstruction +{ + public final String owner; + public final String method; + public final String desc; + public final int index; + public final AbstractInsnNode replaceWith; + + public ReplaceNodeInstruction(String var1, String var2, String var3, int var4, AbstractInsnNode var5) + { + this.owner = var1; + this.method = var2; + this.desc = var3; + this.index = var4; + this.replaceWith = var5; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/SuperChangeInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/SuperChangeInstruction.java new file mode 100644 index 0000000000..fe2f540b32 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/SuperChangeInstruction.java @@ -0,0 +1,35 @@ +package net.runelite.runeloader.inject; + +import org.objectweb.asm.tree.ClassNode; + +public class SuperChangeInstruction +{ + private final String clientName; + private final String superName; + + public SuperChangeInstruction(String var1, String var2) + { + this.clientName = var1; + this.superName = var2; + } + + public String getClientName() + { + return this.clientName; + } + + public String getSuperName() + { + return this.superName; + } + + public boolean valid(ClassNode var1) + { + return var1.name.equalsIgnoreCase(this.clientName); + } + + public void inject(ClassNode var1) + { + var1.superName = this.superName; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/TableJumpInstruction$TableJump.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/TableJumpInstruction$TableJump.java new file mode 100644 index 0000000000..7f9dbc6d80 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/TableJumpInstruction$TableJump.java @@ -0,0 +1,18 @@ +package net.runelite.runeloader.inject; + +import org.objectweb.asm.Label; + +public class TableJumpInstruction$TableJump +{ + public Label label; + public final int instructionIndex; + public final int labelArrayIndex; + public final int opcode; + + public TableJumpInstruction$TableJump(int var1, int var2, int var3) + { + this.instructionIndex = var1; + this.opcode = var3; + this.labelArrayIndex = var2; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/inject/TableJumpInstruction.java b/deobfuscator/src/test/java/net/runelite/runeloader/inject/TableJumpInstruction.java new file mode 100644 index 0000000000..34a438c81f --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runeloader/inject/TableJumpInstruction.java @@ -0,0 +1,25 @@ +package net.runelite.runeloader.inject; + +import org.objectweb.asm.tree.AbstractInsnNode; + +public class TableJumpInstruction +{ + private final TableJumpInstruction$TableJump[] tableJumps; + private final int[] labels; + private final int start; + private final AbstractInsnNode[] instructions; + private final String owner; + private final String name; + private final String desc; + + public TableJumpInstruction(TableJumpInstruction$TableJump[] var1, AbstractInsnNode[] var2, int[] var3, int var4, String var5, String var6, String var7) + { + this.tableJumps = var1; + this.instructions = var2; + this.labels = var3; + this.owner = var5; + this.name = var6; + this.desc = var7; + this.start = var4; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runesuite/HookClass.java b/deobfuscator/src/test/java/net/runelite/runesuite/HookClass.java new file mode 100644 index 0000000000..5b7caf9d80 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runesuite/HookClass.java @@ -0,0 +1,14 @@ +package net.runelite.runesuite; + +import com.google.gson.annotations.SerializedName; +import java.util.List; + +public class HookClass +{ + @SerializedName("class") + String clazz; + String name; + int access; + List fields; + List methods; +} diff --git a/deobfuscator/src/test/java/net/runelite/runesuite/HookField.java b/deobfuscator/src/test/java/net/runelite/runesuite/HookField.java new file mode 100644 index 0000000000..c5219be785 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runesuite/HookField.java @@ -0,0 +1,15 @@ +package net.runelite.runesuite; + +public class HookField +{ + String field; + String owner; + String name; + int access; + + @Override + public String toString() + { + return "HookField{" + "field=" + field + ", owner=" + owner + ", name=" + name + '}'; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runesuite/HookImporter.java b/deobfuscator/src/test/java/net/runelite/runesuite/HookImporter.java new file mode 100644 index 0000000000..c4a7892a1f --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runesuite/HookImporter.java @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.runesuite; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Annotations; +import net.runelite.asm.attributes.annotation.Annotation; +import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.signature.Signature; +import net.runelite.asm.signature.util.VirtualMethods; +import static net.runelite.deob.DeobAnnotations.EXPORT; +import static net.runelite.deob.DeobAnnotations.IMPLEMENTS; +import static net.runelite.deob.DeobAnnotations.OBFUSCATED_NAME; +import static net.runelite.deob.DeobAnnotations.OBFUSCATED_SIGNATURE; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.deobfuscators.Renamer; +import net.runelite.deob.util.JarUtil; +import net.runelite.deob.util.NameMappings; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HookImporter +{ + private static final Logger logger = LoggerFactory.getLogger(HookImporter.class); + + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private List hooks; + private ClassGroup group; + + @Before + public void before() throws IOException + { + group = JarUtil.loadJar(new File(properties.getRsClient())); + + InputStream is = getClass().getResourceAsStream("hooks.json"); + Gson gson = new Gson(); + java.lang.reflect.Type type = new TypeToken>() + { + }.getType(); + hooks = gson.fromJson(new InputStreamReader(is), type); + } + + @After + public void after() throws IOException + { + File out = folder.newFile("client.jar"); + JarUtil.saveJar(group, out); + logger.info("Wrote to {}", out); + } + + @Test + @Ignore + public void importHooks() + { + int classes = 0, fields = 0, methods = 0, access = 0; + NameMappings mappings = new NameMappings(); + + for (HookClass hc : hooks) + { + + ClassFile cf = findClassWithObfuscatedName(hc.name); + + assert cf != null; + + if (cf.getAccess() != hc.access) + { + cf.setAccess(hc.access); + ++access; + } + + String implementsName = getAnnotation(cf.getAnnotations(), IMPLEMENTS); + if (implementsName.isEmpty()) + { + String deobfuscatedClassName = hc.clazz; + cf.getAnnotations().addAnnotation(IMPLEMENTS, "value", deobfuscatedClassName); + mappings.map(cf.getPoolClass(), deobfuscatedClassName); + ++classes; + } + + for (HookField fh : hc.fields) + { + ClassFile cf2 = findClassWithObfuscatedName(fh.owner); + assert cf2 != null; + + Field f = findFieldWithObfuscatedName(cf2, fh.name); + if (f == null) + { + continue; + } + + if (f.getAccessFlags() != fh.access) + { + f.setAccessFlags(fh.access); + ++access; + } + + String exportedName = getAnnotation(f.getAnnotations(), EXPORT); + if (exportedName.isEmpty()) + { + String deobfuscatedFieldName = fh.field; + + Field other = cf2.findField(deobfuscatedFieldName); + if (other != null) + { + logger.warn("Name collision for field {}", deobfuscatedFieldName); + continue; + } + + f.getAnnotations().addAnnotation(EXPORT, "value", deobfuscatedFieldName); + mappings.map(f.getPoolField(), deobfuscatedFieldName); + ++fields; + } + } + + outer: + for (HookMethod hm : hc.methods) + { + + ClassFile cf2 = findClassWithObfuscatedName(hm.owner); + assert cf2 != null; + + Method m = findMethodWithObfuscatedName(cf2, hm.name, hm.descriptor); + if (m == null) + { + logger.warn(hm.toString() + " is missing"); + continue; + } + + if (m.getAccessFlags() != hm.access) + { + m.setAccessFlags(hm.access); + ++access; + } + + // maybe only the base class method is exported + List virtualMethods = VirtualMethods.getVirtualMethods(m); + for (Method method : virtualMethods) + { + String exportedName = getAnnotation(method.getAnnotations(), EXPORT); + if (!exportedName.isEmpty()) + { + continue outer; + } + } + + String deobfuscatedMethodName = hm.method; + m.getAnnotations().addAnnotation(EXPORT, "value", deobfuscatedMethodName); + mappings.map(m.getPoolMethod(), deobfuscatedMethodName); + ++methods; + } + } + + Renamer renamer = new Renamer(mappings); + renamer.run(group); + + logger.info("Imported {} classes, {} fields, {} methods, {} access levels", classes, fields, methods, access); + } + + private ClassFile findClassWithObfuscatedName(String name) + { + for (ClassFile c : group.getClasses()) + { + if (c.getName().equals(name)) + { + return c; + } + + Annotations an = c.getAnnotations(); + if (getAnnotation(an, OBFUSCATED_NAME).equals(name)) + { + return c; + } + } + return null; + } + + private Field findFieldWithObfuscatedName(ClassFile c, String name) + { + for (Field f : c.getFields()) + { + Annotations an = f.getAnnotations(); + if (getAnnotation(an, OBFUSCATED_NAME).equals(name)) + { + return f; + } + } + return null; + } + + private Method findMethodWithObfuscatedName(ClassFile c, String name, String signature) + { + Signature sig = new Signature(signature); + + for (Method m : c.getMethods()) + { + Annotations an = m.getAnnotations(); + if (m.getName().equals(name) || getAnnotation(an, OBFUSCATED_NAME).equals(name)) + { + Signature methodSig = getObfuscatedMethodSignature(m); + + if (methodSig.equals(sig)) + { + return m; + } + } + } + return null; + } + + private String getAnnotation(Annotations an, Type type) + { + Annotation a = an.find(type); + if (a != null) + { + for (Element e : a.getElements()) + { + String str = (String) e.getValue(); + return str; + } + } + + return ""; + } + + private Signature getObfuscatedMethodSignature(Method method) + { + String sig = getAnnotation(method.getAnnotations(), OBFUSCATED_SIGNATURE); + if (sig.isEmpty() == false) + { + return new Signature(sig); // if it is annotated, use that + } + else + { + return method.getDescriptor(); + } + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runesuite/HookMethod.java b/deobfuscator/src/test/java/net/runelite/runesuite/HookMethod.java new file mode 100644 index 0000000000..849c0d01c7 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runesuite/HookMethod.java @@ -0,0 +1,19 @@ +package net.runelite.runesuite; + +public class HookMethod +{ + String method; + String owner; + String name; + int access; + String[] parameters; + String descriptor; + + @Override + public String toString() + { + return method + + owner + + name; + } +} diff --git a/deobfuscator/src/test/java/net/runelite/runesuite/hooks.json b/deobfuscator/src/test/java/net/runelite/runesuite/hooks.json new file mode 100644 index 0000000000..e36464b4e9 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/runesuite/hooks.json @@ -0,0 +1,32344 @@ +[ { + "class" : "UrlRequest", + "name" : "ey", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "isDone0", + "owner" : "ey", + "name" : "f", + "access" : 64, + "descriptor" : "Z" + }, { + "field" : "response0", + "owner" : "ey", + "name" : "q", + "access" : 64, + "descriptor" : "[B" + }, { + "field" : "url", + "owner" : "ey", + "name" : "m", + "access" : 16, + "descriptor" : "Ljava/net/URL;" + } ], + "methods" : [ { + "method" : "getResponse", + "owner" : "ey", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)[B" + }, { + "method" : "isDone", + "owner" : "ey", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/net/URL;)V" + } ] +}, { + "class" : "ClientParameter", + "name" : "ji", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "id", + "owner" : "ji", + "name" : "y", + "access" : 17, + "descriptor" : "Ljava/lang/String;" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/String;Ljava/lang/String;)V" + } ] +}, { + "class" : "Usernamed", + "name" : "ky", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "username", + "owner" : "ky", + "name" : "kr", + "access" : 1025, + "descriptor" : "(B)Lkp;" + } ], + "constructors" : [ ] +}, { + "class" : "WorldMapLabel", + "name" : "aj", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "height", + "owner" : "aj", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -85027761 + }, { + "field" : "size", + "owner" : "aj", + "name" : "w", + "access" : 0, + "descriptor" : "Ls;" + }, { + "field" : "text", + "owner" : "aj", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "width", + "owner" : "aj", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -471061617 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/String;IILs;)V" + } ] +}, { + "class" : "Canvas", + "name" : "ao", + "super" : "java.awt.Canvas", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "component", + "owner" : "ao", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/awt/Component;" + } ], + "methods" : [ { + "method" : "paint", + "owner" : "ao", + "name" : "paint", + "access" : 17, + "parameters" : [ "g" ], + "descriptor" : "(Ljava/awt/Graphics;)V" + }, { + "method" : "update", + "owner" : "ao", + "name" : "update", + "access" : 17, + "parameters" : [ "g" ], + "descriptor" : "(Ljava/awt/Graphics;)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/awt/Component;)V" + } ] +}, { + "class" : "SoundEnvelope", + "name" : "de", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "amplitude", + "owner" : "de", + "name" : "d", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "durations", + "owner" : "de", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "end", + "owner" : "de", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "form", + "owner" : "de", + "name" : "u", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "max", + "owner" : "de", + "name" : "k", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "phaseIndex", + "owner" : "de", + "name" : "l", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "phases", + "owner" : "de", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "segments", + "owner" : "de", + "name" : "m", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "start", + "owner" : "de", + "name" : "w", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "step", + "owner" : "de", + "name" : "e", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "ticks", + "owner" : "de", + "name" : "g", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "decode", + "owner" : "de", + "name" : "m", + "access" : 16, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;)V" + }, { + "method" : "decodeSegments", + "owner" : "de", + "name" : "f", + "access" : 16, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;)V" + }, { + "method" : "doStep", + "owner" : "de", + "name" : "w", + "access" : 16, + "parameters" : [ "n" ], + "descriptor" : "(I)I" + }, { + "method" : "reset", + "owner" : "de", + "name" : "q", + "access" : 16, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ServerPacket", + "name" : "ge", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "id", + "owner" : "ge", + "name" : "cu", + "access" : 17, + "descriptor" : "I", + "decoder" : 1117211673 + }, { + "field" : "length", + "owner" : "ge", + "name" : "cb", + "access" : 17, + "descriptor" : "I", + "decoder" : 947096829 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(II)V" + } ] +}, { + "class" : "ModelData0", + "name" : "ed", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "SecureRandomFuture", + "name" : "cn", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "executor", + "owner" : "cn", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/util/concurrent/ExecutorService;" + }, { + "field" : "future", + "owner" : "cn", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/util/concurrent/Future;" + } ], + "methods" : [ { + "method" : "get", + "owner" : "cn", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Ljava/security/SecureRandom;" + }, { + "method" : "isDone", + "owner" : "cn", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "shutdown", + "owner" : "cn", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Task", + "name" : "fm", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "intArgument", + "owner" : "fm", + "name" : "g", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "next", + "owner" : "fm", + "name" : "m", + "access" : 0, + "descriptor" : "Lfm;" + }, { + "field" : "objectArgument", + "owner" : "fm", + "name" : "l", + "access" : 0, + "descriptor" : "Ljava/lang/Object;" + }, { + "field" : "result", + "owner" : "fm", + "name" : "e", + "access" : 65, + "descriptor" : "Ljava/lang/Object;" + }, { + "field" : "status", + "owner" : "fm", + "name" : "o", + "access" : 65, + "descriptor" : "I" + }, { + "field" : "type", + "owner" : "fm", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1097728571 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Clock", + "name" : "fa", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "mark", + "owner" : "fa", + "name" : "m", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "wait", + "owner" : "fa", + "name" : "f", + "access" : 1025, + "parameters" : [ "cycleMs", "minSleepMs" ], + "descriptor" : "(III)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ServerBuild", + "name" : "iy", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "id", + "owner" : "iy", + "name" : "u", + "access" : 17, + "descriptor" : "I", + "decoder" : -947415971 + }, { + "field" : "name", + "owner" : "iy", + "name" : "o", + "access" : 17, + "descriptor" : "Ljava/lang/String;" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/String;I)V" + } ] +}, { + "class" : "Formatting", + "name" : "cy", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "Decimator", + "name" : "dp", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "inputRate", + "owner" : "dp", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1376358157 + }, { + "field" : "outputRate", + "owner" : "dp", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -876645877 + }, { + "field" : "table", + "owner" : "dp", + "name" : "u", + "access" : 0, + "descriptor" : "[[I" + } ], + "methods" : [ { + "method" : "resample", + "owner" : "dp", + "name" : "m", + "access" : 0, + "descriptor" : "([BI)[B" + }, { + "method" : "scalePosition", + "owner" : "dp", + "name" : "q", + "access" : 0, + "parameters" : [ "position" ], + "descriptor" : "(IB)I" + }, { + "method" : "scaleRate", + "owner" : "dp", + "name" : "f", + "access" : 0, + "parameters" : [ "rate" ], + "descriptor" : "(II)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(II)V" + } ] +}, { + "class" : "AbstractByteArrayCopier", + "name" : "gu", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "get", + "owner" : "gu", + "name" : "m", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "(I)[B" + }, { + "method" : "set", + "owner" : "gu", + "name" : "f", + "access" : 1024, + "parameters" : [ "array" ], + "descriptor" : "([BI)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Varcs", + "name" : "ch", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "intsPersistence", + "owner" : "ch", + "name" : "q", + "access" : 0, + "descriptor" : "[Z" + }, { + "field" : "lastWriteTimeMs", + "owner" : "ch", + "name" : "g", + "access" : 0, + "descriptor" : "J", + "decoder" : 4836824701467349417 + }, { + "field" : "map", + "owner" : "ch", + "name" : "w", + "access" : 0, + "descriptor" : "Ljava/util/Map;" + }, { + "field" : "strings", + "owner" : "ch", + "name" : "o", + "access" : 0, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "unwrittenChanges", + "owner" : "ch", + "name" : "u", + "access" : 0, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "clearTransient", + "owner" : "ch", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "getInt", + "owner" : "ch", + "name" : "f", + "access" : 0, + "parameters" : [ "index" ], + "descriptor" : "(IB)I" + }, { + "method" : "getPreferencesFile", + "owner" : "ch", + "name" : "l", + "access" : 0, + "descriptor" : "(ZB)Ldk;" + }, { + "method" : "getString", + "owner" : "ch", + "name" : "w", + "access" : 0, + "parameters" : [ "index" ], + "descriptor" : "(II)Ljava/lang/String;" + }, { + "method" : "getStringOld", + "owner" : "ch", + "name" : "u", + "access" : 0, + "parameters" : [ "index" ], + "descriptor" : "(IB)Ljava/lang/String;" + }, { + "method" : "hasUnwrittenChanges", + "owner" : "ch", + "name" : "a", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "read", + "owner" : "ch", + "name" : "x", + "access" : 0, + "descriptor" : "(I)V" + }, { + "method" : "setInt", + "owner" : "ch", + "name" : "m", + "access" : 0, + "parameters" : [ "index", "n" ], + "descriptor" : "(III)V" + }, { + "method" : "setString", + "owner" : "ch", + "name" : "q", + "access" : 0, + "parameters" : [ "index", "s" ], + "descriptor" : "(ILjava/lang/String;I)V" + }, { + "method" : "setStringOld", + "owner" : "ch", + "name" : "o", + "access" : 0, + "parameters" : [ "index", "s" ], + "descriptor" : "(ILjava/lang/String;B)V" + }, { + "method" : "tryWrite", + "owner" : "ch", + "name" : "d", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "write", + "owner" : "ch", + "name" : "e", + "access" : 0, + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "DevicePcmPlayer", + "name" : "ax", + "super" : "co", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "byteSamples", + "owner" : "ax", + "name" : "w", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "capacity2", + "owner" : "ax", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -106586673 + }, { + "field" : "format", + "owner" : "ax", + "name" : "m", + "access" : 0, + "descriptor" : "Ljavax/sound/sampled/AudioFormat;" + }, { + "field" : "line", + "owner" : "ax", + "name" : "f", + "access" : 0, + "descriptor" : "Ljavax/sound/sampled/SourceDataLine;" + } ], + "methods" : [ { + "method" : "close", + "owner" : "ax", + "name" : "o", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "discard", + "owner" : "ax", + "name" : "u", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "init", + "owner" : "ax", + "name" : "m", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "open", + "owner" : "ax", + "name" : "f", + "access" : 4, + "parameters" : [ "bufferSize" ], + "descriptor" : "(II)V" + }, { + "method" : "position", + "owner" : "ax", + "name" : "q", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "write", + "owner" : "ax", + "name" : "w", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ClientPacket", + "name" : "gs", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "gb" ], + "fields" : [ { + "field" : "id", + "owner" : "gs", + "name" : "cd", + "access" : 16, + "descriptor" : "I", + "decoder" : -286923745 + }, { + "field" : "length", + "owner" : "gs", + "name" : "cx", + "access" : 16, + "descriptor" : "I", + "decoder" : -1759434223 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(II)V" + } ] +}, { + "class" : "Node", + "name" : "gw", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "key", + "owner" : "gw", + "name" : "cl", + "access" : 1, + "descriptor" : "J" + }, { + "field" : "next", + "owner" : "gw", + "name" : "cz", + "access" : 1, + "descriptor" : "Lgw;" + }, { + "field" : "previous", + "owner" : "gw", + "name" : "ct", + "access" : 1, + "descriptor" : "Lgw;" + } ], + "methods" : [ { + "method" : "hasNext", + "owner" : "gw", + "name" : "eg", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "remove", + "owner" : "gw", + "name" : "es", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "NodeHashTable", + "name" : "ld", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "buckets", + "owner" : "ld", + "name" : "f", + "access" : 0, + "descriptor" : "[Lgw;" + }, { + "field" : "current", + "owner" : "ld", + "name" : "w", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "currentGet", + "owner" : "ld", + "name" : "q", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "index", + "owner" : "ld", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "size", + "owner" : "ld", + "name" : "m", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "clear", + "owner" : "ld", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "first", + "owner" : "ld", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "get", + "owner" : "ld", + "name" : "m", + "access" : 1, + "parameters" : [ "key" ], + "descriptor" : "(J)Lgw;" + }, { + "method" : "next", + "owner" : "ld", + "name" : "o", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "put", + "owner" : "ld", + "name" : "f", + "access" : 1, + "parameters" : [ "node", "key" ], + "descriptor" : "(Lgw;J)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(I)V" + } ] +}, { + "class" : "TilePaint", + "name" : "eb", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "isFlat", + "owner" : "eb", + "name" : "u", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "neColor", + "owner" : "eb", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1668262341 + }, { + "field" : "nwColor", + "owner" : "eb", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1057776035 + }, { + "field" : "rgb", + "owner" : "eb", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 2097947337 + }, { + "field" : "seColor", + "owner" : "eb", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1875844515 + }, { + "field" : "swColor", + "owner" : "eb", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 181759449 + }, { + "field" : "texture", + "owner" : "eb", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 463308567 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIIIIIZ)V" + } ] +}, { + "class" : "MenuAction", + "name" : "cs", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "action", + "owner" : "cs", + "name" : "o", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "argument0", + "owner" : "cs", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -2057883817 + }, { + "field" : "argument1", + "owner" : "cs", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 305977315 + }, { + "field" : "argument2", + "owner" : "cs", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1764645917 + }, { + "field" : "opcode", + "owner" : "cs", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1483856253 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "GzipDecompressor", + "name" : "go", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "inflater", + "owner" : "go", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/util/zip/Inflater;" + } ], + "methods" : [ { + "method" : "decompress", + "owner" : "go", + "name" : "m", + "access" : 1, + "descriptor" : "(Lgr;[BB)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + }, { + "access" : 0, + "descriptor" : "(III)V" + } ] +}, { + "class" : "SoundCache", + "name" : "dt", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "musicSampleIndex", + "owner" : "dt", + "name" : "f", + "access" : 0, + "descriptor" : "Lir;" + }, { + "field" : "musicSamples", + "owner" : "dt", + "name" : "q", + "access" : 0, + "descriptor" : "Lld;" + }, { + "field" : "rawSounds", + "owner" : "dt", + "name" : "w", + "access" : 0, + "descriptor" : "Lld;" + }, { + "field" : "soundEffectIndex", + "owner" : "dt", + "name" : "m", + "access" : 0, + "descriptor" : "Lir;" + } ], + "methods" : [ { + "method" : "getMusicSample", + "owner" : "dt", + "name" : "w", + "access" : 1, + "descriptor" : "(I[II)Lcx;" + }, { + "method" : "getMusicSample0", + "owner" : "dt", + "name" : "f", + "access" : 0, + "descriptor" : "(II[II)Lcx;" + }, { + "method" : "getSoundEffect", + "owner" : "dt", + "name" : "q", + "access" : 1, + "descriptor" : "(I[IB)Lcx;" + }, { + "method" : "getSoundEffect0", + "owner" : "dt", + "name" : "m", + "access" : 0, + "descriptor" : "(II[IS)Lcx;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Lir;Lir;)V" + } ] +}, { + "class" : "Strings", + "name" : "id", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "GrandExchangeEvents", + "name" : "g", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "events", + "owner" : "g", + "name" : "m", + "access" : 17, + "descriptor" : "Ljava/util/List;" + } ], + "methods" : [ { + "method" : "sort", + "owner" : "g", + "name" : "m", + "access" : 1, + "descriptor" : "(Ljava/util/Comparator;ZI)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Lgr;Z)V" + } ] +}, { + "class" : "ObjectNode", + "name" : "fk", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "obj", + "owner" : "fk", + "name" : "m", + "access" : 17, + "descriptor" : "Ljava/lang/Object;" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Ljava/lang/Object;)V" + } ] +}, { + "class" : "NodeDeque", + "name" : "je", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "current", + "owner" : "je", + "name" : "f", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "sentinel", + "owner" : "je", + "name" : "m", + "access" : 1, + "descriptor" : "Lgw;" + } ], + "methods" : [ { + "method" : "addFirst", + "owner" : "je", + "name" : "f", + "access" : 1, + "parameters" : [ "node" ], + "descriptor" : "(Lgw;)V" + }, { + "method" : "addLast", + "owner" : "je", + "name" : "q", + "access" : 1, + "parameters" : [ "node" ], + "descriptor" : "(Lgw;)V" + }, { + "method" : "clear", + "owner" : "je", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "first", + "owner" : "je", + "name" : "l", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "last", + "owner" : "je", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "next", + "owner" : "je", + "name" : "x", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "previous", + "owner" : "je", + "name" : "e", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "removeFirst", + "owner" : "je", + "name" : "u", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "removeLast", + "owner" : "je", + "name" : "o", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "Bzip2Decompressor", + "name" : "gk", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "IntegerNode", + "name" : "gn", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "integer", + "owner" : "gn", + "name" : "m", + "access" : 1, + "descriptor" : "I" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(I)V" + } ] +}, { + "class" : "HealthBarUpdate", + "name" : "bg", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "cycle", + "owner" : "bg", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 2103089795 + }, { + "field" : "cycleOffset", + "owner" : "bg", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1876302639 + }, { + "field" : "health", + "owner" : "bg", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1821995313 + }, { + "field" : "health2", + "owner" : "bg", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -820353645 + } ], + "methods" : [ { + "method" : "set", + "owner" : "bg", + "name" : "m", + "access" : 0, + "descriptor" : "(IIIII)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIII)V" + } ] +}, { + "class" : "ItemContainer", + "name" : "bc", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "ids", + "owner" : "bc", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "quantities", + "owner" : "bc", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapCacheName", + "name" : "aw", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "name", + "owner" : "aw", + "name" : "u", + "access" : 17, + "descriptor" : "Ljava/lang/String;" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/String;)V" + } ] +}, { + "class" : "AbstractSound", + "name" : "dd", + "super" : "gw", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "position", + "owner" : "dd", + "name" : "u", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ByteArrayPool", + "name" : "gi", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "AbstractSocket", + "name" : "fu", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "available", + "owner" : "fu", + "name" : "q", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "close", + "owner" : "fu", + "name" : "g", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "isAvailable", + "owner" : "fu", + "name" : "f", + "access" : 1025, + "parameters" : [ "length" ], + "descriptor" : "(II)Z" + }, { + "method" : "read", + "owner" : "fu", + "name" : "o", + "access" : 1025, + "parameters" : [ "dst", "dstIndex", "length" ], + "descriptor" : "([BIII)I" + }, { + "method" : "readUnsignedByte", + "owner" : "fu", + "name" : "w", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "write", + "owner" : "fu", + "name" : "u", + "access" : 1025, + "parameters" : [ "src", "srcIndex", "length" ], + "descriptor" : "([BIIB)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Skeleton", + "name" : "ek", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "count", + "owner" : "ek", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1875841677 + }, { + "field" : "id", + "owner" : "ek", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -1634889691 + }, { + "field" : "labels", + "owner" : "ek", + "name" : "w", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "transformTypes", + "owner" : "ek", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(I[B)V" + } ] +}, { + "class" : "TriBool", + "name" : "kd", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "StudioGame", + "name" : "is", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "gc" ], + "fields" : [ { + "field" : "id", + "owner" : "is", + "name" : "l", + "access" : 16, + "descriptor" : "I", + "decoder" : -1688917715 + }, { + "field" : "name", + "owner" : "is", + "name" : "g", + "access" : 17, + "descriptor" : "Ljava/lang/String;" + } ], + "methods" : [ { + "method" : "ordinal", + "owner" : "is", + "name" : "f", + "access" : 1, + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/String;Ljava/lang/String;I)V" + } ] +}, { + "class" : "Varps", + "name" : "hv", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "WorldMapSection", + "name" : "ab", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "containsCoord", + "owner" : "ab", + "name" : "f", + "access" : 1025, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(IIIB)Z" + }, { + "method" : "containsPosition", + "owner" : "ab", + "name" : "q", + "access" : 1025, + "parameters" : [ "x", "y" ], + "descriptor" : "(IIB)Z" + }, { + "method" : "coord", + "owner" : "ab", + "name" : "o", + "access" : 1025, + "parameters" : [ "x", "y" ], + "descriptor" : "(III)Lhu;" + }, { + "method" : "expandBounds", + "owner" : "ab", + "name" : "m", + "access" : 1025, + "parameters" : [ "area" ], + "descriptor" : "(Lag;I)V" + }, { + "method" : "position", + "owner" : "ab", + "name" : "w", + "access" : 1025, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(IIII)[I" + }, { + "method" : "read", + "owner" : "ab", + "name" : "u", + "access" : 1025, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;B)V" + } ], + "constructors" : [ ] +}, { + "class" : "Buddy", + "name" : "ke", + "super" : "js", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "int2", + "owner" : "ke", + "name" : "u", + "access" : 1, + "descriptor" : "I", + "decoder" : 120689297 + }, { + "field" : "rank", + "owner" : "ke", + "name" : "g", + "access" : 1, + "descriptor" : "I", + "decoder" : -304954565 + }, { + "field" : "world0", + "owner" : "ke", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : 429472919 + } ], + "methods" : [ { + "method" : "hasWorld", + "owner" : "ke", + "name" : "au", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "set", + "owner" : "ke", + "name" : "an", + "access" : 0, + "descriptor" : "(IIS)V" + }, { + "method" : "world", + "owner" : "ke", + "name" : "az", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "RunException", + "name" : "fx", + "super" : "java.lang.RuntimeException", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "string", + "owner" : "fx", + "name" : "o", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "throwable", + "owner" : "fx", + "name" : "u", + "access" : 0, + "descriptor" : "Ljava/lang/Throwable;" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/Throwable;Ljava/lang/String;)V" + } ] +}, { + "class" : "AbstractRasterProvider", + "name" : "lp", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "height", + "owner" : "lp", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : -239960145 + }, { + "field" : "pixels", + "owner" : "lp", + "name" : "q", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "width", + "owner" : "lp", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : -560298363 + } ], + "methods" : [ { + "method" : "apply", + "owner" : "lp", + "name" : "b", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "draw", + "owner" : "lp", + "name" : "q", + "access" : 1025, + "parameters" : [ "x", "y", "width", "height" ], + "descriptor" : "(IIIIB)V" + }, { + "method" : "drawFull", + "owner" : "lp", + "name" : "f", + "access" : 1025, + "parameters" : [ "x", "y" ], + "descriptor" : "(III)V" + } ], + "constructors" : [ { + "access" : 4, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapEvent", + "name" : "ap", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "coord1", + "owner" : "ap", + "name" : "f", + "access" : 1, + "descriptor" : "Lhu;" + }, { + "field" : "coord2", + "owner" : "ap", + "name" : "q", + "access" : 1, + "descriptor" : "Lhu;" + }, { + "field" : "mapElement", + "owner" : "ap", + "name" : "m", + "access" : 1, + "descriptor" : "I", + "decoder" : 264384233 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(ILhu;Lhu;)V" + } ] +}, { + "class" : "DualNode", + "name" : "fn", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "keyDual", + "owner" : "fn", + "name" : "cg", + "access" : 1, + "descriptor" : "J" + }, { + "field" : "nextDual", + "owner" : "fn", + "name" : "cp", + "access" : 1, + "descriptor" : "Lfn;" + }, { + "field" : "previousDual", + "owner" : "fn", + "name" : "cf", + "access" : 1, + "descriptor" : "Lfn;" + } ], + "methods" : [ { + "method" : "removeDual", + "owner" : "fn", + "name" : "cg", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "ClientPacketMarker", + "name" : "gb", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "ByteArrayNode", + "name" : "gp", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "byteArray", + "owner" : "gp", + "name" : "m", + "access" : 1, + "descriptor" : "[B" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 1, + "descriptor" : "([B)V" + } ] +}, { + "class" : "ClanMate", + "name" : "jk", + "super" : "ke", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "isFriend0", + "owner" : "jk", + "name" : "m", + "access" : 0, + "descriptor" : "Lkd;" + }, { + "field" : "isIgnored0", + "owner" : "jk", + "name" : "f", + "access" : 0, + "descriptor" : "Lkd;" + } ], + "methods" : [ { + "method" : "clearIsFriend", + "owner" : "jk", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "clearIsIgnored", + "owner" : "jk", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "fillIsFriend", + "owner" : "jk", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "fillIsIgnored", + "owner" : "jk", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "isFriend", + "owner" : "jk", + "name" : "f", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "isIgnored", + "owner" : "jk", + "name" : "o", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Login", + "name" : "cu", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "HealthBar", + "name" : "cr", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "definition", + "owner" : "cr", + "name" : "q", + "access" : 0, + "descriptor" : "Lii;" + }, { + "field" : "updates", + "owner" : "cr", + "name" : "w", + "access" : 0, + "descriptor" : "Lja;" + } ], + "methods" : [ { + "method" : "get", + "owner" : "cr", + "name" : "f", + "access" : 0, + "parameters" : [ "cycle" ], + "descriptor" : "(II)Lbg;" + }, { + "method" : "isEmpty", + "owner" : "cr", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "put", + "owner" : "cr", + "name" : "m", + "access" : 0, + "descriptor" : "(IIIIB)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lii;)V" + } ] +}, { + "class" : "RasterProvider", + "name" : "ai", + "super" : "lp", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "component0", + "owner" : "ai", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/awt/Component;" + }, { + "field" : "image", + "owner" : "ai", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/awt/Image;" + } ], + "methods" : [ { + "method" : "draw", + "owner" : "ai", + "name" : "q", + "access" : 17, + "parameters" : [ "x", "y", "width", "height" ], + "descriptor" : "(IIIIB)V" + }, { + "method" : "draw0", + "owner" : "ai", + "name" : "o", + "access" : 16, + "parameters" : [ "graphics", "x", "y", "width", "height" ], + "descriptor" : "(Ljava/awt/Graphics;IIIIB)V" + }, { + "method" : "drawFull", + "owner" : "ai", + "name" : "f", + "access" : 17, + "parameters" : [ "x", "y" ], + "descriptor" : "(III)V" + }, { + "method" : "drawFull0", + "owner" : "ai", + "name" : "w", + "access" : 16, + "parameters" : [ "graphics", "x", "y" ], + "descriptor" : "(Ljava/awt/Graphics;III)V" + }, { + "method" : "setComponent", + "owner" : "ai", + "name" : "m", + "access" : 16, + "descriptor" : "(Ljava/awt/Component;B)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IILjava/awt/Component;)V" + } ] +}, { + "class" : "Enumerated", + "name" : "gc", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "ordinal", + "owner" : "gc", + "name" : "f", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ ] +}, { + "class" : "Message", + "name" : "bm", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "count", + "owner" : "bm", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1597147817 + }, { + "field" : "cycle", + "owner" : "bm", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1164592791 + }, { + "field" : "isFromFriend0", + "owner" : "bm", + "name" : "u", + "access" : 0, + "descriptor" : "Lkd;" + }, { + "field" : "isFromIgnored0", + "owner" : "bm", + "name" : "g", + "access" : 0, + "descriptor" : "Lkd;" + }, { + "field" : "prefix", + "owner" : "bm", + "name" : "l", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "sender", + "owner" : "bm", + "name" : "w", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "senderUsername", + "owner" : "bm", + "name" : "o", + "access" : 0, + "descriptor" : "Lkp;" + }, { + "field" : "text", + "owner" : "bm", + "name" : "e", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "type", + "owner" : "bm", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 1223792995 + } ], + "methods" : [ { + "method" : "clearIsFromFriend", + "owner" : "bm", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "clearIsFromIgnored", + "owner" : "bm", + "name" : "o", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "fillIsFromFriend", + "owner" : "bm", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "fillIsFromIgnored", + "owner" : "bm", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(S)V" + }, { + "method" : "fillSenderUsername", + "owner" : "bm", + "name" : "l", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "isFromFriend", + "owner" : "bm", + "name" : "q", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "isFromIgnored", + "owner" : "bm", + "name" : "u", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "set", + "owner" : "bm", + "name" : "m", + "access" : 0, + "parameters" : [ "type", "sender", "prefix", "text" ], + "descriptor" : "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;B)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" + } ] +}, { + "class" : "Rasterizer2D", + "name" : "lf", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ { + "access" : 4, + "descriptor" : "()V" + } ] +}, { + "class" : "NanoClock", + "name" : "fp", + "super" : "fa", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "lastTimeNano", + "owner" : "fp", + "name" : "m", + "access" : 0, + "descriptor" : "J", + "decoder" : 7586221391557635221 + } ], + "methods" : [ { + "method" : "mark", + "owner" : "fp", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "wait", + "owner" : "fp", + "name" : "f", + "access" : 1, + "parameters" : [ "cycleMs", "minSleepMs" ], + "descriptor" : "(III)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "DirectByteArrayCopier", + "name" : "gv", + "super" : "gu", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "directBuffer", + "owner" : "gv", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/nio/ByteBuffer;" + } ], + "methods" : [ { + "method" : "get", + "owner" : "gv", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)[B" + }, { + "method" : "set", + "owner" : "gv", + "name" : "f", + "access" : 0, + "parameters" : [ "array" ], + "descriptor" : "([BI)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "MouseWheel", + "name" : "fv", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "useRotation", + "owner" : "fv", + "name" : "q", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(I)I" + } ], + "constructors" : [ ] +}, { + "class" : "ReflectionCheck", + "name" : "lw", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "arguments", + "owner" : "lw", + "name" : "m", + "access" : 0, + "descriptor" : "[[[B" + }, { + "field" : "creationErrors", + "owner" : "lw", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "fields", + "owner" : "lw", + "name" : "g", + "access" : 0, + "descriptor" : "[Ljava/lang/reflect/Field;" + }, { + "field" : "id", + "owner" : "lw", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1955146989 + }, { + "field" : "intReplaceValues", + "owner" : "lw", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "methods", + "owner" : "lw", + "name" : "l", + "access" : 0, + "descriptor" : "[Ljava/lang/reflect/Method;" + }, { + "field" : "operations", + "owner" : "lw", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "size", + "owner" : "lw", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1091722075 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "FriendLoginUpdate", + "name" : "kn", + "super" : "gh", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "time", + "owner" : "kn", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : -1390885889 + }, { + "field" : "username", + "owner" : "kn", + "name" : "w", + "access" : 1, + "descriptor" : "Lkp;" + }, { + "field" : "world", + "owner" : "kn", + "name" : "o", + "access" : 1, + "descriptor" : "S" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lkp;I)V" + } ] +}, { + "class" : "WidgetGroupParent", + "name" : "bx", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "group", + "owner" : "bx", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -707461797 + }, { + "field" : "keep", + "owner" : "bx", + "name" : "q", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "type", + "owner" : "bx", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1712037041 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapIndexCacheLoader", + "name" : "ls", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "cacheName", + "owner" : "ls", + "name" : "o", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "indexCache", + "owner" : "ls", + "name" : "u", + "access" : 0, + "descriptor" : "Lir;" + }, { + "field" : "isLoaded0", + "owner" : "ls", + "name" : "l", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "percentLoaded0", + "owner" : "ls", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 624113115 + } ], + "methods" : [ { + "method" : "isLoaded", + "owner" : "ls", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(S)Z" + }, { + "method" : "load", + "owner" : "ls", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "percentLoaded", + "owner" : "ls", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "reset", + "owner" : "ls", + "name" : "m", + "access" : 0, + "parameters" : [ "cacheName" ], + "descriptor" : "(Ljava/lang/String;I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lir;)V" + } ] +}, { + "class" : "NetCache", + "name" : "iq", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "EnumDefinition", + "name" : "jw", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "defaultInt", + "owner" : "jw", + "name" : "u", + "access" : 1, + "descriptor" : "I", + "decoder" : 1948115527 + }, { + "field" : "defaultString", + "owner" : "jw", + "name" : "o", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "intVals", + "owner" : "jw", + "name" : "e", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "keyType", + "owner" : "jw", + "name" : "q", + "access" : 1, + "descriptor" : "C" + }, { + "field" : "keys", + "owner" : "jw", + "name" : "l", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "size0", + "owner" : "jw", + "name" : "g", + "access" : 1, + "descriptor" : "I", + "decoder" : -12324053 + }, { + "field" : "stringVals", + "owner" : "jw", + "name" : "x", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "valType", + "owner" : "jw", + "name" : "w", + "access" : 1, + "descriptor" : "C" + } ], + "methods" : [ { + "method" : "read", + "owner" : "jw", + "name" : "f", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "jw", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "size", + "owner" : "jw", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "DemotingHashTable", + "name" : "ec", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "capacity", + "owner" : "ec", + "name" : "m", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "hashTable", + "owner" : "ec", + "name" : "q", + "access" : 0, + "descriptor" : "Llh;" + }, { + "field" : "queue", + "owner" : "ec", + "name" : "w", + "access" : 0, + "descriptor" : "Ljc;" + }, { + "field" : "remaining", + "owner" : "ec", + "name" : "f", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "clear", + "owner" : "ec", + "name" : "u", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "demote", + "owner" : "ec", + "name" : "o", + "access" : 1, + "parameters" : [ "softeningLevel" ], + "descriptor" : "(I)V" + }, { + "method" : "get", + "owner" : "ec", + "name" : "m", + "access" : 1, + "parameters" : [ "key" ], + "descriptor" : "(J)Ljava/lang/Object;" + }, { + "method" : "put", + "owner" : "ec", + "name" : "w", + "access" : 1, + "parameters" : [ "value", "key", "size" ], + "descriptor" : "(Ljava/lang/Object;JI)V" + }, { + "method" : "remove", + "owner" : "ec", + "name" : "f", + "access" : 0, + "parameters" : [ "key" ], + "descriptor" : "(J)V" + }, { + "method" : "removeWrapper", + "owner" : "ec", + "name" : "q", + "access" : 0, + "parameters" : [ "wrapper" ], + "descriptor" : "(Leu;)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(II)V" + } ] +}, { + "class" : "Wrapper", + "name" : "eu", + "super" : "fn", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "size", + "owner" : "eu", + "name" : "f", + "access" : 16, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "get", + "owner" : "eu", + "name" : "m", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/Object;" + }, { + "method" : "isSoft", + "owner" : "eu", + "name" : "f", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "()Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(I)V" + } ] +}, { + "class" : "UserList", + "name" : "km", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "array", + "owner" : "km", + "name" : "u", + "access" : 0, + "descriptor" : "[Ljs;" + }, { + "field" : "capacity", + "owner" : "km", + "name" : "w", + "access" : 16, + "descriptor" : "I", + "decoder" : -2119868987 + }, { + "field" : "comparator", + "owner" : "km", + "name" : "e", + "access" : 0, + "descriptor" : "Ljava/util/Comparator;" + }, { + "field" : "previousUsernamesMap", + "owner" : "km", + "name" : "l", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "size0", + "owner" : "km", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -280101247 + }, { + "field" : "usernamesMap", + "owner" : "km", + "name" : "g", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + } ], + "methods" : [ { + "method" : "addComparator", + "owner" : "km", + "name" : "al", + "access" : 17, + "parameters" : [ "c" ], + "descriptor" : "(Ljava/util/Comparator;B)V" + }, { + "method" : "addLast", + "owner" : "km", + "name" : "ag", + "access" : 0, + "parameters" : [ "username", "previousUsername" ], + "descriptor" : "(Lkp;Lkp;I)Ljs;" + }, { + "method" : "addLastNoPreviousUsername", + "owner" : "km", + "name" : "v", + "access" : 0, + "parameters" : [ "username" ], + "descriptor" : "(Lkp;I)Ljs;" + }, { + "method" : "arrayAddLast", + "owner" : "km", + "name" : "ay", + "access" : 16, + "parameters" : [ "user" ], + "descriptor" : "(Ljs;I)V" + }, { + "method" : "arrayRemove", + "owner" : "km", + "name" : "ak", + "access" : 16, + "parameters" : [ "index" ], + "descriptor" : "(II)V" + }, { + "method" : "changeName", + "owner" : "km", + "name" : "av", + "access" : 16, + "parameters" : [ "user", "username", "previousUsername" ], + "descriptor" : "(Ljs;Lkp;Lkp;B)V" + }, { + "method" : "clear", + "owner" : "km", + "name" : "z", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "contains", + "owner" : "km", + "name" : "t", + "access" : 1, + "parameters" : [ "username" ], + "descriptor" : "(Lkp;I)Z" + }, { + "method" : "get", + "owner" : "km", + "name" : "aq", + "access" : 17, + "parameters" : [ "index" ], + "descriptor" : "(II)Ljs;" + }, { + "method" : "getByCurrentUsername", + "owner" : "km", + "name" : "h", + "access" : 0, + "parameters" : [ "username" ], + "descriptor" : "(Lkp;I)Ljs;" + }, { + "method" : "getByPreviousUsername", + "owner" : "km", + "name" : "b", + "access" : 0, + "parameters" : [ "previousUsername" ], + "descriptor" : "(Lkp;I)Ljs;" + }, { + "method" : "getByUsername", + "owner" : "km", + "name" : "y", + "access" : 1, + "parameters" : [ "username" ], + "descriptor" : "(Lkp;I)Ljs;" + }, { + "method" : "indexOf", + "owner" : "km", + "name" : "ar", + "access" : 16, + "parameters" : [ "user" ], + "descriptor" : "(Ljs;I)I" + }, { + "method" : "isFull", + "owner" : "km", + "name" : "s", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "mapPut", + "owner" : "km", + "name" : "ah", + "access" : 16, + "parameters" : [ "user" ], + "descriptor" : "(Ljs;B)V" + }, { + "method" : "mapRemove", + "owner" : "km", + "name" : "ac", + "access" : 16, + "parameters" : [ "user" ], + "descriptor" : "(Ljs;S)V" + }, { + "method" : "newInstance", + "owner" : "km", + "name" : "m", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "(I)Ljs;" + }, { + "method" : "newTypedArray", + "owner" : "km", + "name" : "f", + "access" : 1024, + "parameters" : [ "size" ], + "descriptor" : "(II)[Ljs;" + }, { + "method" : "remove", + "owner" : "km", + "name" : "p", + "access" : 16, + "parameters" : [ "user" ], + "descriptor" : "(Ljs;I)V" + }, { + "method" : "removeByUsername", + "owner" : "km", + "name" : "c", + "access" : 17, + "parameters" : [ "username" ], + "descriptor" : "(Lkp;S)Z" + }, { + "method" : "removeComparator", + "owner" : "km", + "name" : "aw", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "size", + "owner" : "km", + "name" : "j", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "sort", + "owner" : "km", + "name" : "aj", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(I)V" + } ] +}, { + "class" : "Animation", + "name" : "dz", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "hasAlphaTransform", + "owner" : "dz", + "name" : "d", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "skeleton", + "owner" : "dz", + "name" : "o", + "access" : 0, + "descriptor" : "Lek;" + }, { + "field" : "transformCount", + "owner" : "dz", + "name" : "u", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "transformSkeletonLabels", + "owner" : "dz", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "transformXs", + "owner" : "dz", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "transformYs", + "owner" : "dz", + "name" : "e", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "transformZs", + "owner" : "dz", + "name" : "x", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "([BLek;)V" + } ] +}, { + "class" : "ParamKeyDefinition", + "name" : "jb", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "isMembersOnly", + "owner" : "jb", + "name" : "u", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "keyInt", + "owner" : "jb", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : 1133042753 + }, { + "field" : "keyString", + "owner" : "jb", + "name" : "o", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "type", + "owner" : "jb", + "name" : "q", + "access" : 0, + "descriptor" : "C" + } ], + "methods" : [ { + "method" : "init", + "owner" : "jb", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "isString", + "owner" : "jb", + "name" : "o", + "access" : 1, + "descriptor" : "(I)Z" + }, { + "method" : "read", + "owner" : "jb", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "jb", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "NetFileRequest", + "name" : "iz", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "crc", + "owner" : "iz", + "name" : "f", + "access" : 1, + "descriptor" : "I", + "decoder" : 1487103265 + }, { + "field" : "indexCache", + "owner" : "iz", + "name" : "m", + "access" : 1, + "descriptor" : "Lit;" + }, { + "field" : "padding", + "owner" : "iz", + "name" : "q", + "access" : 1, + "descriptor" : "B" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "DualNodeDeque", + "name" : "jp", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "sentinel", + "owner" : "jp", + "name" : "m", + "access" : 0, + "descriptor" : "Lfn;" + } ], + "methods" : [ { + "method" : "addFirst", + "owner" : "jp", + "name" : "m", + "access" : 1, + "descriptor" : "(Lfn;)V" + }, { + "method" : "addLast", + "owner" : "jp", + "name" : "f", + "access" : 1, + "descriptor" : "(Lfn;)V" + }, { + "method" : "clear", + "owner" : "jp", + "name" : "u", + "access" : 1, + "descriptor" : "()V" + }, { + "method" : "last", + "owner" : "jp", + "name" : "o", + "access" : 1, + "descriptor" : "()Lfn;" + }, { + "method" : "removeLast", + "owner" : "jp", + "name" : "w", + "access" : 1, + "descriptor" : "()Lfn;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "LoginPacket", + "name" : "gl", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "gb" ], + "fields" : [ { + "field" : "id", + "owner" : "gl", + "name" : "u", + "access" : 17, + "descriptor" : "I", + "decoder" : 1743806243 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(II)V" + } ] +}, { + "class" : "Skills", + "name" : "hc", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "AbstractFont", + "name" : "kt", + "super" : "lf", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "advances", + "owner" : "kt", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "ascent", + "owner" : "kt", + "name" : "g", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "heights", + "owner" : "kt", + "name" : "w", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "kerning", + "owner" : "kt", + "name" : "d", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "leftBearings", + "owner" : "kt", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "maxAscent", + "owner" : "kt", + "name" : "l", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "maxDescent", + "owner" : "kt", + "name" : "e", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "pixels", + "owner" : "kt", + "name" : "m", + "access" : 0, + "descriptor" : "[[B" + }, { + "field" : "topBearings", + "owner" : "kt", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "widths", + "owner" : "kt", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "breakLines", + "owner" : "kt", + "name" : "a", + "access" : 1, + "parameters" : [ "s", "lineWidths", "linesDst" ], + "descriptor" : "(Ljava/lang/String;[I[Ljava/lang/String;)I" + }, { + "method" : "calculateLineJustification", + "owner" : "kt", + "name" : "ar", + "access" : 0, + "parameters" : [ "s", "lineWidth" ], + "descriptor" : "(Ljava/lang/String;I)V" + }, { + "method" : "charWidth", + "owner" : "kt", + "name" : "x", + "access" : 0, + "parameters" : [ "c" ], + "descriptor" : "(C)I" + }, { + "method" : "decodeTag", + "owner" : "kt", + "name" : "av", + "access" : 0, + "parameters" : [ "s" ], + "descriptor" : "(Ljava/lang/String;)V" + }, { + "method" : "draw", + "owner" : "kt", + "name" : "t", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow" ], + "descriptor" : "(Ljava/lang/String;IIII)V" + }, { + "method" : "draw0", + "owner" : "kt", + "name" : "ac", + "access" : 0, + "parameters" : [ "s", "x", "y" ], + "descriptor" : "(Ljava/lang/String;II)V" + }, { + "method" : "drawAlpha", + "owner" : "kt", + "name" : "y", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow", "alpha" ], + "descriptor" : "(Ljava/lang/String;IIIII)V" + }, { + "method" : "drawCentered", + "owner" : "kt", + "name" : "b", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow" ], + "descriptor" : "(Ljava/lang/String;IIII)V" + }, { + "method" : "drawCenteredShake", + "owner" : "kt", + "name" : "ag", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow", "seed", "seed2" ], + "descriptor" : "(Ljava/lang/String;IIIIII)V" + }, { + "method" : "drawCenteredWave", + "owner" : "kt", + "name" : "p", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow", "seed" ], + "descriptor" : "(Ljava/lang/String;IIIII)V" + }, { + "method" : "drawCenteredWave2", + "owner" : "kt", + "name" : "v", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow", "seed" ], + "descriptor" : "(Ljava/lang/String;IIIII)V" + }, { + "method" : "drawGlyph", + "owner" : "kt", + "name" : "m", + "access" : 1024, + "parameters" : [ "pixels", "x", "y", "width", "height", "color" ], + "descriptor" : "([BIIIII)V" + }, { + "method" : "drawGlyphAlpha", + "owner" : "kt", + "name" : "f", + "access" : 1024, + "parameters" : [ "pixels", "x", "y", "width", "height", "color", "alpha" ], + "descriptor" : "([BIIIIII)V" + }, { + "method" : "drawLines", + "owner" : "kt", + "name" : "c", + "access" : 1, + "parameters" : [ "s", "x", "y", "width", "height", "color", "shadow", "xAlignment", "yAlignment", "lineHeight" ], + "descriptor" : "(Ljava/lang/String;IIIIIIIII)I" + }, { + "method" : "drawRandomAlphaAndSpacing", + "owner" : "kt", + "name" : "aq", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow", "seed" ], + "descriptor" : "(Ljava/lang/String;IIIII)V" + }, { + "method" : "drawRightAligned", + "owner" : "kt", + "name" : "h", + "access" : 1, + "parameters" : [ "s", "x", "y", "color", "shadow" ], + "descriptor" : "(Ljava/lang/String;IIII)V" + }, { + "method" : "drawWithOffsets0", + "owner" : "kt", + "name" : "ay", + "access" : 0, + "parameters" : [ "s", "x", "y", "xs", "ys" ], + "descriptor" : "(Ljava/lang/String;II[I[I)V" + }, { + "method" : "lineCount", + "owner" : "kt", + "name" : "j", + "access" : 1, + "parameters" : [ "s", "lineWidth" ], + "descriptor" : "(Ljava/lang/String;I)I" + }, { + "method" : "lineWidth", + "owner" : "kt", + "name" : "z", + "access" : 1, + "parameters" : [ "s", "lineWidth" ], + "descriptor" : "(Ljava/lang/String;I)I" + }, { + "method" : "readMetrics", + "owner" : "kt", + "name" : "l", + "access" : 0, + "parameters" : [ "bytes" ], + "descriptor" : "([B)V" + }, { + "method" : "reset", + "owner" : "kt", + "name" : "aj", + "access" : 0, + "parameters" : [ "color", "shadow" ], + "descriptor" : "(II)V" + }, { + "method" : "stringWidth", + "owner" : "kt", + "name" : "d", + "access" : 1, + "parameters" : [ "s" ], + "descriptor" : "(Ljava/lang/String;)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "([B[I[I[I[I[I[[B)V" + }, { + "access" : 0, + "descriptor" : "([B)V" + } ] +}, { + "class" : "UnderlayDefinition", + "name" : "ih", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "hue", + "owner" : "ih", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : -1465372343 + }, { + "field" : "hueMultiplier", + "owner" : "ih", + "name" : "g", + "access" : 1, + "descriptor" : "I", + "decoder" : 1484542081 + }, { + "field" : "lightness", + "owner" : "ih", + "name" : "u", + "access" : 1, + "descriptor" : "I", + "decoder" : -1691813081 + }, { + "field" : "rgb", + "owner" : "ih", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -635678213 + }, { + "field" : "saturation", + "owner" : "ih", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : 2031118785 + } ], + "methods" : [ { + "method" : "init", + "owner" : "ih", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "read", + "owner" : "ih", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "readNext", + "owner" : "ih", + "name" : "o", + "access" : 0, + "descriptor" : "(Lgr;III)V" + }, { + "method" : "setHsl", + "owner" : "ih", + "name" : "u", + "access" : 0, + "parameters" : [ "rgb" ], + "descriptor" : "(IB)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "IntHashTable", + "name" : "lv", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "array", + "owner" : "lv", + "name" : "m", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "get", + "owner" : "lv", + "name" : "m", + "access" : 1, + "descriptor" : "(II)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "([I)V" + } ] +}, { + "class" : "VarbitDefinition", + "name" : "ia", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "highBit", + "owner" : "ia", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : -1710935305 + }, { + "field" : "lowBit", + "owner" : "ia", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : -870948181 + }, { + "field" : "varp", + "owner" : "ia", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : 1552575189 + } ], + "methods" : [ { + "method" : "read", + "owner" : "ia", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "ia", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;IB)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "IndexStore", + "name" : "ff", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "dataFile", + "owner" : "ff", + "name" : "f", + "access" : 0, + "descriptor" : "Ldy;" + }, { + "field" : "index", + "owner" : "ff", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1982523283 + }, { + "field" : "indexFile", + "owner" : "ff", + "name" : "q", + "access" : 0, + "descriptor" : "Ldy;" + }, { + "field" : "maxEntrySize", + "owner" : "ff", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -748616567 + } ], + "methods" : [ { + "method" : "read", + "owner" : "ff", + "name" : "m", + "access" : 1, + "parameters" : [ "entry" ], + "descriptor" : "(II)[B" + }, { + "method" : "write", + "owner" : "ff", + "name" : "f", + "access" : 1, + "descriptor" : "(I[BII)Z" + }, { + "method" : "write0", + "owner" : "ff", + "name" : "q", + "access" : 0, + "descriptor" : "(I[BIZI)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(ILdy;Ldy;I)V" + } ] +}, { + "class" : "Entity", + "name" : "ex", + "super" : "fn", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "height", + "owner" : "ex", + "name" : "cw", + "access" : 1, + "descriptor" : "I", + "decoder" : 849583845 + } ], + "methods" : [ { + "method" : "draw", + "owner" : "ex", + "name" : "cy", + "access" : 0, + "parameters" : [ "yaw", "cameraPitchSine", "cameraPitchCosine", "cameraYawSine", "cameraYawCosine", "x", "y", "z", "tag" ], + "descriptor" : "(IIIIIIIIJ)V" + }, { + "method" : "getModel", + "owner" : "ex", + "name" : "e", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)Ldu;" + } ], + "constructors" : [ { + "access" : 4, + "descriptor" : "()V" + } ] +}, { + "class" : "DirectWrapper", + "name" : "ew", + "super" : "eu", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "obj", + "owner" : "ew", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/lang/Object;" + } ], + "methods" : [ { + "method" : "get", + "owner" : "ew", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/Object;" + }, { + "method" : "isSoft", + "owner" : "ew", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/Object;I)V" + } ] +}, { + "class" : "FloorDecoration", + "name" : "do", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "entity", + "owner" : "do", + "name" : "o", + "access" : 1, + "descriptor" : "Lex;" + }, { + "field" : "flags", + "owner" : "do", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1241982749 + }, { + "field" : "tag", + "owner" : "do", + "name" : "m", + "access" : 1, + "descriptor" : "J", + "decoder" : -5063688075016130813 + }, { + "field" : "tileHeight", + "owner" : "do", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1358154703 + }, { + "field" : "x", + "owner" : "do", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 1309467119 + }, { + "field" : "y", + "owner" : "do", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 318503957 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "InvDefinition", + "name" : "ib", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "size", + "owner" : "ib", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : 1358868971 + } ], + "methods" : [ { + "method" : "read", + "owner" : "ib", + "name" : "f", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "ib", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "BoundaryObject", + "name" : "ej", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "entity1", + "owner" : "ej", + "name" : "u", + "access" : 1, + "descriptor" : "Lex;" + }, { + "field" : "entity2", + "owner" : "ej", + "name" : "g", + "access" : 1, + "descriptor" : "Lex;" + }, { + "field" : "flags", + "owner" : "ej", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -693868549 + }, { + "field" : "orientationA", + "owner" : "ej", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 1724480965 + }, { + "field" : "orientationB", + "owner" : "ej", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -969316473 + }, { + "field" : "tag", + "owner" : "ej", + "name" : "l", + "access" : 1, + "descriptor" : "J", + "decoder" : -4401157754236673285 + }, { + "field" : "tileHeight", + "owner" : "ej", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -9307913 + }, { + "field" : "x", + "owner" : "ej", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 860688417 + }, { + "field" : "y", + "owner" : "ej", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -260081891 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Interpreter", + "name" : "bv", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "PcmPlayerProvider", + "name" : "cz", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "player", + "owner" : "cz", + "name" : "m", + "access" : 1025, + "descriptor" : "(B)Lco;" + } ], + "constructors" : [ ] +}, { + "class" : "SpriteMask", + "name" : "hp", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "height", + "owner" : "hp", + "name" : "f", + "access" : 17, + "descriptor" : "I", + "decoder" : -193097093 + }, { + "field" : "width", + "owner" : "hp", + "name" : "m", + "access" : 17, + "descriptor" : "I", + "decoder" : 574541221 + }, { + "field" : "xStarts", + "owner" : "hp", + "name" : "w", + "access" : 17, + "descriptor" : "[I" + }, { + "field" : "xWidths", + "owner" : "hp", + "name" : "q", + "access" : 17, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "contains", + "owner" : "hp", + "name" : "m", + "access" : 1, + "parameters" : [ "x", "y" ], + "descriptor" : "(III)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(II[I[II)V" + } ] +}, { + "class" : "Tiles", + "name" : "bq", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "ChatChannel", + "name" : "cp", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "count", + "owner" : "cp", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 612486877 + }, { + "field" : "messages", + "owner" : "cp", + "name" : "f", + "access" : 0, + "descriptor" : "[Lbm;" + } ], + "methods" : [ { + "method" : "addMessage", + "owner" : "cp", + "name" : "m", + "access" : 0, + "parameters" : [ "type", "sender", "text", "prefix" ], + "descriptor" : "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Lbm;" + }, { + "method" : "getMessage", + "owner" : "cp", + "name" : "f", + "access" : 0, + "parameters" : [ "index" ], + "descriptor" : "(II)Lbm;" + }, { + "method" : "size", + "owner" : "cp", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "PlatformInfoProvider", + "name" : "lm", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "get", + "owner" : "lm", + "name" : "m", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(I)Llb;" + } ], + "constructors" : [ ] +}, { + "class" : "IgnoreList", + "name" : "kj", + "super" : "km", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "loginType", + "owner" : "kj", + "name" : "q", + "access" : 16, + "descriptor" : "Llx;" + } ], + "methods" : [ { + "method" : "newInstance", + "owner" : "kj", + "name" : "m", + "access" : 0, + "descriptor" : "(I)Ljs;" + }, { + "method" : "newTypedArray", + "owner" : "kj", + "name" : "f", + "access" : 0, + "descriptor" : "(II)[Ljs;" + }, { + "method" : "read", + "owner" : "kj", + "name" : "q", + "access" : 1, + "parameters" : [ "buffer", "n" ], + "descriptor" : "(Lgr;IB)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Llx;)V" + } ] +}, { + "class" : "WallDecoration", + "name" : "eq", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "entity1", + "owner" : "eq", + "name" : "l", + "access" : 1, + "descriptor" : "Lex;" + }, { + "field" : "entity2", + "owner" : "eq", + "name" : "e", + "access" : 1, + "descriptor" : "Lex;" + }, { + "field" : "flags", + "owner" : "eq", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -1164153171 + }, { + "field" : "int7", + "owner" : "eq", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -303827911 + }, { + "field" : "orientation", + "owner" : "eq", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -183359389 + }, { + "field" : "tag", + "owner" : "eq", + "name" : "x", + "access" : 1, + "descriptor" : "J", + "decoder" : 3167575053900974839 + }, { + "field" : "tileHeight", + "owner" : "eq", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1781638945 + }, { + "field" : "x", + "owner" : "eq", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1411967127 + }, { + "field" : "xOffset", + "owner" : "eq", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 1927462659 + }, { + "field" : "y", + "owner" : "eq", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -629971645 + }, { + "field" : "yOffset", + "owner" : "eq", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -1531207607 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "DynamicObject", + "name" : "cf", + "super" : "ex", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "cycleStart", + "owner" : "cf", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -1596313489 + }, { + "field" : "frame", + "owner" : "cf", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -2017547185 + }, { + "field" : "id", + "owner" : "cf", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1369707199 + }, { + "field" : "orientation", + "owner" : "cf", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 141031459 + }, { + "field" : "plane", + "owner" : "cf", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 844945979 + }, { + "field" : "sequenceDefinition", + "owner" : "cf", + "name" : "g", + "access" : 0, + "descriptor" : "Ljh;" + }, { + "field" : "type", + "owner" : "cf", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1713856147 + }, { + "field" : "x", + "owner" : "cf", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -351084819 + }, { + "field" : "y", + "owner" : "cf", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -126308963 + } ], + "methods" : [ { + "method" : "getModel", + "owner" : "cf", + "name" : "e", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)Ldu;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIIIIIIZLex;)V" + } ] +}, { + "class" : "StructDefinition", + "name" : "jq", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "params", + "owner" : "jq", + "name" : "q", + "access" : 0, + "descriptor" : "Llh;" + } ], + "methods" : [ { + "method" : "getIntParam", + "owner" : "jq", + "name" : "o", + "access" : 1, + "descriptor" : "(IIB)I" + }, { + "method" : "getStringParam", + "owner" : "jq", + "name" : "u", + "access" : 1, + "descriptor" : "(ILjava/lang/String;I)Ljava/lang/String;" + }, { + "method" : "init", + "owner" : "jq", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "read", + "owner" : "jq", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "jq", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "SoftWrapper", + "name" : "ef", + "super" : "eu", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "ref", + "owner" : "ef", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/lang/ref/SoftReference;" + } ], + "methods" : [ { + "method" : "get", + "owner" : "ef", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/Object;" + }, { + "method" : "isSoft", + "owner" : "ef", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/Object;I)V" + } ] +}, { + "class" : "DesktopPlatformInfoProvider", + "name" : "lu", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "lm" ], + "fields" : [ ], + "methods" : [ { + "method" : "get", + "owner" : "lu", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Llb;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "GroundItem", + "name" : "ck", + "super" : "ex", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "id", + "owner" : "ck", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 893970699 + }, { + "field" : "quantity", + "owner" : "ck", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 454094667 + } ], + "methods" : [ { + "method" : "getModel", + "owner" : "ck", + "name" : "e", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)Ldu;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "VarpDefinition", + "name" : "ix", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "type", + "owner" : "ix", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : -1792568421 + } ], + "methods" : [ { + "method" : "read", + "owner" : "ix", + "name" : "f", + "access" : 0, + "descriptor" : "(Lgr;B)V" + }, { + "method" : "readNext", + "owner" : "ix", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Rasterizer3D", + "name" : "et", + "super" : "lf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "AttackOption", + "name" : "cj", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "gc" ], + "fields" : [ { + "field" : "id", + "owner" : "cj", + "name" : "o", + "access" : 16, + "descriptor" : "I", + "decoder" : -1461217963 + } ], + "methods" : [ { + "method" : "ordinal", + "owner" : "cj", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(I)V" + } ] +}, { + "class" : "GroundItemPile", + "name" : "dr", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "first", + "owner" : "dr", + "name" : "o", + "access" : 0, + "descriptor" : "Lex;" + }, { + "field" : "height", + "owner" : "dr", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -1659262853 + }, { + "field" : "second", + "owner" : "dr", + "name" : "m", + "access" : 0, + "descriptor" : "Lex;" + }, { + "field" : "tag", + "owner" : "dr", + "name" : "g", + "access" : 0, + "descriptor" : "J", + "decoder" : -3696674445500472687 + }, { + "field" : "third", + "owner" : "dr", + "name" : "u", + "access" : 0, + "descriptor" : "Lex;" + }, { + "field" : "tileHeight", + "owner" : "dr", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -325682933 + }, { + "field" : "x", + "owner" : "dr", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1363136655 + }, { + "field" : "y", + "owner" : "dr", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 968072997 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Font", + "name" : "kk", + "super" : "kt", + "access" : 49, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "drawGlyph", + "owner" : "kk", + "name" : "m", + "access" : 16, + "descriptor" : "([BIIIII)V" + }, { + "method" : "drawGlyphAlpha", + "owner" : "kk", + "name" : "f", + "access" : 16, + "descriptor" : "([BIIIIII)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "([B[I[I[I[I[I[[B)V" + }, { + "access" : 1, + "descriptor" : "([B)V" + } ] +}, { + "class" : "Messages", + "name" : "cw", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "Frames", + "name" : "en", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "frames", + "owner" : "en", + "name" : "m", + "access" : 0, + "descriptor" : "[Ldz;" + } ], + "methods" : [ { + "method" : "hasAlphaTransform", + "owner" : "en", + "name" : "m", + "access" : 1, + "parameters" : [ "frame" ], + "descriptor" : "(II)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Lir;Lir;IZ)V" + } ] +}, { + "class" : "ScriptFrame", + "name" : "bn", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "intLocals", + "owner" : "bn", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "pc", + "owner" : "bn", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1715361849 + }, { + "field" : "script", + "owner" : "bn", + "name" : "m", + "access" : 0, + "descriptor" : "Lcg;" + }, { + "field" : "stringLocals", + "owner" : "bn", + "name" : "w", + "access" : 0, + "descriptor" : "[Ljava/lang/String;" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "GraphicsObject", + "name" : "bw", + "super" : "ex", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "cycleStart", + "owner" : "bw", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1245488067 + }, { + "field" : "frame", + "owner" : "bw", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : 1541221595 + }, { + "field" : "frameCycle", + "owner" : "bw", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -1950327625 + }, { + "field" : "height", + "owner" : "bw", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 1156757009 + }, { + "field" : "id", + "owner" : "bw", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -289084031 + }, { + "field" : "isFinished", + "owner" : "bw", + "name" : "x", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "plane", + "owner" : "bw", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 432847573 + }, { + "field" : "sequenceDefinition", + "owner" : "bw", + "name" : "g", + "access" : 0, + "descriptor" : "Ljh;" + }, { + "field" : "x", + "owner" : "bw", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1189549567 + }, { + "field" : "y", + "owner" : "bw", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 1416438985 + } ], + "methods" : [ { + "method" : "advance", + "owner" : "bw", + "name" : "m", + "access" : 16, + "parameters" : [ "cycles" ], + "descriptor" : "(II)V" + }, { + "method" : "getModel", + "owner" : "bw", + "name" : "e", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)Ldu;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIIIIII)V" + } ] +}, { + "class" : "IndexStoreAction", + "name" : "ik", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "data", + "owner" : "ik", + "name" : "f", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "indexCache", + "owner" : "ik", + "name" : "w", + "access" : 0, + "descriptor" : "Lit;" + }, { + "field" : "indexStore", + "owner" : "ik", + "name" : "q", + "access" : 0, + "descriptor" : "Lff;" + }, { + "field" : "type", + "owner" : "ik", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -1942326733 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Projectile", + "name" : "cb", + "super" : "ex", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "accelerationZ", + "owner" : "cb", + "name" : "y", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "cycleEnd", + "owner" : "cb", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : 2121946763 + }, { + "field" : "cycleStart", + "owner" : "cb", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 358196599 + }, { + "field" : "frame", + "owner" : "cb", + "name" : "r", + "access" : 0, + "descriptor" : "I", + "decoder" : -377214997 + }, { + "field" : "frameCycle", + "owner" : "cb", + "name" : "p", + "access" : 0, + "descriptor" : "I", + "decoder" : -742871951 + }, { + "field" : "id", + "owner" : "cb", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 2111080001 + }, { + "field" : "int3", + "owner" : "cb", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -769539171 + }, { + "field" : "int4", + "owner" : "cb", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -2074328969 + }, { + "field" : "int5", + "owner" : "cb", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -675081925 + }, { + "field" : "isMoving", + "owner" : "cb", + "name" : "k", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "pitch", + "owner" : "cb", + "name" : "b", + "access" : 0, + "descriptor" : "I", + "decoder" : -2072120189 + }, { + "field" : "plane", + "owner" : "cb", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1038876505 + }, { + "field" : "sequenceDefinition", + "owner" : "cb", + "name" : "c", + "access" : 0, + "descriptor" : "Ljh;" + }, { + "field" : "sourceX", + "owner" : "cb", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 1652455041 + }, { + "field" : "sourceY", + "owner" : "cb", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1421996173 + }, { + "field" : "sourceZ", + "owner" : "cb", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -4446033 + }, { + "field" : "speed", + "owner" : "cb", + "name" : "s", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "speedX", + "owner" : "cb", + "name" : "z", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "speedY", + "owner" : "cb", + "name" : "j", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "speedZ", + "owner" : "cb", + "name" : "t", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "targetIndex", + "owner" : "cb", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : 551413977 + }, { + "field" : "x", + "owner" : "cb", + "name" : "n", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "y", + "owner" : "cb", + "name" : "i", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "yaw", + "owner" : "cb", + "name" : "h", + "access" : 0, + "descriptor" : "I", + "decoder" : 1281680175 + }, { + "field" : "z", + "owner" : "cb", + "name" : "a", + "access" : 0, + "descriptor" : "D" + } ], + "methods" : [ { + "method" : "advance", + "owner" : "cb", + "name" : "f", + "access" : 16, + "parameters" : [ "cycles" ], + "descriptor" : "(II)V" + }, { + "method" : "getModel", + "owner" : "cb", + "name" : "e", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)Ldu;" + }, { + "method" : "setDestination", + "owner" : "cb", + "name" : "m", + "access" : 16, + "parameters" : [ "x", "y", "height", "cycle" ], + "descriptor" : "(IIIII)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIIIIIIIIII)V" + } ] +}, { + "class" : "DevicePcmPlayerProvider", + "name" : "az", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "cz" ], + "fields" : [ ], + "methods" : [ { + "method" : "player", + "owner" : "az", + "name" : "m", + "access" : 1, + "descriptor" : "(B)Lco;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ViewportMouse", + "name" : "dm", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "Players", + "name" : "cq", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ ], + "constructors" : [ ] +}, { + "class" : "WorldComparator", + "name" : "u", + "super" : "java.lang.Object", + "access" : 48, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ ], + "methods" : [ { + "method" : "__m_0", + "owner" : "u", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ll;Ll;I)I" + }, { + "method" : "__compare_1", + "owner" : "u", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + }, { + "method" : "__equals_2", + "owner" : "u", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "GrandExchangeEvent", + "name" : "l", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "grandExchangeOffer", + "owner" : "l", + "name" : "q", + "access" : 17, + "descriptor" : "Lx;" + }, { + "field" : "string1", + "owner" : "l", + "name" : "w", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "string2", + "owner" : "l", + "name" : "o", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "world", + "owner" : "l", + "name" : "m", + "access" : 17, + "descriptor" : "I", + "decoder" : -633089807 + }, { + "field" : "__f", + "owner" : "l", + "name" : "f", + "access" : 17, + "descriptor" : "J", + "decoder" : -6503890758391257651 + } ], + "methods" : [ { + "method" : "__m_3", + "owner" : "l", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/lang/String;" + }, { + "method" : "__f_4", + "owner" : "l", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/lang/String;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lgr;BI)V" + } ] +}, { + "class" : "TotalQuantityComparator", + "name" : "e", + "super" : "java.lang.Object", + "access" : 48, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ ], + "methods" : [ { + "method" : "__m_5", + "owner" : "e", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ll;Ll;I)I" + }, { + "method" : "__compare_6", + "owner" : "e", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + }, { + "method" : "__equals_7", + "owner" : "e", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "GrandExchangeOffer", + "name" : "x", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "currentPrice", + "owner" : "x", + "name" : "u", + "access" : 1, + "descriptor" : "I", + "decoder" : 396420073 + }, { + "field" : "currentQuantity", + "owner" : "x", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : 1413132419 + }, { + "field" : "id", + "owner" : "x", + "name" : "f", + "access" : 1, + "descriptor" : "I", + "decoder" : 1136727241 + }, { + "field" : "state", + "owner" : "x", + "name" : "m", + "access" : 0, + "descriptor" : "B" + }, { + "field" : "totalQuantity", + "owner" : "x", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : 562564821 + }, { + "field" : "unitPrice", + "owner" : "x", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : -1627453165 + } ], + "methods" : [ { + "method" : "status", + "owner" : "x", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "type", + "owner" : "x", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__f_8", + "owner" : "x", + "name" : "f", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Integer;I)V" + }, { + "method" : "__o_9", + "owner" : "x", + "name" : "o", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__u_10", + "owner" : "x", + "name" : "u", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + }, { + "access" : 1, + "descriptor" : "(Lgr;Z)V" + } ] +}, { + "class" : "UnitPriceComparator", + "name" : "d", + "super" : "java.lang.Object", + "access" : 48, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ ], + "methods" : [ { + "method" : "__m_11", + "owner" : "d", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ll;Ll;I)I" + }, { + "method" : "__compare_12", + "owner" : "d", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + }, { + "method" : "__equals_13", + "owner" : "d", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapLabelSize", + "name" : "s", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__o", + "owner" : "s", + "name" : "o", + "access" : 16, + "descriptor" : "I", + "decoder" : 707828941 + }, { + "field" : "__u", + "owner" : "s", + "name" : "u", + "access" : 16, + "descriptor" : "I", + "decoder" : -422937451 + }, { + "field" : "__w", + "owner" : "s", + "name" : "w", + "access" : 16, + "descriptor" : "I", + "decoder" : 1252293513 + } ], + "methods" : [ { + "method" : "__f_14", + "owner" : "s", + "name" : "f", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(FI)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(III)V" + } ] +}, { + "class" : "WorldMapIcon1", + "name" : "t", + "super" : "ak", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "label0", + "owner" : "t", + "name" : "f", + "access" : 16, + "descriptor" : "Laj;" + }, { + "field" : "__m", + "owner" : "t", + "name" : "m", + "access" : 16, + "descriptor" : "I", + "decoder" : -1722323621 + }, { + "field" : "__q", + "owner" : "t", + "name" : "q", + "access" : 16, + "descriptor" : "I", + "decoder" : 364253793 + }, { + "field" : "__w", + "owner" : "t", + "name" : "w", + "access" : 16, + "descriptor" : "I", + "decoder" : -362031241 + } ], + "methods" : [ { + "method" : "__m_15", + "owner" : "t", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__f_16", + "owner" : "t", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Laj;" + }, { + "method" : "__q_17", + "owner" : "t", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__w_18", + "owner" : "t", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lhu;Lhu;ILaj;)V" + } ] +}, { + "class" : "WorldMapSection0", + "name" : "y", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "ab" ], + "fields" : [ { + "field" : "__d", + "owner" : "y", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -799353317 + }, { + "field" : "__e", + "owner" : "y", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -1022177315 + }, { + "field" : "__f", + "owner" : "y", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1299225715 + }, { + "field" : "__g", + "owner" : "y", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -150870205 + }, { + "field" : "__i", + "owner" : "y", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : 1345061881 + }, { + "field" : "__k", + "owner" : "y", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : -1388959491 + }, { + "field" : "__l", + "owner" : "y", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : 1009718107 + }, { + "field" : "__m", + "owner" : "y", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -2011838881 + }, { + "field" : "__n", + "owner" : "y", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : -1657956317 + }, { + "field" : "__o", + "owner" : "y", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -671345527 + }, { + "field" : "__q", + "owner" : "y", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 82600709 + }, { + "field" : "__u", + "owner" : "y", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 529427495 + }, { + "field" : "__w", + "owner" : "y", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -477370575 + }, { + "field" : "__x", + "owner" : "y", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -1397517463 + } ], + "methods" : [ { + "method" : "__m_19", + "owner" : "y", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lag;I)V" + }, { + "method" : "__f_20", + "owner" : "y", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIIB)Z" + }, { + "method" : "__q_21", + "owner" : "y", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)Z" + }, { + "method" : "__w_22", + "owner" : "y", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)[I" + }, { + "method" : "__o_23", + "owner" : "y", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)Lhu;" + }, { + "method" : "__u_24", + "owner" : "y", + "name" : "u", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgr;B)V" + }, { + "method" : "__g_25", + "owner" : "y", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapSectionType", + "name" : "h", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "gc" ], + "fields" : [ { + "field" : "id", + "owner" : "h", + "name" : "u", + "access" : 16, + "descriptor" : "B" + }, { + "field" : "type", + "owner" : "h", + "name" : "o", + "access" : 16, + "descriptor" : "I", + "decoder" : 738759853 + } ], + "methods" : [ { + "method" : "__f_26", + "owner" : "h", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IB)V" + } ] +}, { + "class" : "WorldMapIcon2", + "name" : "r", + "super" : "ak", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "label0", + "owner" : "r", + "name" : "w", + "access" : 0, + "descriptor" : "Laj;" + }, { + "field" : "__o", + "owner" : "r", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 927871683 + }, { + "field" : "__q", + "owner" : "r", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -25914375 + }, { + "field" : "__u", + "owner" : "r", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1431936619 + }, { + "field" : "__f", + "owner" : "r", + "name" : "f", + "access" : 16, + "descriptor" : "Lav;" + }, { + "field" : "__m", + "owner" : "r", + "name" : "m", + "access" : 16, + "descriptor" : "I", + "decoder" : -985436813 + } ], + "methods" : [ { + "method" : "__z_27", + "owner" : "r", + "name" : "z", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__m_28", + "owner" : "r", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__f_29", + "owner" : "r", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Laj;" + }, { + "method" : "__q_30", + "owner" : "r", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__w_31", + "owner" : "r", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lhu;Lhu;ILav;)V" + } ] +}, { + "class" : "WorldMapSection3", + "name" : "p", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "ab" ], + "fields" : [ { + "field" : "__e", + "owner" : "p", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : 395786901 + }, { + "field" : "__f", + "owner" : "p", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1622972483 + }, { + "field" : "__g", + "owner" : "p", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 1016557381 + }, { + "field" : "__l", + "owner" : "p", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : 884736611 + }, { + "field" : "__m", + "owner" : "p", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1389733201 + }, { + "field" : "__o", + "owner" : "p", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 1257151629 + }, { + "field" : "__q", + "owner" : "p", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 702057599 + }, { + "field" : "__u", + "owner" : "p", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1351623663 + }, { + "field" : "__w", + "owner" : "p", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -1068088609 + }, { + "field" : "__x", + "owner" : "p", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -627081155 + } ], + "methods" : [ { + "method" : "__m_32", + "owner" : "p", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lag;I)V" + }, { + "method" : "__f_33", + "owner" : "p", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIIB)Z" + }, { + "method" : "__q_34", + "owner" : "p", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)Z" + }, { + "method" : "__w_35", + "owner" : "p", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)[I" + }, { + "method" : "__o_36", + "owner" : "p", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)Lhu;" + }, { + "method" : "__u_37", + "owner" : "p", + "name" : "u", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgr;B)V" + }, { + "method" : "__g_38", + "owner" : "p", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapArea", + "name" : "ag", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "archiveName0", + "owner" : "ag", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "id0", + "owner" : "ag", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1232579503 + }, { + "field" : "isMain0", + "owner" : "ag", + "name" : "d", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "maxX0", + "owner" : "ag", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : 225384859 + }, { + "field" : "maxY0", + "owner" : "ag", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : 1025105175 + }, { + "field" : "minX0", + "owner" : "ag", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 1238532539 + }, { + "field" : "minY0", + "owner" : "ag", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : 963380367 + }, { + "field" : "name0", + "owner" : "ag", + "name" : "q", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "origin0", + "owner" : "ag", + "name" : "u", + "access" : 0, + "descriptor" : "Lhu;" + }, { + "field" : "sections", + "owner" : "ag", + "name" : "k", + "access" : 0, + "descriptor" : "Ljava/util/LinkedList;" + }, { + "field" : "zoom0", + "owner" : "ag", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 196514055 + }, { + "field" : "__w", + "owner" : "ag", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 986239133 + } ], + "methods" : [ { + "method" : "archiveName", + "owner" : "ag", + "name" : "x", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Ljava/lang/String;" + }, { + "method" : "containsCoord", + "owner" : "ag", + "name" : "q", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(IIII)Z" + }, { + "method" : "containsPosition", + "owner" : "ag", + "name" : "w", + "access" : 1, + "parameters" : [ "x", "y" ], + "descriptor" : "(III)Z" + }, { + "method" : "coord", + "owner" : "ag", + "name" : "u", + "access" : 1, + "parameters" : [ "x", "y" ], + "descriptor" : "(III)Lhu;" + }, { + "method" : "id", + "owner" : "ag", + "name" : "l", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "isMain", + "owner" : "ag", + "name" : "e", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "maxX", + "owner" : "ag", + "name" : "s", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "maxY", + "owner" : "ag", + "name" : "y", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "minX", + "owner" : "ag", + "name" : "j", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "minY", + "owner" : "ag", + "name" : "t", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "name", + "owner" : "ag", + "name" : "d", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Ljava/lang/String;" + }, { + "method" : "origin", + "owner" : "ag", + "name" : "p", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Lhu;" + }, { + "method" : "originPlane", + "owner" : "ag", + "name" : "b", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "originX", + "owner" : "ag", + "name" : "h", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "originY", + "owner" : "ag", + "name" : "c", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "position", + "owner" : "ag", + "name" : "o", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(IIII)[I" + }, { + "method" : "read", + "owner" : "ag", + "name" : "m", + "access" : 1, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "readWorldMapSection", + "owner" : "ag", + "name" : "f", + "access" : 0, + "descriptor" : "(Lgr;S)Lab;" + }, { + "method" : "setBounds", + "owner" : "ag", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "zoom", + "owner" : "ag", + "name" : "z", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__a_39", + "owner" : "ag", + "name" : "a", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapRegion", + "name" : "av", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "fonts", + "owner" : "av", + "name" : "i", + "access" : 16, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "iconsList", + "owner" : "av", + "name" : "k", + "access" : 0, + "descriptor" : "Ljava/util/List;" + }, { + "field" : "iconsMap", + "owner" : "av", + "name" : "n", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "x", + "owner" : "av", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1061363609 + }, { + "field" : "y", + "owner" : "av", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 2099407363 + }, { + "field" : "__d", + "owner" : "av", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : 415972873 + }, { + "field" : "__x", + "owner" : "av", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -120515153 + }, { + "field" : "__e", + "owner" : "av", + "name" : "e", + "access" : 0, + "descriptor" : "Ljava/util/LinkedList;" + } ], + "methods" : [ { + "method" : "icons", + "owner" : "av", + "name" : "at", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Ljava/util/List;" + }, { + "method" : "__w_40", + "owner" : "av", + "name" : "w", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIIB)V" + }, { + "method" : "__u_41", + "owner" : "av", + "name" : "u", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/util/HashSet;Ljava/util/List;B)V" + }, { + "method" : "__e_42", + "owner" : "av", + "name" : "e", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__x_43", + "owner" : "av", + "name" : "x", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/util/List;I)V" + }, { + "method" : "__d_44", + "owner" : "av", + "name" : "d", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__a_45", + "owner" : "av", + "name" : "a", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lir;B)Z" + }, { + "method" : "__j_46", + "owner" : "av", + "name" : "j", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIILjava/util/HashSet;I)V" + }, { + "method" : "__s_47", + "owner" : "av", + "name" : "s", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(Ljava/util/HashSet;IIB)V" + }, { + "method" : "__aq_48", + "owner" : "av", + "name" : "aq", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IILjava/util/HashSet;IB)V" + }, { + "method" : "__aj_49", + "owner" : "av", + "name" : "aj", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(Ljava/util/HashSet;III)V" + }, { + "method" : "__av_50", + "owner" : "av", + "name" : "av", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(Lic;IIIIB)V" + }, { + "method" : "__ar_51", + "owner" : "av", + "name" : "ar", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(Lak;IIFI)V" + }, { + "method" : "__ac_52", + "owner" : "av", + "name" : "ac", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(Lic;III)V" + }, { + "method" : "__ay_53", + "owner" : "av", + "name" : "ay", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(Lak;Lic;IIFI)V" + }, { + "method" : "__ah_54", + "owner" : "av", + "name" : "ah", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IILjava/util/HashSet;IB)V" + }, { + "method" : "__al_55", + "owner" : "av", + "name" : "al", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)Laj;" + }, { + "method" : "__ab_56", + "owner" : "av", + "name" : "ab", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lic;B)Laj;" + }, { + "method" : "__ae_57", + "owner" : "av", + "name" : "ae", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(IIIIII)Ljava/util/List;" + }, { + "method" : "__ad_58", + "owner" : "av", + "name" : "ad", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIIII)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIILjava/util/HashMap;)V" + } ] +}, { + "class" : "WorldMapSection2", + "name" : "ah", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "ab" ], + "fields" : [ { + "field" : "__f", + "owner" : "ah", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -245382089 + }, { + "field" : "__m", + "owner" : "ah", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -1561552223 + }, { + "field" : "__o", + "owner" : "ah", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 982234927 + }, { + "field" : "__q", + "owner" : "ah", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1024859679 + }, { + "field" : "__u", + "owner" : "ah", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1272330125 + }, { + "field" : "__w", + "owner" : "ah", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 40495485 + } ], + "methods" : [ { + "method" : "__m_59", + "owner" : "ah", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lag;I)V" + }, { + "method" : "__f_60", + "owner" : "ah", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIIB)Z" + }, { + "method" : "__q_61", + "owner" : "ah", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)Z" + }, { + "method" : "__w_62", + "owner" : "ah", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)[I" + }, { + "method" : "__o_63", + "owner" : "ah", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)Lhu;" + }, { + "method" : "__u_64", + "owner" : "ah", + "name" : "u", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgr;B)V" + }, { + "method" : "__g_65", + "owner" : "ah", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "AbstractWorldMapIcon", + "name" : "ak", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "coord1", + "owner" : "ak", + "name" : "l", + "access" : 17, + "descriptor" : "Lhu;" + }, { + "field" : "coord2", + "owner" : "ak", + "name" : "g", + "access" : 17, + "descriptor" : "Lhu;" + }, { + "field" : "__e", + "owner" : "ak", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -521086143 + }, { + "field" : "__x", + "owner" : "ak", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -1065362217 + } ], + "methods" : [ { + "method" : "element", + "owner" : "ak", + "name" : "m", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "label", + "owner" : "ak", + "name" : "f", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "(I)Laj;" + }, { + "method" : "__y_66", + "owner" : "ak", + "name" : "y", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)Z" + }, { + "method" : "__h_67", + "owner" : "ak", + "name" : "h", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__b_68", + "owner" : "ak", + "name" : "b", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)Z" + }, { + "method" : "__c_69", + "owner" : "ak", + "name" : "c", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)Z" + }, { + "method" : "__w_70", + "owner" : "ak", + "name" : "w", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__q_71", + "owner" : "ak", + "name" : "q", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lhu;Lhu;)V" + } ] +}, { + "class" : "WorldMapManager", + "name" : "al", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "fonts", + "owner" : "al", + "name" : "d", + "access" : 16, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "icons", + "owner" : "al", + "name" : "o", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "isLoaded0", + "owner" : "al", + "name" : "m", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "loadStarted", + "owner" : "al", + "name" : "f", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "mapAreaData", + "owner" : "al", + "name" : "q", + "access" : 0, + "descriptor" : "Lae;" + }, { + "field" : "mapSceneSprites", + "owner" : "al", + "name" : "l", + "access" : 0, + "descriptor" : "[Llq;" + }, { + "field" : "overviewSprite", + "owner" : "al", + "name" : "w", + "access" : 0, + "descriptor" : "Lln;" + }, { + "field" : "regions", + "owner" : "al", + "name" : "u", + "access" : 0, + "descriptor" : "[[Lav;" + }, { + "field" : "__a", + "owner" : "al", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : -395718741 + }, { + "field" : "__i", + "owner" : "al", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : 1729323633 + }, { + "field" : "__k", + "owner" : "al", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : -1459928419 + }, { + "field" : "__n", + "owner" : "al", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : 1364441271 + }, { + "field" : "__g", + "owner" : "al", + "name" : "g", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "__e", + "owner" : "al", + "name" : "e", + "access" : 16, + "descriptor" : "Lir;" + }, { + "field" : "__x", + "owner" : "al", + "name" : "x", + "access" : 16, + "descriptor" : "Lir;" + }, { + "field" : "__z", + "owner" : "al", + "name" : "z", + "access" : 1, + "descriptor" : "I", + "decoder" : 1085359673 + } ], + "methods" : [ { + "method" : "buildIcons", + "owner" : "al", + "name" : "e", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/util/HashMap;" + }, { + "method" : "buildIcons0", + "owner" : "al", + "name" : "x", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "clearIcons", + "owner" : "al", + "name" : "f", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "drawOverview", + "owner" : "al", + "name" : "o", + "access" : 1, + "descriptor" : "(IIIILjava/util/HashSet;III)V" + }, { + "method" : "isLoaded", + "owner" : "al", + "name" : "l", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "load", + "owner" : "al", + "name" : "m", + "access" : 1, + "parameters" : [ "indexCache", "cacheName", "isMembersWorld" ], + "descriptor" : "(Lir;Ljava/lang/String;ZB)V" + }, { + "method" : "__q_72", + "owner" : "al", + "name" : "q", + "access" : 17, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7" ], + "descriptor" : "(IIIIIIIII)V" + }, { + "method" : "__w_73", + "owner" : "al", + "name" : "w", + "access" : 17, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "arg9", "arg10", "arg11", "arg12" ], + "descriptor" : "(IIIIIIIILjava/util/HashSet;Ljava/util/HashSet;IIZB)V" + }, { + "method" : "__u_74", + "owner" : "al", + "name" : "u", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "arg9" ], + "descriptor" : "(IIIIIIIIIII)Ljava/util/List;" + }, { + "method" : "__d_75", + "owner" : "al", + "name" : "d", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)F" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "([Llq;Ljava/util/HashMap;Lir;Lir;)V" + } ] +}, { + "class" : "WorldMapAreaData", + "name" : "ae", + "super" : "ag", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__i", + "owner" : "ae", + "name" : "i", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "__n", + "owner" : "ae", + "name" : "n", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "__a", + "owner" : "ae", + "name" : "a", + "access" : 0, + "descriptor" : "Ljava/util/List;" + } ], + "methods" : [ { + "method" : "__ce_76", + "owner" : "ae", + "name" : "ce", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(Lgr;Lgr;IZI)V" + }, { + "method" : "__cy_77", + "owner" : "ae", + "name" : "cy", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lgr;ZB)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "WorldMapSection1", + "name" : "as", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "ab" ], + "fields" : [ { + "field" : "__e", + "owner" : "as", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -1797724181 + }, { + "field" : "__f", + "owner" : "as", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1483447179 + }, { + "field" : "__g", + "owner" : "as", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 1526007343 + }, { + "field" : "__l", + "owner" : "as", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -890169045 + }, { + "field" : "__m", + "owner" : "as", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -1971304641 + }, { + "field" : "__o", + "owner" : "as", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -1513010233 + }, { + "field" : "__q", + "owner" : "as", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1875803617 + }, { + "field" : "__u", + "owner" : "as", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1383826035 + }, { + "field" : "__w", + "owner" : "as", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 284566685 + }, { + "field" : "__x", + "owner" : "as", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : 325777555 + } ], + "methods" : [ { + "method" : "__m_78", + "owner" : "as", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lag;I)V" + }, { + "method" : "__f_79", + "owner" : "as", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIIB)Z" + }, { + "method" : "__q_80", + "owner" : "as", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)Z" + }, { + "method" : "__w_81", + "owner" : "as", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)[I" + }, { + "method" : "__o_82", + "owner" : "as", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)Lhu;" + }, { + "method" : "__u_83", + "owner" : "as", + "name" : "u", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgr;B)V" + }, { + "method" : "__g_84", + "owner" : "as", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "MouseWheelHandler", + "name" : "am", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ "fv", "java.awt.event.MouseWheelListener" ], + "fields" : [ { + "field" : "rotation", + "owner" : "am", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -182252389 + } ], + "methods" : [ { + "method" : "addTo", + "owner" : "am", + "name" : "m", + "access" : 0, + "parameters" : [ "component" ], + "descriptor" : "(Ljava/awt/Component;B)V" + }, { + "method" : "removeFrom", + "owner" : "am", + "name" : "f", + "access" : 0, + "parameters" : [ "component" ], + "descriptor" : "(Ljava/awt/Component;I)V" + }, { + "method" : "useRotation", + "owner" : "am", + "name" : "q", + "access" : 33, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__mouseWheelMoved_85", + "owner" : "am", + "name" : "mouseWheelMoved", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/MouseWheelEvent;)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "KeyHandler", + "name" : "an", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ "java.awt.event.KeyListener", "java.awt.event.FocusListener" ], + "fields" : [ ], + "methods" : [ { + "method" : "keyPressed", + "owner" : "an", + "name" : "keyPressed", + "access" : 49, + "parameters" : [ "ke" ], + "descriptor" : "(Ljava/awt/event/KeyEvent;)V" + }, { + "method" : "__keyReleased_86", + "owner" : "an", + "name" : "keyReleased", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/KeyEvent;)V" + }, { + "method" : "__keyTyped_87", + "owner" : "an", + "name" : "keyTyped", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/KeyEvent;)V" + }, { + "method" : "__focusGained_88", + "owner" : "an", + "name" : "focusGained", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/FocusEvent;)V" + }, { + "method" : "__focusLost_89", + "owner" : "an", + "name" : "focusLost", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/FocusEvent;)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "GameShell", + "name" : "ba", + "super" : "java.applet.Applet", + "access" : 1057, + "interfaces" : [ "java.lang.Runnable", "java.awt.event.FocusListener", "java.awt.event.WindowListener" ], + "fields" : [ { + "field" : "canvas", + "owner" : "ba", + "name" : "ay", + "access" : 0, + "descriptor" : "Ljava/awt/Canvas;" + }, { + "field" : "canvasSetTimeMs", + "owner" : "ba", + "name" : "ae", + "access" : 64, + "descriptor" : "J", + "decoder" : 956221087975405011 + }, { + "field" : "canvasX", + "owner" : "ba", + "name" : "b", + "access" : 0, + "descriptor" : "I", + "decoder" : 781373219 + }, { + "field" : "canvasY", + "owner" : "ba", + "name" : "c", + "access" : 0, + "descriptor" : "I", + "decoder" : 198681537 + }, { + "field" : "clipboard", + "owner" : "ba", + "name" : "as", + "access" : 0, + "descriptor" : "Ljava/awt/datatransfer/Clipboard;" + }, { + "field" : "contentHeight", + "owner" : "ba", + "name" : "h", + "access" : 4, + "descriptor" : "I", + "decoder" : -628781469 + }, { + "field" : "contentHeight0", + "owner" : "ba", + "name" : "ag", + "access" : 0, + "descriptor" : "I", + "decoder" : -2057041525 + }, { + "field" : "contentWidth", + "owner" : "ba", + "name" : "t", + "access" : 4, + "descriptor" : "I", + "decoder" : -1854329683 + }, { + "field" : "contentWidth0", + "owner" : "ba", + "name" : "v", + "access" : 0, + "descriptor" : "I", + "decoder" : 740831949 + }, { + "field" : "eventQueue", + "owner" : "ba", + "name" : "am", + "access" : 16, + "descriptor" : "Ljava/awt/EventQueue;" + }, { + "field" : "frame", + "owner" : "ba", + "name" : "ac", + "access" : 0, + "descriptor" : "Ljava/awt/Frame;" + }, { + "field" : "hasErrored", + "owner" : "ba", + "name" : "g", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "isCanvasInvalid", + "owner" : "ba", + "name" : "ab", + "access" : 64, + "descriptor" : "Z" + }, { + "field" : "mouseWheelHandler", + "owner" : "ba", + "name" : "ap", + "access" : 0, + "descriptor" : "Lam;" + }, { + "field" : "stopTimeMs", + "owner" : "ba", + "name" : "o", + "access" : 8, + "descriptor" : "J", + "decoder" : 5666519919949401915 + }, { + "field" : "__al", + "owner" : "ba", + "name" : "al", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__aj", + "owner" : "ba", + "name" : "aj", + "access" : 0, + "descriptor" : "I", + "decoder" : 1911308233 + }, { + "field" : "__aq", + "owner" : "ba", + "name" : "aq", + "access" : 0, + "descriptor" : "I", + "decoder" : -2071955075 + }, { + "field" : "__ah", + "owner" : "ba", + "name" : "ah", + "access" : 64, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "addCanvas", + "owner" : "ba", + "name" : "aq", + "access" : 48, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "checkHost", + "owner" : "ba", + "name" : "aj", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "clearBackground", + "owner" : "ba", + "name" : "p", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "clipboardSetString", + "owner" : "ba", + "name" : "x", + "access" : 4, + "parameters" : [ "s" ], + "descriptor" : "(Ljava/lang/String;I)V" + }, { + "method" : "container", + "owner" : "ba", + "name" : "as", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Ljava/awt/Container;" + }, { + "method" : "drawInitial", + "owner" : "ba", + "name" : "at", + "access" : 20, + "descriptor" : "(ILjava/lang/String;ZB)V" + }, { + "method" : "error", + "owner" : "ba", + "name" : "ap", + "access" : 4, + "parameters" : [ "type" ], + "descriptor" : "(Ljava/lang/String;B)V" + }, { + "method" : "focusGained", + "owner" : "ba", + "name" : "focusGained", + "access" : 17, + "descriptor" : "(Ljava/awt/event/FocusEvent;)V" + }, { + "method" : "getFrameContentBounds", + "owner" : "ba", + "name" : "am", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Lla;" + }, { + "method" : "hasFrame", + "owner" : "ba", + "name" : "an", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "kill", + "owner" : "ba", + "name" : "ah", + "access" : 48, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "kill0", + "owner" : "ba", + "name" : "ae", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "mouseWheel", + "owner" : "ba", + "name" : "l", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(B)Lfv;" + }, { + "method" : "paint", + "owner" : "ba", + "name" : "paint", + "access" : 49, + "parameters" : [ "g" ], + "descriptor" : "(Ljava/awt/Graphics;)V" + }, { + "method" : "replaceCanvas", + "owner" : "ba", + "name" : "v", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "run", + "owner" : "ba", + "name" : "run", + "access" : 1, + "descriptor" : "()V" + }, { + "method" : "setUp", + "owner" : "ba", + "name" : "aw", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "setUpClipboard", + "owner" : "ba", + "name" : "e", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "setUpKeyboard", + "owner" : "ba", + "name" : "d", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "setUpMouse", + "owner" : "ba", + "name" : "a", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "startThread", + "owner" : "ba", + "name" : "ag", + "access" : 20, + "parameters" : [ "width", "height", "revision" ], + "descriptor" : "(IIII)V" + }, { + "method" : "update", + "owner" : "ba", + "name" : "update", + "access" : 17, + "parameters" : [ "g" ], + "descriptor" : "(Ljava/awt/Graphics;)V" + }, { + "method" : "__u_90", + "owner" : "ba", + "name" : "u", + "access" : 20, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)V" + }, { + "method" : "__g_91", + "owner" : "ba", + "name" : "g", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;I)V" + }, { + "method" : "__z_92", + "owner" : "ba", + "name" : "z", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__av_93", + "owner" : "ba", + "name" : "av", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__ar_94", + "owner" : "ba", + "name" : "ar", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__ac_95", + "owner" : "ba", + "name" : "ac", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__ay_96", + "owner" : "ba", + "name" : "ay", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__start_97", + "owner" : "ba", + "name" : "start", + "access" : 17, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__stop_98", + "owner" : "ba", + "name" : "stop", + "access" : 17, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__destroy_99", + "owner" : "ba", + "name" : "destroy", + "access" : 17, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__focusLost_100", + "owner" : "ba", + "name" : "focusLost", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/FocusEvent;)V" + }, { + "method" : "__windowActivated_101", + "owner" : "ba", + "name" : "windowActivated", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/WindowEvent;)V" + }, { + "method" : "__windowClosed_102", + "owner" : "ba", + "name" : "windowClosed", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/WindowEvent;)V" + }, { + "method" : "__windowClosing_103", + "owner" : "ba", + "name" : "windowClosing", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/WindowEvent;)V" + }, { + "method" : "__windowDeactivated_104", + "owner" : "ba", + "name" : "windowDeactivated", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/WindowEvent;)V" + }, { + "method" : "__windowDeiconified_105", + "owner" : "ba", + "name" : "windowDeiconified", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/WindowEvent;)V" + }, { + "method" : "__windowIconified_106", + "owner" : "ba", + "name" : "windowIconified", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/WindowEvent;)V" + }, { + "method" : "__windowOpened_107", + "owner" : "ba", + "name" : "windowOpened", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/WindowEvent;)V" + }, { + "method" : "__ad_108", + "owner" : "ba", + "name" : "ad", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__init_109", + "owner" : "ba", + "name" : "init", + "access" : 1025, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__au_110", + "owner" : "ba", + "name" : "au", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__al_111", + "owner" : "ba", + "name" : "al", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__ab_112", + "owner" : "ba", + "name" : "ab", + "access" : 1028, + "parameters" : [ "arg0" ], + "descriptor" : "(ZI)V" + }, { + "method" : "__j_113", + "owner" : "ba", + "name" : "j", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 4, + "descriptor" : "()V" + } ] +}, { + "class" : "MouseHandler", + "name" : "bb", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.awt.event.MouseListener", "java.awt.event.MouseMotionListener", "java.awt.event.FocusListener" ], + "fields" : [ ], + "methods" : [ { + "method" : "getButton", + "owner" : "bb", + "name" : "f", + "access" : 16, + "parameters" : [ "mouseEvent" ], + "descriptor" : "(Ljava/awt/event/MouseEvent;I)I" + }, { + "method" : "mouseMoved", + "owner" : "bb", + "name" : "mouseMoved", + "access" : 49, + "descriptor" : "(Ljava/awt/event/MouseEvent;)V" + }, { + "method" : "mousePressed", + "owner" : "bb", + "name" : "mousePressed", + "access" : 49, + "descriptor" : "(Ljava/awt/event/MouseEvent;)V" + }, { + "method" : "__mouseReleased_114", + "owner" : "bb", + "name" : "mouseReleased", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/MouseEvent;)V" + }, { + "method" : "__mouseClicked_115", + "owner" : "bb", + "name" : "mouseClicked", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/MouseEvent;)V" + }, { + "method" : "__mouseEntered_116", + "owner" : "bb", + "name" : "mouseEntered", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/MouseEvent;)V" + }, { + "method" : "__mouseExited_117", + "owner" : "bb", + "name" : "mouseExited", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/MouseEvent;)V" + }, { + "method" : "__mouseDragged_118", + "owner" : "bb", + "name" : "mouseDragged", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/MouseEvent;)V" + }, { + "method" : "__focusGained_119", + "owner" : "bb", + "name" : "focusGained", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/FocusEvent;)V" + }, { + "method" : "__focusLost_120", + "owner" : "bb", + "name" : "focusLost", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/awt/event/FocusEvent;)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "SecureRandomCallable", + "name" : "bk", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.concurrent.Callable" ], + "fields" : [ ], + "methods" : [ { + "method" : "__call_121", + "owner" : "bk", + "name" : "call", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/Object;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "IndexCacheLoader", + "name" : "bd", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "indexCache", + "owner" : "bd", + "name" : "f", + "access" : 16, + "descriptor" : "Lit;" + }, { + "field" : "__w", + "owner" : "bd", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 782003089 + }, { + "field" : "__q", + "owner" : "bd", + "name" : "q", + "access" : 16, + "descriptor" : "I", + "decoder" : 1459455501 + } ], + "methods" : [ { + "method" : "__m_122", + "owner" : "bd", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lit;Ljava/lang/String;)V" + } ] +}, { + "class" : "ScriptEvent", + "name" : "by", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "args0", + "owner" : "by", + "name" : "m", + "access" : 0, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "boolean1", + "owner" : "by", + "name" : "f", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "dragTarget", + "owner" : "by", + "name" : "g", + "access" : 0, + "descriptor" : "Lho;" + }, { + "field" : "keyPressed", + "owner" : "by", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : 327085889 + }, { + "field" : "keyTyped", + "owner" : "by", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -1330602393 + }, { + "field" : "mouseX", + "owner" : "by", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 488198377 + }, { + "field" : "mouseY", + "owner" : "by", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 95719815 + }, { + "field" : "opIndex", + "owner" : "by", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1089993721 + }, { + "field" : "targetName", + "owner" : "by", + "name" : "x", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "type0", + "owner" : "by", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : -161292529 + }, { + "field" : "widget", + "owner" : "by", + "name" : "q", + "access" : 0, + "descriptor" : "Lho;" + }, { + "field" : "__d", + "owner" : "by", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -2138736593 + } ], + "methods" : [ { + "method" : "setArgs", + "owner" : "by", + "name" : "m", + "access" : 1, + "parameters" : [ "args" ], + "descriptor" : "([Ljava/lang/Object;I)V" + }, { + "method" : "setType", + "owner" : "by", + "name" : "f", + "access" : 1, + "parameters" : [ "type" ], + "descriptor" : "(IB)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "MouseRecorder", + "name" : "bu", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ { + "field" : "index", + "owner" : "bu", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 973045825 + }, { + "field" : "isRunning", + "owner" : "bu", + "name" : "m", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "lock", + "owner" : "bu", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/lang/Object;" + }, { + "field" : "millis", + "owner" : "bu", + "name" : "u", + "access" : 0, + "descriptor" : "[J" + }, { + "field" : "xs", + "owner" : "bu", + "name" : "w", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "ys", + "owner" : "bu", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "__run_123", + "owner" : "bu", + "name" : "run", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Player", + "name" : "br", + "super" : "bz", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "actions", + "owner" : "br", + "name" : "u", + "access" : 0, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "animationCycleEnd", + "owner" : "br", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -359981047 + }, { + "field" : "animationCycleStart", + "owner" : "br", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -351876137 + }, { + "field" : "appearance", + "owner" : "br", + "name" : "f", + "access" : 0, + "descriptor" : "Lhi;" + }, { + "field" : "combatLevel", + "owner" : "br", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 984869133 + }, { + "field" : "headIconPk", + "owner" : "br", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 2021372599 + }, { + "field" : "headIconPrayer", + "owner" : "br", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -793415473 + }, { + "field" : "index", + "owner" : "br", + "name" : "r", + "access" : 0, + "descriptor" : "I", + "decoder" : 1486240677 + }, { + "field" : "isFriend", + "owner" : "br", + "name" : "p", + "access" : 0, + "descriptor" : "Lkd;" + }, { + "field" : "isHidden", + "owner" : "br", + "name" : "b", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "isInClanChat", + "owner" : "br", + "name" : "v", + "access" : 0, + "descriptor" : "Lkd;" + }, { + "field" : "isUnanimated", + "owner" : "br", + "name" : "y", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "model0", + "owner" : "br", + "name" : "a", + "access" : 0, + "descriptor" : "Ldu;" + }, { + "field" : "plane", + "owner" : "br", + "name" : "c", + "access" : 0, + "descriptor" : "I", + "decoder" : 1332604413 + }, { + "field" : "skillLevel", + "owner" : "br", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -1136542281 + }, { + "field" : "team", + "owner" : "br", + "name" : "h", + "access" : 0, + "descriptor" : "I", + "decoder" : 91041167 + }, { + "field" : "tileHeight", + "owner" : "br", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : 1989338999 + }, { + "field" : "tileHeight2", + "owner" : "br", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : -1624108131 + }, { + "field" : "tileX", + "owner" : "br", + "name" : "aq", + "access" : 0, + "descriptor" : "I", + "decoder" : -539678769 + }, { + "field" : "tileY", + "owner" : "br", + "name" : "aj", + "access" : 0, + "descriptor" : "I", + "decoder" : 702193221 + }, { + "field" : "username", + "owner" : "br", + "name" : "m", + "access" : 0, + "descriptor" : "Lkp;" + }, { + "field" : "__ag", + "owner" : "br", + "name" : "ag", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__i", + "owner" : "br", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : -1771431457 + }, { + "field" : "__j", + "owner" : "br", + "name" : "j", + "access" : 0, + "descriptor" : "I", + "decoder" : 224552403 + }, { + "field" : "__k", + "owner" : "br", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : 665272587 + }, { + "field" : "__s", + "owner" : "br", + "name" : "s", + "access" : 0, + "descriptor" : "I", + "decoder" : 305969541 + }, { + "field" : "__t", + "owner" : "br", + "name" : "t", + "access" : 0, + "descriptor" : "I", + "decoder" : 892671055 + }, { + "field" : "__z", + "owner" : "br", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : 1610462047 + } ], + "methods" : [ { + "method" : "getModel", + "owner" : "br", + "name" : "e", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)Ldu;" + }, { + "method" : "isVisible", + "owner" : "br", + "name" : "z", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "read", + "owner" : "br", + "name" : "m", + "access" : 16, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "resetPath", + "owner" : "br", + "name" : "d", + "access" : 0, + "parameters" : [ "x", "y" ], + "descriptor" : "(III)V" + }, { + "method" : "transformedSize", + "owner" : "br", + "name" : "l", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__f_124", + "owner" : "br", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__q_125", + "owner" : "br", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__w_126", + "owner" : "br", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__o_127", + "owner" : "br", + "name" : "o", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__u_128", + "owner" : "br", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__g_129", + "owner" : "br", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__x_130", + "owner" : "br", + "name" : "x", + "access" : 16, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIBI)V" + }, { + "method" : "__a_131", + "owner" : "br", + "name" : "a", + "access" : 16, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIBI)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "OwnWorldComparator", + "name" : "bj", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ { + "field" : "__m", + "owner" : "bj", + "name" : "m", + "access" : 0, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_132", + "owner" : "bj", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ll;Ll;B)I" + }, { + "method" : "__compare_133", + "owner" : "bj", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + }, { + "method" : "__equals_134", + "owner" : "bj", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Actor", + "name" : "bz", + "super" : "ex", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "defaultHeight", + "owner" : "bz", + "name" : "cy", + "access" : 0, + "descriptor" : "I", + "decoder" : 1003085333 + }, { + "field" : "false0", + "owner" : "bz", + "name" : "bd", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "healthBars", + "owner" : "bz", + "name" : "bn", + "access" : 0, + "descriptor" : "Lja;" + }, { + "field" : "heightOffset", + "owner" : "bz", + "name" : "bp", + "access" : 0, + "descriptor" : "I", + "decoder" : -779457309 + }, { + "field" : "hitSplatCount", + "owner" : "bz", + "name" : "af", + "access" : 0, + "descriptor" : "B" + }, { + "field" : "hitSplatCycles", + "owner" : "bz", + "name" : "bb", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "hitSplatTypes", + "owner" : "bz", + "name" : "ai", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "hitSplatTypes2", + "owner" : "bz", + "name" : "bs", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "hitSplatValues", + "owner" : "bz", + "name" : "ba", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "hitSplatValues2", + "owner" : "bz", + "name" : "bq", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "idleSequence", + "owner" : "bz", + "name" : "aw", + "access" : 0, + "descriptor" : "I", + "decoder" : -299122235 + }, { + "field" : "isAutoChatting", + "owner" : "bz", + "name" : "an", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "movementFrame", + "owner" : "bz", + "name" : "bx", + "access" : 0, + "descriptor" : "I", + "decoder" : -1119758739 + }, { + "field" : "movementFrameCycle", + "owner" : "bz", + "name" : "by", + "access" : 0, + "descriptor" : "I", + "decoder" : -1646413227 + }, { + "field" : "movementSequence", + "owner" : "bz", + "name" : "bo", + "access" : 0, + "descriptor" : "I", + "decoder" : 1614854211 + }, { + "field" : "npcCycle", + "owner" : "bz", + "name" : "ce", + "access" : 0, + "descriptor" : "I", + "decoder" : 2051334073 + }, { + "field" : "orientation", + "owner" : "bz", + "name" : "cs", + "access" : 0, + "descriptor" : "I", + "decoder" : -1189634367 + }, { + "field" : "overheadText", + "owner" : "bz", + "name" : "am", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "overheadTextColor", + "owner" : "bz", + "name" : "ao", + "access" : 0, + "descriptor" : "I", + "decoder" : -1905191799 + }, { + "field" : "overheadTextCyclesRemaining", + "owner" : "bz", + "name" : "au", + "access" : 0, + "descriptor" : "I", + "decoder" : 137508815 + }, { + "field" : "overheadTextEffect", + "owner" : "bz", + "name" : "aa", + "access" : 0, + "descriptor" : "I", + "decoder" : 541000549 + }, { + "field" : "pathLength", + "owner" : "bz", + "name" : "cu", + "access" : 0, + "descriptor" : "I", + "decoder" : -2033082375 + }, { + "field" : "pathTraversed", + "owner" : "bz", + "name" : "cn", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "pathX", + "owner" : "bz", + "name" : "cb", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "pathY", + "owner" : "bz", + "name" : "ck", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "playerCycle", + "owner" : "bz", + "name" : "ak", + "access" : 0, + "descriptor" : "I", + "decoder" : 141226463 + }, { + "field" : "runSequence", + "owner" : "bz", + "name" : "as", + "access" : 0, + "descriptor" : "I", + "decoder" : 1708570917 + }, { + "field" : "sequence", + "owner" : "bz", + "name" : "bu", + "access" : 0, + "descriptor" : "I", + "decoder" : 323216015 + }, { + "field" : "sequenceDelay", + "owner" : "bz", + "name" : "br", + "access" : 0, + "descriptor" : "I", + "decoder" : -134491649 + }, { + "field" : "sequenceFrame", + "owner" : "bz", + "name" : "bm", + "access" : 0, + "descriptor" : "I", + "decoder" : 1425662251 + }, { + "field" : "sequenceFrameCycle", + "owner" : "bz", + "name" : "bl", + "access" : 0, + "descriptor" : "I", + "decoder" : -1753867715 + }, { + "field" : "size", + "owner" : "bz", + "name" : "ah", + "access" : 0, + "descriptor" : "I", + "decoder" : -1357622739 + }, { + "field" : "spotAnimation", + "owner" : "bz", + "name" : "bi", + "access" : 0, + "descriptor" : "I", + "decoder" : -220610999 + }, { + "field" : "spotAnimationFrame", + "owner" : "bz", + "name" : "bz", + "access" : 0, + "descriptor" : "I", + "decoder" : -2125404733 + }, { + "field" : "spotAnimationFrameCycle", + "owner" : "bz", + "name" : "bg", + "access" : 0, + "descriptor" : "I", + "decoder" : 330334599 + }, { + "field" : "targetIndex", + "owner" : "bz", + "name" : "bk", + "access" : 0, + "descriptor" : "I", + "decoder" : -1387109107 + }, { + "field" : "turnLeftSequence", + "owner" : "bz", + "name" : "al", + "access" : 0, + "descriptor" : "I", + "decoder" : -831787909 + }, { + "field" : "turnRightSequence", + "owner" : "bz", + "name" : "ab", + "access" : 0, + "descriptor" : "I", + "decoder" : 1788714977 + }, { + "field" : "walkSequence", + "owner" : "bz", + "name" : "ae", + "access" : 0, + "descriptor" : "I", + "decoder" : -2075997699 + }, { + "field" : "walkTurnLeftSequence", + "owner" : "bz", + "name" : "ad", + "access" : 0, + "descriptor" : "I", + "decoder" : -568830521 + }, { + "field" : "walkTurnRightSequence", + "owner" : "bz", + "name" : "ap", + "access" : 0, + "descriptor" : "I", + "decoder" : -257240117 + }, { + "field" : "walkTurnSequence", + "owner" : "bz", + "name" : "at", + "access" : 0, + "descriptor" : "I", + "decoder" : -1598871111 + }, { + "field" : "x", + "owner" : "bz", + "name" : "av", + "access" : 0, + "descriptor" : "I", + "decoder" : -1573449469 + }, { + "field" : "y", + "owner" : "bz", + "name" : "ar", + "access" : 0, + "descriptor" : "I", + "decoder" : 676600595 + }, { + "field" : "__ay", + "owner" : "bz", + "name" : "ay", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__az", + "owner" : "bz", + "name" : "az", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__ac", + "owner" : "bz", + "name" : "ac", + "access" : 0, + "descriptor" : "I", + "decoder" : 1439711403 + }, { + "field" : "__bc", + "owner" : "bz", + "name" : "bc", + "access" : 0, + "descriptor" : "I", + "decoder" : 139384875 + }, { + "field" : "__be", + "owner" : "bz", + "name" : "be", + "access" : 0, + "descriptor" : "I", + "decoder" : 837989037 + }, { + "field" : "__bf", + "owner" : "bz", + "name" : "bf", + "access" : 0, + "descriptor" : "I", + "decoder" : 2121599561 + }, { + "field" : "__bh", + "owner" : "bz", + "name" : "bh", + "access" : 0, + "descriptor" : "I", + "decoder" : 280591281 + }, { + "field" : "__bj", + "owner" : "bz", + "name" : "bj", + "access" : 0, + "descriptor" : "I", + "decoder" : -1523249259 + }, { + "field" : "__bt", + "owner" : "bz", + "name" : "bt", + "access" : 0, + "descriptor" : "I", + "decoder" : 886371765 + }, { + "field" : "__bv", + "owner" : "bz", + "name" : "bv", + "access" : 0, + "descriptor" : "I", + "decoder" : -1857513783 + }, { + "field" : "__bw", + "owner" : "bz", + "name" : "bw", + "access" : 0, + "descriptor" : "I", + "decoder" : -1630403001 + }, { + "field" : "__ch", + "owner" : "bz", + "name" : "ch", + "access" : 0, + "descriptor" : "I", + "decoder" : 1584102533 + }, { + "field" : "__cj", + "owner" : "bz", + "name" : "cj", + "access" : 0, + "descriptor" : "I", + "decoder" : -336931157 + }, { + "field" : "__cm", + "owner" : "bz", + "name" : "cm", + "access" : 0, + "descriptor" : "I", + "decoder" : 1252341007 + }, { + "field" : "__cq", + "owner" : "bz", + "name" : "cq", + "access" : 0, + "descriptor" : "I", + "decoder" : -1583514013 + }, { + "field" : "__cr", + "owner" : "bz", + "name" : "cr", + "access" : 0, + "descriptor" : "I", + "decoder" : 1367256299 + }, { + "field" : "__cv", + "owner" : "bz", + "name" : "cv", + "access" : 0, + "descriptor" : "I", + "decoder" : -1723834619 + } ], + "methods" : [ { + "method" : "addHealthBar", + "owner" : "bz", + "name" : "bq", + "access" : 16, + "parameters" : [ "healthBarDefinition", "cycle", "n0", "n1", "n2", "n3" ], + "descriptor" : "(IIIIIIB)V" + }, { + "method" : "addHitSplat", + "owner" : "bz", + "name" : "bs", + "access" : 16, + "parameters" : [ "type", "value", "type2", "value2", "cycle", "cycle2" ], + "descriptor" : "(IIIIIII)V" + }, { + "method" : "isVisible", + "owner" : "bz", + "name" : "z", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "removeHealthBar", + "owner" : "bz", + "name" : "bn", + "access" : 16, + "parameters" : [ "healthBarDefinition" ], + "descriptor" : "(IS)V" + }, { + "method" : "__bb_143", + "owner" : "bz", + "name" : "bb", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "World", + "name" : "bt", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "activity", + "owner" : "bt", + "name" : "a", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "host", + "owner" : "bt", + "name" : "i", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "id", + "owner" : "bt", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -144265493 + }, { + "field" : "index", + "owner" : "bt", + "name" : "j", + "access" : 0, + "descriptor" : "I", + "decoder" : 1147427427 + }, { + "field" : "location", + "owner" : "bt", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : 1942858323 + }, { + "field" : "population", + "owner" : "bt", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : 1863464125 + }, { + "field" : "properties", + "owner" : "bt", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : 956991319 + } ], + "methods" : [ { + "method" : "__e_144", + "owner" : "bt", + "name" : "e", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__x_145", + "owner" : "bt", + "name" : "x", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__d_146", + "owner" : "bt", + "name" : "d", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__a_147", + "owner" : "bt", + "name" : "a", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__z_148", + "owner" : "bt", + "name" : "z", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__j_149", + "owner" : "bt", + "name" : "j", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ClientPreferences", + "name" : "bf", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "hideUsername", + "owner" : "bf", + "name" : "g", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "parameters", + "owner" : "bf", + "name" : "l", + "access" : 0, + "descriptor" : "Ljava/util/LinkedHashMap;" + }, { + "field" : "rememberedUsername", + "owner" : "bf", + "name" : "u", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "roofsHidden", + "owner" : "bf", + "name" : "q", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "titleMusicDisabled", + "owner" : "bf", + "name" : "w", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "windowMode", + "owner" : "bf", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -359530975 + } ], + "methods" : [ { + "method" : "toBuffer", + "owner" : "bf", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Lgr;" + }, { + "method" : "__m_150", + "owner" : "bf", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(ZI)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + }, { + "access" : 0, + "descriptor" : "(Lgr;)V" + } ] +}, { + "class" : "FriendSystem", + "name" : "bh", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "friendsList", + "owner" : "bh", + "name" : "o", + "access" : 17, + "descriptor" : "Lkg;" + }, { + "field" : "ignoreList", + "owner" : "bh", + "name" : "u", + "access" : 17, + "descriptor" : "Lkj;" + }, { + "field" : "loginType", + "owner" : "bh", + "name" : "w", + "access" : 16, + "descriptor" : "Llx;" + }, { + "field" : "__g", + "owner" : "bh", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 1477282369 + } ], + "methods" : [ { + "method" : "clear", + "owner" : "bh", + "name" : "o", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "removeFriend", + "owner" : "bh", + "name" : "z", + "access" : 16, + "parameters" : [ "name" ], + "descriptor" : "(Ljava/lang/String;I)V" + }, { + "method" : "removeIgnore", + "owner" : "bh", + "name" : "j", + "access" : 16, + "parameters" : [ "name" ], + "descriptor" : "(Ljava/lang/String;I)V" + }, { + "method" : "__m_151", + "owner" : "bh", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__f_152", + "owner" : "bh", + "name" : "f", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__q_153", + "owner" : "bh", + "name" : "q", + "access" : 16, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lgr;II)V" + }, { + "method" : "__w_154", + "owner" : "bh", + "name" : "w", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__u_155", + "owner" : "bh", + "name" : "u", + "access" : 16, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lkp;ZI)Z" + }, { + "method" : "__g_156", + "owner" : "bh", + "name" : "g", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Lkp;I)Z" + }, { + "method" : "__l_157", + "owner" : "bh", + "name" : "l", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/String;I)V" + }, { + "method" : "__e_158", + "owner" : "bh", + "name" : "e", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__x_159", + "owner" : "bh", + "name" : "x", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/String;B)V" + }, { + "method" : "__a_160", + "owner" : "bh", + "name" : "a", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__t_161", + "owner" : "bh", + "name" : "t", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Lkp;S)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Llx;)V" + } ] +}, { + "class" : "ObjectSound", + "name" : "be", + "super" : "gw", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "obj", + "owner" : "be", + "name" : "a", + "access" : 0, + "descriptor" : "Ljr;" + }, { + "field" : "soundEffectId", + "owner" : "be", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -731474443 + }, { + "field" : "soundEffectIds", + "owner" : "be", + "name" : "k", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "stream1", + "owner" : "be", + "name" : "e", + "access" : 0, + "descriptor" : "Lds;" + }, { + "field" : "stream2", + "owner" : "be", + "name" : "i", + "access" : 0, + "descriptor" : "Lds;" + }, { + "field" : "__d", + "owner" : "be", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : 1748890449 + }, { + "field" : "__f", + "owner" : "be", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 647270745 + }, { + "field" : "__g", + "owner" : "be", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 1344558633 + }, { + "field" : "__n", + "owner" : "be", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : -1041508847 + }, { + "field" : "__o", + "owner" : "be", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -211591209 + }, { + "field" : "__q", + "owner" : "be", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -800464493 + }, { + "field" : "__u", + "owner" : "be", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 512258949 + }, { + "field" : "__w", + "owner" : "be", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -85911525 + }, { + "field" : "__x", + "owner" : "be", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -1608400407 + } ], + "methods" : [ { + "method" : "set", + "owner" : "be", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Npc", + "name" : "cv", + "super" : "bz", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "definition", + "owner" : "cv", + "name" : "m", + "access" : 0, + "descriptor" : "Ljz;" + } ], + "methods" : [ { + "method" : "getModel", + "owner" : "cv", + "name" : "e", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)Ldu;" + }, { + "method" : "isVisible", + "owner" : "cv", + "name" : "z", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__m_162", + "owner" : "cv", + "name" : "m", + "access" : 16, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IBI)V" + }, { + "method" : "__f_163", + "owner" : "cv", + "name" : "f", + "access" : 16, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIZI)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Script", + "name" : "cg", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "intArgumentCount", + "owner" : "cg", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -1077473933 + }, { + "field" : "intOperands", + "owner" : "cg", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "localIntCount", + "owner" : "cg", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 1952727759 + }, { + "field" : "localStringCount", + "owner" : "cg", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1124477681 + }, { + "field" : "opcodes", + "owner" : "cg", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "stringArgumentCount", + "owner" : "cg", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -503680987 + }, { + "field" : "stringOperands", + "owner" : "cg", + "name" : "w", + "access" : 0, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "switches", + "owner" : "cg", + "name" : "e", + "access" : 0, + "descriptor" : "[Llh;" + } ], + "methods" : [ { + "method" : "__o_164", + "owner" : "cg", + "name" : "o", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)[Llh;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "PacketWriter", + "name" : "cl", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "buffer", + "owner" : "cl", + "name" : "w", + "access" : 0, + "descriptor" : "Lgr;" + }, { + "field" : "isaacCipher", + "owner" : "cl", + "name" : "o", + "access" : 1, + "descriptor" : "Lhn;" + }, { + "field" : "packetBuffer", + "owner" : "cl", + "name" : "u", + "access" : 0, + "descriptor" : "Lhx;" + }, { + "field" : "packetBufferNodes", + "owner" : "cl", + "name" : "f", + "access" : 0, + "descriptor" : "Lja;" + }, { + "field" : "serverPacket0", + "owner" : "cl", + "name" : "g", + "access" : 0, + "descriptor" : "Lge;" + }, { + "field" : "serverPacket0Length", + "owner" : "cl", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -1986766063 + }, { + "field" : "socket0", + "owner" : "cl", + "name" : "m", + "access" : 0, + "descriptor" : "Lfu;" + }, { + "field" : "__e", + "owner" : "cl", + "name" : "e", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__i", + "owner" : "cl", + "name" : "i", + "access" : 0, + "descriptor" : "Lge;" + }, { + "field" : "__k", + "owner" : "cl", + "name" : "k", + "access" : 0, + "descriptor" : "Lge;" + }, { + "field" : "__n", + "owner" : "cl", + "name" : "n", + "access" : 0, + "descriptor" : "Lge;" + }, { + "field" : "__d", + "owner" : "cl", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : 1672229609 + }, { + "field" : "__q", + "owner" : "cl", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1028046199 + }, { + "field" : "__x", + "owner" : "cl", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : 120570975 + } ], + "methods" : [ { + "method" : "close", + "owner" : "cl", + "name" : "o", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "getSocket", + "owner" : "cl", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Lfu;" + }, { + "method" : "removeSocket", + "owner" : "cl", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "setSocket", + "owner" : "cl", + "name" : "w", + "access" : 0, + "parameters" : [ "socket" ], + "descriptor" : "(Lfu;B)V" + }, { + "method" : "__m_165", + "owner" : "cl", + "name" : "m", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__f_166", + "owner" : "cl", + "name" : "f", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__q_167", + "owner" : "cl", + "name" : "q", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgg;I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "PcmStreamMixer", + "name" : "ct", + "super" : "dc", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "subStreams", + "owner" : "ct", + "name" : "m", + "access" : 0, + "descriptor" : "Lje;" + }, { + "field" : "__o", + "owner" : "ct", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__q", + "owner" : "ct", + "name" : "q", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__f", + "owner" : "ct", + "name" : "f", + "access" : 0, + "descriptor" : "Lje;" + } ], + "methods" : [ { + "method" : "addSubStream", + "owner" : "ct", + "name" : "m", + "access" : 49, + "parameters" : [ "subStream" ], + "descriptor" : "(Ldc;)V" + }, { + "method" : "firstSubStream", + "owner" : "ct", + "name" : "u", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "nextSubStream", + "owner" : "ct", + "name" : "g", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "removeSubStream", + "owner" : "ct", + "name" : "f", + "access" : 49, + "parameters" : [ "subStream" ], + "descriptor" : "(Ldc;)V" + }, { + "method" : "skipSubStreams", + "owner" : "ct", + "name" : "a", + "access" : 0, + "parameters" : [ "length" ], + "descriptor" : "(I)V" + }, { + "method" : "updateSubStreams", + "owner" : "ct", + "name" : "x", + "access" : 0, + "parameters" : [ "buffer", "start", "end" ], + "descriptor" : "([III)V" + }, { + "method" : "__q_168", + "owner" : "ct", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__w_169", + "owner" : "ct", + "name" : "w", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lgw;Ldf;)V" + }, { + "method" : "__o_170", + "owner" : "ct", + "name" : "o", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Ldf;)V" + }, { + "method" : "__l_171", + "owner" : "ct", + "name" : "l", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__e_172", + "owner" : "ct", + "name" : "e", + "access" : 49, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([III)V" + }, { + "method" : "__d_173", + "owner" : "ct", + "name" : "d", + "access" : 49, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "SoundEffect", + "name" : "ci", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "end", + "owner" : "ci", + "name" : "w", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "instruments", + "owner" : "ci", + "name" : "f", + "access" : 0, + "descriptor" : "[Ldb;" + }, { + "field" : "start", + "owner" : "ci", + "name" : "q", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "mix", + "owner" : "ci", + "name" : "w", + "access" : 16, + "parameters" : [ ], + "descriptor" : "()[B" + }, { + "method" : "toRawSound", + "owner" : "ci", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lcx;" + }, { + "method" : "__q_174", + "owner" : "ci", + "name" : "q", + "access" : 17, + "parameters" : [ ], + "descriptor" : "()I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lgr;)V" + } ] +}, { + "class" : "MusicSample", + "name" : "cd", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "end", + "owner" : "cd", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "sampleCount", + "owner" : "cd", + "name" : "q", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "sampleRate", + "owner" : "cd", + "name" : "f", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "samples", + "owner" : "cd", + "name" : "ac", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "start", + "owner" : "cd", + "name" : "w", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__b", + "owner" : "cd", + "name" : "b", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__u", + "owner" : "cd", + "name" : "u", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__m", + "owner" : "cd", + "name" : "m", + "access" : 0, + "descriptor" : "[[B" + }, { + "field" : "__t", + "owner" : "cd", + "name" : "t", + "access" : 0, + "descriptor" : "[F" + }, { + "field" : "__ah", + "owner" : "cd", + "name" : "ah", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__ay", + "owner" : "cd", + "name" : "ay", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__h", + "owner" : "cd", + "name" : "h", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__y", + "owner" : "cd", + "name" : "y", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "read", + "owner" : "cd", + "name" : "o", + "access" : 0, + "descriptor" : "([B)V" + }, { + "method" : "toRawSound", + "owner" : "cd", + "name" : "x", + "access" : 0, + "descriptor" : "([I)Lcx;" + }, { + "method" : "__g_175", + "owner" : "cd", + "name" : "g", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(I)[F" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "([B)V" + } ] +}, { + "class" : "RawSound", + "name" : "cx", + "super" : "dd", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "end", + "owner" : "cx", + "name" : "w", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "sampleRate", + "owner" : "cx", + "name" : "m", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "samples", + "owner" : "cx", + "name" : "f", + "access" : 1, + "descriptor" : "[B" + }, { + "field" : "start", + "owner" : "cx", + "name" : "q", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "__o", + "owner" : "cx", + "name" : "o", + "access" : 1, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "resample", + "owner" : "cx", + "name" : "m", + "access" : 1, + "parameters" : [ "decimator" ], + "descriptor" : "(Ldp;)Lcx;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(I[BII)V" + }, { + "access" : 0, + "descriptor" : "(I[BIIZ)V" + } ] +}, { + "class" : "PcmPlayer", + "name" : "co", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "capacity", + "owner" : "co", + "name" : "s", + "access" : 0, + "descriptor" : "I", + "decoder" : -1671644011 + }, { + "field" : "frequency", + "owner" : "co", + "name" : "t", + "access" : 0, + "descriptor" : "I", + "decoder" : 951871565 + }, { + "field" : "nextPosition", + "owner" : "co", + "name" : "r", + "access" : 0, + "descriptor" : "I", + "decoder" : -1586398263 + }, { + "field" : "retryTimeMs", + "owner" : "co", + "name" : "h", + "access" : 0, + "descriptor" : "J", + "decoder" : -200656835998283411 + }, { + "field" : "samples", + "owner" : "co", + "name" : "i", + "access" : 4, + "descriptor" : "[I" + }, { + "field" : "stream0", + "owner" : "co", + "name" : "a", + "access" : 0, + "descriptor" : "Ldc;" + }, { + "field" : "timeMs", + "owner" : "co", + "name" : "j", + "access" : 0, + "descriptor" : "J", + "decoder" : -8124323644430480811 + }, { + "field" : "__v", + "owner" : "co", + "name" : "v", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__ah", + "owner" : "co", + "name" : "ah", + "access" : 0, + "descriptor" : "[Ldc;" + }, { + "field" : "__ay", + "owner" : "co", + "name" : "ay", + "access" : 0, + "descriptor" : "[Ldc;" + }, { + "field" : "__ac", + "owner" : "co", + "name" : "ac", + "access" : 0, + "descriptor" : "I", + "decoder" : -645495803 + }, { + "field" : "__b", + "owner" : "co", + "name" : "b", + "access" : 0, + "descriptor" : "I", + "decoder" : 48658021 + }, { + "field" : "__c", + "owner" : "co", + "name" : "c", + "access" : 0, + "descriptor" : "I", + "decoder" : 1624619697 + }, { + "field" : "__y", + "owner" : "co", + "name" : "y", + "access" : 0, + "descriptor" : "I", + "decoder" : 1907203055 + }, { + "field" : "__z", + "owner" : "co", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : 1125788887 + }, { + "field" : "__p", + "owner" : "co", + "name" : "p", + "access" : 0, + "descriptor" : "J", + "decoder" : -8188447292076890879 + } ], + "methods" : [ { + "method" : "close", + "owner" : "co", + "name" : "o", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "discard", + "owner" : "co", + "name" : "u", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "fill", + "owner" : "co", + "name" : "aw", + "access" : 16, + "parameters" : [ "buffer", "length" ], + "descriptor" : "([II)V" + }, { + "method" : "init", + "owner" : "co", + "name" : "m", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "open", + "owner" : "co", + "name" : "f", + "access" : 4, + "parameters" : [ "bufferSize" ], + "descriptor" : "(II)V" + }, { + "method" : "position", + "owner" : "co", + "name" : "q", + "access" : 4, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "run", + "owner" : "co", + "name" : "ar", + "access" : 49, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "setStream", + "owner" : "co", + "name" : "av", + "access" : 49, + "parameters" : [ "stream" ], + "descriptor" : "(Ldc;I)V" + }, { + "method" : "shutdown", + "owner" : "co", + "name" : "ah", + "access" : 49, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "skip", + "owner" : "co", + "name" : "ak", + "access" : 16, + "parameters" : [ "length" ], + "descriptor" : "(II)V" + }, { + "method" : "tryDiscard", + "owner" : "co", + "name" : "ay", + "access" : 49, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "write", + "owner" : "co", + "name" : "w", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__ac_176", + "owner" : "co", + "name" : "ac", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__ab_177", + "owner" : "co", + "name" : "ab", + "access" : 16, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ldc;II)V" + } ], + "constructors" : [ { + "access" : 4, + "descriptor" : "()V" + } ] +}, { + "class" : "SoundSystem", + "name" : "dx", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ { + "field" : "players", + "owner" : "dx", + "name" : "m", + "access" : 64, + "descriptor" : "[Lco;" + } ], + "methods" : [ { + "method" : "__run_178", + "owner" : "dx", + "name" : "run", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "PcmStreamMixerListener", + "name" : "df", + "super" : "gw", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "df", + "name" : "m", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "remove2", + "owner" : "df", + "name" : "m", + "access" : 1024, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "update", + "owner" : "df", + "name" : "f", + "access" : 1024, + "parameters" : [ "mixer" ], + "descriptor" : "(Lct;)I" + } ], + "constructors" : [ ] +}, { + "class" : "RawPcmStream", + "name" : "ds", + "super" : "dc", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "end", + "owner" : "ds", + "name" : "d", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "start", + "owner" : "ds", + "name" : "x", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__k", + "owner" : "ds", + "name" : "k", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__a", + "owner" : "ds", + "name" : "a", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__e", + "owner" : "ds", + "name" : "e", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__f", + "owner" : "ds", + "name" : "f", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__g", + "owner" : "ds", + "name" : "g", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__i", + "owner" : "ds", + "name" : "i", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__l", + "owner" : "ds", + "name" : "l", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__m", + "owner" : "ds", + "name" : "m", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__n", + "owner" : "ds", + "name" : "n", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__o", + "owner" : "ds", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__q", + "owner" : "ds", + "name" : "q", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__u", + "owner" : "ds", + "name" : "u", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__z", + "owner" : "ds", + "name" : "z", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "__az_179", + "owner" : "ds", + "name" : "az", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__o_180", + "owner" : "ds", + "name" : "o", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__x_181", + "owner" : "ds", + "name" : "x", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__a_182", + "owner" : "ds", + "name" : "a", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__z_183", + "owner" : "ds", + "name" : "z", + "access" : 32, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__j_184", + "owner" : "ds", + "name" : "j", + "access" : 32, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(II)V" + }, { + "method" : "__s_185", + "owner" : "ds", + "name" : "s", + "access" : 33, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__t_186", + "owner" : "ds", + "name" : "t", + "access" : 33, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__y_187", + "owner" : "ds", + "name" : "y", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__h_188", + "owner" : "ds", + "name" : "h", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(Z)V" + }, { + "method" : "__b_189", + "owner" : "ds", + "name" : "b", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__c_190", + "owner" : "ds", + "name" : "c", + "access" : 33, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(II)V" + }, { + "method" : "__p_191", + "owner" : "ds", + "name" : "p", + "access" : 33, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)V" + }, { + "method" : "__v_192", + "owner" : "ds", + "name" : "v", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__ah_193", + "owner" : "ds", + "name" : "ah", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__ab_194", + "owner" : "ds", + "name" : "ab", + "access" : 33, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__ae_195", + "owner" : "ds", + "name" : "ae", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "__at_196", + "owner" : "ds", + "name" : "at", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "__u_197", + "owner" : "ds", + "name" : "u", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "__g_198", + "owner" : "ds", + "name" : "g", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "__l_199", + "owner" : "ds", + "name" : "l", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__e_200", + "owner" : "ds", + "name" : "e", + "access" : 33, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([III)V" + }, { + "method" : "__d_201", + "owner" : "ds", + "name" : "d", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__ad_202", + "owner" : "ds", + "name" : "ad", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "([IIIII)I" + }, { + "method" : "__ap_203", + "owner" : "ds", + "name" : "ap", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "([IIIII)I" + }, { + "method" : "__au_204", + "owner" : "ds", + "name" : "au", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lcx;II)V" + }, { + "access" : 0, + "descriptor" : "(Lcx;III)V" + } ] +}, { + "class" : "AudioFilter", + "name" : "di", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "di", + "name" : "m", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__o", + "owner" : "di", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__q", + "owner" : "di", + "name" : "q", + "access" : 0, + "descriptor" : "[[[I" + }, { + "field" : "__w", + "owner" : "di", + "name" : "w", + "access" : 0, + "descriptor" : "[[[I" + } ], + "methods" : [ { + "method" : "__m_205", + "owner" : "di", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIF)F" + }, { + "method" : "__q_206", + "owner" : "di", + "name" : "q", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIF)F" + }, { + "method" : "__w_207", + "owner" : "di", + "name" : "w", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IF)I" + }, { + "method" : "__o_208", + "owner" : "di", + "name" : "o", + "access" : 16, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lgr;Lde;)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "PcmStream", + "name" : "dc", + "super" : "gw", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "active", + "owner" : "dc", + "name" : "w", + "access" : 64, + "descriptor" : "Z" + }, { + "field" : "after", + "owner" : "dc", + "name" : "j", + "access" : 0, + "descriptor" : "Ldc;" + }, { + "field" : "sound", + "owner" : "dc", + "name" : "t", + "access" : 0, + "descriptor" : "Ldd;" + }, { + "field" : "__s", + "owner" : "dc", + "name" : "s", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "fill", + "owner" : "dc", + "name" : "e", + "access" : 1028, + "parameters" : [ "buffer", "start", "end" ], + "descriptor" : "([III)V" + }, { + "method" : "firstSubStream", + "owner" : "dc", + "name" : "u", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "nextSubStream", + "owner" : "dc", + "name" : "g", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "skip", + "owner" : "dc", + "name" : "d", + "access" : 1028, + "parameters" : [ "length" ], + "descriptor" : "(I)V" + }, { + "method" : "update", + "owner" : "dc", + "name" : "ef", + "access" : 16, + "parameters" : [ "buffer", "start", "end" ], + "descriptor" : "([III)V" + }, { + "method" : "__az_209", + "owner" : "dc", + "name" : "az", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__l_210", + "owner" : "dc", + "name" : "l", + "access" : 1028, + "parameters" : [ ], + "descriptor" : "()I" + } ], + "constructors" : [ { + "access" : 4, + "descriptor" : "()V" + } ] +}, { + "class" : "Instrument", + "name" : "db", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "delayDecay", + "owner" : "db", + "name" : "n", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "delayTime", + "owner" : "db", + "name" : "k", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "duration", + "owner" : "db", + "name" : "z", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "filter", + "owner" : "db", + "name" : "i", + "access" : 0, + "descriptor" : "Ldi;" + }, { + "field" : "offset", + "owner" : "db", + "name" : "j", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "oscillatorDelays", + "owner" : "db", + "name" : "d", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "oscillatorPitch", + "owner" : "db", + "name" : "x", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "oscillatorVolume", + "owner" : "db", + "name" : "e", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__a", + "owner" : "db", + "name" : "a", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__f", + "owner" : "db", + "name" : "f", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__g", + "owner" : "db", + "name" : "g", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__l", + "owner" : "db", + "name" : "l", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__m", + "owner" : "db", + "name" : "m", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__o", + "owner" : "db", + "name" : "o", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__q", + "owner" : "db", + "name" : "q", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__u", + "owner" : "db", + "name" : "u", + "access" : 0, + "descriptor" : "Lde;" + }, { + "field" : "__w", + "owner" : "db", + "name" : "w", + "access" : 0, + "descriptor" : "Lde;" + } ], + "methods" : [ { + "method" : "decode", + "owner" : "db", + "name" : "q", + "access" : 16, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;)V" + }, { + "method" : "evaluateWave", + "owner" : "db", + "name" : "f", + "access" : 16, + "descriptor" : "(III)I" + }, { + "method" : "synthesize", + "owner" : "db", + "name" : "m", + "access" : 16, + "descriptor" : "(II)[I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "BufferedFile", + "name" : "dy", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "accessFile", + "owner" : "dy", + "name" : "m", + "access" : 0, + "descriptor" : "Ldk;" + }, { + "field" : "capacity", + "owner" : "dy", + "name" : "x", + "access" : 0, + "descriptor" : "J", + "decoder" : 2663146692618913943 + }, { + "field" : "readBuffer", + "owner" : "dy", + "name" : "f", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "writeBuffer", + "owner" : "dy", + "name" : "o", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__g", + "owner" : "dy", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -1558233611 + }, { + "field" : "__w", + "owner" : "dy", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -846810907 + }, { + "field" : "__d", + "owner" : "dy", + "name" : "d", + "access" : 0, + "descriptor" : "J", + "decoder" : 5720856138805191881 + }, { + "field" : "__e", + "owner" : "dy", + "name" : "e", + "access" : 0, + "descriptor" : "J", + "decoder" : -3728247331531750871 + }, { + "field" : "__l", + "owner" : "dy", + "name" : "l", + "access" : 0, + "descriptor" : "J", + "decoder" : -6819476051574242871 + }, { + "field" : "__q", + "owner" : "dy", + "name" : "q", + "access" : 0, + "descriptor" : "J", + "decoder" : -7773729680030815835 + }, { + "field" : "__u", + "owner" : "dy", + "name" : "u", + "access" : 0, + "descriptor" : "J", + "decoder" : 5249231081498323007 + } ], + "methods" : [ { + "method" : "close", + "owner" : "dy", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "flush", + "owner" : "dy", + "name" : "l", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "length", + "owner" : "dy", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)J" + }, { + "method" : "load", + "owner" : "dy", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "read", + "owner" : "dy", + "name" : "o", + "access" : 1, + "parameters" : [ "dst", "dstIndex", "length" ], + "descriptor" : "([BIIB)V" + }, { + "method" : "readFill", + "owner" : "dy", + "name" : "w", + "access" : 1, + "parameters" : [ "dst" ], + "descriptor" : "([BI)V" + }, { + "method" : "seek", + "owner" : "dy", + "name" : "f", + "access" : 1, + "parameters" : [ "index" ], + "descriptor" : "(J)V" + }, { + "method" : "write", + "owner" : "dy", + "name" : "g", + "access" : 1, + "parameters" : [ "src", "srcIndex", "length" ], + "descriptor" : "([BIII)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Ldk;II)V" + } ] +}, { + "class" : "AccessFile", + "name" : "dk", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "capacity", + "owner" : "dk", + "name" : "f", + "access" : 0, + "descriptor" : "J", + "decoder" : -5849841282281477349 + }, { + "field" : "file", + "owner" : "dk", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/io/RandomAccessFile;" + }, { + "field" : "index", + "owner" : "dk", + "name" : "q", + "access" : 0, + "descriptor" : "J", + "decoder" : 7465414039279036117 + } ], + "methods" : [ { + "method" : "close", + "owner" : "dk", + "name" : "q", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "closeSync", + "owner" : "dk", + "name" : "w", + "access" : 17, + "parameters" : [ "sync" ], + "descriptor" : "(ZI)V" + }, { + "method" : "length", + "owner" : "dk", + "name" : "o", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)J" + }, { + "method" : "read", + "owner" : "dk", + "name" : "u", + "access" : 17, + "parameters" : [ "dst", "dstIndex", "length" ], + "descriptor" : "([BIII)I" + }, { + "method" : "seek", + "owner" : "dk", + "name" : "m", + "access" : 16, + "parameters" : [ "index" ], + "descriptor" : "(J)V" + }, { + "method" : "write", + "owner" : "dk", + "name" : "f", + "access" : 17, + "parameters" : [ "src", "srcIndex", "length" ], + "descriptor" : "([BIIB)V" + }, { + "method" : "__finalize_211", + "owner" : "dk", + "name" : "finalize", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Ljava/io/File;Ljava/lang/String;J)V" + } ] +}, { + "class" : "TextureProvider", + "name" : "dl", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "ei" ], + "fields" : [ { + "field" : "brightness0", + "owner" : "dl", + "name" : "o", + "access" : 0, + "descriptor" : "D" + }, { + "field" : "capacity", + "owner" : "dl", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 762273989 + }, { + "field" : "deque", + "owner" : "dl", + "name" : "f", + "access" : 0, + "descriptor" : "Lje;" + }, { + "field" : "indexCache", + "owner" : "dl", + "name" : "g", + "access" : 0, + "descriptor" : "Lir;" + }, { + "field" : "remaining", + "owner" : "dl", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 1130378699 + }, { + "field" : "textureSize", + "owner" : "dl", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 1124790219 + }, { + "field" : "textures", + "owner" : "dl", + "name" : "m", + "access" : 0, + "descriptor" : "[Ldh;" + } ], + "methods" : [ { + "method" : "animate", + "owner" : "dl", + "name" : "l", + "access" : 1, + "parameters" : [ "n" ], + "descriptor" : "(II)V" + }, { + "method" : "clear", + "owner" : "dl", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "isLowDetail", + "owner" : "dl", + "name" : "u", + "access" : 1, + "descriptor" : "(II)Z" + }, { + "method" : "load", + "owner" : "dl", + "name" : "q", + "access" : 1, + "descriptor" : "(II)[I" + }, { + "method" : "setBrightness", + "owner" : "dl", + "name" : "f", + "access" : 1, + "parameters" : [ "brightness" ], + "descriptor" : "(D)V" + }, { + "method" : "__m_212", + "owner" : "dl", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__w_213", + "owner" : "dl", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)I" + }, { + "method" : "__o_214", + "owner" : "dl", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Lir;Lir;IDI)V" + } ] +}, { + "class" : "ModelData", + "name" : "dw", + "super" : "ex", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "faceAlphas", + "owner" : "dw", + "name" : "d", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "faceColors", + "owner" : "dw", + "name" : "n", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "faceCount", + "owner" : "dw", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "faceLabelsAlpha", + "owner" : "dw", + "name" : "r", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "faceNormals", + "owner" : "dw", + "name" : "p", + "access" : 0, + "descriptor" : "[Lel;" + }, { + "field" : "faceTextures", + "owner" : "dw", + "name" : "i", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "indices1", + "owner" : "dw", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "indices2", + "owner" : "dw", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "indices3", + "owner" : "dw", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "isBoundsCalculated", + "owner" : "dw", + "name" : "av", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "vertexLabels", + "owner" : "dw", + "name" : "c", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "verticesCount", + "owner" : "dw", + "name" : "m", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "verticesX", + "owner" : "dw", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "verticesY", + "owner" : "dw", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "verticesZ", + "owner" : "dw", + "name" : "w", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__a", + "owner" : "dw", + "name" : "a", + "access" : 0, + "descriptor" : "B" + }, { + "field" : "__e", + "owner" : "dw", + "name" : "e", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__j", + "owner" : "dw", + "name" : "j", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__k", + "owner" : "dw", + "name" : "k", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__x", + "owner" : "dw", + "name" : "x", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__ag", + "owner" : "dw", + "name" : "ag", + "access" : 0, + "descriptor" : "[Ldq;" + }, { + "field" : "__v", + "owner" : "dw", + "name" : "v", + "access" : 0, + "descriptor" : "[Ldq;" + }, { + "field" : "__ac", + "owner" : "dw", + "name" : "ac", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__ah", + "owner" : "dw", + "name" : "ah", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__ak", + "owner" : "dw", + "name" : "ak", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__ar", + "owner" : "dw", + "name" : "ar", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__ay", + "owner" : "dw", + "name" : "ay", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__z", + "owner" : "dw", + "name" : "z", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__b", + "owner" : "dw", + "name" : "b", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__h", + "owner" : "dw", + "name" : "h", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__s", + "owner" : "dw", + "name" : "s", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "__t", + "owner" : "dw", + "name" : "t", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "__y", + "owner" : "dw", + "name" : "y", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "__aj", + "owner" : "dw", + "name" : "aj", + "access" : 1, + "descriptor" : "S" + }, { + "field" : "__aq", + "owner" : "dw", + "name" : "aq", + "access" : 1, + "descriptor" : "S" + } ], + "methods" : [ { + "method" : "invalidate", + "owner" : "dw", + "name" : "b", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "recolor", + "owner" : "dw", + "name" : "j", + "access" : 1, + "parameters" : [ "from", "to" ], + "descriptor" : "(SS)V" + }, { + "method" : "retexture", + "owner" : "dw", + "name" : "s", + "access" : 1, + "parameters" : [ "from", "to" ], + "descriptor" : "(SS)V" + }, { + "method" : "toModel", + "owner" : "dw", + "name" : "v", + "access" : 17, + "parameters" : [ "a", "b", "c", "d", "e" ], + "descriptor" : "(IIIII)Ldu;" + }, { + "method" : "__f_215", + "owner" : "dw", + "name" : "f", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "([B)V" + }, { + "method" : "__q_216", + "owner" : "dw", + "name" : "q", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "([B)V" + }, { + "method" : "__w_217", + "owner" : "dw", + "name" : "w", + "access" : 16, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ldw;I)I" + }, { + "method" : "__o_218", + "owner" : "dw", + "name" : "o", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ldw;" + }, { + "method" : "__u_219", + "owner" : "dw", + "name" : "u", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "([[IIIIZI)Ldw;" + }, { + "method" : "__g_220", + "owner" : "dw", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__l_221", + "owner" : "dw", + "name" : "l", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__x_222", + "owner" : "dw", + "name" : "x", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__d_223", + "owner" : "dw", + "name" : "d", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__a_224", + "owner" : "dw", + "name" : "a", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__z_225", + "owner" : "dw", + "name" : "z", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)V" + }, { + "method" : "__t_226", + "owner" : "dw", + "name" : "t", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__y_227", + "owner" : "dw", + "name" : "y", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)V" + }, { + "method" : "__h_228", + "owner" : "dw", + "name" : "h", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__c_229", + "owner" : "dw", + "name" : "c", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + }, { + "access" : 0, + "descriptor" : "([B)V" + }, { + "access" : 1, + "descriptor" : "([Ldw;I)V" + }, { + "access" : 1, + "descriptor" : "(Ldw;ZZZZ)V" + } ] +}, { + "class" : "TileModel", + "name" : "dv", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "isFlat", + "owner" : "dv", + "name" : "d", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "overlayRgb", + "owner" : "dv", + "name" : "a", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "rotation", + "owner" : "dv", + "name" : "n", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "shape", + "owner" : "dv", + "name" : "k", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "underlayRgb", + "owner" : "dv", + "name" : "i", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__e", + "owner" : "dv", + "name" : "e", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__f", + "owner" : "dv", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__g", + "owner" : "dv", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__l", + "owner" : "dv", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__m", + "owner" : "dv", + "name" : "m", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__o", + "owner" : "dv", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__q", + "owner" : "dv", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__u", + "owner" : "dv", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__w", + "owner" : "dv", + "name" : "w", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__x", + "owner" : "dv", + "name" : "x", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIIIIIIIIIIIIIIIIII)V" + } ] +}, { + "class" : "Texture", + "name" : "dh", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "animationDirection", + "owner" : "dh", + "name" : "d", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "animationSpeed", + "owner" : "dh", + "name" : "k", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "int1", + "owner" : "dh", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "isLoaded", + "owner" : "dh", + "name" : "i", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "pixels", + "owner" : "dh", + "name" : "n", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "records", + "owner" : "dh", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__u", + "owner" : "dh", + "name" : "u", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__e", + "owner" : "dh", + "name" : "e", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__l", + "owner" : "dh", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__x", + "owner" : "dh", + "name" : "x", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "animate", + "owner" : "dh", + "name" : "q", + "access" : 0, + "parameters" : [ "n" ], + "descriptor" : "(I)V" + }, { + "method" : "reset", + "owner" : "dh", + "name" : "f", + "access" : 0, + "descriptor" : "()V" + }, { + "method" : "__m_230", + "owner" : "dh", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(DILir;)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lgr;)V" + } ] +}, { + "class" : "Tile", + "name" : "dj", + "super" : "gw", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "boundaryObject", + "owner" : "dj", + "name" : "g", + "access" : 0, + "descriptor" : "Lej;" + }, { + "field" : "drawGameObjectEdges", + "owner" : "dj", + "name" : "t", + "access" : 0, + "descriptor" : "I", + "decoder" : 769252193 + }, { + "field" : "drawGameObjects", + "owner" : "dj", + "name" : "s", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "drawPrimary", + "owner" : "dj", + "name" : "z", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "drawSecondary", + "owner" : "dj", + "name" : "j", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "floorDecoration", + "owner" : "dj", + "name" : "e", + "access" : 0, + "descriptor" : "Ldo;" + }, { + "field" : "gameObjectEdgeMasks", + "owner" : "dj", + "name" : "n", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "gameObjects", + "owner" : "dj", + "name" : "k", + "access" : 0, + "descriptor" : "[Leh;" + }, { + "field" : "gameObjectsCount", + "owner" : "dj", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -792635627 + }, { + "field" : "gameObjectsEdgeMask", + "owner" : "dj", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : 1192947815 + }, { + "field" : "groundItemPile", + "owner" : "dj", + "name" : "x", + "access" : 0, + "descriptor" : "Ldr;" + }, { + "field" : "linkedBelowTile", + "owner" : "dj", + "name" : "c", + "access" : 0, + "descriptor" : "Ldj;" + }, { + "field" : "minPlane", + "owner" : "dj", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : -1078135311 + }, { + "field" : "model", + "owner" : "dj", + "name" : "u", + "access" : 0, + "descriptor" : "Ldv;" + }, { + "field" : "originalPlane", + "owner" : "dj", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 507854577 + }, { + "field" : "paint", + "owner" : "dj", + "name" : "o", + "access" : 0, + "descriptor" : "Leb;" + }, { + "field" : "plane", + "owner" : "dj", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1065165981 + }, { + "field" : "wallDecoration", + "owner" : "dj", + "name" : "l", + "access" : 0, + "descriptor" : "Leq;" + }, { + "field" : "x", + "owner" : "dj", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 103024387 + }, { + "field" : "y", + "owner" : "dj", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -561562755 + }, { + "field" : "__b", + "owner" : "dj", + "name" : "b", + "access" : 0, + "descriptor" : "I", + "decoder" : 2030010491 + }, { + "field" : "__h", + "owner" : "dj", + "name" : "h", + "access" : 0, + "descriptor" : "I", + "decoder" : -172066661 + }, { + "field" : "__y", + "owner" : "dj", + "name" : "y", + "access" : 0, + "descriptor" : "I", + "decoder" : 1724493981 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(III)V" + } ] +}, { + "class" : "Model", + "name" : "du", + "super" : "ex", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "bottomY", + "owner" : "du", + "name" : "aj", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "boundsType", + "owner" : "du", + "name" : "aq", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "diameter", + "owner" : "du", + "name" : "ar", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "faceAlphas", + "owner" : "du", + "name" : "j", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "faceColors1", + "owner" : "du", + "name" : "n", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "faceColors2", + "owner" : "du", + "name" : "i", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "faceColors3", + "owner" : "du", + "name" : "a", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "faceLabelsAlpha", + "owner" : "du", + "name" : "v", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "faceTextures", + "owner" : "du", + "name" : "t", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "indices1", + "owner" : "du", + "name" : "x", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "indices2", + "owner" : "du", + "name" : "d", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "indices3", + "owner" : "du", + "name" : "k", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "indicesCount", + "owner" : "du", + "name" : "e", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "isSingleTile", + "owner" : "du", + "name" : "ag", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "radius", + "owner" : "du", + "name" : "ac", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "vertexLabels", + "owner" : "du", + "name" : "p", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "verticesCount", + "owner" : "du", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "verticesX", + "owner" : "du", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "verticesY", + "owner" : "du", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "verticesZ", + "owner" : "du", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "xMid", + "owner" : "du", + "name" : "ay", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "xMidOffset", + "owner" : "du", + "name" : "aw", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "xzRadius", + "owner" : "du", + "name" : "av", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "yMid", + "owner" : "du", + "name" : "ah", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "yMidOffset", + "owner" : "du", + "name" : "al", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "zMid", + "owner" : "du", + "name" : "ak", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "zMidOffset", + "owner" : "du", + "name" : "ab", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__y", + "owner" : "du", + "name" : "y", + "access" : 0, + "descriptor" : "B" + }, { + "field" : "__s", + "owner" : "du", + "name" : "s", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__z", + "owner" : "du", + "name" : "z", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__h", + "owner" : "du", + "name" : "h", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__b", + "owner" : "du", + "name" : "b", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__c", + "owner" : "du", + "name" : "c", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__r", + "owner" : "du", + "name" : "r", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "animate", + "owner" : "du", + "name" : "d", + "access" : 1, + "parameters" : [ "frames", "frame" ], + "descriptor" : "(Len;I)V", + "finalArgument" : -2 + }, { + "method" : "animate2", + "owner" : "du", + "name" : "a", + "access" : 1, + "descriptor" : "(Len;ILen;I[I)V" + }, { + "method" : "calculateBoundingBox", + "owner" : "du", + "name" : "o", + "access" : 0, + "parameters" : [ "yaw" ], + "descriptor" : "(I)V" + }, { + "method" : "calculateBoundsCylinder", + "owner" : "du", + "name" : "u", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "copy0", + "owner" : "du", + "name" : "w", + "access" : 0, + "descriptor" : "(ZLdu;[B)Ldu;" + }, { + "method" : "draw", + "owner" : "du", + "name" : "cy", + "access" : 0, + "parameters" : [ "yaw", "cameraPitchSine", "cameraPitchCosine", "cameraYawSine", "cameraYawCosine", "x", "y", "z", "tag" ], + "descriptor" : "(IIIIIIIIJ)V" + }, { + "method" : "draw0", + "owner" : "du", + "name" : "v", + "access" : 16, + "descriptor" : "(ZZZJ)V" + }, { + "method" : "offsetBy", + "owner" : "du", + "name" : "h", + "access" : 1, + "parameters" : [ "x", "y", "z" ], + "descriptor" : "(III)V" + }, { + "method" : "resetBounds", + "owner" : "du", + "name" : "x", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "rotateY180", + "owner" : "du", + "name" : "s", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "rotateY270Ccw", + "owner" : "du", + "name" : "t", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "rotateY90Ccw", + "owner" : "du", + "name" : "j", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "rotateZ", + "owner" : "du", + "name" : "y", + "access" : 1, + "parameters" : [ "pitch" ], + "descriptor" : "(I)V" + }, { + "method" : "scale", + "owner" : "du", + "name" : "b", + "access" : 1, + "parameters" : [ "x", "y", "z" ], + "descriptor" : "(III)V" + }, { + "method" : "toSharedSequenceModel", + "owner" : "du", + "name" : "f", + "access" : 1, + "parameters" : [ "b" ], + "descriptor" : "(Z)Ldu;" + }, { + "method" : "toSharedSpotAnimationModel", + "owner" : "du", + "name" : "q", + "access" : 1, + "parameters" : [ "b" ], + "descriptor" : "(Z)Ldu;" + }, { + "method" : "transform", + "owner" : "du", + "name" : "z", + "access" : 0, + "parameters" : [ "type", "labels", "tx", "ty", "tz" ], + "descriptor" : "(I[IIII)V" + }, { + "method" : "__m_231", + "owner" : "du", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "([[IIIIZI)Ldu;" + }, { + "method" : "__g_232", + "owner" : "du", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__l_233", + "owner" : "du", + "name" : "l", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__c_234", + "owner" : "du", + "name" : "c", + "access" : 17, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6" ], + "descriptor" : "(IIIIIII)V" + }, { + "method" : "__p_235", + "owner" : "du", + "name" : "p", + "access" : 17, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7" ], + "descriptor" : "(IIIIIIII)V" + }, { + "method" : "__ag_236", + "owner" : "du", + "name" : "ag", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__aq_237", + "owner" : "du", + "name" : "aq", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + }, { + "access" : 1, + "descriptor" : "([Ldu;I)V" + } ] +}, { + "class" : "VertexNormal", + "name" : "dq", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "dq", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1493845293 + }, { + "field" : "__m", + "owner" : "dq", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1414310131 + }, { + "field" : "__q", + "owner" : "dq", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 1575149515 + }, { + "field" : "__w", + "owner" : "dq", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -487323631 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + }, { + "access" : 0, + "descriptor" : "(Ldq;)V" + } ] +}, { + "class" : "Scene", + "name" : "em", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "minPlane", + "owner" : "em", + "name" : "g", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "planes", + "owner" : "em", + "name" : "f", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "tempGameObjects", + "owner" : "em", + "name" : "e", + "access" : 0, + "descriptor" : "[Leh;" + }, { + "field" : "tempGameObjectsCount", + "owner" : "em", + "name" : "l", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "tileHeights", + "owner" : "em", + "name" : "o", + "access" : 0, + "descriptor" : "[[[I" + }, { + "field" : "tiles", + "owner" : "em", + "name" : "u", + "access" : 0, + "descriptor" : "[[[Ldj;" + }, { + "field" : "xSize", + "owner" : "em", + "name" : "q", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "ySize", + "owner" : "em", + "name" : "w", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__bd", + "owner" : "em", + "name" : "bd", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "__bk", + "owner" : "em", + "name" : "bk", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "__x", + "owner" : "em", + "name" : "x", + "access" : 0, + "descriptor" : "[[[I" + } ], + "methods" : [ { + "method" : "addTile", + "owner" : "em", + "name" : "u", + "access" : 1, + "descriptor" : "(IIIIIIIIIIIIIIIIIIII)V" + }, { + "method" : "clear", + "owner" : "em", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "clearTempGameObjects", + "owner" : "em", + "name" : "s", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "draw", + "owner" : "em", + "name" : "az", + "access" : 1, + "parameters" : [ "x", "y", "z", "pitch", "yaw", "plane" ], + "descriptor" : "(IIIIII)V" + }, { + "method" : "drawTile", + "owner" : "em", + "name" : "au", + "access" : 0, + "parameters" : [ "tile", "b" ], + "descriptor" : "(Ldj;Z)V" + }, { + "method" : "drawTileMinimap", + "owner" : "em", + "name" : "ae", + "access" : 1, + "parameters" : [ "pixels", "index", "width", "plane", "x", "y" ], + "descriptor" : "([IIIIII)V" + }, { + "method" : "getBoundaryObject", + "owner" : "em", + "name" : "ag", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)Lej;" + }, { + "method" : "getFloorDecoration", + "owner" : "em", + "name" : "av", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)Ldo;" + }, { + "method" : "getFloorDecorationTag", + "owner" : "em", + "name" : "ah", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)J" + }, { + "method" : "getObjectFlags", + "owner" : "em", + "name" : "ak", + "access" : 1, + "parameters" : [ "plane", "x", "y", "id" ], + "descriptor" : "(IIIJ)I" + }, { + "method" : "getWallDecoration", + "owner" : "em", + "name" : "aq", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)Leq;" + }, { + "method" : "init", + "owner" : "em", + "name" : "f", + "access" : 1, + "parameters" : [ "minPlane" ], + "descriptor" : "(I)V" + }, { + "method" : "menuOpen", + "owner" : "em", + "name" : "ap", + "access" : 1, + "parameters" : [ "plane", "screenX", "screenY", "b" ], + "descriptor" : "(IIIZ)V" + }, { + "method" : "newBoundaryObject", + "owner" : "em", + "name" : "e", + "access" : 1, + "parameters" : [ "plane", "x", "y", "tileHeight", "entity1", "entity2", "orientationA", "orientationB", "tag", "flags" ], + "descriptor" : "(IIIILex;Lex;IIJI)V" + }, { + "method" : "newFloorDecoration", + "owner" : "em", + "name" : "g", + "access" : 1, + "parameters" : [ "plane", "x", "y", "tileHeight", "entity", "tag", "flags" ], + "descriptor" : "(IIIILex;JI)V" + }, { + "method" : "newGameObject", + "owner" : "em", + "name" : "j", + "access" : 0, + "parameters" : [ "plane", "startX", "startY", "sizeX", "sizeY", "centerX", "centerY", "height", "entity", "orientation", "isTemp", "tag", "flags" ], + "descriptor" : "(IIIIIIIILex;IZJI)Z" + }, { + "method" : "newGroundItemPile", + "owner" : "em", + "name" : "l", + "access" : 1, + "parameters" : [ "plane", "x", "y", "tileHeight", "first", "tag", "second", "third" ], + "descriptor" : "(IIIILex;JLex;Lex;)V" + }, { + "method" : "newWallDecoration", + "owner" : "em", + "name" : "x", + "access" : 1, + "parameters" : [ "plane", "x", "y", "tileHeight", "entity1", "entity2", "orientation", "int7", "xOffset", "yOffset", "tag", "flags" ], + "descriptor" : "(IIIILex;Lex;IIIIJI)V" + }, { + "method" : "occlude", + "owner" : "em", + "name" : "ai", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "removeBoundaryObject", + "owner" : "em", + "name" : "h", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)V" + }, { + "method" : "removeFloorDecoration", + "owner" : "em", + "name" : "p", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)V" + }, { + "method" : "removeGameObject", + "owner" : "em", + "name" : "t", + "access" : 0, + "parameters" : [ "gameObject" ], + "descriptor" : "(Leh;)V" + }, { + "method" : "removeGroundItemPile", + "owner" : "em", + "name" : "v", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)V" + }, { + "method" : "removeWallDecoration", + "owner" : "em", + "name" : "b", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(III)V" + }, { + "method" : "setLinkBelow", + "owner" : "em", + "name" : "q", + "access" : 1, + "parameters" : [ "x", "y" ], + "descriptor" : "(II)V" + }, { + "method" : "setTileMinPlane", + "owner" : "em", + "name" : "o", + "access" : 1, + "parameters" : [ "plane", "x", "y", "minPlane" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__d_238", + "owner" : "em", + "name" : "d", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "arg9" ], + "descriptor" : "(IIIIIILex;IJI)Z" + }, { + "method" : "__a_239", + "owner" : "em", + "name" : "a", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8" ], + "descriptor" : "(IIIIILex;IJZ)Z" + }, { + "method" : "__z_240", + "owner" : "em", + "name" : "z", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "arg9", "arg10", "arg11" ], + "descriptor" : "(IIIIILex;IJIIII)Z" + }, { + "method" : "__y_241", + "owner" : "em", + "name" : "y", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__c_242", + "owner" : "em", + "name" : "c", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)V" + }, { + "method" : "__aj_243", + "owner" : "em", + "name" : "aj", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)Leh;" + }, { + "method" : "__ar_244", + "owner" : "em", + "name" : "ar", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)J" + }, { + "method" : "__ac_245", + "owner" : "em", + "name" : "ac", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)J" + }, { + "method" : "__ay_246", + "owner" : "em", + "name" : "ay", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)J" + }, { + "method" : "__aw_247", + "owner" : "em", + "name" : "aw", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)V" + }, { + "method" : "__al_248", + "owner" : "em", + "name" : "al", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(Ldw;III)V" + }, { + "method" : "__ab_249", + "owner" : "em", + "name" : "ab", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(Ldw;IIIII)V" + }, { + "method" : "__as_250", + "owner" : "em", + "name" : "as", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__ao_251", + "owner" : "em", + "name" : "ao", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7" ], + "descriptor" : "(Leb;IIIIIII)V" + }, { + "method" : "__aa_252", + "owner" : "em", + "name" : "aa", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6" ], + "descriptor" : "(Ldv;IIIIII)V" + }, { + "method" : "__ba_253", + "owner" : "em", + "name" : "ba", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)Z" + }, { + "method" : "__bb_254", + "owner" : "em", + "name" : "bb", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)Z" + }, { + "method" : "__bs_255", + "owner" : "em", + "name" : "bs", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)Z" + }, { + "method" : "__bq_256", + "owner" : "em", + "name" : "bq", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(IIIIII)Z" + }, { + "method" : "__bn_257", + "owner" : "em", + "name" : "bn", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(III[[[I)V" + } ] +}, { + "class" : "FaceNormal", + "name" : "el", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "el", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -1376860893 + }, { + "field" : "__m", + "owner" : "el", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -2074333261 + }, { + "field" : "__q", + "owner" : "el", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 2619977 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "TextureLoader", + "name" : "ei", + "super" : "java.lang.Object", + "access" : 1537, + "interfaces" : [ ], + "fields" : [ ], + "methods" : [ { + "method" : "isLowDetail", + "owner" : "ei", + "name" : "u", + "access" : 1025, + "descriptor" : "(II)Z" + }, { + "method" : "load", + "owner" : "ei", + "name" : "q", + "access" : 1025, + "descriptor" : "(II)[I" + }, { + "method" : "__w_258", + "owner" : "ei", + "name" : "w", + "access" : 1025, + "parameters" : [ "arg0" ], + "descriptor" : "(II)I" + }, { + "method" : "__o_259", + "owner" : "ei", + "name" : "o", + "access" : 1025, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)Z" + } ], + "constructors" : [ ] +}, { + "class" : "Occluder", + "name" : "ee", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "maxTileX", + "owner" : "ee", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : -13700523 + }, { + "field" : "maxTileY", + "owner" : "ee", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 1501977891 + }, { + "field" : "maxX", + "owner" : "ee", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -2141305127 + }, { + "field" : "maxY", + "owner" : "ee", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -1114046315 + }, { + "field" : "maxZ", + "owner" : "ee", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -1805075909 + }, { + "field" : "minTileX", + "owner" : "ee", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : -691483983 + }, { + "field" : "minTileY", + "owner" : "ee", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 768402657 + }, { + "field" : "minX", + "owner" : "ee", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -1824663821 + }, { + "field" : "minY", + "owner" : "ee", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : 842961497 + }, { + "field" : "minZ", + "owner" : "ee", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -41239751 + }, { + "field" : "type", + "owner" : "ee", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -806776509 + }, { + "field" : "__a", + "owner" : "ee", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : -1527021367 + }, { + "field" : "__i", + "owner" : "ee", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : 1324959981 + }, { + "field" : "__j", + "owner" : "ee", + "name" : "j", + "access" : 0, + "descriptor" : "I", + "decoder" : -373839103 + }, { + "field" : "__k", + "owner" : "ee", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : 826041747 + }, { + "field" : "__n", + "owner" : "ee", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : -407777817 + }, { + "field" : "__s", + "owner" : "ee", + "name" : "s", + "access" : 0, + "descriptor" : "I", + "decoder" : -1334433969 + }, { + "field" : "__z", + "owner" : "ee", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : -570391007 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "GameObject", + "name" : "eh", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "centerX", + "owner" : "eh", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 109300811 + }, { + "field" : "centerY", + "owner" : "eh", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 714046631 + }, { + "field" : "endX", + "owner" : "eh", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -379698951 + }, { + "field" : "endY", + "owner" : "eh", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -607228629 + }, { + "field" : "entity", + "owner" : "eh", + "name" : "u", + "access" : 1, + "descriptor" : "Lex;" + }, { + "field" : "flags", + "owner" : "eh", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : -161115901 + }, { + "field" : "height", + "owner" : "eh", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1791908691 + }, { + "field" : "lastDrawn", + "owner" : "eh", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : -1043687633 + }, { + "field" : "orientation", + "owner" : "eh", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 1393658667 + }, { + "field" : "plane", + "owner" : "eh", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 2095667225 + }, { + "field" : "startX", + "owner" : "eh", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -1017836867 + }, { + "field" : "startY", + "owner" : "eh", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -1519796265 + }, { + "field" : "tag", + "owner" : "eh", + "name" : "n", + "access" : 1, + "descriptor" : "J", + "decoder" : -114546124748632877 + }, { + "field" : "__d", + "owner" : "eh", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : 1941106389 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "UrlRequester", + "name" : "eo", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ { + "field" : "isClosed", + "owner" : "eo", + "name" : "f", + "access" : 64, + "descriptor" : "Z" + }, { + "field" : "requests", + "owner" : "eo", + "name" : "q", + "access" : 0, + "descriptor" : "Ljava/util/Queue;" + }, { + "field" : "thread", + "owner" : "eo", + "name" : "m", + "access" : 16, + "descriptor" : "Ljava/lang/Thread;" + } ], + "methods" : [ { + "method" : "close", + "owner" : "eo", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(S)V" + }, { + "method" : "request", + "owner" : "eo", + "name" : "m", + "access" : 1, + "parameters" : [ "url" ], + "descriptor" : "(Ljava/net/URL;I)Ley;" + }, { + "method" : "__run_260", + "owner" : "eo", + "name" : "run", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "EvictingDualNodeHashTable", + "name" : "er", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "capacity", + "owner" : "er", + "name" : "f", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "deque", + "owner" : "er", + "name" : "o", + "access" : 0, + "descriptor" : "Ljp;" + }, { + "field" : "hashTable", + "owner" : "er", + "name" : "w", + "access" : 0, + "descriptor" : "Lld;" + }, { + "field" : "remainingCapacity", + "owner" : "er", + "name" : "q", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__m", + "owner" : "er", + "name" : "m", + "access" : 0, + "descriptor" : "Lfn;" + } ], + "methods" : [ { + "method" : "clear", + "owner" : "er", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "get", + "owner" : "er", + "name" : "m", + "access" : 1, + "parameters" : [ "key" ], + "descriptor" : "(J)Lfn;" + }, { + "method" : "put", + "owner" : "er", + "name" : "q", + "access" : 1, + "parameters" : [ "value", "key" ], + "descriptor" : "(Lfn;J)V" + }, { + "method" : "remove", + "owner" : "er", + "name" : "f", + "access" : 1, + "parameters" : [ "key" ], + "descriptor" : "(J)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(I)V" + } ] +}, { + "class" : "UserComparator4", + "name" : "ev", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ { + "field" : "__m", + "owner" : "ev", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_261", + "owner" : "ev", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;I)I" + }, { + "method" : "__compare_262", + "owner" : "ev", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + }, { + "method" : "__equals_263", + "owner" : "ev", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator9", + "name" : "ea", + "super" : "kf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "ea", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_264", + "owner" : "ea", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;I)I" + }, { + "method" : "__compare_265", + "owner" : "ea", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator8", + "name" : "es", + "super" : "kf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "es", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_266", + "owner" : "es", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;B)I" + }, { + "method" : "__compare_267", + "owner" : "es", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator10", + "name" : "eg", + "super" : "kf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "eg", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_268", + "owner" : "eg", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;B)I" + }, { + "method" : "__compare_269", + "owner" : "eg", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator7", + "name" : "ez", + "super" : "kf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "ez", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_270", + "owner" : "ez", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;I)I" + }, { + "method" : "__compare_271", + "owner" : "ez", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator5", + "name" : "ep", + "super" : "kf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "ep", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_272", + "owner" : "ep", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;B)I" + }, { + "method" : "__compare_273", + "owner" : "ep", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator3", + "name" : "fq", + "super" : "kf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "fq", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_274", + "owner" : "fq", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;I)I" + }, { + "method" : "__compare_275", + "owner" : "fq", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator6", + "name" : "fg", + "super" : "kf", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__m", + "owner" : "fg", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_276", + "owner" : "fg", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lke;Lke;I)I" + }, { + "method" : "__compare_277", + "owner" : "fg", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "MilliClock", + "name" : "fd", + "super" : "fa", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "fd", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1940981129 + }, { + "field" : "__o", + "owner" : "fd", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 250272357 + }, { + "field" : "__q", + "owner" : "fd", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 1217137493 + }, { + "field" : "__u", + "owner" : "fd", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 576555527 + }, { + "field" : "__w", + "owner" : "fd", + "name" : "w", + "access" : 0, + "descriptor" : "J", + "decoder" : -8372744267470318611 + }, { + "field" : "__m", + "owner" : "fd", + "name" : "m", + "access" : 0, + "descriptor" : "[J" + } ], + "methods" : [ { + "method" : "mark", + "owner" : "fd", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "wait", + "owner" : "fd", + "name" : "f", + "access" : 1, + "parameters" : [ "cycleMs", "minSleepMs" ], + "descriptor" : "(III)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "BufferedSource", + "name" : "fh", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ { + "field" : "buffer", + "owner" : "fh", + "name" : "w", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "capacity", + "owner" : "fh", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : -1970062431 + }, { + "field" : "exception", + "owner" : "fh", + "name" : "g", + "access" : 0, + "descriptor" : "Ljava/io/IOException;" + }, { + "field" : "inputStream", + "owner" : "fh", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/io/InputStream;" + }, { + "field" : "limit", + "owner" : "fh", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 1507905677 + }, { + "field" : "position", + "owner" : "fh", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 267006153 + }, { + "field" : "thread", + "owner" : "fh", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/lang/Thread;" + } ], + "methods" : [ { + "method" : "available", + "owner" : "fh", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "close", + "owner" : "fh", + "name" : "o", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "isAvailable", + "owner" : "fh", + "name" : "m", + "access" : 0, + "parameters" : [ "length" ], + "descriptor" : "(II)Z" + }, { + "method" : "read", + "owner" : "fh", + "name" : "w", + "access" : 0, + "parameters" : [ "dst", "dstIndex", "length" ], + "descriptor" : "([BIIB)I" + }, { + "method" : "readUnsignedByte", + "owner" : "fh", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__run_278", + "owner" : "fh", + "name" : "run", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/io/InputStream;I)V" + } ] +}, { + "class" : "TaskHandler", + "name" : "fz", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ { + "field" : "current", + "owner" : "fz", + "name" : "q", + "access" : 0, + "descriptor" : "Lfm;" + }, { + "field" : "isClosed", + "owner" : "fz", + "name" : "u", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "task0", + "owner" : "fz", + "name" : "w", + "access" : 0, + "descriptor" : "Lfm;" + }, { + "field" : "thread", + "owner" : "fz", + "name" : "o", + "access" : 0, + "descriptor" : "Ljava/lang/Thread;" + } ], + "methods" : [ { + "method" : "close", + "owner" : "fz", + "name" : "m", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "newSocketTask", + "owner" : "fz", + "name" : "q", + "access" : 17, + "descriptor" : "(Ljava/lang/String;II)Lfm;" + }, { + "method" : "newTask", + "owner" : "fz", + "name" : "f", + "access" : 16, + "descriptor" : "(IIILjava/lang/Object;I)Lfm;" + }, { + "method" : "newThreadTask", + "owner" : "fz", + "name" : "w", + "access" : 17, + "descriptor" : "(Ljava/lang/Runnable;II)Lfm;" + }, { + "method" : "__run_279", + "owner" : "fz", + "name" : "run", + "access" : 17, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "BufferedNetSocket", + "name" : "ft", + "super" : "fu", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "sink", + "owner" : "ft", + "name" : "q", + "access" : 0, + "descriptor" : "Lfr;" + }, { + "field" : "socket", + "owner" : "ft", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/net/Socket;" + }, { + "field" : "source", + "owner" : "ft", + "name" : "f", + "access" : 0, + "descriptor" : "Lfh;" + } ], + "methods" : [ { + "method" : "available", + "owner" : "ft", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "close", + "owner" : "ft", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "isAvailable", + "owner" : "ft", + "name" : "f", + "access" : 1, + "parameters" : [ "length" ], + "descriptor" : "(II)Z" + }, { + "method" : "read", + "owner" : "ft", + "name" : "o", + "access" : 1, + "parameters" : [ "dst", "dstIndex", "length" ], + "descriptor" : "([BIII)I" + }, { + "method" : "readUnsignedByte", + "owner" : "ft", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "write", + "owner" : "ft", + "name" : "u", + "access" : 1, + "parameters" : [ "src", "srcIndex", "length" ], + "descriptor" : "([BIIB)V" + }, { + "method" : "__finalize_280", + "owner" : "ft", + "name" : "finalize", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/net/Socket;II)V" + } ] +}, { + "class" : "NetSocket", + "name" : "fb", + "super" : "fu", + "access" : 49, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ { + "field" : "array", + "owner" : "fb", + "name" : "g", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "exceptionWriting", + "owner" : "fb", + "name" : "x", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "inputStream", + "owner" : "fb", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/io/InputStream;" + }, { + "field" : "isClosed", + "owner" : "fb", + "name" : "w", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "outputStream", + "owner" : "fb", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/io/OutputStream;" + }, { + "field" : "socket", + "owner" : "fb", + "name" : "q", + "access" : 0, + "descriptor" : "Ljava/net/Socket;" + }, { + "field" : "task", + "owner" : "fb", + "name" : "u", + "access" : 0, + "descriptor" : "Lfm;" + }, { + "field" : "taskHandler", + "owner" : "fb", + "name" : "o", + "access" : 0, + "descriptor" : "Lfz;" + }, { + "field" : "__e", + "owner" : "fb", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : 2057244853 + }, { + "field" : "__l", + "owner" : "fb", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -738185459 + }, { + "field" : "__d", + "owner" : "fb", + "name" : "d", + "access" : 16, + "descriptor" : "I", + "decoder" : -1644762957 + }, { + "field" : "__k", + "owner" : "fb", + "name" : "k", + "access" : 16, + "descriptor" : "I", + "decoder" : -782964015 + } ], + "methods" : [ { + "method" : "available", + "owner" : "fb", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "close", + "owner" : "fb", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "finalize", + "owner" : "fb", + "name" : "finalize", + "access" : 4, + "descriptor" : "()V" + }, { + "method" : "isAvailable", + "owner" : "fb", + "name" : "f", + "access" : 1, + "parameters" : [ "length" ], + "descriptor" : "(II)Z" + }, { + "method" : "read", + "owner" : "fb", + "name" : "o", + "access" : 1, + "parameters" : [ "dst", "dstIndex", "length" ], + "descriptor" : "([BIII)I" + }, { + "method" : "readUnsignedByte", + "owner" : "fb", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "write", + "owner" : "fb", + "name" : "u", + "access" : 1, + "parameters" : [ "src", "srcIndex", "length" ], + "descriptor" : "([BIIB)V" + }, { + "method" : "write0", + "owner" : "fb", + "name" : "ay", + "access" : 0, + "parameters" : [ "src", "srcIndex", "length" ], + "descriptor" : "([BIIB)V" + }, { + "method" : "__run_281", + "owner" : "fb", + "name" : "run", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Ljava/net/Socket;Lfz;I)V" + } ] +}, { + "class" : "BufferedSink", + "name" : "fr", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ { + "field" : "buffer", + "owner" : "fr", + "name" : "w", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "capacity", + "owner" : "fr", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 1805563727 + }, { + "field" : "exception", + "owner" : "fr", + "name" : "g", + "access" : 0, + "descriptor" : "Ljava/io/IOException;" + }, { + "field" : "isClosed0", + "owner" : "fr", + "name" : "l", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "limit", + "owner" : "fr", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 1028856279 + }, { + "field" : "outputStream", + "owner" : "fr", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/io/OutputStream;" + }, { + "field" : "position", + "owner" : "fr", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : 315461309 + }, { + "field" : "thread", + "owner" : "fr", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/lang/Thread;" + } ], + "methods" : [ { + "method" : "close", + "owner" : "fr", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "isClosed", + "owner" : "fr", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "write", + "owner" : "fr", + "name" : "f", + "access" : 0, + "parameters" : [ "src", "srcIndex", "length" ], + "descriptor" : "([BIIB)V" + }, { + "method" : "__run_282", + "owner" : "fr", + "name" : "run", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/io/OutputStream;I)V" + } ] +}, { + "class" : "CollisionMap", + "name" : "fy", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "flags", + "owner" : "fy", + "name" : "ab", + "access" : 1, + "descriptor" : "[[I" + }, { + "field" : "xInset", + "owner" : "fy", + "name" : "ah", + "access" : 0, + "descriptor" : "I", + "decoder" : 264774249 + }, { + "field" : "xSize", + "owner" : "fy", + "name" : "aw", + "access" : 0, + "descriptor" : "I", + "decoder" : 674483785 + }, { + "field" : "yInset", + "owner" : "fy", + "name" : "ak", + "access" : 0, + "descriptor" : "I", + "decoder" : -1037712787 + }, { + "field" : "ySize", + "owner" : "fy", + "name" : "al", + "access" : 0, + "descriptor" : "I", + "decoder" : -871458249 + } ], + "methods" : [ { + "method" : "clear", + "owner" : "fy", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__f_283", + "owner" : "fy", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(IIIIZB)V" + }, { + "method" : "__q_284", + "owner" : "fy", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(IIIIZI)V" + }, { + "method" : "__w_285", + "owner" : "fy", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__o_286", + "owner" : "fy", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__u_287", + "owner" : "fy", + "name" : "u", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__g_288", + "owner" : "fy", + "name" : "g", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(IIIIZB)V" + }, { + "method" : "__l_289", + "owner" : "fy", + "name" : "l", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(IIIIIZB)V" + }, { + "method" : "__e_290", + "owner" : "fy", + "name" : "e", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__x_291", + "owner" : "fy", + "name" : "x", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(II)V" + } ] +}, { + "class" : "Link", + "name" : "gh", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "gh", + "name" : "f", + "access" : 1, + "descriptor" : "Lgh;" + }, { + "field" : "__m", + "owner" : "gh", + "name" : "m", + "access" : 1, + "descriptor" : "Lgh;" + } ], + "methods" : [ { + "method" : "remove", + "owner" : "gh", + "name" : "m", + "access" : 1, + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "PacketBufferNode", + "name" : "gg", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "packetBuffer", + "owner" : "gg", + "name" : "q", + "access" : 1, + "descriptor" : "Lhx;" + }, { + "field" : "__m", + "owner" : "gg", + "name" : "m", + "access" : 1, + "descriptor" : "Lgs;" + }, { + "field" : "__f", + "owner" : "gg", + "name" : "f", + "access" : 1, + "descriptor" : "I", + "decoder" : 1433542775 + }, { + "field" : "__w", + "owner" : "gg", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : -2051819203 + } ], + "methods" : [ { + "method" : "__f_292", + "owner" : "gg", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "Huffman", + "name" : "gd", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "gd", + "name" : "f", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__m", + "owner" : "gd", + "name" : "m", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__q", + "owner" : "gd", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "__m_293", + "owner" : "gd", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "([BII[BIB)I" + }, { + "method" : "__f_294", + "owner" : "gd", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "([BI[BIII)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "([B)V" + } ] +}, { + "class" : "Bzip2State", + "name" : "gt", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "__ag", + "owner" : "gt", + "name" : "ag", + "access" : 0, + "descriptor" : "[Z" + }, { + "field" : "__aq", + "owner" : "gt", + "name" : "aq", + "access" : 0, + "descriptor" : "[Z" + }, { + "field" : "__i", + "owner" : "gt", + "name" : "i", + "access" : 0, + "descriptor" : "B" + }, { + "field" : "__ac", + "owner" : "gt", + "name" : "ac", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__aj", + "owner" : "gt", + "name" : "aj", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__av", + "owner" : "gt", + "name" : "av", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__ay", + "owner" : "gt", + "name" : "ay", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__g", + "owner" : "gt", + "name" : "g", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__x", + "owner" : "gt", + "name" : "x", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__ah", + "owner" : "gt", + "name" : "ah", + "access" : 0, + "descriptor" : "[[B" + }, { + "field" : "__a", + "owner" : "gt", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : -1994129645 + }, { + "field" : "__ae", + "owner" : "gt", + "name" : "ae", + "access" : 0, + "descriptor" : "I", + "decoder" : 444639767 + }, { + "field" : "__c", + "owner" : "gt", + "name" : "c", + "access" : 0, + "descriptor" : "I", + "decoder" : -557334365 + }, { + "field" : "__d", + "owner" : "gt", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -861462251 + }, { + "field" : "__e", + "owner" : "gt", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -473971741 + }, { + "field" : "__h", + "owner" : "gt", + "name" : "h", + "access" : 0, + "descriptor" : "I", + "decoder" : -1981923611 + }, { + "field" : "__j", + "owner" : "gt", + "name" : "j", + "access" : 0, + "descriptor" : "I", + "decoder" : -1987934943 + }, { + "field" : "__k", + "owner" : "gt", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : 594179173 + }, { + "field" : "__l", + "owner" : "gt", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -1510817847 + }, { + "field" : "__n", + "owner" : "gt", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : 1860254567 + }, { + "field" : "__s", + "owner" : "gt", + "name" : "s", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__t", + "owner" : "gt", + "name" : "t", + "access" : 0, + "descriptor" : "I", + "decoder" : 1502359789 + }, { + "field" : "__v", + "owner" : "gt", + "name" : "v", + "access" : 0, + "descriptor" : "I", + "decoder" : -886333045 + }, { + "field" : "__y", + "owner" : "gt", + "name" : "y", + "access" : 0, + "descriptor" : "I", + "decoder" : -953353963 + }, { + "field" : "__z", + "owner" : "gt", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : -1793367959 + }, { + "field" : "__ab", + "owner" : "gt", + "name" : "ab", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__ar", + "owner" : "gt", + "name" : "ar", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__b", + "owner" : "gt", + "name" : "b", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__r", + "owner" : "gt", + "name" : "r", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__ak", + "owner" : "gt", + "name" : "ak", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "__al", + "owner" : "gt", + "name" : "al", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "__aw", + "owner" : "gt", + "name" : "aw", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "__f", + "owner" : "gt", + "name" : "f", + "access" : 16, + "descriptor" : "I" + }, { + "field" : "__m", + "owner" : "gt", + "name" : "m", + "access" : 16, + "descriptor" : "I" + }, { + "field" : "__o", + "owner" : "gt", + "name" : "o", + "access" : 16, + "descriptor" : "I" + }, { + "field" : "__q", + "owner" : "gt", + "name" : "q", + "access" : 16, + "descriptor" : "I" + }, { + "field" : "__u", + "owner" : "gt", + "name" : "u", + "access" : 16, + "descriptor" : "I" + }, { + "field" : "__w", + "owner" : "gt", + "name" : "w", + "access" : 16, + "descriptor" : "I" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Buffer", + "name" : "gr", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "array", + "owner" : "gr", + "name" : "m", + "access" : 1, + "descriptor" : "[B" + }, { + "field" : "index", + "owner" : "gr", + "name" : "f", + "access" : 1, + "descriptor" : "I", + "decoder" : -271438207 + } ], + "methods" : [ { + "method" : "encryptRsa", + "owner" : "gr", + "name" : "ao", + "access" : 1, + "descriptor" : "(Ljava/math/BigInteger;Ljava/math/BigInteger;I)V" + }, { + "method" : "readBoolean", + "owner" : "gr", + "name" : "ac", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "readByte", + "owner" : "gr", + "name" : "v", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)B" + }, { + "method" : "readInt", + "owner" : "gr", + "name" : "av", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "readLong", + "owner" : "gr", + "name" : "ar", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)J" + }, { + "method" : "readMedium", + "owner" : "gr", + "name" : "aj", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "readStringCp1252NullCircumfixed", + "owner" : "gr", + "name" : "ak", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/lang/String;" + }, { + "method" : "readStringCp1252NullTerminated", + "owner" : "gr", + "name" : "ah", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/lang/String;" + }, { + "method" : "readStringCp1252NullTerminatedOrNull", + "owner" : "gr", + "name" : "ay", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/lang/String;" + }, { + "method" : "readUnsignedByte", + "owner" : "gr", + "name" : "p", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "readUnsignedByteNegate", + "owner" : "gr", + "name" : "bs", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "writeBoolean", + "owner" : "gr", + "name" : "e", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(ZB)V" + }, { + "method" : "writeByte", + "owner" : "gr", + "name" : "q", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(II)V" + }, { + "method" : "writeInt", + "owner" : "gr", + "name" : "u", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(II)V" + }, { + "method" : "writeIntLE", + "owner" : "gr", + "name" : "bi", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(IB)V" + }, { + "method" : "writeIntLE16", + "owner" : "gr", + "name" : "bg", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(II)V" + }, { + "method" : "writeIntME", + "owner" : "gr", + "name" : "bz", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(IB)V" + }, { + "method" : "writeLong", + "owner" : "gr", + "name" : "l", + "access" : 1, + "parameters" : [ "n" ], + "descriptor" : "(J)V" + }, { + "method" : "writeLongMedium", + "owner" : "gr", + "name" : "g", + "access" : 1, + "parameters" : [ "n" ], + "descriptor" : "(J)V" + }, { + "method" : "writeMedium", + "owner" : "gr", + "name" : "o", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(IB)V" + }, { + "method" : "writeShort", + "owner" : "gr", + "name" : "w", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(IB)V" + }, { + "method" : "writeShortLE", + "owner" : "gr", + "name" : "bc", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(IB)V" + }, { + "method" : "writeSmartByteShort", + "owner" : "gr", + "name" : "b", + "access" : 1, + "parameters" : [ "value" ], + "descriptor" : "(II)V" + }, { + "method" : "writeStringCp1252NullCircumfixed", + "owner" : "gr", + "name" : "z", + "access" : 1, + "parameters" : [ "string" ], + "descriptor" : "(Ljava/lang/String;S)V" + }, { + "method" : "writeStringCp1252NullTerminated", + "owner" : "gr", + "name" : "d", + "access" : 1, + "parameters" : [ "string" ], + "descriptor" : "(Ljava/lang/String;B)V" + }, { + "method" : "xteaDecrypt", + "owner" : "gr", + "name" : "au", + "access" : 1, + "parameters" : [ "xteaKey", "start", "end" ], + "descriptor" : "([IIII)V" + }, { + "method" : "xteaDecryptAll", + "owner" : "gr", + "name" : "an", + "access" : 1, + "parameters" : [ "xteaKey" ], + "descriptor" : "([II)V" + }, { + "method" : "xteaEncrypt", + "owner" : "gr", + "name" : "az", + "access" : 1, + "parameters" : [ "xteaKey", "start", "end" ], + "descriptor" : "([IIII)V" + }, { + "method" : "xteaEncryptAll", + "owner" : "gr", + "name" : "am", + "access" : 1, + "parameters" : [ "xteaKey" ], + "descriptor" : "([IB)V" + }, { + "method" : "__f_295", + "owner" : "gr", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(S)V" + }, { + "method" : "__j_296", + "owner" : "gr", + "name" : "j", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/CharSequence;B)V" + }, { + "method" : "__s_297", + "owner" : "gr", + "name" : "s", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([BIII)V" + }, { + "method" : "__t_298", + "owner" : "gr", + "name" : "t", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__y_299", + "owner" : "gr", + "name" : "y", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__h_300", + "owner" : "gr", + "name" : "h", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__c_301", + "owner" : "gr", + "name" : "c", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__ag_302", + "owner" : "gr", + "name" : "ag", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__aq_303", + "owner" : "gr", + "name" : "aq", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__aw_304", + "owner" : "gr", + "name" : "aw", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Ljava/lang/String;" + }, { + "method" : "__al_305", + "owner" : "gr", + "name" : "al", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([BIIB)V" + }, { + "method" : "__ab_306", + "owner" : "gr", + "name" : "ab", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__ae_307", + "owner" : "gr", + "name" : "ae", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__at_308", + "owner" : "gr", + "name" : "at", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__ad_309", + "owner" : "gr", + "name" : "ad", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__ap_310", + "owner" : "gr", + "name" : "ap", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__as_311", + "owner" : "gr", + "name" : "as", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__aa_312", + "owner" : "gr", + "name" : "aa", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)I" + }, { + "method" : "__ax_313", + "owner" : "gr", + "name" : "ax", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__af_314", + "owner" : "gr", + "name" : "af", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)V" + }, { + "method" : "__ai_315", + "owner" : "gr", + "name" : "ai", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__ba_316", + "owner" : "gr", + "name" : "ba", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)V" + }, { + "method" : "__bb_317", + "owner" : "gr", + "name" : "bb", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bq_318", + "owner" : "gr", + "name" : "bq", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bn_319", + "owner" : "gr", + "name" : "bn", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)B" + }, { + "method" : "__bk_320", + "owner" : "gr", + "name" : "bk", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)B" + }, { + "method" : "__bd_321", + "owner" : "gr", + "name" : "bd", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)B" + }, { + "method" : "__bo_322", + "owner" : "gr", + "name" : "bo", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__bx_323", + "owner" : "gr", + "name" : "bx", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)V" + }, { + "method" : "__by_324", + "owner" : "gr", + "name" : "by", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bu_325", + "owner" : "gr", + "name" : "bu", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bm_326", + "owner" : "gr", + "name" : "bm", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__bl_327", + "owner" : "gr", + "name" : "bl", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__br_328", + "owner" : "gr", + "name" : "br", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bj_329", + "owner" : "gr", + "name" : "bj", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bt_330", + "owner" : "gr", + "name" : "bt", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bp_331", + "owner" : "gr", + "name" : "bp", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__bf_332", + "owner" : "gr", + "name" : "bf", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "__bh_333", + "owner" : "gr", + "name" : "bh", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([BIII)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(I)V" + }, { + "access" : 1, + "descriptor" : "([B)V" + } ] +}, { + "class" : "PacketBuffer", + "name" : "hx", + "super" : "gr", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "bitIndex", + "owner" : "hx", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -1048718919 + }, { + "field" : "isaacCipher0", + "owner" : "hx", + "name" : "e", + "access" : 0, + "descriptor" : "Lhn;" + } ], + "methods" : [ { + "method" : "bitsRemaining", + "owner" : "hx", + "name" : "jr", + "access" : 1, + "parameters" : [ "index" ], + "descriptor" : "(II)I" + }, { + "method" : "exportIndex", + "owner" : "hx", + "name" : "jm", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "importIndex", + "owner" : "hx", + "name" : "jq", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "newIsaacCipher", + "owner" : "hx", + "name" : "io", + "access" : 1, + "parameters" : [ "array" ], + "descriptor" : "([II)V" + }, { + "method" : "readBits", + "owner" : "hx", + "name" : "jw", + "access" : 1, + "parameters" : [ "bits" ], + "descriptor" : "(II)I" + }, { + "method" : "readByteIsaac", + "owner" : "hx", + "name" : "ii", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "readSmartByteShortIsaac", + "owner" : "hx", + "name" : "ia", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "setIsaacCipher", + "owner" : "hx", + "name" : "ih", + "access" : 1, + "parameters" : [ "isaacCipher" ], + "descriptor" : "(Lhn;B)V" + }, { + "method" : "writeByteIsaac", + "owner" : "hx", + "name" : "im", + "access" : 1, + "parameters" : [ "b" ], + "descriptor" : "(IS)V" + }, { + "method" : "__ig_334", + "owner" : "hx", + "name" : "ig", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__jb_335", + "owner" : "hx", + "name" : "jb", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([BIII)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(I)V" + } ] +}, { + "class" : "IsaacCipher", + "name" : "hn", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "__e", + "owner" : "hn", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -689202647 + }, { + "field" : "__g", + "owner" : "hn", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -1670027699 + }, { + "field" : "__l", + "owner" : "hn", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -325762649 + }, { + "field" : "__w", + "owner" : "hn", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : 1514845493 + }, { + "field" : "__o", + "owner" : "hn", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__u", + "owner" : "hn", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "__m_336", + "owner" : "hn", + "name" : "m", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__f_337", + "owner" : "hn", + "name" : "f", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__q_338", + "owner" : "hn", + "name" : "q", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__w_339", + "owner" : "hn", + "name" : "w", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "([I)V" + } ] +}, { + "class" : "MusicPatchNode2", + "name" : "hd", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "hd", + "name" : "f", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__m", + "owner" : "hd", + "name" : "m", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__e", + "owner" : "hd", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : 1984131473 + }, { + "field" : "__g", + "owner" : "hd", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : 391670135 + }, { + "field" : "__l", + "owner" : "hd", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : 320761691 + }, { + "field" : "__o", + "owner" : "hd", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -1455145595 + }, { + "field" : "__q", + "owner" : "hd", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 140046797 + }, { + "field" : "__u", + "owner" : "hd", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 1577527995 + }, { + "field" : "__w", + "owner" : "hd", + "name" : "w", + "access" : 0, + "descriptor" : "I", + "decoder" : -249046051 + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "MidiPcmStream", + "name" : "hm", + "super" : "dc", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "midiFile", + "owner" : "hm", + "name" : "aq", + "access" : 0, + "descriptor" : "Lhs;" + }, { + "field" : "musicPatches", + "owner" : "hm", + "name" : "m", + "access" : 0, + "descriptor" : "Lld;" + }, { + "field" : "patchStream", + "owner" : "hm", + "name" : "ah", + "access" : 0, + "descriptor" : "Lhq;" + }, { + "field" : "track", + "owner" : "hm", + "name" : "av", + "access" : 0, + "descriptor" : "I", + "decoder" : 1450922835 + }, { + "field" : "trackLength", + "owner" : "hm", + "name" : "ar", + "access" : 0, + "descriptor" : "I", + "decoder" : 713752539 + }, { + "field" : "__aj", + "owner" : "hm", + "name" : "aj", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__ag", + "owner" : "hm", + "name" : "ag", + "access" : 0, + "descriptor" : "[[Lha;" + }, { + "field" : "__v", + "owner" : "hm", + "name" : "v", + "access" : 0, + "descriptor" : "[[Lha;" + }, { + "field" : "__f", + "owner" : "hm", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 335918727 + }, { + "field" : "__q", + "owner" : "hm", + "name" : "q", + "access" : 0, + "descriptor" : "I", + "decoder" : 2095480747 + }, { + "field" : "__b", + "owner" : "hm", + "name" : "b", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__c", + "owner" : "hm", + "name" : "c", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__d", + "owner" : "hm", + "name" : "d", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__e", + "owner" : "hm", + "name" : "e", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__g", + "owner" : "hm", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__h", + "owner" : "hm", + "name" : "h", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__k", + "owner" : "hm", + "name" : "k", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__l", + "owner" : "hm", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__n", + "owner" : "hm", + "name" : "n", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__o", + "owner" : "hm", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__p", + "owner" : "hm", + "name" : "p", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__r", + "owner" : "hm", + "name" : "r", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__u", + "owner" : "hm", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__x", + "owner" : "hm", + "name" : "x", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__y", + "owner" : "hm", + "name" : "y", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__ac", + "owner" : "hm", + "name" : "ac", + "access" : 0, + "descriptor" : "J", + "decoder" : -7547625335559871937 + }, { + "field" : "__ay", + "owner" : "hm", + "name" : "ay", + "access" : 0, + "descriptor" : "J", + "decoder" : 3736036110499628937 + } ], + "methods" : [ { + "method" : "clear", + "owner" : "hm", + "name" : "a", + "access" : 33, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "clearAll", + "owner" : "hm", + "name" : "w", + "access" : 33, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "isReady", + "owner" : "hm", + "name" : "z", + "access" : 33, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "loadMusicTrack", + "owner" : "hm", + "name" : "q", + "access" : 33, + "parameters" : [ "musicTrack", "i", "s", "frequency" ], + "descriptor" : "(Lhe;Lir;Ldt;II)Z" + }, { + "method" : "removeAll", + "owner" : "hm", + "name" : "o", + "access" : 33, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "setMusicTrack", + "owner" : "hm", + "name" : "x", + "access" : 33, + "parameters" : [ "musicTrack", "b" ], + "descriptor" : "(Lhe;ZI)V" + }, { + "method" : "__m_340", + "owner" : "hm", + "name" : "m", + "access" : 33, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)V" + }, { + "method" : "__f_341", + "owner" : "hm", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__j_342", + "owner" : "hm", + "name" : "j", + "access" : 33, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__s_343", + "owner" : "hm", + "name" : "s", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__t_344", + "owner" : "hm", + "name" : "t", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__y_345", + "owner" : "hm", + "name" : "y", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIIB)V" + }, { + "method" : "__h_346", + "owner" : "hm", + "name" : "h", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lha;ZI)V" + }, { + "method" : "__b_347", + "owner" : "hm", + "name" : "b", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__c_348", + "owner" : "hm", + "name" : "c", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__p_349", + "owner" : "hm", + "name" : "p", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)V" + }, { + "method" : "__v_350", + "owner" : "hm", + "name" : "v", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)V" + }, { + "method" : "__ah_351", + "owner" : "hm", + "name" : "ah", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__ab_352", + "owner" : "hm", + "name" : "ab", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__ae_353", + "owner" : "hm", + "name" : "ae", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__at_354", + "owner" : "hm", + "name" : "at", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__ad_355", + "owner" : "hm", + "name" : "ad", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__ap_356", + "owner" : "hm", + "name" : "ap", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__au_357", + "owner" : "hm", + "name" : "au", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__ao_358", + "owner" : "hm", + "name" : "ao", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__aa_359", + "owner" : "hm", + "name" : "aa", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lha;I)I" + }, { + "method" : "__ax_360", + "owner" : "hm", + "name" : "ax", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lha;I)I" + }, { + "method" : "__af_361", + "owner" : "hm", + "name" : "af", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lha;I)I" + }, { + "method" : "__u_362", + "owner" : "hm", + "name" : "u", + "access" : 36, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "__g_363", + "owner" : "hm", + "name" : "g", + "access" : 36, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "__l_364", + "owner" : "hm", + "name" : "l", + "access" : 36, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__e_365", + "owner" : "hm", + "name" : "e", + "access" : 36, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([III)V" + }, { + "method" : "__d_366", + "owner" : "hm", + "name" : "d", + "access" : 36, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__ai_367", + "owner" : "hm", + "name" : "ai", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__ba_368", + "owner" : "hm", + "name" : "ba", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lha;I)Z" + }, { + "method" : "__bb_369", + "owner" : "hm", + "name" : "bb", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(Lha;[IIII)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "MusicPatchNode", + "name" : "ha", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "patch", + "owner" : "ha", + "name" : "f", + "access" : 0, + "descriptor" : "Lhl;" + }, { + "field" : "rawSound", + "owner" : "ha", + "name" : "q", + "access" : 0, + "descriptor" : "Lcx;" + }, { + "field" : "stream", + "owner" : "ha", + "name" : "t", + "access" : 0, + "descriptor" : "Lds;" + }, { + "field" : "__w", + "owner" : "ha", + "name" : "w", + "access" : 0, + "descriptor" : "Lhd;" + }, { + "field" : "__a", + "owner" : "ha", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : -2083252379 + }, { + "field" : "__b", + "owner" : "ha", + "name" : "b", + "access" : 0, + "descriptor" : "I", + "decoder" : 1359854411 + }, { + "field" : "__d", + "owner" : "ha", + "name" : "d", + "access" : 0, + "descriptor" : "I", + "decoder" : -852988281 + }, { + "field" : "__e", + "owner" : "ha", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : -471899285 + }, { + "field" : "__g", + "owner" : "ha", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -836502917 + }, { + "field" : "__i", + "owner" : "ha", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : -2136855685 + }, { + "field" : "__j", + "owner" : "ha", + "name" : "j", + "access" : 0, + "descriptor" : "I", + "decoder" : 173672931 + }, { + "field" : "__k", + "owner" : "ha", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : -439388365 + }, { + "field" : "__l", + "owner" : "ha", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : -308599455 + }, { + "field" : "__m", + "owner" : "ha", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 801157533 + }, { + "field" : "__n", + "owner" : "ha", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : 476852577 + }, { + "field" : "__o", + "owner" : "ha", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -2058553171 + }, { + "field" : "__s", + "owner" : "ha", + "name" : "s", + "access" : 0, + "descriptor" : "I", + "decoder" : 219840779 + }, { + "field" : "__u", + "owner" : "ha", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : 62958303 + }, { + "field" : "__x", + "owner" : "ha", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -1520706641 + }, { + "field" : "__y", + "owner" : "ha", + "name" : "y", + "access" : 0, + "descriptor" : "I", + "decoder" : -666877449 + }, { + "field" : "__z", + "owner" : "ha", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : 1605236771 + } ], + "methods" : [ { + "method" : "__m_370", + "owner" : "ha", + "name" : "m", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "MidiFileReader", + "name" : "hs", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "buffer", + "owner" : "hs", + "name" : "m", + "access" : 0, + "descriptor" : "Lgr;" + }, { + "field" : "division", + "owner" : "hs", + "name" : "f", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "trackLengths", + "owner" : "hs", + "name" : "o", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "trackPositions", + "owner" : "hs", + "name" : "w", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "trackStarts", + "owner" : "hs", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__g", + "owner" : "hs", + "name" : "g", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "__u", + "owner" : "hs", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__e", + "owner" : "hs", + "name" : "e", + "access" : 0, + "descriptor" : "J" + } ], + "methods" : [ { + "method" : "clear", + "owner" : "hs", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "getPrioritizedTrack", + "owner" : "hs", + "name" : "z", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "gotoTrack", + "owner" : "hs", + "name" : "o", + "access" : 0, + "parameters" : [ "trackId" ], + "descriptor" : "(I)V" + }, { + "method" : "isDone", + "owner" : "hs", + "name" : "j", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "isReady", + "owner" : "hs", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "markTrackPosition", + "owner" : "hs", + "name" : "u", + "access" : 0, + "parameters" : [ "trackId" ], + "descriptor" : "(I)V" + }, { + "method" : "parse", + "owner" : "hs", + "name" : "m", + "access" : 0, + "parameters" : [ "midi" ], + "descriptor" : "([B)V" + }, { + "method" : "readMessage", + "owner" : "hs", + "name" : "e", + "access" : 0, + "parameters" : [ "trackId" ], + "descriptor" : "(I)I" + }, { + "method" : "readMessage0", + "owner" : "hs", + "name" : "x", + "access" : 0, + "parameters" : [ "trackId" ], + "descriptor" : "(I)I" + }, { + "method" : "readTrackLength", + "owner" : "hs", + "name" : "l", + "access" : 0, + "parameters" : [ "trackId" ], + "descriptor" : "(I)V" + }, { + "method" : "reset", + "owner" : "hs", + "name" : "s", + "access" : 0, + "descriptor" : "(J)V" + }, { + "method" : "setTrackDone", + "owner" : "hs", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "trackCount", + "owner" : "hs", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__d_371", + "owner" : "hs", + "name" : "d", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(II)I" + }, { + "method" : "__a_372", + "owner" : "hs", + "name" : "a", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(I)J" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + }, { + "access" : 0, + "descriptor" : "([B)V" + } ] +}, { + "class" : "MusicPatch", + "name" : "hl", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "rawSounds", + "owner" : "hl", + "name" : "f", + "access" : 0, + "descriptor" : "[Lcx;" + }, { + "field" : "__g", + "owner" : "hl", + "name" : "g", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__o", + "owner" : "hl", + "name" : "o", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__w", + "owner" : "hl", + "name" : "w", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__u", + "owner" : "hl", + "name" : "u", + "access" : 0, + "descriptor" : "[Lhd;" + }, { + "field" : "__m", + "owner" : "hl", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 574200865 + }, { + "field" : "__l", + "owner" : "hl", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__q", + "owner" : "hl", + "name" : "q", + "access" : 0, + "descriptor" : "[S" + } ], + "methods" : [ { + "method" : "clear", + "owner" : "hl", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__f_373", + "owner" : "hl", + "name" : "f", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(Ldt;[B[II)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "([B)V" + } ] +}, { + "class" : "MusicPatchPcmStream", + "name" : "hq", + "super" : "dc", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "mixer", + "owner" : "hq", + "name" : "q", + "access" : 0, + "descriptor" : "Lct;" + }, { + "field" : "queue", + "owner" : "hq", + "name" : "f", + "access" : 0, + "descriptor" : "Lje;" + }, { + "field" : "superStream", + "owner" : "hq", + "name" : "m", + "access" : 0, + "descriptor" : "Lhm;" + } ], + "methods" : [ { + "method" : "__u_374", + "owner" : "hq", + "name" : "u", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "__g_375", + "owner" : "hq", + "name" : "g", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()Ldc;" + }, { + "method" : "__l_376", + "owner" : "hq", + "name" : "l", + "access" : 4, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__e_377", + "owner" : "hq", + "name" : "e", + "access" : 4, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "([III)V" + }, { + "method" : "__d_378", + "owner" : "hq", + "name" : "d", + "access" : 4, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__m_379", + "owner" : "hq", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(Lha;[IIIII)V" + }, { + "method" : "__f_380", + "owner" : "hq", + "name" : "f", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lha;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lhm;)V" + } ] +}, { + "class" : "MusicTrack", + "name" : "he", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "midi", + "owner" : "he", + "name" : "f", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "table", + "owner" : "he", + "name" : "m", + "access" : 0, + "descriptor" : "Lld;" + } ], + "methods" : [ { + "method" : "clear", + "owner" : "he", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__f_381", + "owner" : "he", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lgr;)V" + } ] +}, { + "class" : "TileLocation", + "name" : "hu", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "plane", + "owner" : "hu", + "name" : "m", + "access" : 1, + "descriptor" : "I", + "decoder" : 503621925 + }, { + "field" : "x", + "owner" : "hu", + "name" : "f", + "access" : 1, + "descriptor" : "I", + "decoder" : 1225620013 + }, { + "field" : "y", + "owner" : "hu", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : 154740833 + } ], + "methods" : [ { + "method" : "equals0", + "owner" : "hu", + "name" : "f", + "access" : 0, + "parameters" : [ "other" ], + "descriptor" : "(Lhu;B)Z" + }, { + "method" : "packed", + "owner" : "hu", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "toString0", + "owner" : "hu", + "name" : "q", + "access" : 0, + "parameters" : [ "separator" ], + "descriptor" : "(Ljava/lang/String;I)Ljava/lang/String;" + }, { + "method" : "__equals_382", + "owner" : "hu", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + }, { + "method" : "__hashCode_383", + "owner" : "hu", + "name" : "hashCode", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__toString_384", + "owner" : "hu", + "name" : "toString", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/String;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(III)V" + }, { + "access" : 1, + "descriptor" : "(Lhu;)V" + }, { + "access" : 1, + "descriptor" : "(I)V" + } ] +}, { + "class" : "PlayerAppearance", + "name" : "hi", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "bodyColors", + "owner" : "hi", + "name" : "f", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "equipment", + "owner" : "hi", + "name" : "m", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "isFemale", + "owner" : "hi", + "name" : "q", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "npcTransformId", + "owner" : "hi", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : 1676934923 + }, { + "field" : "__o", + "owner" : "hi", + "name" : "o", + "access" : 0, + "descriptor" : "J", + "decoder" : -3506189412688081513 + }, { + "field" : "__u", + "owner" : "hi", + "name" : "u", + "access" : 0, + "descriptor" : "J", + "decoder" : 8217880921734028425 + } ], + "methods" : [ { + "method" : "getChatHeadId", + "owner" : "hi", + "name" : "e", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "getModel", + "owner" : "hi", + "name" : "g", + "access" : 1, + "descriptor" : "(Ljh;ILjh;II)Ldu;" + }, { + "method" : "getModelData", + "owner" : "hi", + "name" : "l", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Ldw;" + }, { + "method" : "__m_385", + "owner" : "hi", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "([I[IZII)V" + }, { + "method" : "__f_386", + "owner" : "hi", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IZI)V" + }, { + "method" : "__q_387", + "owner" : "hi", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IZI)V" + }, { + "method" : "__w_388", + "owner" : "hi", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(ZB)V" + }, { + "method" : "__o_389", + "owner" : "hi", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "__u_390", + "owner" : "hi", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "Widget", + "name" : "ho", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "actions", + "owner" : "ho", + "name" : "dx", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "buttonText", + "owner" : "ho", + "name" : "ec", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "buttonType", + "owner" : "ho", + "name" : "b", + "access" : 1, + "descriptor" : "I", + "decoder" : 1412102151 + }, { + "field" : "childIndex", + "owner" : "ho", + "name" : "y", + "access" : 1, + "descriptor" : "I", + "decoder" : -648033351 + }, { + "field" : "children", + "owner" : "ho", + "name" : "ep", + "access" : 1, + "descriptor" : "[Lho;" + }, { + "field" : "clickMask", + "owner" : "ho", + "name" : "cw", + "access" : 1, + "descriptor" : "I", + "decoder" : 1856618959 + }, { + "field" : "color", + "owner" : "ho", + "name" : "am", + "access" : 1, + "descriptor" : "I", + "decoder" : -2022638615 + }, { + "field" : "color2", + "owner" : "ho", + "name" : "an", + "access" : 1, + "descriptor" : "I", + "decoder" : -365781561 + }, { + "field" : "contentType", + "owner" : "ho", + "name" : "c", + "access" : 1, + "descriptor" : "I", + "decoder" : -581762425 + }, { + "field" : "cs1ComparisonValues", + "owner" : "ho", + "name" : "er", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "cs1Comparisons", + "owner" : "ho", + "name" : "ey", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "cs1Instructions", + "owner" : "ho", + "name" : "eo", + "access" : 1, + "descriptor" : "[[I" + }, { + "field" : "cycle", + "owner" : "ho", + "name" : "fd", + "access" : 1, + "descriptor" : "I", + "decoder" : -1995006949 + }, { + "field" : "dataText", + "owner" : "ho", + "name" : "de", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "dragThreshold", + "owner" : "ho", + "name" : "df", + "access" : 1, + "descriptor" : "I", + "decoder" : -1021798347 + }, { + "field" : "dragZoneSize", + "owner" : "ho", + "name" : "dn", + "access" : 1, + "descriptor" : "I", + "decoder" : 2092800189 + }, { + "field" : "fill", + "owner" : "ho", + "name" : "ao", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "fontId", + "owner" : "ho", + "name" : "cr", + "access" : 1, + "descriptor" : "I", + "decoder" : 1435746863 + }, { + "field" : "hasListener", + "owner" : "ho", + "name" : "ds", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "height", + "owner" : "ho", + "name" : "ak", + "access" : 1, + "descriptor" : "I", + "decoder" : 1656646737 + }, { + "field" : "heightAlignment", + "owner" : "ho", + "name" : "ag", + "access" : 1, + "descriptor" : "I", + "decoder" : -709256449 + }, { + "field" : "id", + "owner" : "ho", + "name" : "t", + "access" : 1, + "descriptor" : "I", + "decoder" : -941148335 + }, { + "field" : "invTransmitTriggers", + "owner" : "ho", + "name" : "du", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "inventorySprites", + "owner" : "ho", + "name" : "cq", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "inventoryXOffsets", + "owner" : "ho", + "name" : "ck", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "inventoryYOffsets", + "owner" : "ho", + "name" : "cn", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "isHidden", + "owner" : "ho", + "name" : "ae", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "isIf3", + "owner" : "ho", + "name" : "s", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "isScrollBar", + "owner" : "ho", + "name" : "da", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "itemActions", + "owner" : "ho", + "name" : "ch", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "itemId", + "owner" : "ho", + "name" : "ea", + "access" : 1, + "descriptor" : "I", + "decoder" : 1248629915 + }, { + "field" : "itemIds", + "owner" : "ho", + "name" : "ef", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "itemQuantities", + "owner" : "ho", + "name" : "ev", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "itemQuantity", + "owner" : "ho", + "name" : "es", + "access" : 1, + "descriptor" : "I", + "decoder" : 340244859 + }, { + "field" : "lineWid", + "owner" : "ho", + "name" : "ai", + "access" : 1, + "descriptor" : "I", + "decoder" : -110526699 + }, { + "field" : "modelAngleX", + "owner" : "ho", + "name" : "bz", + "access" : 1, + "descriptor" : "I", + "decoder" : 2044722063 + }, { + "field" : "modelAngleY", + "owner" : "ho", + "name" : "bg", + "access" : 1, + "descriptor" : "I", + "decoder" : -1253859481 + }, { + "field" : "modelAngleZ", + "owner" : "ho", + "name" : "bt", + "access" : 1, + "descriptor" : "I", + "decoder" : -692411223 + }, { + "field" : "modelFrame", + "owner" : "ho", + "name" : "eg", + "access" : 1, + "descriptor" : "I", + "decoder" : -431656963 + }, { + "field" : "modelFrameCycle", + "owner" : "ho", + "name" : "ez", + "access" : 1, + "descriptor" : "I", + "decoder" : -95117407 + }, { + "field" : "modelId", + "owner" : "ho", + "name" : "by", + "access" : 1, + "descriptor" : "I", + "decoder" : -2013625215 + }, { + "field" : "modelId2", + "owner" : "ho", + "name" : "bm", + "access" : 0, + "descriptor" : "I", + "decoder" : -201557389 + }, { + "field" : "modelOffsetX", + "owner" : "ho", + "name" : "bj", + "access" : 1, + "descriptor" : "I", + "decoder" : -459670781 + }, { + "field" : "modelOffsetY", + "owner" : "ho", + "name" : "bi", + "access" : 1, + "descriptor" : "I", + "decoder" : -2018053063 + }, { + "field" : "modelOrthog", + "owner" : "ho", + "name" : "be", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "modelType", + "owner" : "ho", + "name" : "bx", + "access" : 1, + "descriptor" : "I", + "decoder" : 630750753 + }, { + "field" : "modelType2", + "owner" : "ho", + "name" : "bu", + "access" : 0, + "descriptor" : "I", + "decoder" : 138222099 + }, { + "field" : "modelZoom", + "owner" : "ho", + "name" : "bp", + "access" : 1, + "descriptor" : "I", + "decoder" : -2133338643 + }, { + "field" : "mouseOverColor", + "owner" : "ho", + "name" : "az", + "access" : 1, + "descriptor" : "I", + "decoder" : -1831692129 + }, { + "field" : "mouseOverColor2", + "owner" : "ho", + "name" : "au", + "access" : 1, + "descriptor" : "I", + "decoder" : 1236161275 + }, { + "field" : "mouseOverRedirect", + "owner" : "ho", + "name" : "ew", + "access" : 1, + "descriptor" : "I", + "decoder" : -1390352887 + }, { + "field" : "noClickThrough", + "owner" : "ho", + "name" : "fx", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "onClick", + "owner" : "ho", + "name" : "dc", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onClickRepeat", + "owner" : "ho", + "name" : "dg", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onDrag", + "owner" : "ho", + "name" : "dr", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onDragComplete", + "owner" : "ho", + "name" : "dw", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onHold", + "owner" : "ho", + "name" : "dd", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onInvTransmit", + "owner" : "ho", + "name" : "dj", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onLoad", + "owner" : "ho", + "name" : "di", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onMouseLeave", + "owner" : "ho", + "name" : "dl", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onMouseOver", + "owner" : "ho", + "name" : "dy", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onMouseRepeat", + "owner" : "ho", + "name" : "dk", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onOp", + "owner" : "ho", + "name" : "eb", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onRelease", + "owner" : "ho", + "name" : "db", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onScroll", + "owner" : "ho", + "name" : "ek", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onStatTransmit", + "owner" : "ho", + "name" : "dm", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onTargetEnter", + "owner" : "ho", + "name" : "dv", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onTargetLeave", + "owner" : "ho", + "name" : "do", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onTimer", + "owner" : "ho", + "name" : "et", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "onVarTransmit", + "owner" : "ho", + "name" : "dh", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "outline", + "owner" : "ho", + "name" : "bk", + "access" : 1, + "descriptor" : "I", + "decoder" : -594884327 + }, { + "field" : "paddingX", + "owner" : "ho", + "name" : "cu", + "access" : 1, + "descriptor" : "I", + "decoder" : -23173063 + }, { + "field" : "paddingY", + "owner" : "ho", + "name" : "cb", + "access" : 1, + "descriptor" : "I", + "decoder" : 720760323 + }, { + "field" : "parent", + "owner" : "ho", + "name" : "dt", + "access" : 1, + "descriptor" : "Lho;" + }, { + "field" : "parentId", + "owner" : "ho", + "name" : "ab", + "access" : 1, + "descriptor" : "I", + "decoder" : -617209253 + }, { + "field" : "rawHeight", + "owner" : "ho", + "name" : "ar", + "access" : 1, + "descriptor" : "I", + "decoder" : 1202342839 + }, { + "field" : "rawWidth", + "owner" : "ho", + "name" : "av", + "access" : 1, + "descriptor" : "I", + "decoder" : -2001402777 + }, { + "field" : "rawX", + "owner" : "ho", + "name" : "aq", + "access" : 1, + "descriptor" : "I", + "decoder" : -872904863 + }, { + "field" : "rawY", + "owner" : "ho", + "name" : "aj", + "access" : 1, + "descriptor" : "I", + "decoder" : -1814696937 + }, { + "field" : "rectangleMode", + "owner" : "ho", + "name" : "aa", + "access" : 1, + "descriptor" : "Llj;" + }, { + "field" : "rootIndex", + "owner" : "ho", + "name" : "fp", + "access" : 1, + "descriptor" : "I", + "decoder" : 365867737 + }, { + "field" : "scrollHeight", + "owner" : "ho", + "name" : "as", + "access" : 1, + "descriptor" : "I", + "decoder" : -867175629 + }, { + "field" : "scrollWidth", + "owner" : "ho", + "name" : "ap", + "access" : 1, + "descriptor" : "I", + "decoder" : -623790443 + }, { + "field" : "scrollX", + "owner" : "ho", + "name" : "at", + "access" : 1, + "descriptor" : "I", + "decoder" : 2090399935 + }, { + "field" : "scrollY", + "owner" : "ho", + "name" : "ad", + "access" : 1, + "descriptor" : "I", + "decoder" : -537618643 + }, { + "field" : "sequenceId", + "owner" : "ho", + "name" : "bl", + "access" : 1, + "descriptor" : "I", + "decoder" : -1423753745 + }, { + "field" : "sequenceId2", + "owner" : "ho", + "name" : "br", + "access" : 1, + "descriptor" : "I", + "decoder" : -856053301 + }, { + "field" : "spellActionName", + "owner" : "ho", + "name" : "dp", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "spellName", + "owner" : "ho", + "name" : "eu", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "spriteAngle", + "owner" : "ho", + "name" : "bq", + "access" : 1, + "descriptor" : "I", + "decoder" : -1361791123 + }, { + "field" : "spriteFlipH", + "owner" : "ho", + "name" : "bo", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "spriteFlipV", + "owner" : "ho", + "name" : "bc", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "spriteId", + "owner" : "ho", + "name" : "bs", + "access" : 1, + "descriptor" : "I", + "decoder" : 1573420153 + }, { + "field" : "spriteId2", + "owner" : "ho", + "name" : "bb", + "access" : 1, + "descriptor" : "I", + "decoder" : -1074168553 + }, { + "field" : "spriteShadow", + "owner" : "ho", + "name" : "bd", + "access" : 1, + "descriptor" : "I", + "decoder" : 215797483 + }, { + "field" : "spriteTiling", + "owner" : "ho", + "name" : "bn", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "statTransmitTriggers", + "owner" : "ho", + "name" : "dq", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "text", + "owner" : "ho", + "name" : "cv", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "text2", + "owner" : "ho", + "name" : "ce", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "textLineHeight", + "owner" : "ho", + "name" : "cy", + "access" : 1, + "descriptor" : "I", + "decoder" : 1401272343 + }, { + "field" : "textShadowed", + "owner" : "ho", + "name" : "cj", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "textXAlignment", + "owner" : "ho", + "name" : "cs", + "access" : 1, + "descriptor" : "I", + "decoder" : 1527989635 + }, { + "field" : "textYAlignment", + "owner" : "ho", + "name" : "cm", + "access" : 1, + "descriptor" : "I", + "decoder" : 1271997981 + }, { + "field" : "transparency", + "owner" : "ho", + "name" : "ax", + "access" : 1, + "descriptor" : "I", + "decoder" : -638557371 + }, { + "field" : "type", + "owner" : "ho", + "name" : "h", + "access" : 1, + "descriptor" : "I", + "decoder" : 1521310729 + }, { + "field" : "varTransmitTriggers", + "owner" : "ho", + "name" : "dz", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "width", + "owner" : "ho", + "name" : "ah", + "access" : 1, + "descriptor" : "I", + "decoder" : 1716081883 + }, { + "field" : "widthAlignment", + "owner" : "ho", + "name" : "v", + "access" : 1, + "descriptor" : "I", + "decoder" : 1628640897 + }, { + "field" : "x", + "owner" : "ho", + "name" : "ac", + "access" : 1, + "descriptor" : "I", + "decoder" : 1271321381 + }, { + "field" : "xAlignment", + "owner" : "ho", + "name" : "r", + "access" : 1, + "descriptor" : "I", + "decoder" : 523318277 + }, { + "field" : "y", + "owner" : "ho", + "name" : "ay", + "access" : 1, + "descriptor" : "I", + "decoder" : 1492291497 + }, { + "field" : "yAlignment", + "owner" : "ho", + "name" : "p", + "access" : 1, + "descriptor" : "I", + "decoder" : 1300531185 + }, { + "field" : "__ba", + "owner" : "ho", + "name" : "ba", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__bv", + "owner" : "ho", + "name" : "bv", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__cg", + "owner" : "ho", + "name" : "cg", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__fm", + "owner" : "ho", + "name" : "fm", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__fq", + "owner" : "ho", + "name" : "fq", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__fw", + "owner" : "ho", + "name" : "fw", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__fz", + "owner" : "ho", + "name" : "fz", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__cf", + "owner" : "ho", + "name" : "cf", + "access" : 1, + "descriptor" : "[[B" + }, { + "field" : "__cp", + "owner" : "ho", + "name" : "cp", + "access" : 1, + "descriptor" : "[[B" + }, { + "field" : "__af", + "owner" : "ho", + "name" : "af", + "access" : 1, + "descriptor" : "I", + "decoder" : -1853255291 + }, { + "field" : "__al", + "owner" : "ho", + "name" : "al", + "access" : 1, + "descriptor" : "I", + "decoder" : -1047989223 + }, { + "field" : "__aw", + "owner" : "ho", + "name" : "aw", + "access" : 1, + "descriptor" : "I", + "decoder" : 206556853 + }, { + "field" : "__bf", + "owner" : "ho", + "name" : "bf", + "access" : 1, + "descriptor" : "I", + "decoder" : -1692331135 + }, { + "field" : "__bh", + "owner" : "ho", + "name" : "bh", + "access" : 1, + "descriptor" : "I", + "decoder" : 727421593 + }, { + "field" : "__bw", + "owner" : "ho", + "name" : "bw", + "access" : 1, + "descriptor" : "I", + "decoder" : -1658511475 + }, { + "field" : "__fc", + "owner" : "ho", + "name" : "fc", + "access" : 1, + "descriptor" : "I", + "decoder" : 209458049 + }, { + "field" : "__fg", + "owner" : "ho", + "name" : "fg", + "access" : 1, + "descriptor" : "I", + "decoder" : -1520351537 + }, { + "field" : "__fj", + "owner" : "ho", + "name" : "fj", + "access" : 1, + "descriptor" : "I", + "decoder" : 876695207 + }, { + "field" : "__fl", + "owner" : "ho", + "name" : "fl", + "access" : 1, + "descriptor" : "I", + "decoder" : -672198209 + }, { + "field" : "__cc", + "owner" : "ho", + "name" : "cc", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "__ci", + "owner" : "ho", + "name" : "ci", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "__fh", + "owner" : "ho", + "name" : "fh", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "__ed", + "owner" : "ho", + "name" : "ed", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__ee", + "owner" : "ho", + "name" : "ee", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__eh", + "owner" : "ho", + "name" : "eh", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__ei", + "owner" : "ho", + "name" : "ei", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__ej", + "owner" : "ho", + "name" : "ej", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__el", + "owner" : "ho", + "name" : "el", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__em", + "owner" : "ho", + "name" : "em", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__en", + "owner" : "ho", + "name" : "en", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__eq", + "owner" : "ho", + "name" : "eq", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "__ex", + "owner" : "ho", + "name" : "ex", + "access" : 1, + "descriptor" : "[Ljava/lang/Object;" + } ], + "methods" : [ { + "method" : "decode", + "owner" : "ho", + "name" : "u", + "access" : 0, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "decodeLegacy", + "owner" : "ho", + "name" : "o", + "access" : 0, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "getFont", + "owner" : "ho", + "name" : "d", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Lkk;" + }, { + "method" : "getInventorySprite", + "owner" : "ho", + "name" : "a", + "access" : 1, + "descriptor" : "(II)Lln;" + }, { + "method" : "getModel", + "owner" : "ho", + "name" : "z", + "access" : 1, + "parameters" : [ "sequence", "frame", "b", "appearance" ], + "descriptor" : "(Ljh;IZLhi;I)Ldu;" + }, { + "method" : "getSprite", + "owner" : "ho", + "name" : "x", + "access" : 1, + "parameters" : [ "b" ], + "descriptor" : "(ZI)Lln;" + }, { + "method" : "getSpriteMask", + "owner" : "ho", + "name" : "j", + "access" : 1, + "parameters" : [ "b" ], + "descriptor" : "(ZB)Lhp;" + }, { + "method" : "readListener", + "owner" : "ho", + "name" : "g", + "access" : 0, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)[Ljava/lang/Object;" + }, { + "method" : "readListenerTriggers", + "owner" : "ho", + "name" : "l", + "access" : 0, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;B)[I" + }, { + "method" : "setAction", + "owner" : "ho", + "name" : "t", + "access" : 1, + "parameters" : [ "index", "s" ], + "descriptor" : "(ILjava/lang/String;B)V" + }, { + "method" : "swapItems", + "owner" : "ho", + "name" : "e", + "access" : 1, + "parameters" : [ "indexA", "indexB" ], + "descriptor" : "(III)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "PlayerType", + "name" : "ij", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "gc" ], + "fields" : [ { + "field" : "id", + "owner" : "ij", + "name" : "g", + "access" : 16, + "descriptor" : "I", + "decoder" : 1999564657 + }, { + "field" : "isPrivileged", + "owner" : "ij", + "name" : "e", + "access" : 17, + "descriptor" : "Z" + }, { + "field" : "isUser", + "owner" : "ij", + "name" : "x", + "access" : 17, + "descriptor" : "Z" + }, { + "field" : "modIcon", + "owner" : "ij", + "name" : "l", + "access" : 17, + "descriptor" : "I", + "decoder" : 613822977 + } ], + "methods" : [ { + "method" : "__f_391", + "owner" : "ij", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IIZZZ)V" + } ] +}, { + "class" : "AbstractIndexCache", + "name" : "ir", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ ], + "fields" : [ { + "field" : "archiveCount", + "owner" : "ir", + "name" : "f", + "access" : 0, + "descriptor" : "I", + "decoder" : 1694798923 + }, { + "field" : "archiveCrcs", + "owner" : "ir", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "archiveIds", + "owner" : "ir", + "name" : "q", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "archiveNameHashTable", + "owner" : "ir", + "name" : "o", + "access" : 0, + "descriptor" : "Llv;" + }, { + "field" : "archiveNameHashes", + "owner" : "ir", + "name" : "w", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "archiveVersions", + "owner" : "ir", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "archives", + "owner" : "ir", + "name" : "k", + "access" : 0, + "descriptor" : "[Ljava/lang/Object;" + }, { + "field" : "hash", + "owner" : "ir", + "name" : "a", + "access" : 1, + "descriptor" : "I", + "decoder" : -530370811 + }, { + "field" : "recordCounts", + "owner" : "ir", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "recordIds", + "owner" : "ir", + "name" : "e", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "recordNameHashTables", + "owner" : "ir", + "name" : "d", + "access" : 0, + "descriptor" : "[Llv;" + }, { + "field" : "recordNameHashes", + "owner" : "ir", + "name" : "x", + "access" : 0, + "descriptor" : "[[I" + }, { + "field" : "records", + "owner" : "ir", + "name" : "n", + "access" : 0, + "descriptor" : "[[Ljava/lang/Object;" + }, { + "field" : "releaseArchives", + "owner" : "ir", + "name" : "z", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "shallowRecords", + "owner" : "ir", + "name" : "j", + "access" : 0, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "archiveLoadPercent", + "owner" : "ir", + "name" : "e", + "access" : 0, + "descriptor" : "(II)I" + }, { + "method" : "archiveLoadPercentByName", + "owner" : "ir", + "name" : "ac", + "access" : 1, + "parameters" : [ "archiveName" ], + "descriptor" : "(Ljava/lang/String;I)I" + }, { + "method" : "buildRecords", + "owner" : "ir", + "name" : "c", + "access" : 0, + "parameters" : [ "archive", "xteaKey" ], + "descriptor" : "(I[II)Z" + }, { + "method" : "getArchiveId", + "owner" : "ir", + "name" : "p", + "access" : 1, + "parameters" : [ "archiveName" ], + "descriptor" : "(Ljava/lang/String;I)I" + }, { + "method" : "getRecord", + "owner" : "ir", + "name" : "d", + "access" : 1, + "parameters" : [ "archive", "record" ], + "descriptor" : "(III)[B" + }, { + "method" : "getRecordFlat", + "owner" : "ir", + "name" : "a", + "access" : 1, + "parameters" : [ "archiveOrRecord" ], + "descriptor" : "(IB)[B" + }, { + "method" : "getRecordId", + "owner" : "ir", + "name" : "v", + "access" : 1, + "parameters" : [ "archiveId", "recordName" ], + "descriptor" : "(ILjava/lang/String;I)I" + }, { + "method" : "loadArchive", + "owner" : "ir", + "name" : "z", + "access" : 0, + "descriptor" : "(II)V" + }, { + "method" : "setIndexReference", + "owner" : "ir", + "name" : "m", + "access" : 0, + "descriptor" : "([BB)V" + }, { + "method" : "takeRecord", + "owner" : "ir", + "name" : "q", + "access" : 1, + "parameters" : [ "archive", "record" ], + "descriptor" : "(III)[B" + }, { + "method" : "takeRecordByNames", + "owner" : "ir", + "name" : "aq", + "access" : 1, + "parameters" : [ "archiveName", "recordName" ], + "descriptor" : "(Ljava/lang/String;Ljava/lang/String;S)[B" + }, { + "method" : "takeRecordEncrypted", + "owner" : "ir", + "name" : "w", + "access" : 1, + "parameters" : [ "archive", "record", "xteaKey" ], + "descriptor" : "(II[II)[B" + }, { + "method" : "takeRecordFlat", + "owner" : "ir", + "name" : "x", + "access" : 1, + "parameters" : [ "archiveOrRecord" ], + "descriptor" : "(IS)[B" + }, { + "method" : "tryLoadArchive", + "owner" : "ir", + "name" : "g", + "access" : 1, + "parameters" : [ "archive" ], + "descriptor" : "(II)Z" + }, { + "method" : "tryLoadArchiveByName", + "owner" : "ir", + "name" : "av", + "access" : 1, + "parameters" : [ "archiveName" ], + "descriptor" : "(Ljava/lang/String;I)Z" + }, { + "method" : "tryLoadRecord", + "owner" : "ir", + "name" : "o", + "access" : 1, + "parameters" : [ "archive", "record" ], + "descriptor" : "(III)Z" + }, { + "method" : "tryLoadRecordByNames", + "owner" : "ir", + "name" : "aj", + "access" : 1, + "parameters" : [ "archiveName", "recordName" ], + "descriptor" : "(Ljava/lang/String;Ljava/lang/String;I)Z" + }, { + "method" : "__f_392", + "owner" : "ir", + "name" : "f", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__u_393", + "owner" : "ir", + "name" : "u", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)Z" + }, { + "method" : "__l_394", + "owner" : "ir", + "name" : "l", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__j_395", + "owner" : "ir", + "name" : "j", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)[I" + }, { + "method" : "__s_396", + "owner" : "ir", + "name" : "s", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)I" + }, { + "method" : "__t_397", + "owner" : "ir", + "name" : "t", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__y_398", + "owner" : "ir", + "name" : "y", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__h_399", + "owner" : "ir", + "name" : "h", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__b_400", + "owner" : "ir", + "name" : "b", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__ag_401", + "owner" : "ir", + "name" : "ag", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/String;Ljava/lang/String;B)Z" + }, { + "method" : "__ar_402", + "owner" : "ir", + "name" : "ar", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/String;B)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(ZZ)V" + } ] +}, { + "class" : "IndexStoreActionHandler", + "name" : "iv", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Runnable" ], + "fields" : [ ], + "methods" : [ { + "method" : "__run_403", + "owner" : "iv", + "name" : "run", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "IndexCache", + "name" : "it", + "super" : "ir", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "index", + "owner" : "it", + "name" : "p", + "access" : 0, + "descriptor" : "I", + "decoder" : -1579549759 + }, { + "field" : "indexReferenceCrc", + "owner" : "it", + "name" : "av", + "access" : 0, + "descriptor" : "I", + "decoder" : 1472870917 + }, { + "field" : "indexReferenceVersion", + "owner" : "it", + "name" : "ar", + "access" : 0, + "descriptor" : "I", + "decoder" : -785528219 + }, { + "field" : "indexStore", + "owner" : "it", + "name" : "c", + "access" : 0, + "descriptor" : "Lff;" + }, { + "field" : "referenceStore", + "owner" : "it", + "name" : "r", + "access" : 0, + "descriptor" : "Lff;" + }, { + "field" : "validArchives", + "owner" : "it", + "name" : "aq", + "access" : 64, + "descriptor" : "[Z" + }, { + "field" : "__ag", + "owner" : "it", + "name" : "ag", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__ac", + "owner" : "it", + "name" : "ac", + "access" : 0, + "descriptor" : "I", + "decoder" : -1884661133 + }, { + "field" : "__v", + "owner" : "it", + "name" : "v", + "access" : 64, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "archiveLoadPercent", + "owner" : "it", + "name" : "e", + "access" : 0, + "descriptor" : "(II)I" + }, { + "method" : "load", + "owner" : "it", + "name" : "dx", + "access" : 0, + "descriptor" : "(Lff;I[BZI)V" + }, { + "method" : "loadAllLocal", + "owner" : "it", + "name" : "dt", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "loadArchive", + "owner" : "it", + "name" : "z", + "access" : 0, + "descriptor" : "(II)V" + }, { + "method" : "loadIndexReference", + "owner" : "it", + "name" : "co", + "access" : 1, + "descriptor" : "(III)V" + }, { + "method" : "loadPercent", + "owner" : "it", + "name" : "da", + "access" : 1, + "descriptor" : "(I)I" + }, { + "method" : "write", + "owner" : "it", + "name" : "de", + "access" : 1, + "descriptor" : "(I[BZZB)V" + }, { + "method" : "__cx_404", + "owner" : "it", + "name" : "cx", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__ca_405", + "owner" : "it", + "name" : "ca", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__f_406", + "owner" : "it", + "name" : "f", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__dn_407", + "owner" : "it", + "name" : "dn", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)Z" + }, { + "method" : "__df_408", + "owner" : "it", + "name" : "df", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Lff;Lff;IZZZ)V" + } ] +}, { + "class" : "WorldMapElement", + "name" : "ic", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "category", + "owner" : "ic", + "name" : "c", + "access" : 1, + "descriptor" : "I", + "decoder" : -653112729 + }, { + "field" : "sprite1", + "owner" : "ic", + "name" : "u", + "access" : 1, + "descriptor" : "I", + "decoder" : 2012857993 + }, { + "field" : "sprite2", + "owner" : "ic", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -322924875 + }, { + "field" : "string1", + "owner" : "ic", + "name" : "n", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "strings", + "owner" : "ic", + "name" : "k", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "textSize", + "owner" : "ic", + "name" : "x", + "access" : 1, + "descriptor" : "I", + "decoder" : 1184517129 + }, { + "field" : "__b", + "owner" : "ic", + "name" : "b", + "access" : 0, + "descriptor" : "[B" + }, { + "field" : "__a", + "owner" : "ic", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : 1336803515 + }, { + "field" : "__j", + "owner" : "ic", + "name" : "j", + "access" : 0, + "descriptor" : "I", + "decoder" : -1007121521 + }, { + "field" : "__s", + "owner" : "ic", + "name" : "s", + "access" : 0, + "descriptor" : "I", + "decoder" : -1209054101 + }, { + "field" : "__z", + "owner" : "ic", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : -1825795359 + }, { + "field" : "__h", + "owner" : "ic", + "name" : "h", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__i", + "owner" : "ic", + "name" : "i", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__e", + "owner" : "ic", + "name" : "e", + "access" : 1, + "descriptor" : "I", + "decoder" : -231067 + }, { + "field" : "__l", + "owner" : "ic", + "name" : "l", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__o", + "owner" : "ic", + "name" : "o", + "access" : 17, + "descriptor" : "I", + "decoder" : -1579051565 + } ], + "methods" : [ { + "method" : "getSprite", + "owner" : "ic", + "name" : "o", + "access" : 1, + "parameters" : [ "b" ], + "descriptor" : "(ZI)Lln;" + }, { + "method" : "getSprite0", + "owner" : "ic", + "name" : "u", + "access" : 0, + "parameters" : [ "id" ], + "descriptor" : "(IB)Lln;" + }, { + "method" : "read", + "owner" : "ic", + "name" : "f", + "access" : 1, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;B)V" + }, { + "method" : "readNext", + "owner" : "ic", + "name" : "q", + "access" : 0, + "parameters" : [ "buffer", "opcode" ], + "descriptor" : "(Lgr;II)V" + }, { + "method" : "__w_409", + "owner" : "ic", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__g_410", + "owner" : "ic", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(I)V" + } ] +}, { + "class" : "VarcInt", + "name" : "iw", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "persist", + "owner" : "iw", + "name" : "q", + "access" : 1, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__q_411", + "owner" : "iw", + "name" : "q", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "__w_412", + "owner" : "iw", + "name" : "w", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lgr;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "SpotAnimationDefinition", + "name" : "io", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "archive", + "owner" : "io", + "name" : "u", + "access" : 0, + "descriptor" : "I", + "decoder" : -2065492247 + }, { + "field" : "heightScale", + "owner" : "io", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : 1199960995 + }, { + "field" : "id", + "owner" : "io", + "name" : "o", + "access" : 0, + "descriptor" : "I", + "decoder" : -713866165 + }, { + "field" : "orientation", + "owner" : "io", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : 1650590363 + }, { + "field" : "recolorFrom", + "owner" : "io", + "name" : "l", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "recolorTo", + "owner" : "io", + "name" : "e", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureFrom", + "owner" : "io", + "name" : "x", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureTo", + "owner" : "io", + "name" : "d", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "sequence", + "owner" : "io", + "name" : "g", + "access" : 1, + "descriptor" : "I", + "decoder" : 1580078789 + }, { + "field" : "widthScale", + "owner" : "io", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : 680796997 + }, { + "field" : "__a", + "owner" : "io", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : -20619847 + }, { + "field" : "__z", + "owner" : "io", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : 1866148625 + } ], + "methods" : [ { + "method" : "getModel", + "owner" : "io", + "name" : "w", + "access" : 17, + "descriptor" : "(II)Ldu;" + }, { + "method" : "read", + "owner" : "io", + "name" : "f", + "access" : 0, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "io", + "name" : "q", + "access" : 0, + "parameters" : [ "buffer", "n" ], + "descriptor" : "(Lgr;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "KitDefinition", + "name" : "im", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "archives", + "owner" : "im", + "name" : "d", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "recolorFrom", + "owner" : "im", + "name" : "g", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "recolorTo", + "owner" : "im", + "name" : "l", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureFrom", + "owner" : "im", + "name" : "e", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureTo", + "owner" : "im", + "name" : "x", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "__u", + "owner" : "im", + "name" : "u", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__k", + "owner" : "im", + "name" : "k", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__o", + "owner" : "im", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : 1619779051 + } ], + "methods" : [ { + "method" : "read", + "owner" : "im", + "name" : "f", + "access" : 0, + "descriptor" : "(Lgr;S)V" + }, { + "method" : "readNext", + "owner" : "im", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "__w_413", + "owner" : "im", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__o_414", + "owner" : "im", + "name" : "o", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Ldw;" + }, { + "method" : "__u_415", + "owner" : "im", + "name" : "u", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__g_416", + "owner" : "im", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Ldw;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "HealthBarDefinition", + "name" : "ii", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "int1", + "owner" : "ii", + "name" : "l", + "access" : 1, + "descriptor" : "I", + "decoder" : 390656615 + }, { + "field" : "int2", + "owner" : "ii", + "name" : "e", + "access" : 1, + "descriptor" : "I", + "decoder" : 1890433231 + }, { + "field" : "int3", + "owner" : "ii", + "name" : "x", + "access" : 1, + "descriptor" : "I", + "decoder" : -1180353973 + }, { + "field" : "int4", + "owner" : "ii", + "name" : "d", + "access" : 1, + "descriptor" : "I", + "decoder" : -1956457117 + }, { + "field" : "int5", + "owner" : "ii", + "name" : "k", + "access" : 1, + "descriptor" : "I", + "decoder" : -642961053 + }, { + "field" : "spriteId1", + "owner" : "ii", + "name" : "n", + "access" : 0, + "descriptor" : "I", + "decoder" : 1310001257 + }, { + "field" : "spriteId2", + "owner" : "ii", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : -1707680631 + }, { + "field" : "width", + "owner" : "ii", + "name" : "a", + "access" : 1, + "descriptor" : "I", + "decoder" : -354704697 + }, { + "field" : "widthPadding", + "owner" : "ii", + "name" : "z", + "access" : 1, + "descriptor" : "I", + "decoder" : 166567703 + }, { + "field" : "__o", + "owner" : "ii", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : 1515955705 + } ], + "methods" : [ { + "method" : "getSprite1", + "owner" : "ii", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Lln;" + }, { + "method" : "getSprite2", + "owner" : "ii", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Lln;" + }, { + "method" : "read", + "owner" : "ii", + "name" : "m", + "access" : 1, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "ii", + "name" : "f", + "access" : 0, + "descriptor" : "(Lgr;IB)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "HitSplatDefinition", + "name" : "jm", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "fontId", + "owner" : "jm", + "name" : "k", + "access" : 0, + "descriptor" : "I", + "decoder" : 431076793 + }, { + "field" : "transformVarbit", + "owner" : "jm", + "name" : "v", + "access" : 0, + "descriptor" : "I", + "decoder" : 516423393 + }, { + "field" : "transformVarp", + "owner" : "jm", + "name" : "ag", + "access" : 0, + "descriptor" : "I", + "decoder" : -1841054487 + }, { + "field" : "transforms", + "owner" : "jm", + "name" : "p", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "__a", + "owner" : "jm", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : -1533306389 + }, { + "field" : "__j", + "owner" : "jm", + "name" : "j", + "access" : 0, + "descriptor" : "I", + "decoder" : 1683792491 + }, { + "field" : "__s", + "owner" : "jm", + "name" : "s", + "access" : 0, + "descriptor" : "I", + "decoder" : 1845590719 + }, { + "field" : "__z", + "owner" : "jm", + "name" : "z", + "access" : 0, + "descriptor" : "I", + "decoder" : -1677628889 + }, { + "field" : "__b", + "owner" : "jm", + "name" : "b", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__c", + "owner" : "jm", + "name" : "c", + "access" : 1, + "descriptor" : "I", + "decoder" : 1003116765 + }, { + "field" : "__h", + "owner" : "jm", + "name" : "h", + "access" : 1, + "descriptor" : "I", + "decoder" : 199815415 + }, { + "field" : "__i", + "owner" : "jm", + "name" : "i", + "access" : 1, + "descriptor" : "I", + "decoder" : -102270561 + }, { + "field" : "__n", + "owner" : "jm", + "name" : "n", + "access" : 1, + "descriptor" : "I", + "decoder" : -1151968735 + }, { + "field" : "__r", + "owner" : "jm", + "name" : "r", + "access" : 1, + "descriptor" : "I", + "decoder" : 1498880475 + }, { + "field" : "__t", + "owner" : "jm", + "name" : "t", + "access" : 1, + "descriptor" : "I", + "decoder" : -389283589 + }, { + "field" : "__y", + "owner" : "jm", + "name" : "y", + "access" : 1, + "descriptor" : "I", + "decoder" : 1751286975 + } ], + "methods" : [ { + "method" : "getFont", + "owner" : "jm", + "name" : "d", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Lkk;" + }, { + "method" : "getString", + "owner" : "jm", + "name" : "u", + "access" : 1, + "parameters" : [ "n" ], + "descriptor" : "(IS)Ljava/lang/String;" + }, { + "method" : "read", + "owner" : "jm", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "jm", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "transform", + "owner" : "jm", + "name" : "o", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(B)Ljm;" + }, { + "method" : "__g_417", + "owner" : "jm", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Lln;" + }, { + "method" : "__l_418", + "owner" : "jm", + "name" : "l", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Lln;" + }, { + "method" : "__e_419", + "owner" : "jm", + "name" : "e", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Lln;" + }, { + "method" : "__x_420", + "owner" : "jm", + "name" : "x", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Lln;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ObjectDefinition", + "name" : "jr", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "actions", + "owner" : "jr", + "name" : "aj", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "ambient", + "owner" : "jr", + "name" : "ag", + "access" : 0, + "descriptor" : "I", + "decoder" : 533219139 + }, { + "field" : "ambientSoundId", + "owner" : "jr", + "name" : "az", + "access" : 1, + "descriptor" : "I", + "decoder" : 374616127 + }, { + "field" : "animationId", + "owner" : "jr", + "name" : "p", + "access" : 1, + "descriptor" : "I", + "decoder" : -1018236769 + }, { + "field" : "boolean1", + "owner" : "jr", + "name" : "y", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "boolean2", + "owner" : "jr", + "name" : "at", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "clipType", + "owner" : "jr", + "name" : "b", + "access" : 0, + "descriptor" : "I", + "decoder" : -268374709 + }, { + "field" : "clipped", + "owner" : "jr", + "name" : "ay", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "contrast", + "owner" : "jr", + "name" : "aq", + "access" : 0, + "descriptor" : "I", + "decoder" : -216646581 + }, { + "field" : "id", + "owner" : "jr", + "name" : "e", + "access" : 1, + "descriptor" : "I", + "decoder" : -2034835389 + }, { + "field" : "int1", + "owner" : "jr", + "name" : "h", + "access" : 1, + "descriptor" : "I", + "decoder" : 1419333853 + }, { + "field" : "int2", + "owner" : "jr", + "name" : "v", + "access" : 1, + "descriptor" : "I", + "decoder" : 713665805 + }, { + "field" : "int3", + "owner" : "jr", + "name" : "ap", + "access" : 1, + "descriptor" : "I", + "decoder" : 1455451843 + }, { + "field" : "int4", + "owner" : "jr", + "name" : "au", + "access" : 1, + "descriptor" : "I", + "decoder" : -1990510197 + }, { + "field" : "int5", + "owner" : "jr", + "name" : "ao", + "access" : 1, + "descriptor" : "I", + "decoder" : -1519592967 + }, { + "field" : "int6", + "owner" : "jr", + "name" : "aa", + "access" : 1, + "descriptor" : "I", + "decoder" : 1201773735 + }, { + "field" : "interactType", + "owner" : "jr", + "name" : "t", + "access" : 1, + "descriptor" : "I", + "decoder" : -553719901 + }, { + "field" : "isRotated", + "owner" : "jr", + "name" : "ac", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "isSolid", + "owner" : "jr", + "name" : "ad", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "mapIconId", + "owner" : "jr", + "name" : "av", + "access" : 1, + "descriptor" : "I", + "decoder" : -1737602209 + }, { + "field" : "mapSceneId", + "owner" : "jr", + "name" : "ar", + "access" : 1, + "descriptor" : "I", + "decoder" : -324183669 + }, { + "field" : "modelClipped", + "owner" : "jr", + "name" : "r", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "modelHeight", + "owner" : "jr", + "name" : "ak", + "access" : 0, + "descriptor" : "I", + "decoder" : 511434049 + }, { + "field" : "modelSizeX", + "owner" : "jr", + "name" : "ah", + "access" : 0, + "descriptor" : "I", + "decoder" : -1509832827 + }, { + "field" : "modelSizeY", + "owner" : "jr", + "name" : "aw", + "access" : 0, + "descriptor" : "I", + "decoder" : 1746573233 + }, { + "field" : "name", + "owner" : "jr", + "name" : "k", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "nonFlatShading", + "owner" : "jr", + "name" : "c", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "offsetHeight", + "owner" : "jr", + "name" : "ab", + "access" : 0, + "descriptor" : "I", + "decoder" : -1720702573 + }, { + "field" : "offsetX", + "owner" : "jr", + "name" : "al", + "access" : 0, + "descriptor" : "I", + "decoder" : 967376007 + }, { + "field" : "offsetY", + "owner" : "jr", + "name" : "ae", + "access" : 0, + "descriptor" : "I", + "decoder" : 818611483 + }, { + "field" : "params", + "owner" : "jr", + "name" : "af", + "access" : 0, + "descriptor" : "Llh;" + }, { + "field" : "recolorFrom", + "owner" : "jr", + "name" : "n", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "recolorTo", + "owner" : "jr", + "name" : "i", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureFrom", + "owner" : "jr", + "name" : "a", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureTo", + "owner" : "jr", + "name" : "z", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "sizeX", + "owner" : "jr", + "name" : "j", + "access" : 1, + "descriptor" : "I", + "decoder" : 998026479 + }, { + "field" : "sizeY", + "owner" : "jr", + "name" : "s", + "access" : 1, + "descriptor" : "I", + "decoder" : -301273619 + }, { + "field" : "transformConfigId", + "owner" : "jr", + "name" : "an", + "access" : 0, + "descriptor" : "I", + "decoder" : -2119965579 + }, { + "field" : "transformVarbit", + "owner" : "jr", + "name" : "am", + "access" : 0, + "descriptor" : "I", + "decoder" : 1136644531 + }, { + "field" : "transforms", + "owner" : "jr", + "name" : "as", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "__d", + "owner" : "jr", + "name" : "d", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__x", + "owner" : "jr", + "name" : "x", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__ax", + "owner" : "jr", + "name" : "ax", + "access" : 1, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "getIntParam", + "owner" : "jr", + "name" : "z", + "access" : 1, + "descriptor" : "(IIB)I" + }, { + "method" : "getModel", + "owner" : "jr", + "name" : "e", + "access" : 17, + "descriptor" : "(II[[IIIIB)Ldu;" + }, { + "method" : "getModelData", + "owner" : "jr", + "name" : "d", + "access" : 16, + "parameters" : [ "n", "m" ], + "descriptor" : "(IIB)Ldw;" + }, { + "method" : "getModelDynamic", + "owner" : "jr", + "name" : "x", + "access" : 17, + "descriptor" : "(II[[IIIILjh;II)Ldu;" + }, { + "method" : "getStringParam", + "owner" : "jr", + "name" : "j", + "access" : 1, + "descriptor" : "(ILjava/lang/String;I)Ljava/lang/String;" + }, { + "method" : "init", + "owner" : "jr", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "read", + "owner" : "jr", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "jr", + "name" : "o", + "access" : 0, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "transform", + "owner" : "jr", + "name" : "a", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(B)Ljr;" + }, { + "method" : "__u_421", + "owner" : "jr", + "name" : "u", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(II)Z" + }, { + "method" : "__g_422", + "owner" : "jr", + "name" : "g", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__l_423", + "owner" : "jr", + "name" : "l", + "access" : 17, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(II[[IIIIS)Lex;" + }, { + "method" : "__t_424", + "owner" : "jr", + "name" : "t", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ItemDefinition", + "name" : "jv", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "ambient", + "owner" : "jv", + "name" : "ba", + "access" : 1, + "descriptor" : "I", + "decoder" : 738319589 + }, { + "field" : "contrast", + "owner" : "jv", + "name" : "bb", + "access" : 1, + "descriptor" : "I", + "decoder" : -1984887305 + }, { + "field" : "femaleHeadModel", + "owner" : "jv", + "name" : "am", + "access" : 0, + "descriptor" : "I", + "decoder" : 1709659237 + }, { + "field" : "femaleHeadModel2", + "owner" : "jv", + "name" : "an", + "access" : 0, + "descriptor" : "I", + "decoder" : 106668727 + }, { + "field" : "femaleModel", + "owner" : "jv", + "name" : "al", + "access" : 0, + "descriptor" : "I", + "decoder" : 886682223 + }, { + "field" : "femaleModel1", + "owner" : "jv", + "name" : "ab", + "access" : 0, + "descriptor" : "I", + "decoder" : 154223105 + }, { + "field" : "femaleModel2", + "owner" : "jv", + "name" : "ad", + "access" : 0, + "descriptor" : "I", + "decoder" : -771136925 + }, { + "field" : "femaleOffset", + "owner" : "jv", + "name" : "ae", + "access" : 0, + "descriptor" : "I", + "decoder" : -1619361485 + }, { + "field" : "groundActions", + "owner" : "jv", + "name" : "av", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "id", + "owner" : "jv", + "name" : "i", + "access" : 1, + "descriptor" : "I", + "decoder" : -590103687 + }, { + "field" : "int1", + "owner" : "jv", + "name" : "bs", + "access" : 1, + "descriptor" : "I", + "decoder" : -1057008657 + }, { + "field" : "inventoryActions", + "owner" : "jv", + "name" : "ar", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "isMembersOnly", + "owner" : "jv", + "name" : "aj", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "isStackable", + "owner" : "jv", + "name" : "ag", + "access" : 1, + "descriptor" : "I", + "decoder" : -237597001 + }, { + "field" : "isTradable", + "owner" : "jv", + "name" : "bn", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "maleHeadModel", + "owner" : "jv", + "name" : "ap", + "access" : 0, + "descriptor" : "I", + "decoder" : -650184697 + }, { + "field" : "maleHeadModel2", + "owner" : "jv", + "name" : "as", + "access" : 0, + "descriptor" : "I", + "decoder" : 548044049 + }, { + "field" : "maleModel", + "owner" : "jv", + "name" : "ah", + "access" : 0, + "descriptor" : "I", + "decoder" : 939367983 + }, { + "field" : "maleModel1", + "owner" : "jv", + "name" : "ak", + "access" : 0, + "descriptor" : "I", + "decoder" : 140643039 + }, { + "field" : "maleModel2", + "owner" : "jv", + "name" : "at", + "access" : 0, + "descriptor" : "I", + "decoder" : -691559863 + }, { + "field" : "maleOffset", + "owner" : "jv", + "name" : "aw", + "access" : 0, + "descriptor" : "I", + "decoder" : -1378899027 + }, { + "field" : "name", + "owner" : "jv", + "name" : "z", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "note", + "owner" : "jv", + "name" : "ao", + "access" : 1, + "descriptor" : "I", + "decoder" : 619422509 + }, { + "field" : "noteTemplate", + "owner" : "jv", + "name" : "aa", + "access" : 1, + "descriptor" : "I", + "decoder" : -2121346423 + }, { + "field" : "notedId", + "owner" : "jv", + "name" : "bd", + "access" : 0, + "descriptor" : "I", + "decoder" : -1969719185 + }, { + "field" : "offsetX2d", + "owner" : "jv", + "name" : "p", + "access" : 1, + "descriptor" : "I", + "decoder" : -533708435 + }, { + "field" : "offsetY2d", + "owner" : "jv", + "name" : "v", + "access" : 1, + "descriptor" : "I", + "decoder" : -2130350563 + }, { + "field" : "params", + "owner" : "jv", + "name" : "bq", + "access" : 0, + "descriptor" : "Llh;" + }, { + "field" : "placeholder", + "owner" : "jv", + "name" : "bc", + "access" : 1, + "descriptor" : "I", + "decoder" : 807815565 + }, { + "field" : "placeholderTemplate", + "owner" : "jv", + "name" : "bo", + "access" : 1, + "descriptor" : "I", + "decoder" : -1854342455 + }, { + "field" : "price", + "owner" : "jv", + "name" : "aq", + "access" : 1, + "descriptor" : "I", + "decoder" : -343501105 + }, { + "field" : "recolorFrom", + "owner" : "jv", + "name" : "j", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "recolorTo", + "owner" : "jv", + "name" : "s", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "resizeX", + "owner" : "jv", + "name" : "ax", + "access" : 0, + "descriptor" : "I", + "decoder" : 69034859 + }, { + "field" : "resizeY", + "owner" : "jv", + "name" : "af", + "access" : 0, + "descriptor" : "I", + "decoder" : -17174497 + }, { + "field" : "resizeZ", + "owner" : "jv", + "name" : "ai", + "access" : 0, + "descriptor" : "I", + "decoder" : 1395132907 + }, { + "field" : "retextureFrom", + "owner" : "jv", + "name" : "t", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureTo", + "owner" : "jv", + "name" : "y", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "shiftClickIndex0", + "owner" : "jv", + "name" : "ay", + "access" : 0, + "descriptor" : "I", + "decoder" : 881309855 + }, { + "field" : "unnotedId", + "owner" : "jv", + "name" : "bk", + "access" : 0, + "descriptor" : "I", + "decoder" : 700576005 + }, { + "field" : "xan2d", + "owner" : "jv", + "name" : "b", + "access" : 1, + "descriptor" : "I", + "decoder" : 880150839 + }, { + "field" : "yan2d", + "owner" : "jv", + "name" : "c", + "access" : 1, + "descriptor" : "I", + "decoder" : 507808107 + }, { + "field" : "zan2d", + "owner" : "jv", + "name" : "r", + "access" : 1, + "descriptor" : "I", + "decoder" : 551313257 + }, { + "field" : "zoom2d", + "owner" : "jv", + "name" : "h", + "access" : 1, + "descriptor" : "I", + "decoder" : 278037959 + }, { + "field" : "__a", + "owner" : "jv", + "name" : "a", + "access" : 0, + "descriptor" : "I", + "decoder" : 1070080857 + }, { + "field" : "__au", + "owner" : "jv", + "name" : "au", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__az", + "owner" : "jv", + "name" : "az", + "access" : 0, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "getIntParam", + "owner" : "jv", + "name" : "y", + "access" : 1, + "descriptor" : "(IIS)I" + }, { + "method" : "getModel", + "owner" : "jv", + "name" : "e", + "access" : 17, + "parameters" : [ "quantity" ], + "descriptor" : "(II)Ldu;" + }, { + "method" : "getShiftClickIndex", + "owner" : "jv", + "name" : "b", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "getStringParam", + "owner" : "jv", + "name" : "h", + "access" : 1, + "descriptor" : "(ILjava/lang/String;I)Ljava/lang/String;" + }, { + "method" : "read", + "owner" : "jv", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "jv", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "__f_425", + "owner" : "jv", + "name" : "f", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__o_426", + "owner" : "jv", + "name" : "o", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljv;Ljv;I)V" + }, { + "method" : "__u_427", + "owner" : "jv", + "name" : "u", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljv;Ljv;I)V" + }, { + "method" : "__g_428", + "owner" : "jv", + "name" : "g", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljv;Ljv;I)V" + }, { + "method" : "__l_429", + "owner" : "jv", + "name" : "l", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(II)Ldw;" + }, { + "method" : "__x_430", + "owner" : "jv", + "name" : "x", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)Ljv;" + }, { + "method" : "__z_431", + "owner" : "jv", + "name" : "z", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(ZI)Z" + }, { + "method" : "__j_432", + "owner" : "jv", + "name" : "j", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(ZB)Ldw;" + }, { + "method" : "__s_433", + "owner" : "jv", + "name" : "s", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(ZI)Z" + }, { + "method" : "__t_434", + "owner" : "jv", + "name" : "t", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(ZI)Ldw;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "NpcDefinition", + "name" : "jz", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "actions", + "owner" : "jz", + "name" : "h", + "access" : 1, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "archives", + "owner" : "jz", + "name" : "l", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "combatLevel", + "owner" : "jz", + "name" : "c", + "access" : 1, + "descriptor" : "I", + "decoder" : 1192179847 + }, { + "field" : "drawMapDot", + "owner" : "jz", + "name" : "b", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "headIconPrayer", + "owner" : "jz", + "name" : "aj", + "access" : 1, + "descriptor" : "I", + "decoder" : 235824283 + }, { + "field" : "heightScale", + "owner" : "jz", + "name" : "p", + "access" : 0, + "descriptor" : "I", + "decoder" : 1390683537 + }, { + "field" : "id", + "owner" : "jz", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : -1937346627 + }, { + "field" : "idleSequence", + "owner" : "jz", + "name" : "x", + "access" : 1, + "descriptor" : "I", + "decoder" : 275200787 + }, { + "field" : "isFollower", + "owner" : "jz", + "name" : "aw", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "isInteractable", + "owner" : "jz", + "name" : "ah", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "name", + "owner" : "jz", + "name" : "u", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "params", + "owner" : "jz", + "name" : "al", + "access" : 0, + "descriptor" : "Llh;" + }, { + "field" : "recolorFrom", + "owner" : "jz", + "name" : "j", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "recolorTo", + "owner" : "jz", + "name" : "s", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureFrom", + "owner" : "jz", + "name" : "t", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "retextureTo", + "owner" : "jz", + "name" : "y", + "access" : 0, + "descriptor" : "[S" + }, { + "field" : "size", + "owner" : "jz", + "name" : "g", + "access" : 1, + "descriptor" : "I", + "decoder" : -1541308911 + }, { + "field" : "transformVarbit", + "owner" : "jz", + "name" : "ac", + "access" : 0, + "descriptor" : "I", + "decoder" : 1011388197 + }, { + "field" : "transformVarp", + "owner" : "jz", + "name" : "ay", + "access" : 0, + "descriptor" : "I", + "decoder" : 1631362233 + }, { + "field" : "transforms", + "owner" : "jz", + "name" : "ar", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "turnLeftSequence", + "owner" : "jz", + "name" : "d", + "access" : 1, + "descriptor" : "I", + "decoder" : 819690597 + }, { + "field" : "turnRightSequence", + "owner" : "jz", + "name" : "k", + "access" : 1, + "descriptor" : "I", + "decoder" : 1311553413 + }, { + "field" : "walkSequence", + "owner" : "jz", + "name" : "n", + "access" : 1, + "descriptor" : "I", + "decoder" : -284110917 + }, { + "field" : "walkTurnLeftSequence", + "owner" : "jz", + "name" : "a", + "access" : 1, + "descriptor" : "I", + "decoder" : -1213774321 + }, { + "field" : "walkTurnRightSequence", + "owner" : "jz", + "name" : "z", + "access" : 1, + "descriptor" : "I", + "decoder" : -96930503 + }, { + "field" : "walkTurnSequence", + "owner" : "jz", + "name" : "i", + "access" : 1, + "descriptor" : "I", + "decoder" : 1952230339 + }, { + "field" : "widthScale", + "owner" : "jz", + "name" : "r", + "access" : 0, + "descriptor" : "I", + "decoder" : -1469219067 + }, { + "field" : "__ag", + "owner" : "jz", + "name" : "ag", + "access" : 0, + "descriptor" : "I", + "decoder" : -1235927151 + }, { + "field" : "__aq", + "owner" : "jz", + "name" : "aq", + "access" : 0, + "descriptor" : "I", + "decoder" : 1962875903 + }, { + "field" : "__e", + "owner" : "jz", + "name" : "e", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__ak", + "owner" : "jz", + "name" : "ak", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__v", + "owner" : "jz", + "name" : "v", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__av", + "owner" : "jz", + "name" : "av", + "access" : 1, + "descriptor" : "I", + "decoder" : -506638747 + } ], + "methods" : [ { + "method" : "getIntParam", + "owner" : "jz", + "name" : "x", + "access" : 1, + "descriptor" : "(III)I" + }, { + "method" : "getModel", + "owner" : "jz", + "name" : "u", + "access" : 17, + "parameters" : [ "s1", "n1", "s2", "n2" ], + "descriptor" : "(Ljh;ILjh;II)Ldu;" + }, { + "method" : "getModelData", + "owner" : "jz", + "name" : "g", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)Ldw;" + }, { + "method" : "getStringParam", + "owner" : "jz", + "name" : "d", + "access" : 1, + "descriptor" : "(ILjava/lang/String;I)Ljava/lang/String;" + }, { + "method" : "init", + "owner" : "jz", + "name" : "q", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "read", + "owner" : "jz", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;I)V" + }, { + "method" : "readNext", + "owner" : "jz", + "name" : "o", + "access" : 0, + "descriptor" : "(Lgr;IB)V" + }, { + "method" : "transform", + "owner" : "jz", + "name" : "l", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(B)Ljz;" + }, { + "method" : "__e_435", + "owner" : "jz", + "name" : "e", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "OverlayDefinition", + "name" : "jf", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "hue", + "owner" : "jf", + "name" : "g", + "access" : 1, + "descriptor" : "I", + "decoder" : 2013422835 + }, { + "field" : "hue2", + "owner" : "jf", + "name" : "x", + "access" : 1, + "descriptor" : "I", + "decoder" : -122393061 + }, { + "field" : "lightness", + "owner" : "jf", + "name" : "e", + "access" : 1, + "descriptor" : "I", + "decoder" : -624223733 + }, { + "field" : "lightness2", + "owner" : "jf", + "name" : "k", + "access" : 1, + "descriptor" : "I", + "decoder" : 127639041 + }, { + "field" : "rgb", + "owner" : "jf", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : -111851793 + }, { + "field" : "rgb2", + "owner" : "jf", + "name" : "u", + "access" : 1, + "descriptor" : "I", + "decoder" : 528865753 + }, { + "field" : "saturation", + "owner" : "jf", + "name" : "l", + "access" : 1, + "descriptor" : "I", + "decoder" : -1719896767 + }, { + "field" : "saturation2", + "owner" : "jf", + "name" : "d", + "access" : 1, + "descriptor" : "I", + "decoder" : 1514187401 + }, { + "field" : "texture", + "owner" : "jf", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : 733377225 + }, { + "field" : "__o", + "owner" : "jf", + "name" : "o", + "access" : 1, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "init", + "owner" : "jf", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "read", + "owner" : "jf", + "name" : "q", + "access" : 1, + "descriptor" : "(Lgr;II)V" + }, { + "method" : "readNext", + "owner" : "jf", + "name" : "w", + "access" : 0, + "descriptor" : "(Lgr;III)V" + }, { + "method" : "setHsl", + "owner" : "jf", + "name" : "o", + "access" : 0, + "parameters" : [ "rgb" ], + "descriptor" : "(II)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "SequenceDefinition", + "name" : "jh", + "super" : "fn", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "frameCount", + "owner" : "jh", + "name" : "x", + "access" : 1, + "descriptor" : "I", + "decoder" : -736885973 + }, { + "field" : "frameIds", + "owner" : "jh", + "name" : "u", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "frameIds2", + "owner" : "jh", + "name" : "g", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "frameLengths", + "owner" : "jh", + "name" : "l", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "shield", + "owner" : "jh", + "name" : "i", + "access" : 1, + "descriptor" : "I", + "decoder" : -1308226131 + }, { + "field" : "weapon", + "owner" : "jh", + "name" : "a", + "access" : 1, + "descriptor" : "I", + "decoder" : -1629538741 + }, { + "field" : "__d", + "owner" : "jh", + "name" : "d", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__k", + "owner" : "jh", + "name" : "k", + "access" : 1, + "descriptor" : "Z" + }, { + "field" : "__j", + "owner" : "jh", + "name" : "j", + "access" : 1, + "descriptor" : "I", + "decoder" : 1339014215 + }, { + "field" : "__n", + "owner" : "jh", + "name" : "n", + "access" : 1, + "descriptor" : "I", + "decoder" : 1309695045 + }, { + "field" : "__s", + "owner" : "jh", + "name" : "s", + "access" : 1, + "descriptor" : "I", + "decoder" : 2012242069 + }, { + "field" : "__t", + "owner" : "jh", + "name" : "t", + "access" : 1, + "descriptor" : "I", + "decoder" : 1147391369 + }, { + "field" : "__z", + "owner" : "jh", + "name" : "z", + "access" : 1, + "descriptor" : "I", + "decoder" : -28345361 + }, { + "field" : "__e", + "owner" : "jh", + "name" : "e", + "access" : 1, + "descriptor" : "[I" + } ], + "methods" : [ { + "method" : "animateObject", + "owner" : "jh", + "name" : "u", + "access" : 0, + "parameters" : [ "model", "frame", "orientation" ], + "descriptor" : "(Ldu;IIB)Ldu;" + }, { + "method" : "animateSequence", + "owner" : "jh", + "name" : "o", + "access" : 1, + "parameters" : [ "model", "frame" ], + "descriptor" : "(Ldu;II)Ldu;" + }, { + "method" : "animateSequence2", + "owner" : "jh", + "name" : "l", + "access" : 1, + "parameters" : [ "model", "frame", "sequence", "sequenceFrame" ], + "descriptor" : "(Ldu;ILjh;II)Ldu;" + }, { + "method" : "animateSpotAnimation", + "owner" : "jh", + "name" : "g", + "access" : 0, + "parameters" : [ "model", "frame" ], + "descriptor" : "(Ldu;II)Ldu;" + }, { + "method" : "animateWidget", + "owner" : "jh", + "name" : "e", + "access" : 1, + "parameters" : [ "model", "frame" ], + "descriptor" : "(Ldu;II)Ldu;" + }, { + "method" : "init", + "owner" : "jh", + "name" : "w", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "read", + "owner" : "jh", + "name" : "f", + "access" : 0, + "descriptor" : "(Lgr;S)V" + }, { + "method" : "readNext", + "owner" : "jh", + "name" : "q", + "access" : 0, + "descriptor" : "(Lgr;II)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "IterableNodeDeque", + "name" : "ja", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Iterable" ], + "fields" : [ { + "field" : "current", + "owner" : "ja", + "name" : "f", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "sentinel", + "owner" : "ja", + "name" : "m", + "access" : 0, + "descriptor" : "Lgw;" + } ], + "methods" : [ { + "method" : "addFirst", + "owner" : "ja", + "name" : "f", + "access" : 1, + "parameters" : [ "node" ], + "descriptor" : "(Lgw;)V" + }, { + "method" : "addLast", + "owner" : "ja", + "name" : "q", + "access" : 1, + "parameters" : [ "node" ], + "descriptor" : "(Lgw;)V" + }, { + "method" : "clear", + "owner" : "ja", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "isEmpty", + "owner" : "ja", + "name" : "l", + "access" : 1, + "descriptor" : "()Z" + }, { + "method" : "last", + "owner" : "ja", + "name" : "o", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "previous", + "owner" : "ja", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgw;" + }, { + "method" : "previousOrLast", + "owner" : "ja", + "name" : "u", + "access" : 0, + "parameters" : [ "node" ], + "descriptor" : "(Lgw;)Lgw;" + }, { + "method" : "__iterator_436", + "owner" : "ja", + "name" : "iterator", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/util/Iterator;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "LinkDeque", + "name" : "jy", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "jy", + "name" : "f", + "access" : 0, + "descriptor" : "Lgh;" + }, { + "field" : "__m", + "owner" : "jy", + "name" : "m", + "access" : 0, + "descriptor" : "Lgh;" + } ], + "methods" : [ { + "method" : "__m_437", + "owner" : "jy", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgh;)V" + }, { + "method" : "__f_438", + "owner" : "jy", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgh;" + }, { + "method" : "__q_439", + "owner" : "jy", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lgh;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "IterableDualNodeQueueIterator", + "name" : "jl", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.Iterator" ], + "fields" : [ { + "field" : "queue", + "owner" : "jl", + "name" : "m", + "access" : 0, + "descriptor" : "Ljc;" + }, { + "field" : "__f", + "owner" : "jl", + "name" : "f", + "access" : 0, + "descriptor" : "Lfn;" + }, { + "field" : "__q", + "owner" : "jl", + "name" : "q", + "access" : 0, + "descriptor" : "Lfn;" + } ], + "methods" : [ { + "method" : "__next_440", + "owner" : "jl", + "name" : "next", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/Object;" + }, { + "method" : "__hasNext_441", + "owner" : "jl", + "name" : "hasNext", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "__remove_442", + "owner" : "jl", + "name" : "remove", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljc;)V" + } ] +}, { + "class" : "IterableNodeDequeDescendingIterator", + "name" : "jt", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.Iterator" ], + "fields" : [ { + "field" : "deque", + "owner" : "jt", + "name" : "m", + "access" : 0, + "descriptor" : "Lja;" + }, { + "field" : "__f", + "owner" : "jt", + "name" : "f", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "__q", + "owner" : "jt", + "name" : "q", + "access" : 0, + "descriptor" : "Lgw;" + } ], + "methods" : [ { + "method" : "__u_443", + "owner" : "jt", + "name" : "u", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lja;)V" + }, { + "method" : "__g_444", + "owner" : "jt", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__next_445", + "owner" : "jt", + "name" : "next", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/Object;" + }, { + "method" : "__hasNext_446", + "owner" : "jt", + "name" : "hasNext", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "__remove_447", + "owner" : "jt", + "name" : "remove", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Lja;)V" + } ] +}, { + "class" : "IterableDualNodeQueue", + "name" : "jc", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Iterable" ], + "fields" : [ { + "field" : "head", + "owner" : "jc", + "name" : "f", + "access" : 0, + "descriptor" : "Lfn;" + }, { + "field" : "sentinel", + "owner" : "jc", + "name" : "m", + "access" : 1, + "descriptor" : "Lfn;" + } ], + "methods" : [ { + "method" : "add", + "owner" : "jc", + "name" : "f", + "access" : 1, + "descriptor" : "(Lfn;)V" + }, { + "method" : "clear", + "owner" : "jc", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__q_448", + "owner" : "jc", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lfn;" + }, { + "method" : "__w_449", + "owner" : "jc", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lfn;" + }, { + "method" : "__o_450", + "owner" : "jc", + "name" : "o", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(Lfn;)Lfn;" + }, { + "method" : "__u_451", + "owner" : "jc", + "name" : "u", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lfn;" + }, { + "method" : "__iterator_452", + "owner" : "jc", + "name" : "iterator", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/util/Iterator;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "Timer", + "name" : "jo", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__e", + "owner" : "jo", + "name" : "e", + "access" : 0, + "descriptor" : "I", + "decoder" : 978183419 + }, { + "field" : "__g", + "owner" : "jo", + "name" : "g", + "access" : 0, + "descriptor" : "I", + "decoder" : -500639955 + }, { + "field" : "__l", + "owner" : "jo", + "name" : "l", + "access" : 0, + "descriptor" : "I", + "decoder" : 2043109577 + }, { + "field" : "__x", + "owner" : "jo", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : 1684916659 + }, { + "field" : "__f", + "owner" : "jo", + "name" : "f", + "access" : 0, + "descriptor" : "J", + "decoder" : -8166664055136527097 + }, { + "field" : "__m", + "owner" : "jo", + "name" : "m", + "access" : 0, + "descriptor" : "J", + "decoder" : 6181704275746246665 + }, { + "field" : "__o", + "owner" : "jo", + "name" : "o", + "access" : 0, + "descriptor" : "J", + "decoder" : -5820022560321695785 + }, { + "field" : "__u", + "owner" : "jo", + "name" : "u", + "access" : 0, + "descriptor" : "J", + "decoder" : -7044840680232740733 + }, { + "field" : "__w", + "owner" : "jo", + "name" : "w", + "access" : 0, + "descriptor" : "J", + "decoder" : -6206176920376957899 + }, { + "field" : "__q", + "owner" : "jo", + "name" : "q", + "access" : 1, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "write", + "owner" : "jo", + "name" : "g", + "access" : 1, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "__m_453", + "owner" : "jo", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__f_454", + "owner" : "jo", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__q_455", + "owner" : "jo", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__w_456", + "owner" : "jo", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__o_457", + "owner" : "jo", + "name" : "o", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(S)V" + }, { + "method" : "__u_458", + "owner" : "jo", + "name" : "u", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "User", + "name" : "js", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Comparable" ], + "fields" : [ { + "field" : "previousUsername", + "owner" : "js", + "name" : "w", + "access" : 0, + "descriptor" : "Lkp;" + }, { + "field" : "username0", + "owner" : "js", + "name" : "q", + "access" : 0, + "descriptor" : "Lkp;" + } ], + "methods" : [ { + "method" : "compareTo0", + "owner" : "js", + "name" : "aj", + "access" : 1, + "parameters" : [ "other" ], + "descriptor" : "(Ljs;I)I" + }, { + "method" : "name", + "owner" : "js", + "name" : "v", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Ljava/lang/String;" + }, { + "method" : "previousName", + "owner" : "js", + "name" : "ag", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/lang/String;" + }, { + "method" : "set", + "owner" : "js", + "name" : "aq", + "access" : 0, + "parameters" : [ "username", "previousUsername" ], + "descriptor" : "(Lkp;Lkp;I)V" + }, { + "method" : "username", + "owner" : "js", + "name" : "p", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Lkp;" + }, { + "method" : "__compareTo_459", + "owner" : "js", + "name" : "compareTo", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "AbstractUserComparator", + "name" : "kf", + "super" : "java.lang.Object", + "access" : 1057, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ { + "field" : "__f", + "owner" : "kf", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/util/Comparator;" + } ], + "methods" : [ { + "method" : "__e_460", + "owner" : "kf", + "name" : "e", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/util/Comparator;B)V" + }, { + "method" : "__x_461", + "owner" : "kf", + "name" : "x", + "access" : 20, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljs;Ljs;I)I" + }, { + "method" : "__equals_462", + "owner" : "kf", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 4, + "descriptor" : "()V" + } ] +}, { + "class" : "Ignored", + "name" : "ks", + "super" : "js", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "id", + "owner" : "ks", + "name" : "m", + "access" : 0, + "descriptor" : "I", + "decoder" : 344024525 + } ], + "methods" : [ { + "method" : "compareTo00", + "owner" : "ks", + "name" : "m", + "access" : 0, + "parameters" : [ "other" ], + "descriptor" : "(Lks;I)I" + }, { + "method" : "__aj_463", + "owner" : "ks", + "name" : "aj", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljs;I)I" + }, { + "method" : "__compareTo_464", + "owner" : "ks", + "name" : "compareTo", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "FriendsList", + "name" : "kg", + "super" : "km", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "friendLoginUpdates", + "owner" : "kg", + "name" : "d", + "access" : 1, + "descriptor" : "Ljy;" + }, { + "field" : "loginType", + "owner" : "kg", + "name" : "q", + "access" : 16, + "descriptor" : "Llx;" + }, { + "field" : "__x", + "owner" : "kg", + "name" : "x", + "access" : 0, + "descriptor" : "I", + "decoder" : -217526077 + } ], + "methods" : [ { + "method" : "newInstance", + "owner" : "kg", + "name" : "m", + "access" : 0, + "descriptor" : "(I)Ljs;" + }, { + "method" : "newTypedArray", + "owner" : "kg", + "name" : "f", + "access" : 0, + "descriptor" : "(II)[Ljs;" + }, { + "method" : "read", + "owner" : "kg", + "name" : "x", + "access" : 1, + "parameters" : [ "buffer", "n" ], + "descriptor" : "(Lgr;IB)V" + }, { + "method" : "__q_465", + "owner" : "kg", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lkp;ZI)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Llx;)V" + } ] +}, { + "class" : "Username", + "name" : "kp", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.lang.Comparable" ], + "fields" : [ { + "field" : "cleanName", + "owner" : "kp", + "name" : "f", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "name0", + "owner" : "kp", + "name" : "m", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + } ], + "methods" : [ { + "method" : "compareTo0", + "owner" : "kp", + "name" : "q", + "access" : 1, + "parameters" : [ "other" ], + "descriptor" : "(Lkp;B)I" + }, { + "method" : "hasCleanName", + "owner" : "kp", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "name", + "owner" : "kp", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Ljava/lang/String;" + }, { + "method" : "__equals_466", + "owner" : "kp", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + }, { + "method" : "__hashCode_467", + "owner" : "kp", + "name" : "hashCode", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()I" + }, { + "method" : "__toString_468", + "owner" : "kp", + "name" : "toString", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/String;" + }, { + "method" : "__compareTo_469", + "owner" : "kp", + "name" : "compareTo", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Ljava/lang/String;Llx;)V" + } ] +}, { + "class" : "Friend", + "name" : "kq", + "super" : "ke", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "kq", + "name" : "f", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__m", + "owner" : "kq", + "name" : "m", + "access" : 0, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "compareTo00", + "owner" : "kq", + "name" : "m", + "access" : 0, + "parameters" : [ "other" ], + "descriptor" : "(Lkq;I)I" + }, { + "method" : "__aj_470", + "owner" : "kq", + "name" : "aj", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljs;I)I" + }, { + "method" : "__compareTo_471", + "owner" : "kq", + "name" : "compareTo", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "ClanChat", + "name" : "kv", + "super" : "km", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "localUser", + "owner" : "kv", + "name" : "q", + "access" : 16, + "descriptor" : "Lky;" + }, { + "field" : "loginType", + "owner" : "kv", + "name" : "f", + "access" : 16, + "descriptor" : "Llx;" + }, { + "field" : "name", + "owner" : "kv", + "name" : "x", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "owner", + "owner" : "kv", + "name" : "d", + "access" : 1, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "rank", + "owner" : "kv", + "name" : "n", + "access" : 1, + "descriptor" : "I", + "decoder" : -1534670751 + }, { + "field" : "__i", + "owner" : "kv", + "name" : "i", + "access" : 0, + "descriptor" : "I", + "decoder" : 386706253 + }, { + "field" : "__k", + "owner" : "kv", + "name" : "k", + "access" : 1, + "descriptor" : "B" + } ], + "methods" : [ { + "method" : "clearFriends", + "owner" : "kv", + "name" : "cg", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "clearIgnoreds", + "owner" : "kv", + "name" : "cf", + "access" : 17, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "newInstance", + "owner" : "kv", + "name" : "m", + "access" : 0, + "descriptor" : "(I)Ljs;" + }, { + "method" : "newTypedArray", + "owner" : "kv", + "name" : "f", + "access" : 0, + "descriptor" : "(II)[Ljs;" + }, { + "method" : "readUpdate", + "owner" : "kv", + "name" : "d", + "access" : 17, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)V" + }, { + "method" : "__q_472", + "owner" : "kv", + "name" : "q", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/String;I)V" + }, { + "method" : "__x_473", + "owner" : "kv", + "name" : "x", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/String;B)V" + }, { + "method" : "__a_474", + "owner" : "kv", + "name" : "a", + "access" : 17, + "parameters" : [ "arg0" ], + "descriptor" : "(Lgr;B)V" + }, { + "method" : "__cp_475", + "owner" : "kv", + "name" : "cp", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljk;I)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Llx;Lky;)V" + } ] +}, { + "class" : "FontName", + "name" : "kx", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__g", + "owner" : "kx", + "name" : "g", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + } ], + "methods" : [ ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Ljava/lang/String;)V" + } ] +}, { + "class" : "Fonts", + "name" : "kz", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "map", + "owner" : "kz", + "name" : "q", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "__f", + "owner" : "kz", + "name" : "f", + "access" : 0, + "descriptor" : "Lir;" + }, { + "field" : "__m", + "owner" : "kz", + "name" : "m", + "access" : 0, + "descriptor" : "Lir;" + } ], + "methods" : [ { + "method" : "createMap", + "owner" : "kz", + "name" : "m", + "access" : 1, + "descriptor" : "([Lkx;I)Ljava/util/HashMap;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Lir;Lir;)V" + } ] +}, { + "class" : "SpriteIds", + "name" : "lg", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "crosses", + "owner" : "lg", + "name" : "l", + "access" : 1, + "descriptor" : "I", + "decoder" : 536911453 + }, { + "field" : "headIconsHint", + "owner" : "lg", + "name" : "u", + "access" : 1, + "descriptor" : "I", + "decoder" : 185111653 + }, { + "field" : "headIconsPk", + "owner" : "lg", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : -1052769237 + }, { + "field" : "headIconsPrayer", + "owner" : "lg", + "name" : "o", + "access" : 1, + "descriptor" : "I", + "decoder" : -1744250043 + }, { + "field" : "mapDots", + "owner" : "lg", + "name" : "e", + "access" : 1, + "descriptor" : "I", + "decoder" : -1114417319 + }, { + "field" : "mapMarkers", + "owner" : "lg", + "name" : "g", + "access" : 1, + "descriptor" : "I", + "decoder" : -1217061337 + }, { + "field" : "mapScenes", + "owner" : "lg", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : -104203005 + }, { + "field" : "modIcons", + "owner" : "lg", + "name" : "d", + "access" : 1, + "descriptor" : "I", + "decoder" : 2043130323 + }, { + "field" : "scrollBars", + "owner" : "lg", + "name" : "x", + "access" : 1, + "descriptor" : "I", + "decoder" : -919662109 + }, { + "field" : "__f", + "owner" : "lg", + "name" : "f", + "access" : 1, + "descriptor" : "I", + "decoder" : 159591367 + }, { + "field" : "__m", + "owner" : "lg", + "name" : "m", + "access" : 1, + "descriptor" : "I", + "decoder" : 1673796151 + } ], + "methods" : [ { + "method" : "read", + "owner" : "lg", + "name" : "m", + "access" : 1, + "parameters" : [ "index" ], + "descriptor" : "(Lir;I)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "UserComparator1", + "name" : "ly", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ { + "field" : "__m", + "owner" : "ly", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_476", + "owner" : "ly", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljs;Ljs;B)I" + }, { + "method" : "__compare_477", + "owner" : "ly", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + }, { + "method" : "__equals_478", + "owner" : "ly", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "UserComparator2", + "name" : "li", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.Comparator" ], + "fields" : [ { + "field" : "__m", + "owner" : "li", + "name" : "m", + "access" : 16, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "__m_479", + "owner" : "li", + "name" : "m", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljs;Ljs;I)I" + }, { + "method" : "__compare_480", + "owner" : "li", + "name" : "compare", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Ljava/lang/Object;Ljava/lang/Object;)I" + }, { + "method" : "__equals_481", + "owner" : "li", + "name" : "equals", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(Ljava/lang/Object;)Z" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(Z)V" + } ] +}, { + "class" : "IterableNodeHashTable", + "name" : "lh", + "super" : "java.lang.Object", + "access" : 49, + "interfaces" : [ "java.lang.Iterable" ], + "fields" : [ { + "field" : "buckets", + "owner" : "lh", + "name" : "f", + "access" : 0, + "descriptor" : "[Lgw;" + }, { + "field" : "current", + "owner" : "lh", + "name" : "w", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "currentGet", + "owner" : "lh", + "name" : "q", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "index", + "owner" : "lh", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "size", + "owner" : "lh", + "name" : "m", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "clear", + "owner" : "lh", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "first", + "owner" : "lh", + "name" : "w", + "access" : 1, + "descriptor" : "()Lgw;" + }, { + "method" : "get", + "owner" : "lh", + "name" : "m", + "access" : 1, + "descriptor" : "(J)Lgw;" + }, { + "method" : "next", + "owner" : "lh", + "name" : "o", + "access" : 1, + "descriptor" : "()Lgw;" + }, { + "method" : "put", + "owner" : "lh", + "name" : "f", + "access" : 1, + "descriptor" : "(Lgw;J)V" + }, { + "method" : "__iterator_482", + "owner" : "lh", + "name" : "iterator", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/util/Iterator;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(I)V" + } ] +}, { + "class" : "IterableNodeHashTableIterator", + "name" : "lk", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "java.util.Iterator" ], + "fields" : [ { + "field" : "hashTable", + "owner" : "lk", + "name" : "m", + "access" : 0, + "descriptor" : "Llh;" + }, { + "field" : "__f", + "owner" : "lk", + "name" : "f", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "__w", + "owner" : "lk", + "name" : "w", + "access" : 0, + "descriptor" : "Lgw;" + }, { + "field" : "__q", + "owner" : "lk", + "name" : "q", + "access" : 0, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "__u_483", + "owner" : "lk", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__next_484", + "owner" : "lk", + "name" : "next", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/Object;" + }, { + "method" : "__hasNext_485", + "owner" : "lk", + "name" : "hasNext", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Z" + }, { + "method" : "__remove_486", + "owner" : "lk", + "name" : "remove", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(Llh;)V" + } ] +}, { + "class" : "Bounds", + "name" : "la", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__f", + "owner" : "la", + "name" : "f", + "access" : 1, + "descriptor" : "I", + "decoder" : -1887298731 + }, { + "field" : "__m", + "owner" : "la", + "name" : "m", + "access" : 1, + "descriptor" : "I", + "decoder" : -2004088829 + }, { + "field" : "__q", + "owner" : "la", + "name" : "q", + "access" : 1, + "descriptor" : "I", + "decoder" : 2001187823 + }, { + "field" : "__w", + "owner" : "la", + "name" : "w", + "access" : 1, + "descriptor" : "I", + "decoder" : 1377856837 + } ], + "methods" : [ { + "method" : "__m_487", + "owner" : "la", + "name" : "m", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(IIB)V" + }, { + "method" : "__f_488", + "owner" : "la", + "name" : "f", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__toString_489", + "owner" : "la", + "name" : "toString", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/String;" + }, { + "method" : "__q_490", + "owner" : "la", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lla;Lla;I)V" + }, { + "method" : "__w_491", + "owner" : "la", + "name" : "w", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lla;Lla;I)V" + }, { + "method" : "__o_492", + "owner" : "la", + "name" : "o", + "access" : 0, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(Lla;Lla;S)V" + }, { + "method" : "__u_493", + "owner" : "la", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__g_494", + "owner" : "la", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "(II)V" + }, { + "access" : 1, + "descriptor" : "(IIII)V" + } ] +}, { + "class" : "RectangleMode", + "name" : "lj", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ "gc" ], + "fields" : [ { + "field" : "id", + "owner" : "lj", + "name" : "w", + "access" : 17, + "descriptor" : "I", + "decoder" : -1391612747 + }, { + "field" : "id2", + "owner" : "lj", + "name" : "o", + "access" : 16, + "descriptor" : "I", + "decoder" : -1204297807 + } ], + "methods" : [ { + "method" : "__f_495", + "owner" : "lj", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(II)V" + } ] +}, { + "class" : "IndexedSprite", + "name" : "lq", + "super" : "lf", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "height", + "owner" : "lq", + "name" : "l", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "palette", + "owner" : "lq", + "name" : "f", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "pixels", + "owner" : "lq", + "name" : "m", + "access" : 1, + "descriptor" : "[B" + }, { + "field" : "subHeight", + "owner" : "lq", + "name" : "w", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "subWidth", + "owner" : "lq", + "name" : "q", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "width", + "owner" : "lq", + "name" : "g", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "xOffset", + "owner" : "lq", + "name" : "o", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "yOffset", + "owner" : "lq", + "name" : "u", + "access" : 1, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "normalize", + "owner" : "lq", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "shiftColors", + "owner" : "lq", + "name" : "f", + "access" : 1, + "parameters" : [ "r", "g", "b" ], + "descriptor" : "(III)V" + }, { + "method" : "__q_496", + "owner" : "lq", + "name" : "q", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(II)V" + }, { + "method" : "__o_497", + "owner" : "lq", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + } ] +}, { + "class" : "Sprite", + "name" : "ln", + "super" : "lf", + "access" : 49, + "interfaces" : [ ], + "fields" : [ { + "field" : "height", + "owner" : "ln", + "name" : "g", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "pixels", + "owner" : "ln", + "name" : "m", + "access" : 1, + "descriptor" : "[I" + }, { + "field" : "subHeight", + "owner" : "ln", + "name" : "q", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "subWidth", + "owner" : "ln", + "name" : "f", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "width", + "owner" : "ln", + "name" : "u", + "access" : 1, + "descriptor" : "I" + }, { + "field" : "xOffset", + "owner" : "ln", + "name" : "o", + "access" : 0, + "descriptor" : "I" + }, { + "field" : "yOffset", + "owner" : "ln", + "name" : "w", + "access" : 1, + "descriptor" : "I" + } ], + "methods" : [ { + "method" : "copy", + "owner" : "ln", + "name" : "m", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lln;" + }, { + "method" : "copyNormalized", + "owner" : "ln", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Lln;" + }, { + "method" : "normalize", + "owner" : "ln", + "name" : "w", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__q_498", + "owner" : "ln", + "name" : "q", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__o_499", + "owner" : "ln", + "name" : "o", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__u_500", + "owner" : "ln", + "name" : "u", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__g_501", + "owner" : "ln", + "name" : "g", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "__l_502", + "owner" : "ln", + "name" : "l", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__e_503", + "owner" : "ln", + "name" : "e", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(I)V" + }, { + "method" : "__x_504", + "owner" : "ln", + "name" : "x", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(II)V" + }, { + "method" : "__a_505", + "owner" : "ln", + "name" : "a", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(II)V" + }, { + "method" : "__j_506", + "owner" : "ln", + "name" : "j", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__t_507", + "owner" : "ln", + "name" : "t", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__h_508", + "owner" : "ln", + "name" : "h", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)V" + }, { + "method" : "__c_509", + "owner" : "ln", + "name" : "c", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "__v_510", + "owner" : "ln", + "name" : "v", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(III)V" + }, { + "method" : "__aj_511", + "owner" : "ln", + "name" : "aj", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "__ac_512", + "owner" : "ln", + "name" : "ac", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7" ], + "descriptor" : "(IIIIII[I[I)V" + }, { + "method" : "__ay_513", + "owner" : "ln", + "name" : "ay", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "arg9" ], + "descriptor" : "(IIIIIIII[I[I)V" + }, { + "method" : "__ah_514", + "owner" : "ln", + "name" : "ah", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7" ], + "descriptor" : "(IIIIIIDI)V" + }, { + "method" : "__ak_515", + "owner" : "ln", + "name" : "ak", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__aw_516", + "owner" : "ln", + "name" : "aw", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(IIIIII)V" + }, { + "method" : "__al_517", + "owner" : "ln", + "name" : "al", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIII)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "()V" + }, { + "access" : 1, + "descriptor" : "(II)V" + }, { + "access" : 1, + "descriptor" : "([III)V" + } ] +}, { + "class" : "PlatformInfo", + "name" : "lb", + "super" : "gw", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__ah", + "owner" : "lb", + "name" : "ah", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__at", + "owner" : "lb", + "name" : "at", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__ab", + "owner" : "lb", + "name" : "ab", + "access" : 0, + "descriptor" : "I", + "decoder" : -1667177301 + }, { + "field" : "__ad", + "owner" : "lb", + "name" : "ad", + "access" : 0, + "descriptor" : "I", + "decoder" : -1765017 + }, { + "field" : "__ae", + "owner" : "lb", + "name" : "ae", + "access" : 0, + "descriptor" : "I", + "decoder" : 385109109 + }, { + "field" : "__af", + "owner" : "lb", + "name" : "af", + "access" : 0, + "descriptor" : "I", + "decoder" : 1955966365 + }, { + "field" : "__ai", + "owner" : "lb", + "name" : "ai", + "access" : 0, + "descriptor" : "I", + "decoder" : 1196598207 + }, { + "field" : "__ak", + "owner" : "lb", + "name" : "ak", + "access" : 0, + "descriptor" : "I", + "decoder" : 703904161 + }, { + "field" : "__al", + "owner" : "lb", + "name" : "al", + "access" : 0, + "descriptor" : "I", + "decoder" : 2097018521 + }, { + "field" : "__am", + "owner" : "lb", + "name" : "am", + "access" : 0, + "descriptor" : "I", + "decoder" : 30207059 + }, { + "field" : "__an", + "owner" : "lb", + "name" : "an", + "access" : 0, + "descriptor" : "I", + "decoder" : 890109053 + }, { + "field" : "__ap", + "owner" : "lb", + "name" : "ap", + "access" : 0, + "descriptor" : "I", + "decoder" : -817941105 + }, { + "field" : "__aw", + "owner" : "lb", + "name" : "aw", + "access" : 0, + "descriptor" : "I", + "decoder" : 467004305 + }, { + "field" : "__ax", + "owner" : "lb", + "name" : "ax", + "access" : 0, + "descriptor" : "I", + "decoder" : 871094255 + }, { + "field" : "__ay", + "owner" : "lb", + "name" : "ay", + "access" : 0, + "descriptor" : "I", + "decoder" : 1318366785 + }, { + "field" : "__ba", + "owner" : "lb", + "name" : "ba", + "access" : 0, + "descriptor" : "I", + "decoder" : -170839105 + }, { + "field" : "__bn", + "owner" : "lb", + "name" : "bn", + "access" : 0, + "descriptor" : "I", + "decoder" : 1466207635 + }, { + "field" : "__bq", + "owner" : "lb", + "name" : "bq", + "access" : 0, + "descriptor" : "[I" + }, { + "field" : "__aa", + "owner" : "lb", + "name" : "aa", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__ao", + "owner" : "lb", + "name" : "ao", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__au", + "owner" : "lb", + "name" : "au", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__az", + "owner" : "lb", + "name" : "az", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__bb", + "owner" : "lb", + "name" : "bb", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__bk", + "owner" : "lb", + "name" : "bk", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__bs", + "owner" : "lb", + "name" : "bs", + "access" : 0, + "descriptor" : "Ljava/lang/String;" + } ], + "methods" : [ { + "method" : "size", + "owner" : "lb", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "write", + "owner" : "lb", + "name" : "m", + "access" : 1, + "parameters" : [ "buffer" ], + "descriptor" : "(Lgr;I)V" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IZIIIIIZIIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;[IILjava/lang/String;)V" + } ] +}, { + "class" : "WorldMap", + "name" : "lz", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "cacheLoader", + "owner" : "lz", + "name" : "h", + "access" : 0, + "descriptor" : "Lls;" + }, { + "field" : "currentMapArea0", + "owner" : "lz", + "name" : "s", + "access" : 0, + "descriptor" : "Lag;" + }, { + "field" : "elementsDisabled", + "owner" : "lz", + "name" : "ai", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "enabledCategories", + "owner" : "lz", + "name" : "aa", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "enabledElements", + "owner" : "lz", + "name" : "ao", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "flashingElements", + "owner" : "lz", + "name" : "ak", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "font", + "owner" : "lz", + "name" : "n", + "access" : 0, + "descriptor" : "Lkk;" + }, { + "field" : "fonts", + "owner" : "lz", + "name" : "i", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "iconIterator", + "owner" : "lz", + "name" : "bn", + "access" : 0, + "descriptor" : "Ljava/util/Iterator;" + }, { + "field" : "mainMapArea", + "owner" : "lz", + "name" : "j", + "access" : 0, + "descriptor" : "Lag;" + }, { + "field" : "mapAreas", + "owner" : "lz", + "name" : "z", + "access" : 0, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "mapSceneSprites", + "owner" : "lz", + "name" : "a", + "access" : 0, + "descriptor" : "[Llq;" + }, { + "field" : "mouseCoord", + "owner" : "lz", + "name" : "bd", + "access" : 0, + "descriptor" : "Lhu;" + }, { + "field" : "perpetualFlash0", + "owner" : "lz", + "name" : "ah", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "sprite", + "owner" : "lz", + "name" : "bo", + "access" : 0, + "descriptor" : "Lln;" + }, { + "field" : "worldMapManager", + "owner" : "lz", + "name" : "y", + "access" : 0, + "descriptor" : "Lal;" + }, { + "field" : "zoom", + "owner" : "lz", + "name" : "v", + "access" : 0, + "descriptor" : "F" + }, { + "field" : "zoomTarget", + "owner" : "lz", + "name" : "ag", + "access" : 0, + "descriptor" : "F" + }, { + "field" : "__t", + "owner" : "lz", + "name" : "t", + "access" : 0, + "descriptor" : "Lag;" + }, { + "field" : "__an", + "owner" : "lz", + "name" : "an", + "access" : 0, + "descriptor" : "Z" + }, { + "field" : "__ab", + "owner" : "lz", + "name" : "ab", + "access" : 0, + "descriptor" : "I", + "decoder" : -1979665983 + }, { + "field" : "__ac", + "owner" : "lz", + "name" : "ac", + "access" : 0, + "descriptor" : "I", + "decoder" : -1653084915 + }, { + "field" : "__ad", + "owner" : "lz", + "name" : "ad", + "access" : 0, + "descriptor" : "I", + "decoder" : -988933407 + }, { + "field" : "__ae", + "owner" : "lz", + "name" : "ae", + "access" : 0, + "descriptor" : "I", + "decoder" : 547126547 + }, { + "field" : "__aj", + "owner" : "lz", + "name" : "aj", + "access" : 0, + "descriptor" : "I", + "decoder" : -1140942239 + }, { + "field" : "__al", + "owner" : "lz", + "name" : "al", + "access" : 0, + "descriptor" : "I", + "decoder" : 2064651113 + }, { + "field" : "__am", + "owner" : "lz", + "name" : "am", + "access" : 0, + "descriptor" : "I", + "decoder" : -869889187 + }, { + "field" : "__aq", + "owner" : "lz", + "name" : "aq", + "access" : 0, + "descriptor" : "I", + "decoder" : -1469654441 + }, { + "field" : "__ar", + "owner" : "lz", + "name" : "ar", + "access" : 0, + "descriptor" : "I", + "decoder" : -298919797 + }, { + "field" : "__as", + "owner" : "lz", + "name" : "as", + "access" : 0, + "descriptor" : "I", + "decoder" : -969094439 + }, { + "field" : "__at", + "owner" : "lz", + "name" : "at", + "access" : 0, + "descriptor" : "I", + "decoder" : -815748997 + }, { + "field" : "__av", + "owner" : "lz", + "name" : "av", + "access" : 0, + "descriptor" : "I", + "decoder" : -1301477687 + }, { + "field" : "__aw", + "owner" : "lz", + "name" : "aw", + "access" : 0, + "descriptor" : "I", + "decoder" : -1683910031 + }, { + "field" : "__ay", + "owner" : "lz", + "name" : "ay", + "access" : 0, + "descriptor" : "I", + "decoder" : 1664740569 + }, { + "field" : "__b", + "owner" : "lz", + "name" : "b", + "access" : 0, + "descriptor" : "I", + "decoder" : 1711576969 + }, { + "field" : "__ba", + "owner" : "lz", + "name" : "ba", + "access" : 0, + "descriptor" : "I", + "decoder" : -237734529 + }, { + "field" : "__bm", + "owner" : "lz", + "name" : "bm", + "access" : 0, + "descriptor" : "I", + "decoder" : -1774424249 + }, { + "field" : "__bu", + "owner" : "lz", + "name" : "bu", + "access" : 0, + "descriptor" : "I", + "decoder" : 2064728623 + }, { + "field" : "__bx", + "owner" : "lz", + "name" : "bx", + "access" : 0, + "descriptor" : "I", + "decoder" : 2031417343 + }, { + "field" : "__by", + "owner" : "lz", + "name" : "by", + "access" : 0, + "descriptor" : "I", + "decoder" : 754899959 + }, { + "field" : "__c", + "owner" : "lz", + "name" : "c", + "access" : 0, + "descriptor" : "I", + "decoder" : 1318118645 + }, { + "field" : "__p", + "owner" : "lz", + "name" : "p", + "access" : 0, + "descriptor" : "I", + "decoder" : -56022357 + }, { + "field" : "__r", + "owner" : "lz", + "name" : "r", + "access" : 0, + "descriptor" : "I", + "decoder" : -89657613 + }, { + "field" : "__e", + "owner" : "lz", + "name" : "e", + "access" : 0, + "descriptor" : "Lir;" + }, { + "field" : "__g", + "owner" : "lz", + "name" : "g", + "access" : 0, + "descriptor" : "Lir;" + }, { + "field" : "__l", + "owner" : "lz", + "name" : "l", + "access" : 0, + "descriptor" : "Lir;" + }, { + "field" : "__af", + "owner" : "lz", + "name" : "af", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "__ax", + "owner" : "lz", + "name" : "ax", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "__bk", + "owner" : "lz", + "name" : "bk", + "access" : 0, + "descriptor" : "Ljava/util/HashSet;" + }, { + "field" : "__bq", + "owner" : "lz", + "name" : "bq", + "access" : 0, + "descriptor" : "Ljava/util/List;" + }, { + "field" : "__ap", + "owner" : "lz", + "name" : "ap", + "access" : 0, + "descriptor" : "J", + "decoder" : -4747643242047040283 + }, { + "field" : "__bs", + "owner" : "lz", + "name" : "bs", + "access" : 16, + "descriptor" : "[I" + }, { + "field" : "__bc", + "owner" : "lz", + "name" : "bc", + "access" : 1, + "descriptor" : "Z" + } ], + "methods" : [ { + "method" : "currentMapAreaId", + "owner" : "lz", + "name" : "j", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "disableCategory", + "owner" : "lz", + "name" : "bb", + "access" : 1, + "descriptor" : "(IZI)V" + }, { + "method" : "disableElement", + "owner" : "lz", + "name" : "ba", + "access" : 1, + "descriptor" : "(IZI)V" + }, { + "method" : "draw", + "owner" : "lz", + "name" : "c", + "access" : 1, + "parameters" : [ "x", "y", "width", "height", "cycle" ], + "descriptor" : "(IIIIII)V" + }, { + "method" : "drawLoading", + "owner" : "lz", + "name" : "aj", + "access" : 0, + "descriptor" : "(IIIIIB)V" + }, { + "method" : "drawOverview", + "owner" : "lz", + "name" : "ag", + "access" : 1, + "parameters" : [ "x", "y", "width", "height" ], + "descriptor" : "(IIIIB)V" + }, { + "method" : "flashCategory", + "owner" : "lz", + "name" : "ax", + "access" : 1, + "descriptor" : "(IB)V" + }, { + "method" : "flashElement", + "owner" : "lz", + "name" : "aa", + "access" : 1, + "descriptor" : "(II)V" + }, { + "method" : "getCurrentMapArea", + "owner" : "lz", + "name" : "s", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Lag;" + }, { + "method" : "getElementsEnabled", + "owner" : "lz", + "name" : "bs", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "getMapArea", + "owner" : "lz", + "name" : "ah", + "access" : 1, + "parameters" : [ "id" ], + "descriptor" : "(II)Lag;" + }, { + "method" : "getZoomLevel", + "owner" : "lz", + "name" : "ar", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)I" + }, { + "method" : "iconNext", + "owner" : "lz", + "name" : "by", + "access" : 1, + "descriptor" : "(B)Lak;" + }, { + "method" : "iconStart", + "owner" : "lz", + "name" : "bx", + "access" : 1, + "descriptor" : "(I)Lak;" + }, { + "method" : "init", + "owner" : "lz", + "name" : "m", + "access" : 1, + "descriptor" : "(Lir;Lir;Lir;Lkk;Ljava/util/HashMap;[Llq;I)V" + }, { + "method" : "initializeWorldMapManager", + "owner" : "lz", + "name" : "y", + "access" : 0, + "parameters" : [ "mapArea" ], + "descriptor" : "(Lag;I)V" + }, { + "method" : "isCacheLoaded", + "owner" : "lz", + "name" : "ay", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(S)Z" + }, { + "method" : "isCategoryDisabled", + "owner" : "lz", + "name" : "bn", + "access" : 1, + "descriptor" : "(II)Z" + }, { + "method" : "isElementDisabled", + "owner" : "lz", + "name" : "bq", + "access" : 1, + "descriptor" : "(IB)Z" + }, { + "method" : "jump", + "owner" : "lz", + "name" : "b", + "access" : 0, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(IIII)V" + }, { + "method" : "loadCache", + "owner" : "lz", + "name" : "ac", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "mapAreaAtCoord", + "owner" : "lz", + "name" : "d", + "access" : 1, + "parameters" : [ "plane", "x", "y" ], + "descriptor" : "(IIII)Lag;" + }, { + "method" : "menuAction", + "owner" : "lz", + "name" : "bo", + "access" : 1, + "parameters" : [ "a", "b", "c", "d" ], + "descriptor" : "(IILhu;Lhu;B)V" + }, { + "method" : "onCycle", + "owner" : "lz", + "name" : "q", + "access" : 1, + "parameters" : [ "a", "b", "c", "d", "e", "f", "g" ], + "descriptor" : "(IIZIIIIB)V" + }, { + "method" : "perpetualFlash", + "owner" : "lz", + "name" : "ao", + "access" : 1, + "descriptor" : "(ZI)V" + }, { + "method" : "setCurrentMapArea", + "owner" : "lz", + "name" : "t", + "access" : 0, + "parameters" : [ "mapArea" ], + "descriptor" : "(Lag;B)V" + }, { + "method" : "setCurrentMapAreaId", + "owner" : "lz", + "name" : "z", + "access" : 1, + "parameters" : [ "id" ], + "descriptor" : "(II)V" + }, { + "method" : "setElementsEnabled", + "owner" : "lz", + "name" : "ai", + "access" : 1, + "descriptor" : "(ZI)V" + }, { + "method" : "setZoomLevel", + "owner" : "lz", + "name" : "aq", + "access" : 1, + "parameters" : [ "zoom" ], + "descriptor" : "(II)V" + }, { + "method" : "smoothZoom", + "owner" : "lz", + "name" : "u", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "stopCurrentFlashes", + "owner" : "lz", + "name" : "af", + "access" : 1, + "descriptor" : "(I)V" + }, { + "method" : "__f_518", + "owner" : "lz", + "name" : "f", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__w_519", + "owner" : "lz", + "name" : "w", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIZZS)V" + }, { + "method" : "__o_520", + "owner" : "lz", + "name" : "o", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIZJ)V" + }, { + "method" : "__g_521", + "owner" : "lz", + "name" : "g", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__l_522", + "owner" : "lz", + "name" : "l", + "access" : 16, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIZI)V" + }, { + "method" : "__e_523", + "owner" : "lz", + "name" : "e", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "__x_524", + "owner" : "lz", + "name" : "x", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "__a_525", + "owner" : "lz", + "name" : "a", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(IIIZI)V" + }, { + "method" : "__h_526", + "owner" : "lz", + "name" : "h", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3" ], + "descriptor" : "(Lag;Lhu;Lhu;ZI)V" + }, { + "method" : "__p_527", + "owner" : "lz", + "name" : "p", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(IIIIIII)Z" + }, { + "method" : "__v_528", + "owner" : "lz", + "name" : "v", + "access" : 0, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(IIIIIII)V" + }, { + "method" : "__av_529", + "owner" : "lz", + "name" : "av", + "access" : 0, + "parameters" : [ "arg0" ], + "descriptor" : "(IB)F" + }, { + "method" : "__ak_530", + "owner" : "lz", + "name" : "ak", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__aw_531", + "owner" : "lz", + "name" : "aw", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(III)V" + }, { + "method" : "__al_532", + "owner" : "lz", + "name" : "al", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIIB)V" + }, { + "method" : "__ab_533", + "owner" : "lz", + "name" : "ab", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2" ], + "descriptor" : "(IIII)V" + }, { + "method" : "__ae_534", + "owner" : "lz", + "name" : "ae", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__at_535", + "owner" : "lz", + "name" : "at", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__ad_536", + "owner" : "lz", + "name" : "ad", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)Lhu;" + }, { + "method" : "__ap_537", + "owner" : "lz", + "name" : "ap", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__as_538", + "owner" : "lz", + "name" : "as", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)I" + }, { + "method" : "__am_539", + "owner" : "lz", + "name" : "am", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__an_540", + "owner" : "lz", + "name" : "an", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__az_541", + "owner" : "lz", + "name" : "az", + "access" : 1, + "parameters" : [ "arg0" ], + "descriptor" : "(II)V" + }, { + "method" : "__au_542", + "owner" : "lz", + "name" : "au", + "access" : 1, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__bk_543", + "owner" : "lz", + "name" : "bk", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__bd_544", + "owner" : "lz", + "name" : "bd", + "access" : 1, + "parameters" : [ "arg0", "arg1", "arg2", "arg3", "arg4", "arg5" ], + "descriptor" : "(IIIIIIB)V" + }, { + "method" : "__bc_545", + "owner" : "lz", + "name" : "bc", + "access" : 1, + "parameters" : [ "arg0", "arg1" ], + "descriptor" : "(ILhu;I)Lhu;" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +}, { + "class" : "LoginType", + "name" : "lx", + "super" : "java.lang.Object", + "access" : 33, + "interfaces" : [ ], + "fields" : [ { + "field" : "__d", + "owner" : "lx", + "name" : "d", + "access" : 16, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__x", + "owner" : "lx", + "name" : "x", + "access" : 17, + "descriptor" : "I", + "decoder" : -1916729379 + } ], + "methods" : [ { + "method" : "__toString_546", + "owner" : "lx", + "name" : "toString", + "access" : 1, + "parameters" : [ ], + "descriptor" : "()Ljava/lang/String;" + } ], + "constructors" : [ { + "access" : 0, + "descriptor" : "(IILjava/lang/String;Ljava/lang/String;)V" + }, { + "access" : 0, + "descriptor" : "(IILjava/lang/String;Ljava/lang/String;Z[Llx;)V" + } ] +}, { + "class" : "Client", + "name" : "client", + "super" : "ba", + "access" : 49, + "interfaces" : [ "ky" ], + "fields" : [ { + "field" : "AbstractFont_alpha", + "owner" : "kt", + "name" : "s", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_color", + "owner" : "kt", + "name" : "j", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_justificationCurrent", + "owner" : "kt", + "name" : "y", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_justificationTotal", + "owner" : "kt", + "name" : "t", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_lines", + "owner" : "kt", + "name" : "b", + "access" : 8, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "AbstractFont_modIconSprites", + "owner" : "kt", + "name" : "x", + "access" : 9, + "descriptor" : "[Llq;" + }, { + "field" : "AbstractFont_previousColor", + "owner" : "kt", + "name" : "z", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_previousShadow", + "owner" : "kt", + "name" : "i", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_random", + "owner" : "kt", + "name" : "h", + "access" : 8, + "descriptor" : "Ljava/util/Random;" + }, { + "field" : "AbstractFont_shadow", + "owner" : "kt", + "name" : "a", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_strike", + "owner" : "kt", + "name" : "k", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AbstractFont_underline", + "owner" : "kt", + "name" : "n", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "AttackOption_alwaysRightClick", + "owner" : "cj", + "name" : "f", + "access" : 24, + "descriptor" : "Lcj;" + }, { + "field" : "AttackOption_dependsOnCombatLevels", + "owner" : "cj", + "name" : "m", + "access" : 24, + "descriptor" : "Lcj;" + }, { + "field" : "AttackOption_hidden", + "owner" : "cj", + "name" : "w", + "access" : 24, + "descriptor" : "Lcj;" + }, { + "field" : "AttackOption_leftClickWhereAvailable", + "owner" : "cj", + "name" : "q", + "access" : 24, + "descriptor" : "Lcj;" + }, { + "field" : "ByteArrayPool_large", + "owner" : "gi", + "name" : "u", + "access" : 8, + "descriptor" : "[[B" + }, { + "field" : "ByteArrayPool_largeCount", + "owner" : "gi", + "name" : "q", + "access" : 8, + "descriptor" : "I", + "decoder" : -971800905 + }, { + "field" : "ByteArrayPool_medium", + "owner" : "gi", + "name" : "o", + "access" : 8, + "descriptor" : "[[B" + }, { + "field" : "ByteArrayPool_mediumCount", + "owner" : "gi", + "name" : "f", + "access" : 8, + "descriptor" : "I", + "decoder" : 2121641763 + }, { + "field" : "ByteArrayPool_small", + "owner" : "gi", + "name" : "w", + "access" : 8, + "descriptor" : "[[B" + }, { + "field" : "ByteArrayPool_smallCount", + "owner" : "gi", + "name" : "m", + "access" : 8, + "descriptor" : "I", + "decoder" : -791125441 + }, { + "field" : "Bzip2Decompressor_state", + "owner" : "gk", + "name" : "l", + "access" : 8, + "descriptor" : "Lgt;" + }, { + "field" : "EnumDefinition_cached", + "owner" : "jw", + "name" : "f", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "EnumDefinition_indexCache", + "owner" : "jw", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "FontName_bold12", + "owner" : "kx", + "name" : "q", + "access" : 25, + "descriptor" : "Lkx;" + }, { + "field" : "FontName_plain11", + "owner" : "kx", + "name" : "m", + "access" : 25, + "descriptor" : "Lkx;" + }, { + "field" : "FontName_plain12", + "owner" : "kx", + "name" : "f", + "access" : 25, + "descriptor" : "Lkx;" + }, { + "field" : "FontName_verdana11", + "owner" : "kx", + "name" : "w", + "access" : 25, + "descriptor" : "Lkx;" + }, { + "field" : "FontName_verdana13", + "owner" : "kx", + "name" : "o", + "access" : 25, + "descriptor" : "Lkx;" + }, { + "field" : "FontName_verdana15", + "owner" : "kx", + "name" : "u", + "access" : 25, + "descriptor" : "Lkx;" + }, { + "field" : "Formatting_colorEndTag", + "owner" : "cy", + "name" : "l", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Formatting_comma", + "owner" : "cy", + "name" : "f", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Formatting_lineBreakTag", + "owner" : "cy", + "name" : "g", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Formatting_pipe", + "owner" : "cy", + "name" : "q", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Formatting_rightArrow", + "owner" : "cy", + "name" : "u", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Formatting_rightParenthesis", + "owner" : "cy", + "name" : "o", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Formatting_spaceLeftParenthesis", + "owner" : "cy", + "name" : "w", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Formatting_true", + "owner" : "cy", + "name" : "m", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "HealthBarDefinition_cached", + "owner" : "ii", + "name" : "q", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "HealthBarDefinition_cachedSprites", + "owner" : "ii", + "name" : "w", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "HitSplatDefinition_cached", + "owner" : "jm", + "name" : "w", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "HitSplatDefinition_cachedFonts", + "owner" : "jm", + "name" : "u", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "IndexCache_crc", + "owner" : "it", + "name" : "aj", + "access" : 8, + "descriptor" : "Ljava/util/zip/CRC32;" + }, { + "field" : "IndexStoreActionHandler_lock", + "owner" : "iv", + "name" : "w", + "access" : 8, + "descriptor" : "Ljava/lang/Object;" + }, { + "field" : "IndexStoreActionHandler_requestQueue", + "owner" : "iv", + "name" : "m", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "IndexStoreActionHandler_responseQueue", + "owner" : "iv", + "name" : "f", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "IndexStoreActionHandler_thread", + "owner" : "en", + "name" : "o", + "access" : 8, + "descriptor" : "Ljava/lang/Thread;" + }, { + "field" : "IndexStore_buffer", + "owner" : "ff", + "name" : "m", + "access" : 8, + "descriptor" : "[B" + }, { + "field" : "Instrument_delays", + "owner" : "db", + "name" : "c", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Instrument_noise", + "owner" : "db", + "name" : "t", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Instrument_phases", + "owner" : "db", + "name" : "b", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Instrument_pitchBaseSteps", + "owner" : "db", + "name" : "v", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Instrument_pitchSteps", + "owner" : "db", + "name" : "p", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Instrument_samples", + "owner" : "db", + "name" : "s", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Instrument_sine", + "owner" : "db", + "name" : "y", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Instrument_volumeSteps", + "owner" : "db", + "name" : "r", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Interpreter_arrayLengths", + "owner" : "bv", + "name" : "o", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Interpreter_arrays", + "owner" : "bv", + "name" : "u", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "Interpreter_calendar", + "owner" : "bv", + "name" : "a", + "access" : 8, + "descriptor" : "Ljava/util/Calendar;" + }, { + "field" : "Interpreter_frameDepth", + "owner" : "bv", + "name" : "d", + "access" : 8, + "descriptor" : "I", + "decoder" : 545127349 + }, { + "field" : "Interpreter_frames", + "owner" : "bv", + "name" : "k", + "access" : 8, + "descriptor" : "[Lbn;" + }, { + "field" : "Interpreter_intLocals", + "owner" : "kp", + "name" : "q", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Interpreter_intStack", + "owner" : "bv", + "name" : "g", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Interpreter_intStackSize", + "owner" : "fe", + "name" : "l", + "access" : 8, + "descriptor" : "I", + "decoder" : -1237576843 + }, { + "field" : "Interpreter_stringLocals", + "owner" : "bv", + "name" : "w", + "access" : 8, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "Interpreter_stringStack", + "owner" : "bv", + "name" : "e", + "access" : 8, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "Interpreter_stringStackSize", + "owner" : "bv", + "name" : "x", + "access" : 8, + "descriptor" : "I", + "decoder" : -114766123 + }, { + "field" : "ItemDefinition_cached", + "owner" : "jv", + "name" : "x", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "ItemDefinition_cachedModels", + "owner" : "jv", + "name" : "d", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "ItemDefinition_indexCache", + "owner" : "jv", + "name" : "u", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "ItemDefinition_modelIndexCache", + "owner" : "jv", + "name" : "g", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "KeyHandler_idleCycles", + "owner" : "an", + "name" : "ci", + "access" : 73, + "descriptor" : "I", + "decoder" : -474146073 + }, { + "field" : "KeyHandler_instance", + "owner" : "an", + "name" : "m", + "access" : 9, + "descriptor" : "Lan;" + }, { + "field" : "KeyHandler_keyCodes", + "owner" : "an", + "name" : "cd", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "KeyHandler_pressedKeys", + "owner" : "an", + "name" : "cb", + "access" : 9, + "descriptor" : "[Z" + }, { + "field" : "KitDefinition_cached", + "owner" : "im", + "name" : "w", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "KitDefinition_indexCache", + "owner" : "im", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "Login_isUsernameRemembered", + "owner" : "client", + "name" : "ew", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "Login_loadingPercent", + "owner" : "cu", + "name" : "b", + "access" : 8, + "descriptor" : "I", + "decoder" : -1514610183 + }, { + "field" : "Login_loadingText", + "owner" : "cu", + "name" : "c", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Login_password", + "owner" : "cu", + "name" : "ap", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Login_response0", + "owner" : "cu", + "name" : "al", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Login_response1", + "owner" : "cu", + "name" : "ab", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Login_response2", + "owner" : "cu", + "name" : "ae", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Login_response3", + "owner" : "cu", + "name" : "at", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Login_username", + "owner" : "cu", + "name" : "ad", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Messages_channels", + "owner" : "cw", + "name" : "m", + "access" : 24, + "descriptor" : "Ljava/util/Map;" + }, { + "field" : "Messages_count", + "owner" : "cw", + "name" : "w", + "access" : 8, + "descriptor" : "I", + "decoder" : -1168497831 + }, { + "field" : "Messages_hashTable", + "owner" : "cw", + "name" : "f", + "access" : 24, + "descriptor" : "Llh;" + }, { + "field" : "Messages_queue", + "owner" : "cw", + "name" : "q", + "access" : 24, + "descriptor" : "Ljc;" + }, { + "field" : "ModelData_cosine", + "owner" : "dw", + "name" : "at", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "ModelData_sine", + "owner" : "dw", + "name" : "ae", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Model_cosine", + "owner" : "du", + "name" : "bl", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Model_sharedSequenceModel", + "owner" : "du", + "name" : "m", + "access" : 8, + "descriptor" : "Ldu;" + }, { + "field" : "Model_sharedSequenceModelFaceAlphas", + "owner" : "du", + "name" : "f", + "access" : 8, + "descriptor" : "[B" + }, { + "field" : "Model_sharedSpotAnimationModel", + "owner" : "du", + "name" : "q", + "access" : 8, + "descriptor" : "Ldu;" + }, { + "field" : "Model_sharedSpotAnimationModelFaceAlphas", + "owner" : "du", + "name" : "w", + "access" : 8, + "descriptor" : "[B" + }, { + "field" : "Model_sine", + "owner" : "du", + "name" : "bm", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Model_transformTempX", + "owner" : "du", + "name" : "bd", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Model_transformTempY", + "owner" : "du", + "name" : "bc", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Model_transformTempZ", + "owner" : "du", + "name" : "bo", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "MouseHandler_currentButton", + "owner" : "bb", + "name" : "d", + "access" : 9, + "descriptor" : "I", + "decoder" : -2044247305 + }, { + "field" : "MouseHandler_currentButton0", + "owner" : "bb", + "name" : "u", + "access" : 73, + "descriptor" : "I", + "decoder" : 642308075 + }, { + "field" : "MouseHandler_idleCycles", + "owner" : "bb", + "name" : "o", + "access" : 73, + "descriptor" : "I", + "decoder" : -1080652669 + }, { + "field" : "MouseHandler_instance", + "owner" : "bb", + "name" : "w", + "access" : 9, + "descriptor" : "Lbb;" + }, { + "field" : "MouseHandler_lastButton", + "owner" : "bb", + "name" : "s", + "access" : 9, + "descriptor" : "I", + "decoder" : 2126310249 + }, { + "field" : "MouseHandler_lastButton0", + "owner" : "bb", + "name" : "i", + "access" : 73, + "descriptor" : "I", + "decoder" : 590718769 + }, { + "field" : "MouseHandler_lastPressedTimeMillis", + "owner" : "bb", + "name" : "h", + "access" : 9, + "descriptor" : "J", + "decoder" : 3806612340723844439 + }, { + "field" : "MouseHandler_lastPressedTimeMillis0", + "owner" : "bb", + "name" : "j", + "access" : 73, + "descriptor" : "J", + "decoder" : 3555003757894628243 + }, { + "field" : "MouseHandler_lastPressedX", + "owner" : "bb", + "name" : "t", + "access" : 9, + "descriptor" : "I", + "decoder" : -1853704165 + }, { + "field" : "MouseHandler_lastPressedX0", + "owner" : "bb", + "name" : "a", + "access" : 73, + "descriptor" : "I", + "decoder" : -813801905 + }, { + "field" : "MouseHandler_lastPressedY", + "owner" : "bb", + "name" : "y", + "access" : 9, + "descriptor" : "I", + "decoder" : 1876967757 + }, { + "field" : "MouseHandler_lastPressedY0", + "owner" : "bb", + "name" : "z", + "access" : 73, + "descriptor" : "I", + "decoder" : 14138669 + }, { + "field" : "MouseHandler_millis", + "owner" : "bb", + "name" : "n", + "access" : 9, + "descriptor" : "J", + "decoder" : -7587574528523107151 + }, { + "field" : "MouseHandler_millis0", + "owner" : "bb", + "name" : "e", + "access" : 73, + "descriptor" : "J", + "decoder" : -5429651987476437823 + }, { + "field" : "MouseHandler_x", + "owner" : "bb", + "name" : "k", + "access" : 9, + "descriptor" : "I", + "decoder" : -649043937 + }, { + "field" : "MouseHandler_x0", + "owner" : "bb", + "name" : "g", + "access" : 73, + "descriptor" : "I", + "decoder" : 1048471439 + }, { + "field" : "MouseHandler_y", + "owner" : "bb", + "name" : "x", + "access" : 9, + "descriptor" : "I", + "decoder" : 1291011547 + }, { + "field" : "MouseHandler_y0", + "owner" : "bb", + "name" : "l", + "access" : 73, + "descriptor" : "I", + "decoder" : 2000222973 + }, { + "field" : "NetCache_crc", + "owner" : "iq", + "name" : "t", + "access" : 9, + "descriptor" : "Ljava/util/zip/CRC32;" + }, { + "field" : "NetCache_crcMismatches", + "owner" : "iq", + "name" : "c", + "access" : 9, + "descriptor" : "I", + "decoder" : -1404585009 + }, { + "field" : "NetCache_currentResponse", + "owner" : "ed", + "name" : "i", + "access" : 9, + "descriptor" : "Liz;" + }, { + "field" : "NetCache_indexCaches", + "owner" : "iq", + "name" : "h", + "access" : 9, + "descriptor" : "[Lit;" + }, { + "field" : "NetCache_ioExceptions", + "owner" : "iq", + "name" : "r", + "access" : 9, + "descriptor" : "I", + "decoder" : -1141619871 + }, { + "field" : "NetCache_pendingPriorityResponses", + "owner" : "iq", + "name" : "u", + "access" : 9, + "descriptor" : "Lld;" + }, { + "field" : "NetCache_pendingPriorityResponsesCount", + "owner" : "iq", + "name" : "g", + "access" : 9, + "descriptor" : "I", + "decoder" : 516430597 + }, { + "field" : "NetCache_pendingPriorityWrites", + "owner" : "iq", + "name" : "w", + "access" : 9, + "descriptor" : "Lld;" + }, { + "field" : "NetCache_pendingPriorityWritesCount", + "owner" : "iq", + "name" : "o", + "access" : 9, + "descriptor" : "I", + "decoder" : 1495729287 + }, { + "field" : "NetCache_pendingResponses", + "owner" : "iq", + "name" : "d", + "access" : 9, + "descriptor" : "Lld;" + }, { + "field" : "NetCache_pendingResponsesCount", + "owner" : "iq", + "name" : "k", + "access" : 9, + "descriptor" : "I", + "decoder" : -1627751389 + }, { + "field" : "NetCache_pendingWrites", + "owner" : "iq", + "name" : "e", + "access" : 9, + "descriptor" : "Lld;" + }, { + "field" : "NetCache_pendingWritesCount", + "owner" : "iq", + "name" : "x", + "access" : 9, + "descriptor" : "I", + "decoder" : -1592359229 + }, { + "field" : "NetCache_pendingWritesQueue", + "owner" : "iq", + "name" : "l", + "access" : 9, + "descriptor" : "Ljp;" + }, { + "field" : "NetCache_reference", + "owner" : "cq", + "name" : "y", + "access" : 9, + "descriptor" : "Lgr;" + }, { + "field" : "NetCache_responseArchiveBuffer", + "owner" : "c", + "name" : "z", + "access" : 9, + "descriptor" : "Lgr;" + }, { + "field" : "NetCache_responseHeaderBuffer", + "owner" : "iq", + "name" : "a", + "access" : 9, + "descriptor" : "Lgr;" + }, { + "field" : "NetCache_socket", + "owner" : "iq", + "name" : "m", + "access" : 9, + "descriptor" : "Lfu;" + }, { + "field" : "NpcDefinition_cached", + "owner" : "jz", + "name" : "q", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "NpcDefinition_cachedModels", + "owner" : "jz", + "name" : "w", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "NpcDefinition_indexCache", + "owner" : "jz", + "name" : "m", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "NpcDefinition_modelIndexCache", + "owner" : "jz", + "name" : "f", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "ObjectDefinition_cached", + "owner" : "jr", + "name" : "w", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "ObjectDefinition_cachedModels", + "owner" : "jr", + "name" : "g", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "ObjectDefinition_indexCache", + "owner" : "jr", + "name" : "f", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "ObjectDefinition_isLowDetail", + "owner" : "jr", + "name" : "m", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "PacketBuffer_masks", + "owner" : "hx", + "name" : "x", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "ParamKeyDefinition_cached", + "owner" : "jb", + "name" : "f", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "PcmPlayer_sampleRate", + "owner" : "kl", + "name" : "o", + "access" : 9, + "descriptor" : "I", + "decoder" : 147524751 + }, { + "field" : "PlayerAppearance_cachedModels", + "owner" : "hi", + "name" : "k", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "PlayerType_hardcoreIronman", + "owner" : "ij", + "name" : "u", + "access" : 24, + "descriptor" : "Lij;" + }, { + "field" : "PlayerType_ironman", + "owner" : "ij", + "name" : "w", + "access" : 24, + "descriptor" : "Lij;" + }, { + "field" : "PlayerType_jagexModerator", + "owner" : "ij", + "name" : "q", + "access" : 24, + "descriptor" : "Lij;" + }, { + "field" : "PlayerType_normal", + "owner" : "ij", + "name" : "m", + "access" : 24, + "descriptor" : "Lij;" + }, { + "field" : "PlayerType_playerModerator", + "owner" : "ij", + "name" : "f", + "access" : 24, + "descriptor" : "Lij;" + }, { + "field" : "PlayerType_ultimateIronman", + "owner" : "ij", + "name" : "o", + "access" : 24, + "descriptor" : "Lij;" + }, { + "field" : "Players_count", + "owner" : "cq", + "name" : "u", + "access" : 8, + "descriptor" : "I", + "decoder" : -766468303 + }, { + "field" : "Players_indices", + "owner" : "cq", + "name" : "g", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Players_orientations", + "owner" : "cq", + "name" : "d", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Players_regions", + "owner" : "cq", + "name" : "x", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Players_targetIndices", + "owner" : "cq", + "name" : "k", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Rasterizer2D_height", + "owner" : "lf", + "name" : "av", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Rasterizer2D_pixels", + "owner" : "lf", + "name" : "aq", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "Rasterizer2D_width", + "owner" : "lf", + "name" : "aj", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Rasterizer2D_xClipEnd", + "owner" : "lf", + "name" : "ah", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Rasterizer2D_xClipStart", + "owner" : "lf", + "name" : "ay", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Rasterizer2D_yClipEnd", + "owner" : "lf", + "name" : "ac", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Rasterizer2D_yClipStart", + "owner" : "lf", + "name" : "ar", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_alpha", + "owner" : "et", + "name" : "o", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipHeight", + "owner" : "et", + "name" : "z", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipMidX", + "owner" : "et", + "name" : "n", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipMidX2", + "owner" : "et", + "name" : "s", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipMidY", + "owner" : "et", + "name" : "i", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipMidY2", + "owner" : "et", + "name" : "y", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipNegativeMidX", + "owner" : "et", + "name" : "j", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipNegativeMidY", + "owner" : "et", + "name" : "t", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_clipWidth", + "owner" : "et", + "name" : "a", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Rasterizer3D_colorPalette", + "owner" : "et", + "name" : "b", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "Rasterizer3D_cosine", + "owner" : "et", + "name" : "ag", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "Rasterizer3D_isLowDetailTexture", + "owner" : "et", + "name" : "q", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "Rasterizer3D_rowOffsets", + "owner" : "et", + "name" : "h", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Rasterizer3D_sine", + "owner" : "et", + "name" : "v", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "Rasterizer3D_textureLoader", + "owner" : "et", + "name" : "c", + "access" : 9, + "descriptor" : "Lei;" + }, { + "field" : "Rasterizer3D_zoom", + "owner" : "et", + "name" : "k", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Scene_cameraPitchCosine", + "owner" : "em", + "name" : "aq", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraPitchSine", + "owner" : "em", + "name" : "ag", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraX", + "owner" : "em", + "name" : "r", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraXTile", + "owner" : "em", + "name" : "b", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraXTileMax", + "owner" : "em", + "name" : "t", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraXTileMin", + "owner" : "em", + "name" : "s", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraY", + "owner" : "em", + "name" : "p", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraYTile", + "owner" : "em", + "name" : "c", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraYTileMax", + "owner" : "em", + "name" : "h", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraYTileMin", + "owner" : "em", + "name" : "y", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraYawCosine", + "owner" : "em", + "name" : "av", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraYawSine", + "owner" : "em", + "name" : "aj", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_cameraZ", + "owner" : "em", + "name" : "v", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_currentOccluders", + "owner" : "em", + "name" : "an", + "access" : 8, + "descriptor" : "[Lee;" + }, { + "field" : "Scene_currentOccludersCount", + "owner" : "em", + "name" : "am", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_drawnCount", + "owner" : "em", + "name" : "j", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_isLowDetail", + "owner" : "em", + "name" : "m", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "Scene_plane", + "owner" : "em", + "name" : "z", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_planeOccluderCounts", + "owner" : "em", + "name" : "ap", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Scene_planeOccluders", + "owner" : "em", + "name" : "as", + "access" : 8, + "descriptor" : "[[Lee;" + }, { + "field" : "Scene_selectedPlane", + "owner" : "em", + "name" : "ay", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_selectedScreenX", + "owner" : "em", + "name" : "ah", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_selectedScreenY", + "owner" : "em", + "name" : "ak", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_selectedX", + "owner" : "em", + "name" : "aw", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Scene_selectedY", + "owner" : "em", + "name" : "al", + "access" : 9, + "descriptor" : "I" + }, { + "field" : "Scene_tilesDeque", + "owner" : "em", + "name" : "az", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "Scene_viewportXCenter", + "owner" : "em", + "name" : "bx", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_viewportXMax", + "owner" : "em", + "name" : "bl", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_viewportXMin", + "owner" : "em", + "name" : "bu", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_viewportYCenter", + "owner" : "em", + "name" : "by", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_viewportYMax", + "owner" : "em", + "name" : "br", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Scene_viewportYMin", + "owner" : "em", + "name" : "bm", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "Script_cached", + "owner" : "cg", + "name" : "m", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "SequenceDefinition_cached", + "owner" : "jh", + "name" : "w", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "SequenceDefinition_indexCache", + "owner" : "jh", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "Skills_enabled", + "owner" : "hc", + "name" : "f", + "access" : 25, + "descriptor" : "[Z" + }, { + "field" : "Skills_experienceTable", + "owner" : "hc", + "name" : "q", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "SpotAnimationDefinition_cached", + "owner" : "io", + "name" : "q", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "SpotAnimationDefinition_cachedModels", + "owner" : "io", + "name" : "w", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "SpotAnimationDefinition_indexCache", + "owner" : "io", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "SpotAnimationDefinition_modelIndexCache", + "owner" : "io", + "name" : "f", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "Sprite_cached", + "owner" : "jv", + "name" : "k", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "Strings_almostEverywhere", + "owner" : "id", + "name" : "hw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_andTheProtectItemPrayerWontWork", + "owner" : "id", + "name" : "hj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_attack", + "owner" : "id", + "name" : "fq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_cancel", + "owner" : "id", + "name" : "iz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_checkingForUpdates", + "owner" : "id", + "name" : "s", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_chooseOption", + "owner" : "id", + "name" : "fw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_close", + "owner" : "id", + "name" : "fd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_connectingToServer", + "owner" : "id", + "name" : "if", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_connectingToUpdateServer", + "owner" : "id", + "name" : "j", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_connectionLost", + "owner" : "id", + "name" : "n", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_continue", + "owner" : "id", + "name" : "g", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_drop", + "owner" : "id", + "name" : "q", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_examine", + "owner" : "id", + "name" : "ep", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_existingUser", + "owner" : "id", + "name" : "is", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_fromYourFriendListFirst", + "owner" : "id", + "name" : "fe", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_fromYourIgnoreListFirst", + "owner" : "id", + "name" : "fy", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_hasLoggedIn", + "owner" : "id", + "name" : "ea", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_hasLoggedOut", + "owner" : "id", + "name" : "es", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_hidden", + "owner" : "id", + "name" : "w", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_isAlreadyOnYourFriendList", + "owner" : "id", + "name" : "fo", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_level", + "owner" : "id", + "name" : "fl", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedConfig", + "owner" : "id", + "name" : "v", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedFonts", + "owner" : "id", + "name" : "b", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedInputHandler", + "owner" : "id", + "name" : "ar", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedInterfaces", + "owner" : "id", + "name" : "ak", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedSprites", + "owner" : "id", + "name" : "aq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedTextures", + "owner" : "id", + "name" : "av", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedTitleScreen", + "owner" : "id", + "name" : "r", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedUpdateList", + "owner" : "id", + "name" : "t", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedWordpack", + "owner" : "id", + "name" : "ay", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadedWorldMap", + "owner" : "id", + "name" : "al", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loading", + "owner" : "id", + "name" : "kq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingConfig", + "owner" : "id", + "name" : "p", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingFonts", + "owner" : "id", + "name" : "h", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingInterfaces", + "owner" : "id", + "name" : "ah", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingPleaseWait", + "owner" : "id", + "name" : "k", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingSprites", + "owner" : "id", + "name" : "ag", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingTextures", + "owner" : "id", + "name" : "aj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingTitleScreen", + "owner" : "id", + "name" : "c", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingWordpack", + "owner" : "id", + "name" : "ac", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_loadingWorldMap", + "owner" : "id", + "name" : "aw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_login", + "owner" : "id", + "name" : "ie", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_membersObject", + "owner" : "id", + "name" : "m", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_moreOptions", + "owner" : "id", + "name" : "fg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_newUser", + "owner" : "id", + "name" : "iy", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_notWorkOnThisWorld", + "owner" : "id", + "name" : "hu", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_null", + "owner" : "id", + "name" : "e", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_ok", + "owner" : "id", + "name" : "o", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_password", + "owner" : "id", + "name" : "in", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_pin", + "owner" : "id", + "name" : "il", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_playersCanAttackEachOther", + "owner" : "id", + "name" : "he", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_playersCanAttackEachOtherAlmostEverywhere", + "owner" : "id", + "name" : "ht", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_pleaseEnterYourPassword", + "owner" : "id", + "name" : "dh", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_pleaseEnterYourUsername", + "owner" : "id", + "name" : "dw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_pleaseRemoveFriend", + "owner" : "id", + "name" : "fi", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_pleaseRemoveIgnore", + "owner" : "id", + "name" : "fr", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_pleaseWait", + "owner" : "id", + "name" : "fp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_pleaseWaitAttemptingToReestablish", + "owner" : "id", + "name" : "i", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_preparedSoundEngine", + "owner" : "id", + "name" : "y", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_preparedVisibilityMap", + "owner" : "id", + "name" : "z", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_select", + "owner" : "id", + "name" : "u", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_skill", + "owner" : "id", + "name" : "fj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_space", + "owner" : "id", + "name" : "fh", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_startingGameEngine", + "owner" : "id", + "name" : "a", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_take", + "owner" : "id", + "name" : "f", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_theProtectItemPrayerWill", + "owner" : "id", + "name" : "hv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_thisIsABetaWorld", + "owner" : "id", + "name" : "ho", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_thisIsAHighRiskPvpWorld", + "owner" : "id", + "name" : "hi", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_thisIsAHighRiskWorld", + "owner" : "id", + "name" : "hp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_thisIsAPvpWorld", + "owner" : "id", + "name" : "hq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_unableToFind", + "owner" : "id", + "name" : "eg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_use", + "owner" : "id", + "name" : "ez", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_walkHere", + "owner" : "id", + "name" : "fc", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_warning", + "owner" : "id", + "name" : "hl", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_welcomeToRuneScape", + "owner" : "id", + "name" : "ij", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_yourFriendListIsFull", + "owner" : "id", + "name" : "fu", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_yourIgnoreListIsFull", + "owner" : "id", + "name" : "ft", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Strings_yourNormalAccountWillNotBeAffected", + "owner" : "id", + "name" : "hz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "Texture_animatedPixels", + "owner" : "dh", + "name" : "a", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Tiles_heights", + "owner" : "bq", + "name" : "m", + "access" : 8, + "descriptor" : "[[[I" + }, { + "field" : "Tiles_minPlane", + "owner" : "bq", + "name" : "q", + "access" : 8, + "descriptor" : "I", + "decoder" : -1454618167 + }, { + "field" : "Tiles_renderFlags", + "owner" : "bq", + "name" : "f", + "access" : 8, + "descriptor" : "[[[B" + }, { + "field" : "TriBool_false", + "owner" : "kd", + "name" : "q", + "access" : 25, + "descriptor" : "Lkd;" + }, { + "field" : "TriBool_true", + "owner" : "kd", + "name" : "f", + "access" : 25, + "descriptor" : "Lkd;" + }, { + "field" : "TriBool_unknown", + "owner" : "kd", + "name" : "m", + "access" : 25, + "descriptor" : "Lkd;" + }, { + "field" : "UnderlayDefinition_cached", + "owner" : "ih", + "name" : "f", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "UnderlayDefinition_indexCache", + "owner" : "ih", + "name" : "m", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "VarbitDefinition_cached", + "owner" : "ia", + "name" : "f", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "VarbitDefinition_indexCache", + "owner" : "ia", + "name" : "m", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "VarpDefinition_cached", + "owner" : "ix", + "name" : "q", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "Varps_main", + "owner" : "hv", + "name" : "q", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "Varps_masks", + "owner" : "hv", + "name" : "m", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "Varps_temp", + "owner" : "hv", + "name" : "f", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "ViewportMouse_entityCount", + "owner" : "dm", + "name" : "i", + "access" : 9, + "descriptor" : "I", + "decoder" : -2140977119 + }, { + "field" : "ViewportMouse_entityTags", + "owner" : "dm", + "name" : "a", + "access" : 9, + "descriptor" : "[J" + }, { + "field" : "ViewportMouse_false0", + "owner" : "dm", + "name" : "w", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "ViewportMouse_isInViewport", + "owner" : "dm", + "name" : "m", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "ViewportMouse_x", + "owner" : "dm", + "name" : "f", + "access" : 9, + "descriptor" : "I", + "decoder" : 1891197573 + }, { + "field" : "ViewportMouse_y", + "owner" : "dm", + "name" : "q", + "access" : 9, + "descriptor" : "I", + "decoder" : 1535565231 + }, { + "field" : "Widget_cachedFonts", + "owner" : "ho", + "name" : "a", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "Widget_cachedModels", + "owner" : "ho", + "name" : "i", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "Widget_indexCache", + "owner" : "ho", + "name" : "e", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "WorldMapCacheName_area", + "owner" : "aw", + "name" : "w", + "access" : 24, + "descriptor" : "Law;" + }, { + "field" : "WorldMapCacheName_compositeMap", + "owner" : "aw", + "name" : "f", + "access" : 25, + "descriptor" : "Law;" + }, { + "field" : "WorldMapCacheName_compositeTexture", + "owner" : "aw", + "name" : "q", + "access" : 25, + "descriptor" : "Law;" + }, { + "field" : "WorldMapCacheName_details", + "owner" : "aw", + "name" : "m", + "access" : 25, + "descriptor" : "Law;" + }, { + "field" : "WorldMapCacheName_labels", + "owner" : "aw", + "name" : "o", + "access" : 25, + "descriptor" : "Law;" + }, { + "field" : "WorldMapElement_cached", + "owner" : "ho", + "name" : "f", + "access" : 9, + "descriptor" : "[Lic;" + }, { + "field" : "WorldMapElement_cachedSprites", + "owner" : "ic", + "name" : "w", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "WorldMapElement_count", + "owner" : "ev", + "name" : "q", + "access" : 9, + "descriptor" : "I", + "decoder" : -112939189 + }, { + "field" : "WorldMapLabelSize_large", + "owner" : "s", + "name" : "q", + "access" : 25, + "descriptor" : "Ls;" + }, { + "field" : "WorldMapLabelSize_medium", + "owner" : "s", + "name" : "f", + "access" : 25, + "descriptor" : "Ls;" + }, { + "field" : "WorldMapLabelSize_small", + "owner" : "s", + "name" : "m", + "access" : 25, + "descriptor" : "Ls;" + }, { + "field" : "applet", + "owner" : "fx", + "name" : "m", + "access" : 9, + "descriptor" : "Ljava/applet/Applet;" + }, { + "field" : "base37Table", + "owner" : "ku", + "name" : "m", + "access" : 25, + "descriptor" : "[C" + }, { + "field" : "baseX", + "owner" : "af", + "name" : "ff", + "access" : 8, + "descriptor" : "I", + "decoder" : -790717597 + }, { + "field" : "baseY", + "owner" : "bw", + "name" : "fr", + "access" : 8, + "descriptor" : "I", + "decoder" : -438288575 + }, { + "field" : "cacheDirectoryLocations", + "owner" : "ah", + "name" : "j", + "access" : 9, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "cameraPitch", + "owner" : "t", + "name" : "hq", + "access" : 8, + "descriptor" : "I", + "decoder" : 490189491 + }, { + "field" : "cameraX", + "owner" : "as", + "name" : "ha", + "access" : 8, + "descriptor" : "I", + "decoder" : 1052834531 + }, { + "field" : "cameraY", + "owner" : "g", + "name" : "hs", + "access" : 8, + "descriptor" : "I", + "decoder" : 1326137897 + }, { + "field" : "cameraYaw", + "owner" : "ha", + "name" : "he", + "access" : 8, + "descriptor" : "I", + "decoder" : 2069364655 + }, { + "field" : "cameraZ", + "owner" : "k", + "name" : "hl", + "access" : 8, + "descriptor" : "I", + "decoder" : -1945589829 + }, { + "field" : "canvasHeight", + "owner" : "gd", + "name" : "p", + "access" : 9, + "descriptor" : "I", + "decoder" : -842662451 + }, { + "field" : "canvasWidth", + "owner" : "dt", + "name" : "r", + "access" : 9, + "descriptor" : "I", + "decoder" : 1784515731 + }, { + "field" : "chatEffects", + "owner" : "client", + "name" : "mg", + "access" : 8, + "descriptor" : "I", + "decoder" : 247245677 + }, { + "field" : "clDat", + "owner" : "lc", + "name" : "w", + "access" : 9, + "descriptor" : "Ljava/io/File;" + }, { + "field" : "clanChat", + "owner" : "cl", + "name" : "pg", + "access" : 8, + "descriptor" : "Lkv;" + }, { + "field" : "clickedWidget", + "owner" : "client", + "name" : "mc", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "clickedWidgetParent", + "owner" : "client", + "name" : "mr", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "client", + "owner" : "dl", + "name" : "af", + "access" : 8, + "descriptor" : "Lclient;" + }, { + "field" : "clientPreferences", + "owner" : "lw", + "name" : "su", + "access" : 8, + "descriptor" : "Lbf;" + }, { + "field" : "clientType", + "owner" : "client", + "name" : "bm", + "access" : 8, + "descriptor" : "I", + "decoder" : 1678472241 + }, { + "field" : "clock", + "owner" : "fg", + "name" : "n", + "access" : 8, + "descriptor" : "Lfa;" + }, { + "field" : "collisionMaps", + "owner" : "client", + "name" : "w", + "access" : 8, + "descriptor" : "[Lfy;" + }, { + "field" : "combatTargetPlayerIndex", + "owner" : "client", + "name" : "kx", + "access" : 8, + "descriptor" : "I", + "decoder" : -1309758309 + }, { + "field" : "cp1252AsciiExtension", + "owner" : "kr", + "name" : "m", + "access" : 25, + "descriptor" : "[C" + }, { + "field" : "crossSprites", + "owner" : "an", + "name" : "gx", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "currentLevels", + "owner" : "client", + "name" : "ki", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "currentTimeMsLast", + "owner" : "ed", + "name" : "m", + "access" : 8, + "descriptor" : "J", + "decoder" : 3311945626287518857 + }, { + "field" : "currentTimeMsOffset", + "owner" : "ga", + "name" : "f", + "access" : 8, + "descriptor" : "J", + "decoder" : -6166028446082638015 + }, { + "field" : "cycle", + "owner" : "client", + "name" : "cu", + "access" : 8, + "descriptor" : "I", + "decoder" : 1909006131 + }, { + "field" : "dat2File", + "owner" : "fs", + "name" : "n", + "access" : 9, + "descriptor" : "Ldy;" + }, { + "field" : "decimator", + "owner" : "fd", + "name" : "qi", + "access" : 8, + "descriptor" : "Ldp;" + }, { + "field" : "destinationX", + "owner" : "client", + "name" : "pd", + "access" : 8, + "descriptor" : "I", + "decoder" : -362336323 + }, { + "field" : "destinationY", + "owner" : "client", + "name" : "pk", + "access" : 8, + "descriptor" : "I", + "decoder" : 1298845031 + }, { + "field" : "directBufferUnavailable", + "owner" : "gu", + "name" : "f", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "displayFps", + "owner" : "client", + "name" : "cg", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "dragInventoryWidget", + "owner" : "az", + "name" : "jf", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "dragItemSlotDestination", + "owner" : "client", + "name" : "jy", + "access" : 8, + "descriptor" : "I", + "decoder" : -836653679 + }, { + "field" : "dragItemSlotSource", + "owner" : "client", + "name" : "jp", + "access" : 8, + "descriptor" : "I", + "decoder" : 485534011 + }, { + "field" : "experience", + "owner" : "client", + "name" : "kb", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "followerIndex", + "owner" : "client", + "name" : "ml", + "access" : 8, + "descriptor" : "I", + "decoder" : 1602665191 + }, { + "field" : "followerOpsLowPriority", + "owner" : "client", + "name" : "lw", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "fontBold12", + "owner" : "q", + "name" : "fo", + "access" : 8, + "descriptor" : "Lkk;" + }, { + "field" : "fontNameVerdana11", + "owner" : "lz", + "name" : "x", + "access" : 24, + "descriptor" : "Lkx;" + }, { + "field" : "fontNameVerdana13", + "owner" : "lz", + "name" : "d", + "access" : 24, + "descriptor" : "Lkx;" + }, { + "field" : "fontNameVerdana15", + "owner" : "lz", + "name" : "k", + "access" : 24, + "descriptor" : "Lkx;" + }, { + "field" : "fontPlain11", + "owner" : "by", + "name" : "fv", + "access" : 8, + "descriptor" : "Lkk;" + }, { + "field" : "fontPlain12", + "owner" : "az", + "name" : "fu", + "access" : 8, + "descriptor" : "Lkk;" + }, { + "field" : "fonts", + "owner" : "ic", + "name" : "fs", + "access" : 8, + "descriptor" : "Lkz;" + }, { + "field" : "fontsMap", + "owner" : "client", + "name" : "ft", + "access" : 8, + "descriptor" : "Ljava/util/HashMap;" + }, { + "field" : "fps", + "owner" : "ba", + "name" : "k", + "access" : 12, + "descriptor" : "I", + "decoder" : 1789653893 + }, { + "field" : "friendSystem", + "owner" : "ag", + "name" : "rc", + "access" : 9, + "descriptor" : "Lbh;" + }, { + "field" : "gameBuild", + "owner" : "client", + "name" : "bq", + "access" : 8, + "descriptor" : "I", + "decoder" : 1186004739 + }, { + "field" : "gameDrawingMode", + "owner" : "client", + "name" : "oz", + "access" : 8, + "descriptor" : "I", + "decoder" : -12672775 + }, { + "field" : "gameObjects", + "owner" : "em", + "name" : "ar", + "access" : 8, + "descriptor" : "[Leh;" + }, { + "field" : "gameShell", + "owner" : "ba", + "name" : "f", + "access" : 8, + "descriptor" : "Lba;" + }, { + "field" : "gameState", + "owner" : "client", + "name" : "br", + "access" : 8, + "descriptor" : "I", + "decoder" : 244995961 + }, { + "field" : "garbageCollector", + "owner" : "ir", + "name" : "au", + "access" : 8, + "descriptor" : "Ljava/lang/management/GarbageCollectorMXBean;" + }, { + "field" : "garbageCollectorLastCheckTimeMs", + "owner" : "ba", + "name" : "aa", + "access" : 8, + "descriptor" : "J", + "decoder" : -3607118089363666005 + }, { + "field" : "garbageCollectorLastCollectionTime", + "owner" : "ba", + "name" : "ao", + "access" : 8, + "descriptor" : "J", + "decoder" : 1013162399149344707 + }, { + "field" : "grandExchangeEvents", + "owner" : "do", + "name" : "sm", + "access" : 8, + "descriptor" : "Lg;" + }, { + "field" : "grandExchangeOffers", + "owner" : "client", + "name" : "sb", + "access" : 8, + "descriptor" : "[Lx;" + }, { + "field" : "graphicsObjects", + "owner" : "client", + "name" : "kt", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "groundItems", + "owner" : "client", + "name" : "kz", + "access" : 8, + "descriptor" : "[[[Lje;" + }, { + "field" : "gzipDecompressor", + "owner" : "ir", + "name" : "i", + "access" : 8, + "descriptor" : "Lgo;" + }, { + "field" : "hasFocus", + "owner" : "ba", + "name" : "an", + "access" : 72, + "descriptor" : "Z" + }, { + "field" : "headIconHintSprites", + "owner" : "br", + "name" : "gi", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "headIconPkSprites", + "owner" : "z", + "name" : "gt", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "headIconPrayerSprites", + "owner" : "bf", + "name" : "gr", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "hintArrowHeight", + "owner" : "client", + "name" : "ci", + "access" : 8, + "descriptor" : "I", + "decoder" : -627650567 + }, { + "field" : "hintArrowNpcIndex", + "owner" : "client", + "name" : "cl", + "access" : 8, + "descriptor" : "I", + "decoder" : 1485594821 + }, { + "field" : "hintArrowPlayerIndex", + "owner" : "client", + "name" : "ct", + "access" : 8, + "descriptor" : "I", + "decoder" : -1036874153 + }, { + "field" : "hintArrowSubX", + "owner" : "client", + "name" : "cd", + "access" : 8, + "descriptor" : "I", + "decoder" : 749254081 + }, { + "field" : "hintArrowSubY", + "owner" : "client", + "name" : "cx", + "access" : 8, + "descriptor" : "I", + "decoder" : 1393270633 + }, { + "field" : "hintArrowType", + "owner" : "client", + "name" : "cp", + "access" : 8, + "descriptor" : "I", + "decoder" : -871534943 + }, { + "field" : "hintArrowX", + "owner" : "client", + "name" : "cz", + "access" : 8, + "descriptor" : "I", + "decoder" : -1757834373 + }, { + "field" : "hintArrowY", + "owner" : "client", + "name" : "cc", + "access" : 8, + "descriptor" : "I", + "decoder" : -123748133 + }, { + "field" : "huffman", + "owner" : "ki", + "name" : "m", + "access" : 9, + "descriptor" : "Lgd;" + }, { + "field" : "idx255File", + "owner" : "fs", + "name" : "i", + "access" : 9, + "descriptor" : "Ldy;" + }, { + "field" : "idxCount", + "owner" : "fs", + "name" : "u", + "access" : 9, + "descriptor" : "I", + "decoder" : -2051451755 + }, { + "field" : "idxFiles", + "owner" : "ik", + "name" : "a", + "access" : 9, + "descriptor" : "[Ldy;" + }, { + "field" : "indexCache0", + "owner" : "ir", + "name" : "di", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache1", + "owner" : "ek", + "name" : "dc", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache10", + "owner" : "j", + "name" : "dv", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache11", + "owner" : "cu", + "name" : "do", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache12", + "owner" : "cy", + "name" : "dh", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache13", + "owner" : "gi", + "name" : "dz", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache14", + "owner" : "q", + "name" : "dj", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache15", + "owner" : "as", + "name" : "du", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache16", + "owner" : "c", + "name" : "eb", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache2", + "owner" : "be", + "name" : "dg", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache3", + "owner" : "t", + "name" : "db", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache4", + "owner" : "v", + "name" : "dd", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache5", + "owner" : "cn", + "name" : "dy", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache6", + "owner" : "fq", + "name" : "dk", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache7", + "owner" : "ad", + "name" : "dl", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache8", + "owner" : "p", + "name" : "dr", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCache9", + "owner" : "il", + "name" : "dw", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "indexCacheLoaderIndex", + "owner" : "client", + "name" : "sq", + "access" : 8, + "descriptor" : "I", + "decoder" : -1546210597 + }, { + "field" : "indexCacheLoaders", + "owner" : "client", + "name" : "sy", + "access" : 8, + "descriptor" : "Ljava/util/ArrayList;" + }, { + "field" : "indexStore255", + "owner" : "kz", + "name" : "sc", + "access" : 8, + "descriptor" : "Lff;" + }, { + "field" : "instanceChunkTemplates", + "owner" : "client", + "name" : "gq", + "access" : 8, + "descriptor" : "[[[I" + }, { + "field" : "isCameraLocked", + "owner" : "client", + "name" : "qz", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isDraggingWidget", + "owner" : "client", + "name" : "ny", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isInInstance", + "owner" : "client", + "name" : "gg", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isItemSelected", + "owner" : "client", + "name" : "lz", + "access" : 8, + "descriptor" : "I", + "decoder" : 1630772923 + }, { + "field" : "isKilled", + "owner" : "ba", + "name" : "u", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isLoading", + "owner" : "client", + "name" : "cj", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isLowDetail", + "owner" : "client", + "name" : "bc", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isMembersWorld", + "owner" : "client", + "name" : "bd", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "isMenuOpen", + "owner" : "client", + "name" : "kc", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isResizable", + "owner" : "client", + "name" : "or", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isSpellSelected", + "owner" : "client", + "name" : "lv", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "isStereo", + "owner" : "co", + "name" : "u", + "access" : 12, + "descriptor" : "Z" + }, { + "field" : "itemContainers", + "owner" : "bc", + "name" : "m", + "access" : 8, + "descriptor" : "Lld;" + }, { + "field" : "itemDragDuration", + "owner" : "client", + "name" : "jt", + "access" : 8, + "descriptor" : "I", + "decoder" : 1486366835 + }, { + "field" : "javaVendor", + "owner" : "fz", + "name" : "m", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "javaVersion", + "owner" : "fz", + "name" : "f", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "js5ConnectState", + "owner" : "client", + "name" : "da", + "access" : 8, + "descriptor" : "I", + "decoder" : -1431050759 + }, { + "field" : "js5Errors", + "owner" : "client", + "name" : "ek", + "access" : 8, + "descriptor" : "I", + "decoder" : 1791955261 + }, { + "field" : "js5Socket", + "owner" : "cf", + "name" : "df", + "access" : 8, + "descriptor" : "Lfu;" + }, { + "field" : "js5SocketTask", + "owner" : "hr", + "name" : "dn", + "access" : 8, + "descriptor" : "Lfm;" + }, { + "field" : "js5StartTimeMs", + "owner" : "eh", + "name" : "ds", + "access" : 8, + "descriptor" : "J", + "decoder" : -6104270600047501055 + }, { + "field" : "language", + "owner" : "client", + "name" : "bo", + "access" : 8, + "descriptor" : "I", + "decoder" : 2068355509 + }, { + "field" : "levels", + "owner" : "client", + "name" : "kr", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "loadedWidgetGroups", + "owner" : "ho", + "name" : "l", + "access" : 9, + "descriptor" : "[Z" + }, { + "field" : "localPlayer", + "owner" : "ao", + "name" : "jk", + "access" : 8, + "descriptor" : "Lbr;" + }, { + "field" : "localPlayerIndex", + "owner" : "client", + "name" : "ji", + "access" : 8, + "descriptor" : "I", + "decoder" : -1869532553 + }, { + "field" : "localPlayerName", + "owner" : "fx", + "name" : "f", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "loginState", + "owner" : "client", + "name" : "ed", + "access" : 8, + "descriptor" : "I", + "decoder" : -163579343 + }, { + "field" : "loginType", + "owner" : "an", + "name" : "bk", + "access" : 8, + "descriptor" : "Llx;" + }, { + "field" : "mapDotSprites", + "owner" : "at", + "name" : "gu", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "mapIconCount", + "owner" : "client", + "name" : "pi", + "access" : 8, + "descriptor" : "I", + "decoder" : 864673321 + }, { + "field" : "mapIconXs", + "owner" : "client", + "name" : "ps", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "mapIconYs", + "owner" : "client", + "name" : "pw", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "mapIcons", + "owner" : "client", + "name" : "po", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "mapMarkerSprites", + "owner" : "j", + "name" : "ga", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "mapSceneSprites", + "owner" : "gq", + "name" : "gv", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "menuActions", + "owner" : "client", + "name" : "ld", + "access" : 8, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "menuArguments0", + "owner" : "client", + "name" : "lk", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "menuArguments1", + "owner" : "client", + "name" : "ly", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "menuArguments2", + "owner" : "client", + "name" : "li", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "menuHeight", + "owner" : "ak", + "name" : "ka", + "access" : 8, + "descriptor" : "I", + "decoder" : -1734004743 + }, { + "field" : "menuOpcodes", + "owner" : "client", + "name" : "lh", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "menuOptionsCount", + "owner" : "client", + "name" : "ll", + "access" : 8, + "descriptor" : "I", + "decoder" : -1749538901 + }, { + "field" : "menuShiftClick", + "owner" : "client", + "name" : "lt", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "menuTargetNames", + "owner" : "client", + "name" : "la", + "access" : 8, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "menuWidth", + "owner" : "hf", + "name" : "ko", + "access" : 8, + "descriptor" : "I", + "decoder" : 2079315667 + }, { + "field" : "menuX", + "owner" : "v", + "name" : "kw", + "access" : 8, + "descriptor" : "I", + "decoder" : -12041645 + }, { + "field" : "menuY", + "owner" : "ba", + "name" : "kl", + "access" : 8, + "descriptor" : "I", + "decoder" : 1875936371 + }, { + "field" : "midiPcmStream", + "owner" : "hf", + "name" : "w", + "access" : 9, + "descriptor" : "Lhm;" + }, { + "field" : "minimapOrientation", + "owner" : "client", + "name" : "hp", + "access" : 8, + "descriptor" : "I", + "decoder" : -1163038981 + }, { + "field" : "minimapState", + "owner" : "client", + "name" : "qm", + "access" : 8, + "descriptor" : "I", + "decoder" : -137788125 + }, { + "field" : "modIconSprites", + "owner" : "h", + "name" : "gc", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "modelViewportXs", + "owner" : "du", + "name" : "ap", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "modelViewportYs", + "owner" : "du", + "name" : "as", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "mouseCrossColor", + "owner" : "client", + "name" : "jm", + "access" : 8, + "descriptor" : "I", + "decoder" : 233318639 + }, { + "field" : "mouseCrossState", + "owner" : "client", + "name" : "jw", + "access" : 8, + "descriptor" : "I", + "decoder" : -1302827103 + }, { + "field" : "mouseCrossX", + "owner" : "client", + "name" : "jb", + "access" : 8, + "descriptor" : "I", + "decoder" : 202604997 + }, { + "field" : "mouseCrossY", + "owner" : "client", + "name" : "jq", + "access" : 8, + "descriptor" : "I", + "decoder" : -1984048653 + }, { + "field" : "mouseLastLastPressedTimeMillis", + "owner" : "client", + "name" : "cb", + "access" : 8, + "descriptor" : "J", + "decoder" : -8445874050676184263 + }, { + "field" : "mouseRecorder", + "owner" : "cb", + "name" : "ck", + "access" : 8, + "descriptor" : "Lbu;" + }, { + "field" : "mouseWheel", + "owner" : "j", + "name" : "ol", + "access" : 8, + "descriptor" : "Lfv;" + }, { + "field" : "mouseWheelRotation", + "owner" : "client", + "name" : "oe", + "access" : 8, + "descriptor" : "I", + "decoder" : -1628183831 + }, { + "field" : "mousedOverWidgetIf1", + "owner" : "fa", + "name" : "lu", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "musicTrack", + "owner" : "i", + "name" : "k", + "access" : 9, + "descriptor" : "Lhe;" + }, { + "field" : "musicTrackArchiveId", + "owner" : "ar", + "name" : "g", + "access" : 9, + "descriptor" : "I", + "decoder" : -18917723 + }, { + "field" : "musicTrackBoolean", + "owner" : "lj", + "name" : "d", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "musicTrackFileId", + "owner" : "x", + "name" : "l", + "access" : 9, + "descriptor" : "I", + "decoder" : -812708185 + }, { + "field" : "npcAttackOption", + "owner" : "client", + "name" : "de", + "access" : 8, + "descriptor" : "Lcj;" + }, { + "field" : "npcCount", + "owner" : "client", + "name" : "ep", + "access" : 8, + "descriptor" : "I", + "decoder" : -1569269731 + }, { + "field" : "npcIndices", + "owner" : "client", + "name" : "fq", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "npcs", + "owner" : "client", + "name" : "ez", + "access" : 8, + "descriptor" : "[Lcv;" + }, { + "field" : "objectSounds", + "owner" : "be", + "name" : "m", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "osName", + "owner" : "ju", + "name" : "b", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "osNameLowerCase", + "owner" : "p", + "name" : "h", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "overheadText", + "owner" : "client", + "name" : "ih", + "access" : 8, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "overheadTextAscents", + "owner" : "client", + "name" : "ip", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "overheadTextColors", + "owner" : "client", + "name" : "ic", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "overheadTextCount", + "owner" : "client", + "name" : "ir", + "access" : 8, + "descriptor" : "I", + "decoder" : 616180377 + }, { + "field" : "overheadTextCyclesRemaining", + "owner" : "client", + "name" : "io", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "overheadTextEffects", + "owner" : "client", + "name" : "iw", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "overheadTextLimit", + "owner" : "client", + "name" : "iv", + "access" : 8, + "descriptor" : "I", + "decoder" : 1889277277 + }, { + "field" : "overheadTextXOffsets", + "owner" : "client", + "name" : "ib", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "overheadTextXs", + "owner" : "client", + "name" : "iq", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "overheadTextYs", + "owner" : "client", + "name" : "iu", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "packetBufferNodes", + "owner" : "gg", + "name" : "o", + "access" : 9, + "descriptor" : "[Lgg;" + }, { + "field" : "packetWriter", + "owner" : "client", + "name" : "fj", + "access" : 25, + "descriptor" : "Lcl;" + }, { + "field" : "pcmPlayer0", + "owner" : "aw", + "name" : "qu", + "access" : 8, + "descriptor" : "Lco;" + }, { + "field" : "pcmPlayer1", + "owner" : "ir", + "name" : "qb", + "access" : 8, + "descriptor" : "Lco;" + }, { + "field" : "pcmPlayerCount", + "owner" : "cu", + "name" : "e", + "access" : 8, + "descriptor" : "I", + "decoder" : -184301597 + }, { + "field" : "pcmPlayerProvider", + "owner" : "bl", + "name" : "n", + "access" : 9, + "descriptor" : "Lcz;" + }, { + "field" : "pcmStreamMixer", + "owner" : "fz", + "name" : "qr", + "access" : 8, + "descriptor" : "Lct;" + }, { + "field" : "plane", + "owner" : "dx", + "name" : "jg", + "access" : 8, + "descriptor" : "I", + "decoder" : -631434243 + }, { + "field" : "platformInfo", + "owner" : "s", + "name" : "st", + "access" : 8, + "descriptor" : "Llb;" + }, { + "field" : "platformInfoProvider", + "owner" : "client", + "name" : "sk", + "access" : 8, + "descriptor" : "Llm;" + }, { + "field" : "playerAttackOption", + "owner" : "client", + "name" : "co", + "access" : 8, + "descriptor" : "Lcj;" + }, { + "field" : "playerMenuActions", + "owner" : "client", + "name" : "kq", + "access" : 8, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "playerMenuOpcodes", + "owner" : "client", + "name" : "kp", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "players", + "owner" : "client", + "name" : "jd", + "access" : 8, + "descriptor" : "[Lbr;" + }, { + "field" : "port1", + "owner" : "q", + "name" : "ee", + "access" : 8, + "descriptor" : "I", + "decoder" : -753026759 + }, { + "field" : "port2", + "owner" : "ag", + "name" : "eq", + "access" : 8, + "descriptor" : "I", + "decoder" : -256520591 + }, { + "field" : "port3", + "owner" : "ga", + "name" : "eh", + "access" : 8, + "descriptor" : "I", + "decoder" : 994298267 + }, { + "field" : "projectiles", + "owner" : "client", + "name" : "kk", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "publicChatMode", + "owner" : "client", + "name" : "pt", + "access" : 8, + "descriptor" : "I", + "decoder" : -1802494233 + }, { + "field" : "randomDat", + "owner" : "fs", + "name" : "k", + "access" : 9, + "descriptor" : "Ldy;" + }, { + "field" : "rasterProvider", + "owner" : "gz", + "name" : "ad", + "access" : 9, + "descriptor" : "Llp;" + }, { + "field" : "rebootTimer", + "owner" : "client", + "name" : "cf", + "access" : 8, + "descriptor" : "I", + "decoder" : -1792536059 + }, { + "field" : "reflectionChecks", + "owner" : "le", + "name" : "m", + "access" : 9, + "descriptor" : "Lja;" + }, { + "field" : "regionLandArchiveIds", + "owner" : "bb", + "name" : "gb", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "regionLandArchives", + "owner" : "ad", + "name" : "gs", + "access" : 8, + "descriptor" : "[[B" + }, { + "field" : "regionMapArchiveIds", + "owner" : "bd", + "name" : "gw", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "regionMapArchives", + "owner" : "bg", + "name" : "gl", + "access" : 8, + "descriptor" : "[[B" + }, { + "field" : "regions", + "owner" : "kw", + "name" : "gn", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "renderSelf", + "owner" : "client", + "name" : "js", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "revision", + "owner" : "fx", + "name" : "q", + "access" : 9, + "descriptor" : "I", + "decoder" : -787495321 + }, { + "field" : "rights", + "owner" : "client", + "name" : "mw", + "access" : 8, + "descriptor" : "I", + "decoder" : 821563709 + }, { + "field" : "rootWidgetCount", + "owner" : "client", + "name" : "os", + "access" : 8, + "descriptor" : "I", + "decoder" : -546798303 + }, { + "field" : "rootWidgetGroup", + "owner" : "client", + "name" : "mm", + "access" : 8, + "descriptor" : "I", + "decoder" : -783816509 + }, { + "field" : "rootWidgetHeights", + "owner" : "client", + "name" : "ox", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "rootWidgetWidths", + "owner" : "client", + "name" : "oj", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "rootWidgetXs", + "owner" : "client", + "name" : "oy", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "rootWidgetYs", + "owner" : "client", + "name" : "oi", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "runEnergy", + "owner" : "client", + "name" : "mi", + "access" : 8, + "descriptor" : "I", + "decoder" : 933910819 + }, { + "field" : "scene", + "owner" : "bl", + "name" : "gf", + "access" : 8, + "descriptor" : "Lem;" + }, { + "field" : "sceneMinimapSprite", + "owner" : "bx", + "name" : "px", + "access" : 8, + "descriptor" : "Lln;" + }, { + "field" : "scriptEvents", + "owner" : "client", + "name" : "og", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "scrollBarSprites", + "owner" : "ay", + "name" : "gj", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "secureRandom", + "owner" : "t", + "name" : "ec", + "access" : 8, + "descriptor" : "Ljava/security/SecureRandom;" + }, { + "field" : "secureRandomFuture", + "owner" : "client", + "name" : "eu", + "access" : 8, + "descriptor" : "Lcn;" + }, { + "field" : "selectedItemId", + "owner" : "cs", + "name" : "iz", + "access" : 8, + "descriptor" : "I", + "decoder" : -2062450631 + }, { + "field" : "selectedItemName", + "owner" : "client", + "name" : "it", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "selectedItemSlot", + "owner" : "ii", + "name" : "lx", + "access" : 8, + "descriptor" : "I", + "decoder" : 1912123225 + }, { + "field" : "selectedItemWidget", + "owner" : "ge", + "name" : "ix", + "access" : 8, + "descriptor" : "I", + "decoder" : -1645409107 + }, { + "field" : "selectedSpellActionName", + "owner" : "client", + "name" : "mk", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "selectedSpellFlags", + "owner" : "do", + "name" : "my", + "access" : 8, + "descriptor" : "I", + "decoder" : -1344682613 + }, { + "field" : "selectedSpellName", + "owner" : "client", + "name" : "mu", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "serverBuild", + "owner" : "z", + "name" : "bs", + "access" : 8, + "descriptor" : "Liy;" + }, { + "field" : "shiftClickDrop", + "owner" : "client", + "name" : "lf", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "showLoadingMessages", + "owner" : "client", + "name" : "jj", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "showMouseCross", + "owner" : "client", + "name" : "jr", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "showMouseOverText", + "owner" : "client", + "name" : "lj", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "socketTask", + "owner" : "fq", + "name" : "fl", + "access" : 8, + "descriptor" : "Lfm;" + }, { + "field" : "soundCache", + "owner" : "kc", + "name" : "n", + "access" : 9, + "descriptor" : "Ldt;" + }, { + "field" : "soundEffectCount", + "owner" : "client", + "name" : "qa", + "access" : 8, + "descriptor" : "I", + "decoder" : -1481002083 + }, { + "field" : "soundEffectIds", + "owner" : "client", + "name" : "qv", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "soundEffects", + "owner" : "client", + "name" : "qe", + "access" : 8, + "descriptor" : "[Lci;" + }, { + "field" : "soundSystem", + "owner" : "cw", + "name" : "x", + "access" : 8, + "descriptor" : "Ldx;" + }, { + "field" : "soundSystemExecutor", + "owner" : "kq", + "name" : "l", + "access" : 8, + "descriptor" : "Ljava/util/concurrent/ScheduledExecutorService;" + }, { + "field" : "spriteIds", + "owner" : "hg", + "name" : "em", + "access" : 8, + "descriptor" : "Llg;" + }, { + "field" : "studioGame", + "owner" : "c", + "name" : "bn", + "access" : 8, + "descriptor" : "Lis;" + }, { + "field" : "tapToDrop", + "owner" : "client", + "name" : "lp", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "taskHandler", + "owner" : "ba", + "name" : "m", + "access" : 12, + "descriptor" : "Lfz;" + }, { + "field" : "tempMenuAction", + "owner" : "d", + "name" : "lr", + "access" : 8, + "descriptor" : "Lcs;" + }, { + "field" : "textureProvider", + "owner" : "cn", + "name" : "jn", + "access" : 8, + "descriptor" : "Ldl;" + }, { + "field" : "tileLastDrawnActor", + "owner" : "client", + "name" : "im", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "timer", + "owner" : "client", + "name" : "fm", + "access" : 8, + "descriptor" : "Ljo;" + }, { + "field" : "titleLoadingStage", + "owner" : "client", + "name" : "dt", + "access" : 8, + "descriptor" : "I", + "decoder" : -1520594673 + }, { + "field" : "urlRequester", + "owner" : "kd", + "name" : "fz", + "access" : 8, + "descriptor" : "Leo;" + }, { + "field" : "useBufferedSocket", + "owner" : "client", + "name" : "fx", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "userHomeDirectory", + "owner" : "as", + "name" : "c", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "varcs", + "owner" : "gy", + "name" : "of", + "access" : 8, + "descriptor" : "Lch;" + }, { + "field" : "viewportDrawCount", + "owner" : "client", + "name" : "ii", + "access" : 8, + "descriptor" : "I", + "decoder" : 289477221 + }, { + "field" : "viewportHeight", + "owner" : "client", + "name" : "rx", + "access" : 8, + "descriptor" : "I", + "decoder" : -629885193 + }, { + "field" : "viewportOffsetX", + "owner" : "client", + "name" : "rr", + "access" : 8, + "descriptor" : "I", + "decoder" : 386331251 + }, { + "field" : "viewportOffsetY", + "owner" : "client", + "name" : "rn", + "access" : 8, + "descriptor" : "I", + "decoder" : 992721193 + }, { + "field" : "viewportTempX", + "owner" : "client", + "name" : "ig", + "access" : 8, + "descriptor" : "I", + "decoder" : 424442889 + }, { + "field" : "viewportTempY", + "owner" : "client", + "name" : "ia", + "access" : 8, + "descriptor" : "I", + "decoder" : -81902865 + }, { + "field" : "viewportWidget", + "owner" : "client", + "name" : "mx", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "viewportWidth", + "owner" : "client", + "name" : "ry", + "access" : 8, + "descriptor" : "I", + "decoder" : 2035623995 + }, { + "field" : "viewportZoom", + "owner" : "client", + "name" : "rz", + "access" : 8, + "descriptor" : "I", + "decoder" : 541065633 + }, { + "field" : "visibilityMap", + "owner" : "em", + "name" : "bc", + "access" : 8, + "descriptor" : "[[[[Z" + }, { + "field" : "visibleTiles", + "owner" : "em", + "name" : "bo", + "access" : 8, + "descriptor" : "[[Z" + }, { + "field" : "weight", + "owner" : "client", + "name" : "mv", + "access" : 8, + "descriptor" : "I", + "decoder" : 36001423 + }, { + "field" : "widgetClickMasks", + "owner" : "client", + "name" : "on", + "access" : 8, + "descriptor" : "Lld;" + }, { + "field" : "widgetClickX", + "owner" : "client", + "name" : "mt", + "access" : 8, + "descriptor" : "I", + "decoder" : -1972775883 + }, { + "field" : "widgetClickY", + "owner" : "client", + "name" : "me", + "access" : 8, + "descriptor" : "I", + "decoder" : 1052276727 + }, { + "field" : "widgetDragDuration", + "owner" : "bu", + "name" : "no", + "access" : 8, + "descriptor" : "I", + "decoder" : 2059180753 + }, { + "field" : "widgetGroupParents", + "owner" : "client", + "name" : "mj", + "access" : 8, + "descriptor" : "Lld;" + }, { + "field" : "widgets", + "owner" : "ho", + "name" : "g", + "access" : 9, + "descriptor" : "[[Lho;" + }, { + "field" : "worldHost", + "owner" : "af", + "name" : "ei", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "worldId", + "owner" : "client", + "name" : "ba", + "access" : 9, + "descriptor" : "I", + "decoder" : 1412639841 + }, { + "field" : "worldMap0", + "owner" : "bo", + "name" : "sz", + "access" : 8, + "descriptor" : "Llz;" + }, { + "field" : "worldMapEvent", + "owner" : "z", + "name" : "j", + "access" : 8, + "descriptor" : "Lap;" + }, { + "field" : "worldProperties", + "owner" : "client", + "name" : "bb", + "access" : 8, + "descriptor" : "I", + "decoder" : 352819683 + }, { + "field" : "worlds", + "owner" : "bc", + "name" : "o", + "access" : 8, + "descriptor" : "[Lbt;" + }, { + "field" : "worldsCount", + "owner" : "bt", + "name" : "u", + "access" : 8, + "descriptor" : "I", + "decoder" : 233222155 + }, { + "field" : "worldsUrl", + "owner" : "iy", + "name" : "bx", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "xteaKeys", + "owner" : "gf", + "name" : "ge", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "__f_m", + "owner" : "f", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__w_qs", + "owner" : "w", + "name" : "qs", + "access" : 8, + "descriptor" : "I", + "decoder" : 1608439891 + }, { + "field" : "__o_m", + "owner" : "o", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__u_n", + "owner" : "u", + "name" : "n", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "__g_f", + "owner" : "g", + "name" : "f", + "access" : 9, + "descriptor" : "Ljava/util/Comparator;" + }, { + "field" : "__g_o", + "owner" : "g", + "name" : "o", + "access" : 9, + "descriptor" : "Ljava/util/Comparator;" + }, { + "field" : "__g_q", + "owner" : "g", + "name" : "q", + "access" : 9, + "descriptor" : "Ljava/util/Comparator;" + }, { + "field" : "__g_w", + "owner" : "g", + "name" : "w", + "access" : 9, + "descriptor" : "Ljava/util/Comparator;" + }, { + "field" : "__g_z", + "owner" : "g", + "name" : "z", + "access" : 8, + "descriptor" : "I", + "decoder" : -1605454211 + }, { + "field" : "__x_rg", + "owner" : "x", + "name" : "rg", + "access" : 8, + "descriptor" : "I", + "decoder" : -1286287981 + }, { + "field" : "__d_gz", + "owner" : "d", + "name" : "gz", + "access" : 8, + "descriptor" : "Lln;" + }, { + "field" : "__n_n", + "owner" : "n", + "name" : "n", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "__i_af", + "owner" : "i", + "name" : "af", + "access" : 8, + "descriptor" : "I", + "decoder" : -1810047523 + }, { + "field" : "__i_x", + "owner" : "i", + "name" : "x", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__z_si", + "owner" : "z", + "name" : "si", + "access" : 8, + "descriptor" : "J", + "decoder" : 3423502126894795079 + }, { + "field" : "__s_fi", + "owner" : "s", + "name" : "fi", + "access" : 8, + "descriptor" : "I", + "decoder" : 1577759565 + }, { + "field" : "__s_dq", + "owner" : "s", + "name" : "dq", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "__t_i", + "owner" : "t", + "name" : "i", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "__y_sn", + "owner" : "y", + "name" : "sn", + "access" : 8, + "descriptor" : "I", + "decoder" : -1946112139 + }, { + "field" : "__y_p", + "owner" : "y", + "name" : "p", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__h_n", + "owner" : "h", + "name" : "n", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__h_e", + "owner" : "h", + "name" : "e", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__h_f", + "owner" : "h", + "name" : "f", + "access" : 24, + "descriptor" : "Lh;" + }, { + "field" : "__h_m", + "owner" : "h", + "name" : "m", + "access" : 24, + "descriptor" : "Lh;" + }, { + "field" : "__h_q", + "owner" : "h", + "name" : "q", + "access" : 24, + "descriptor" : "Lh;" + }, { + "field" : "__h_w", + "owner" : "h", + "name" : "w", + "access" : 24, + "descriptor" : "Lh;" + }, { + "field" : "__b_by", + "owner" : "b", + "name" : "by", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__p_go", + "owner" : "p", + "name" : "go", + "access" : 8, + "descriptor" : "I", + "decoder" : -948290091 + }, { + "field" : "__aq_k", + "owner" : "aq", + "name" : "k", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__aj_e", + "owner" : "aj", + "name" : "e", + "access" : 9, + "descriptor" : "I", + "decoder" : -1536028937 + }, { + "field" : "__av_o", + "owner" : "av", + "name" : "o", + "access" : 9, + "descriptor" : "Lec;" + }, { + "field" : "__ar_l", + "owner" : "ar", + "name" : "l", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "__ar_qw", + "owner" : "ar", + "name" : "qw", + "access" : 8, + "descriptor" : "I", + "decoder" : -1555836449 + }, { + "field" : "__ar_bd", + "owner" : "ar", + "name" : "bd", + "access" : 8, + "descriptor" : "[Lln;" + }, { + "field" : "__ay_u", + "owner" : "ay", + "name" : "u", + "access" : 8, + "descriptor" : "[[[B" + }, { + "field" : "__ah_l", + "owner" : "ah", + "name" : "l", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__ak_qj", + "owner" : "ak", + "name" : "qj", + "access" : 8, + "descriptor" : "I", + "decoder" : -1942470229 + }, { + "field" : "__ap_w", + "owner" : "ap", + "name" : "w", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "__as_ey", + "owner" : "as", + "name" : "ey", + "access" : 8, + "descriptor" : "I", + "decoder" : -1516124929 + }, { + "field" : "__an_cl", + "owner" : "an", + "name" : "cl", + "access" : 9, + "descriptor" : "I", + "decoder" : -674534717 + }, { + "field" : "__an_cp", + "owner" : "an", + "name" : "cp", + "access" : 9, + "descriptor" : "[I" + }, { + "field" : "__an_cg", + "owner" : "an", + "name" : "cg", + "access" : 8, + "descriptor" : "[C" + }, { + "field" : "__an_cc", + "owner" : "an", + "name" : "cc", + "access" : 8, + "descriptor" : "I", + "decoder" : -1942898885 + }, { + "field" : "__an_ch", + "owner" : "an", + "name" : "ch", + "access" : 8, + "descriptor" : "I", + "decoder" : 1112094745 + }, { + "field" : "__an_ct", + "owner" : "an", + "name" : "ct", + "access" : 8, + "descriptor" : "I", + "decoder" : -93280591 + }, { + "field" : "__an_cw", + "owner" : "an", + "name" : "cw", + "access" : 8, + "descriptor" : "I", + "decoder" : -1208053825 + }, { + "field" : "__an_cz", + "owner" : "an", + "name" : "cz", + "access" : 8, + "descriptor" : "I", + "decoder" : 2066759739 + }, { + "field" : "__an_ra", + "owner" : "an", + "name" : "ra", + "access" : 8, + "descriptor" : "I", + "decoder" : -817957995 + }, { + "field" : "__an_cf", + "owner" : "an", + "name" : "cf", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__an_cq", + "owner" : "an", + "name" : "cq", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__an_i", + "owner" : "an", + "name" : "i", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__an_x", + "owner" : "an", + "name" : "x", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "__ao_s", + "owner" : "ao", + "name" : "s", + "access" : 9, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "__ao_gk", + "owner" : "ao", + "name" : "gk", + "access" : 8, + "descriptor" : "I", + "decoder" : -1131782991 + }, { + "field" : "__af_m", + "owner" : "af", + "name" : "m", + "access" : 9, + "descriptor" : "Ljava/applet/Applet;" + }, { + "field" : "__af_f", + "owner" : "af", + "name" : "f", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__ba_aw", + "owner" : "ba", + "name" : "aw", + "access" : 8, + "descriptor" : "I", + "decoder" : -1042005999 + }, { + "field" : "__ba_d", + "owner" : "ba", + "name" : "d", + "access" : 8, + "descriptor" : "I", + "decoder" : 425367827 + }, { + "field" : "__ba_e", + "owner" : "ba", + "name" : "e", + "access" : 8, + "descriptor" : "I", + "decoder" : -1698831905 + }, { + "field" : "__ba_l", + "owner" : "ba", + "name" : "l", + "access" : 8, + "descriptor" : "I", + "decoder" : -1179083285 + }, { + "field" : "__ba_q", + "owner" : "ba", + "name" : "q", + "access" : 8, + "descriptor" : "I", + "decoder" : -281664295 + }, { + "field" : "__ba_s", + "owner" : "ba", + "name" : "s", + "access" : 8, + "descriptor" : "I", + "decoder" : -2078849253 + }, { + "field" : "__ba_a", + "owner" : "ba", + "name" : "a", + "access" : 8, + "descriptor" : "[J" + }, { + "field" : "__ba_j", + "owner" : "ba", + "name" : "j", + "access" : 8, + "descriptor" : "[J" + }, { + "field" : "__bb_hz", + "owner" : "bb", + "name" : "hz", + "access" : 8, + "descriptor" : "I", + "decoder" : -215744973 + }, { + "field" : "__bs_nb", + "owner" : "bs", + "name" : "nb", + "access" : 8, + "descriptor" : "I", + "decoder" : -1247107945 + }, { + "field" : "__bq_l", + "owner" : "bq", + "name" : "l", + "access" : 8, + "descriptor" : "[[[B" + }, { + "field" : "__bq_w", + "owner" : "bq", + "name" : "w", + "access" : 8, + "descriptor" : "[[[B" + }, { + "field" : "__bq_p", + "owner" : "bq", + "name" : "p", + "access" : 8, + "descriptor" : "I", + "decoder" : -2142579405 + }, { + "field" : "__bq_v", + "owner" : "bq", + "name" : "v", + "access" : 8, + "descriptor" : "I", + "decoder" : 834543729 + }, { + "field" : "__bq_a", + "owner" : "bq", + "name" : "a", + "access" : 8, + "descriptor" : "[[[I" + }, { + "field" : "__bq_b", + "owner" : "bq", + "name" : "b", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__bq_c", + "owner" : "bq", + "name" : "c", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__bq_h", + "owner" : "bq", + "name" : "h", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__bq_r", + "owner" : "bq", + "name" : "r", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__bq_t", + "owner" : "bq", + "name" : "t", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__bq_y", + "owner" : "bq", + "name" : "y", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__bk_g", + "owner" : "bk", + "name" : "g", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__bd_x", + "owner" : "bd", + "name" : "x", + "access" : 9, + "descriptor" : "[[S" + }, { + "field" : "__bd_er", + "owner" : "bd", + "name" : "er", + "access" : 8, + "descriptor" : "I", + "decoder" : 636454135 + }, { + "field" : "__bd_u", + "owner" : "bd", + "name" : "u", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__bc_dm", + "owner" : "bc", + "name" : "dm", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "__bo_ar", + "owner" : "bo", + "name" : "ar", + "access" : 8, + "descriptor" : "Ljava/awt/FontMetrics;" + }, { + "field" : "__bx_o", + "owner" : "bx", + "name" : "o", + "access" : 8, + "descriptor" : "I", + "decoder" : -992379173 + }, { + "field" : "__by_hb", + "owner" : "by", + "name" : "hb", + "access" : 8, + "descriptor" : "I", + "decoder" : -1218466245 + }, { + "field" : "__bu_hy", + "owner" : "bu", + "name" : "hy", + "access" : 8, + "descriptor" : "I", + "decoder" : 1075569245 + }, { + "field" : "__bm_i", + "owner" : "bm", + "name" : "i", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_il", + "owner" : "client", + "name" : "il", + "access" : 9, + "descriptor" : "I", + "decoder" : -1063713523 + }, { + "field" : "__client_ss", + "owner" : "client", + "name" : "ss", + "access" : 9, + "descriptor" : "I", + "decoder" : -451622431 + }, { + "field" : "__client_sj", + "owner" : "client", + "name" : "sj", + "access" : 8, + "descriptor" : "Lbj;" + }, { + "field" : "__client_ai", + "owner" : "client", + "name" : "ai", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_bl", + "owner" : "client", + "name" : "bl", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_cw", + "owner" : "client", + "name" : "cw", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_fh", + "owner" : "client", + "name" : "fh", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_hh", + "owner" : "client", + "name" : "hh", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_ij", + "owner" : "client", + "name" : "ij", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_is", + "owner" : "client", + "name" : "is", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_jl", + "owner" : "client", + "name" : "jl", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_mn", + "owner" : "client", + "name" : "mn", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_nn", + "owner" : "client", + "name" : "nn", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_nt", + "owner" : "client", + "name" : "nt", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_qq", + "owner" : "client", + "name" : "qq", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__client_kv", + "owner" : "client", + "name" : "kv", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__client_od", + "owner" : "client", + "name" : "od", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__client_oq", + "owner" : "client", + "name" : "oq", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__client_ot", + "owner" : "client", + "name" : "ot", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__client_rh", + "owner" : "client", + "name" : "rh", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__client_ev", + "owner" : "client", + "name" : "ev", + "access" : 8, + "descriptor" : "[B" + }, { + "field" : "__client_ru", + "owner" : "client", + "name" : "ru", + "access" : 8, + "descriptor" : "Lhi;" + }, { + "field" : "__client_md", + "owner" : "client", + "name" : "md", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "__client_mo", + "owner" : "client", + "name" : "mo", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "__client_cn", + "owner" : "client", + "name" : "cn", + "access" : 8, + "descriptor" : "I", + "decoder" : -1731573291 + }, { + "field" : "__client_cq", + "owner" : "client", + "name" : "cq", + "access" : 8, + "descriptor" : "I", + "decoder" : -1313705721 + }, { + "field" : "__client_dp", + "owner" : "client", + "name" : "dp", + "access" : 8, + "descriptor" : "I", + "decoder" : 1154760205 + }, { + "field" : "__client_ej", + "owner" : "client", + "name" : "ej", + "access" : 8, + "descriptor" : "I", + "decoder" : -964416527 + }, { + "field" : "__client_el", + "owner" : "client", + "name" : "el", + "access" : 8, + "descriptor" : "I", + "decoder" : 689094231 + }, { + "field" : "__client_eo", + "owner" : "client", + "name" : "eo", + "access" : 8, + "descriptor" : "I", + "decoder" : -447055355 + }, { + "field" : "__client_ex", + "owner" : "client", + "name" : "ex", + "access" : 8, + "descriptor" : "I", + "decoder" : 755300107 + }, { + "field" : "__client_fd", + "owner" : "client", + "name" : "fd", + "access" : 8, + "descriptor" : "I", + "decoder" : -1050480853 + }, { + "field" : "__client_fe", + "owner" : "client", + "name" : "fe", + "access" : 8, + "descriptor" : "I", + "decoder" : 829228151 + }, { + "field" : "__client_fk", + "owner" : "client", + "name" : "fk", + "access" : 8, + "descriptor" : "I", + "decoder" : 8470625 + }, { + "field" : "__client_fn", + "owner" : "client", + "name" : "fn", + "access" : 8, + "descriptor" : "I", + "decoder" : -597100741 + }, { + "field" : "__client_fw", + "owner" : "client", + "name" : "fw", + "access" : 8, + "descriptor" : "I", + "decoder" : 516059665 + }, { + "field" : "__client_gh", + "owner" : "client", + "name" : "gh", + "access" : 8, + "descriptor" : "I", + "decoder" : -1456975367 + }, { + "field" : "__client_gp", + "owner" : "client", + "name" : "gp", + "access" : 8, + "descriptor" : "I", + "decoder" : 685418907 + }, { + "field" : "__client_gy", + "owner" : "client", + "name" : "gy", + "access" : 8, + "descriptor" : "I", + "decoder" : -134014371 + }, { + "field" : "__client_hc", + "owner" : "client", + "name" : "hc", + "access" : 8, + "descriptor" : "I", + "decoder" : -441913785 + }, { + "field" : "__client_hd", + "owner" : "client", + "name" : "hd", + "access" : 8, + "descriptor" : "I", + "decoder" : 438998245 + }, { + "field" : "__client_hg", + "owner" : "client", + "name" : "hg", + "access" : 8, + "descriptor" : "I", + "decoder" : 1658018867 + }, { + "field" : "__client_hi", + "owner" : "client", + "name" : "hi", + "access" : 8, + "descriptor" : "I", + "decoder" : 402871301 + }, { + "field" : "__client_hj", + "owner" : "client", + "name" : "hj", + "access" : 8, + "descriptor" : "I", + "decoder" : -1420078475 + }, { + "field" : "__client_hk", + "owner" : "client", + "name" : "hk", + "access" : 8, + "descriptor" : "I", + "decoder" : -1149138989 + }, { + "field" : "__client_hn", + "owner" : "client", + "name" : "hn", + "access" : 8, + "descriptor" : "I", + "decoder" : -516933613 + }, { + "field" : "__client_ho", + "owner" : "client", + "name" : "ho", + "access" : 8, + "descriptor" : "I", + "decoder" : 1005832199 + }, { + "field" : "__client_hr", + "owner" : "client", + "name" : "hr", + "access" : 8, + "descriptor" : "I", + "decoder" : 1664350313 + }, { + "field" : "__client_ht", + "owner" : "client", + "name" : "ht", + "access" : 8, + "descriptor" : "I", + "decoder" : 1502058429 + }, { + "field" : "__client_hu", + "owner" : "client", + "name" : "hu", + "access" : 8, + "descriptor" : "I", + "decoder" : -480633777 + }, { + "field" : "__client_hv", + "owner" : "client", + "name" : "hv", + "access" : 8, + "descriptor" : "I", + "decoder" : 218086227 + }, { + "field" : "__client_hw", + "owner" : "client", + "name" : "hw", + "access" : 8, + "descriptor" : "I", + "decoder" : 410614005 + }, { + "field" : "__client_hx", + "owner" : "client", + "name" : "hx", + "access" : 8, + "descriptor" : "I", + "decoder" : -1406125895 + }, { + "field" : "__client_ie", + "owner" : "client", + "name" : "ie", + "access" : 8, + "descriptor" : "I", + "decoder" : 236939601 + }, { + "field" : "__client_if", + "owner" : "client", + "name" : "if", + "access" : 8, + "descriptor" : "I", + "decoder" : -952172003 + }, { + "field" : "__client_ik", + "owner" : "client", + "name" : "ik", + "access" : 8, + "descriptor" : "I", + "decoder" : 910983131 + }, { + "field" : "__client_in", + "owner" : "client", + "name" : "in", + "access" : 8, + "descriptor" : "I", + "decoder" : 351193663 + }, { + "field" : "__client_iy", + "owner" : "client", + "name" : "iy", + "access" : 8, + "descriptor" : "I", + "decoder" : -1213062413 + }, { + "field" : "__client_ja", + "owner" : "client", + "name" : "ja", + "access" : 8, + "descriptor" : "I", + "decoder" : 813973829 + }, { + "field" : "__client_jc", + "owner" : "client", + "name" : "jc", + "access" : 8, + "descriptor" : "I", + "decoder" : 1084498299 + }, { + "field" : "__client_je", + "owner" : "client", + "name" : "je", + "access" : 8, + "descriptor" : "I", + "decoder" : 1959822241 + }, { + "field" : "__client_jo", + "owner" : "client", + "name" : "jo", + "access" : 8, + "descriptor" : "I", + "decoder" : -836962805 + }, { + "field" : "__client_ju", + "owner" : "client", + "name" : "ju", + "access" : 8, + "descriptor" : "I", + "decoder" : 1691923909 + }, { + "field" : "__client_jz", + "owner" : "client", + "name" : "jz", + "access" : 8, + "descriptor" : "I", + "decoder" : -1267243587 + }, { + "field" : "__client_ke", + "owner" : "client", + "name" : "ke", + "access" : 8, + "descriptor" : "I", + "decoder" : -1208823721 + }, { + "field" : "__client_ku", + "owner" : "client", + "name" : "ku", + "access" : 8, + "descriptor" : "I", + "decoder" : -898263359 + }, { + "field" : "__client_ky", + "owner" : "client", + "name" : "ky", + "access" : 8, + "descriptor" : "I", + "decoder" : -64320473 + }, { + "field" : "__client_lb", + "owner" : "client", + "name" : "lb", + "access" : 8, + "descriptor" : "I", + "decoder" : 699084605 + }, { + "field" : "__client_lc", + "owner" : "client", + "name" : "lc", + "access" : 8, + "descriptor" : "I", + "decoder" : 196309625 + }, { + "field" : "__client_ln", + "owner" : "client", + "name" : "ln", + "access" : 8, + "descriptor" : "I", + "decoder" : 885052255 + }, { + "field" : "__client_lq", + "owner" : "client", + "name" : "lq", + "access" : 8, + "descriptor" : "I", + "decoder" : 26099827 + }, { + "field" : "__client_ls", + "owner" : "client", + "name" : "ls", + "access" : 8, + "descriptor" : "I", + "decoder" : -274968037 + }, { + "field" : "__client_mb", + "owner" : "client", + "name" : "mb", + "access" : 8, + "descriptor" : "I", + "decoder" : 1694810089 + }, { + "field" : "__client_mf", + "owner" : "client", + "name" : "mf", + "access" : 8, + "descriptor" : "I", + "decoder" : -1715020411 + }, { + "field" : "__client_mh", + "owner" : "client", + "name" : "mh", + "access" : 8, + "descriptor" : "I", + "decoder" : 535219347 + }, { + "field" : "__client_ms", + "owner" : "client", + "name" : "ms", + "access" : 8, + "descriptor" : "I", + "decoder" : 2128395635 + }, { + "field" : "__client_na", + "owner" : "client", + "name" : "na", + "access" : 8, + "descriptor" : "I", + "decoder" : -934082817 + }, { + "field" : "__client_nc", + "owner" : "client", + "name" : "nc", + "access" : 8, + "descriptor" : "I", + "decoder" : 344308849 + }, { + "field" : "__client_nd", + "owner" : "client", + "name" : "nd", + "access" : 8, + "descriptor" : "I", + "decoder" : 760022015 + }, { + "field" : "__client_ng", + "owner" : "client", + "name" : "ng", + "access" : 8, + "descriptor" : "I", + "decoder" : -1379876433 + }, { + "field" : "__client_nh", + "owner" : "client", + "name" : "nh", + "access" : 8, + "descriptor" : "I", + "decoder" : -278874973 + }, { + "field" : "__client_ni", + "owner" : "client", + "name" : "ni", + "access" : 8, + "descriptor" : "I", + "decoder" : 1990512261 + }, { + "field" : "__client_nk", + "owner" : "client", + "name" : "nk", + "access" : 8, + "descriptor" : "I", + "decoder" : 1019025247 + }, { + "field" : "__client_nl", + "owner" : "client", + "name" : "nl", + "access" : 8, + "descriptor" : "I", + "decoder" : 1939745821 + }, { + "field" : "__client_np", + "owner" : "client", + "name" : "np", + "access" : 8, + "descriptor" : "I", + "decoder" : 1881890525 + }, { + "field" : "__client_nq", + "owner" : "client", + "name" : "nq", + "access" : 8, + "descriptor" : "I", + "decoder" : 1467519791 + }, { + "field" : "__client_ns", + "owner" : "client", + "name" : "ns", + "access" : 8, + "descriptor" : "I", + "decoder" : 743073293 + }, { + "field" : "__client_nv", + "owner" : "client", + "name" : "nv", + "access" : 8, + "descriptor" : "I", + "decoder" : -758575207 + }, { + "field" : "__client_nw", + "owner" : "client", + "name" : "nw", + "access" : 8, + "descriptor" : "I", + "decoder" : -843739713 + }, { + "field" : "__client_nx", + "owner" : "client", + "name" : "nx", + "access" : 8, + "descriptor" : "I", + "decoder" : 1132932607 + }, { + "field" : "__client_oo", + "owner" : "client", + "name" : "oo", + "access" : 8, + "descriptor" : "I", + "decoder" : 1348053843 + }, { + "field" : "__client_pb", + "owner" : "client", + "name" : "pb", + "access" : 8, + "descriptor" : "I", + "decoder" : 1230692157 + }, { + "field" : "__client_ph", + "owner" : "client", + "name" : "ph", + "access" : 8, + "descriptor" : "I", + "decoder" : 587773171 + }, { + "field" : "__client_pl", + "owner" : "client", + "name" : "pl", + "access" : 8, + "descriptor" : "I", + "decoder" : -1362734353 + }, { + "field" : "__client_pm", + "owner" : "client", + "name" : "pm", + "access" : 8, + "descriptor" : "I", + "decoder" : -460406997 + }, { + "field" : "__client_qc", + "owner" : "client", + "name" : "qc", + "access" : 8, + "descriptor" : "I", + "decoder" : -818676431 + }, { + "field" : "__client_qf", + "owner" : "client", + "name" : "qf", + "access" : 8, + "descriptor" : "I", + "decoder" : 1365951359 + }, { + "field" : "__client_qp", + "owner" : "client", + "name" : "qp", + "access" : 8, + "descriptor" : "I", + "decoder" : -1352723865 + }, { + "field" : "__client_qy", + "owner" : "client", + "name" : "qy", + "access" : 8, + "descriptor" : "I", + "decoder" : -34294211 + }, { + "field" : "__client_sd", + "owner" : "client", + "name" : "sd", + "access" : 8, + "descriptor" : "I", + "decoder" : 944933439 + }, { + "field" : "__client_sl", + "owner" : "client", + "name" : "sl", + "access" : 8, + "descriptor" : "I", + "decoder" : -1605855913 + }, { + "field" : "__client_sx", + "owner" : "client", + "name" : "sx", + "access" : 8, + "descriptor" : "I", + "decoder" : 206275573 + }, { + "field" : "__client_fg", + "owner" : "client", + "name" : "fg", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_kd", + "owner" : "client", + "name" : "kd", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_kn", + "owner" : "client", + "name" : "kn", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_nf", + "owner" : "client", + "name" : "nf", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_nr", + "owner" : "client", + "name" : "nr", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_nz", + "owner" : "client", + "name" : "nz", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_pn", + "owner" : "client", + "name" : "pn", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_pq", + "owner" : "client", + "name" : "pq", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_pv", + "owner" : "client", + "name" : "pv", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_qd", + "owner" : "client", + "name" : "qd", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_qk", + "owner" : "client", + "name" : "qk", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_qn", + "owner" : "client", + "name" : "qn", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_rd", + "owner" : "client", + "name" : "rd", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_rj", + "owner" : "client", + "name" : "rj", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_rk", + "owner" : "client", + "name" : "rk", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_rl", + "owner" : "client", + "name" : "rl", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_th", + "owner" : "client", + "name" : "th", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_tp", + "owner" : "client", + "name" : "tp", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__client_pz", + "owner" : "client", + "name" : "pz", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__client_kh", + "owner" : "client", + "name" : "kh", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "__client_oc", + "owner" : "client", + "name" : "oc", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "__client_oh", + "owner" : "client", + "name" : "oh", + "access" : 8, + "descriptor" : "Lje;" + }, { + "field" : "__client_ch", + "owner" : "client", + "name" : "ch", + "access" : 8, + "descriptor" : "J", + "decoder" : -6574384275386813769 + }, { + "field" : "__client_oa", + "owner" : "client", + "name" : "oa", + "access" : 8, + "descriptor" : "J", + "decoder" : 8818983958751331899 + }, { + "field" : "__client_pp", + "owner" : "client", + "name" : "pp", + "access" : 8, + "descriptor" : "J", + "decoder" : -1704358328771670975 + }, { + "field" : "__client_pu", + "owner" : "client", + "name" : "pu", + "access" : 8, + "descriptor" : "[J" + }, { + "field" : "__client_rb", + "owner" : "client", + "name" : "rb", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_re", + "owner" : "client", + "name" : "re", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_ri", + "owner" : "client", + "name" : "ri", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_rm", + "owner" : "client", + "name" : "rm", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_rp", + "owner" : "client", + "name" : "rp", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_rs", + "owner" : "client", + "name" : "rs", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_rv", + "owner" : "client", + "name" : "rv", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_rw", + "owner" : "client", + "name" : "rw", + "access" : 8, + "descriptor" : "S" + }, { + "field" : "__client_gd", + "owner" : "client", + "name" : "gd", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__bt_g", + "owner" : "bt", + "name" : "g", + "access" : 8, + "descriptor" : "I", + "decoder" : 1143875805 + }, { + "field" : "__bt_e", + "owner" : "bt", + "name" : "e", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__bt_l", + "owner" : "bt", + "name" : "l", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__bf_m", + "owner" : "bf", + "name" : "m", + "access" : 8, + "descriptor" : "I", + "decoder" : 1548448409 + }, { + "field" : "__bv_s", + "owner" : "bv", + "name" : "s", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__bv_t", + "owner" : "bv", + "name" : "t", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__bv_y", + "owner" : "bv", + "name" : "y", + "access" : 8, + "descriptor" : "I", + "decoder" : -1019558835 + }, { + "field" : "__bv_r", + "owner" : "bv", + "name" : "r", + "access" : 24, + "descriptor" : "D" + }, { + "field" : "__bv_z", + "owner" : "bv", + "name" : "z", + "access" : 24, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "__bw_d", + "owner" : "bw", + "name" : "d", + "access" : 8, + "descriptor" : "I", + "decoder" : -1807262579 + }, { + "field" : "__bw_k", + "owner" : "bw", + "name" : "k", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__ce_o", + "owner" : "ce", + "name" : "o", + "access" : 24, + "descriptor" : "Ljava/math/BigInteger;" + }, { + "field" : "__ce_u", + "owner" : "ce", + "name" : "u", + "access" : 24, + "descriptor" : "Ljava/math/BigInteger;" + }, { + "field" : "__cy_d", + "owner" : "cy", + "name" : "d", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__cm_e", + "owner" : "cm", + "name" : "e", + "access" : 9, + "descriptor" : "I", + "decoder" : 533653621 + }, { + "field" : "__cm_f", + "owner" : "cm", + "name" : "f", + "access" : 24, + "descriptor" : "Ljava/math/BigInteger;" + }, { + "field" : "__cm_m", + "owner" : "cm", + "name" : "m", + "access" : 24, + "descriptor" : "Ljava/math/BigInteger;" + }, { + "field" : "__cj_ay", + "owner" : "cj", + "name" : "ay", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__cj_bo", + "owner" : "cj", + "name" : "bo", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "__cj_sp", + "owner" : "cj", + "name" : "sp", + "access" : 8, + "descriptor" : "[S" + }, { + "field" : "__cu_aa", + "owner" : "cu", + "name" : "aa", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__cu_ax", + "owner" : "cu", + "name" : "ax", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__cu_ba", + "owner" : "cu", + "name" : "ba", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__cu_bk", + "owner" : "cu", + "name" : "bk", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__cu_f", + "owner" : "cu", + "name" : "f", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__cu_ac", + "owner" : "cu", + "name" : "ac", + "access" : 8, + "descriptor" : "I", + "decoder" : 1677133239 + }, { + "field" : "__cu_aj", + "owner" : "cu", + "name" : "aj", + "access" : 8, + "descriptor" : "I", + "decoder" : 1077910071 + }, { + "field" : "__cu_aw", + "owner" : "cu", + "name" : "aw", + "access" : 8, + "descriptor" : "I", + "decoder" : 1861681835 + }, { + "field" : "__cu_bb", + "owner" : "cu", + "name" : "bb", + "access" : 8, + "descriptor" : "I", + "decoder" : 1769484271 + }, { + "field" : "__cu_bj", + "owner" : "cu", + "name" : "bj", + "access" : 8, + "descriptor" : "I", + "decoder" : 1548722671 + }, { + "field" : "__cu_bl", + "owner" : "cu", + "name" : "bl", + "access" : 8, + "descriptor" : "I", + "decoder" : 1431381579 + }, { + "field" : "__cu_br", + "owner" : "cu", + "name" : "br", + "access" : 8, + "descriptor" : "I", + "decoder" : -376233039 + }, { + "field" : "__cu_q", + "owner" : "cu", + "name" : "q", + "access" : 8, + "descriptor" : "I", + "decoder" : 1606541885 + }, { + "field" : "__cu_y", + "owner" : "cu", + "name" : "y", + "access" : 8, + "descriptor" : "I", + "decoder" : 932541923 + }, { + "field" : "__cu_ai", + "owner" : "cu", + "name" : "ai", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__cu_bq", + "owner" : "cu", + "name" : "bq", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__cu_bs", + "owner" : "cu", + "name" : "bs", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__cu_g", + "owner" : "cu", + "name" : "g", + "access" : 8, + "descriptor" : "Lln;" + }, { + "field" : "__cu_bi", + "owner" : "cu", + "name" : "bi", + "access" : 8, + "descriptor" : "J", + "decoder" : 803647694904294325 + }, { + "field" : "__cu_bz", + "owner" : "cu", + "name" : "bz", + "access" : 8, + "descriptor" : "J", + "decoder" : -3234258972092460093 + }, { + "field" : "__cu_d", + "owner" : "cu", + "name" : "d", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__cu_o", + "owner" : "cu", + "name" : "o", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__cn_bu", + "owner" : "cn", + "name" : "bu", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__cq_q", + "owner" : "cq", + "name" : "q", + "access" : 8, + "descriptor" : "[B" + }, { + "field" : "__cq_w", + "owner" : "cq", + "name" : "w", + "access" : 8, + "descriptor" : "[B" + }, { + "field" : "__cq_a", + "owner" : "cq", + "name" : "a", + "access" : 8, + "descriptor" : "Lgr;" + }, { + "field" : "__cq_o", + "owner" : "cq", + "name" : "o", + "access" : 8, + "descriptor" : "[Lgr;" + }, { + "field" : "__cq_l", + "owner" : "cq", + "name" : "l", + "access" : 8, + "descriptor" : "I", + "decoder" : 945250525 + }, { + "field" : "__cq_n", + "owner" : "cq", + "name" : "n", + "access" : 8, + "descriptor" : "I", + "decoder" : -22568397 + }, { + "field" : "__cq_e", + "owner" : "cq", + "name" : "e", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__cq_i", + "owner" : "cq", + "name" : "i", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__cd_s", + "owner" : "cd", + "name" : "s", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__cd_z", + "owner" : "cd", + "name" : "z", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__cd_g", + "owner" : "cd", + "name" : "g", + "access" : 8, + "descriptor" : "[B" + }, { + "field" : "__cd_ag", + "owner" : "cd", + "name" : "ag", + "access" : 8, + "descriptor" : "[F" + }, { + "field" : "__cd_aj", + "owner" : "cd", + "name" : "aj", + "access" : 8, + "descriptor" : "[F" + }, { + "field" : "__cd_aq", + "owner" : "cd", + "name" : "aq", + "access" : 8, + "descriptor" : "[F" + }, { + "field" : "__cd_c", + "owner" : "cd", + "name" : "c", + "access" : 8, + "descriptor" : "[F" + }, { + "field" : "__cd_p", + "owner" : "cd", + "name" : "p", + "access" : 8, + "descriptor" : "[F" + }, { + "field" : "__cd_r", + "owner" : "cd", + "name" : "r", + "access" : 8, + "descriptor" : "[F" + }, { + "field" : "__cd_v", + "owner" : "cd", + "name" : "v", + "access" : 8, + "descriptor" : "[F" + }, { + "field" : "__cd_d", + "owner" : "cd", + "name" : "d", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__cd_e", + "owner" : "cd", + "name" : "e", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__cd_l", + "owner" : "cd", + "name" : "l", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__cd_x", + "owner" : "cd", + "name" : "x", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__cd_ar", + "owner" : "cd", + "name" : "ar", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__cd_av", + "owner" : "cd", + "name" : "av", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__cd_j", + "owner" : "cd", + "name" : "j", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__ca_k", + "owner" : "ca", + "name" : "k", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__ca_d", + "owner" : "ca", + "name" : "d", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__ca_x", + "owner" : "ca", + "name" : "x", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__ca_f", + "owner" : "ca", + "name" : "f", + "access" : 24, + "descriptor" : "[F" + }, { + "field" : "__ca_m", + "owner" : "ca", + "name" : "m", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__di_l", + "owner" : "di", + "name" : "l", + "access" : 8, + "descriptor" : "F" + }, { + "field" : "__di_u", + "owner" : "di", + "name" : "u", + "access" : 8, + "descriptor" : "[[F" + }, { + "field" : "__di_e", + "owner" : "di", + "name" : "e", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__di_g", + "owner" : "di", + "name" : "g", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "__dk_lm", + "owner" : "dk", + "name" : "lm", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "__dk_o", + "owner" : "dk", + "name" : "o", + "access" : 8, + "descriptor" : "I", + "decoder" : -1762891465 + }, { + "field" : "__dr_ao", + "owner" : "dr", + "name" : "ao", + "access" : 8, + "descriptor" : "I", + "decoder" : -704675849 + }, { + "field" : "__dw_ab", + "owner" : "dw", + "name" : "ab", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__dw_al", + "owner" : "dw", + "name" : "al", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dw_aw", + "owner" : "dw", + "name" : "aw", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dv_j", + "owner" : "dv", + "name" : "j", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dv_s", + "owner" : "dv", + "name" : "s", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dv_t", + "owner" : "dv", + "name" : "t", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dv_y", + "owner" : "dv", + "name" : "y", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dv_z", + "owner" : "dv", + "name" : "z", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dv_b", + "owner" : "dv", + "name" : "b", + "access" : 24, + "descriptor" : "[[I" + }, { + "field" : "__dv_h", + "owner" : "dv", + "name" : "h", + "access" : 24, + "descriptor" : "[[I" + }, { + "field" : "__dz_f", + "owner" : "dz", + "name" : "f", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dz_m", + "owner" : "dz", + "name" : "m", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dz_q", + "owner" : "dz", + "name" : "q", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__dz_w", + "owner" : "dz", + "name" : "w", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_bx", + "owner" : "du", + "name" : "bx", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__du_ad", + "owner" : "du", + "name" : "ad", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__du_at", + "owner" : "du", + "name" : "at", + "access" : 8, + "descriptor" : "[Z" + }, { + "field" : "__du_aa", + "owner" : "du", + "name" : "aa", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_af", + "owner" : "du", + "name" : "af", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_am", + "owner" : "du", + "name" : "am", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_an", + "owner" : "du", + "name" : "an", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_au", + "owner" : "du", + "name" : "au", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_az", + "owner" : "du", + "name" : "az", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_ba", + "owner" : "du", + "name" : "ba", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_bb", + "owner" : "du", + "name" : "bb", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_bj", + "owner" : "du", + "name" : "bj", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_bk", + "owner" : "du", + "name" : "bk", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_bn", + "owner" : "du", + "name" : "bn", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_bq", + "owner" : "du", + "name" : "bq", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_br", + "owner" : "du", + "name" : "br", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_bs", + "owner" : "du", + "name" : "bs", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__du_ai", + "owner" : "du", + "name" : "ai", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "__du_ax", + "owner" : "du", + "name" : "ax", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "__dm_g", + "owner" : "dm", + "name" : "g", + "access" : 8, + "descriptor" : "I", + "decoder" : 262104267 + }, { + "field" : "__dm_k", + "owner" : "dm", + "name" : "k", + "access" : 8, + "descriptor" : "I", + "decoder" : -852671813 + }, { + "field" : "__dm_l", + "owner" : "dm", + "name" : "l", + "access" : 8, + "descriptor" : "I", + "decoder" : -2071972829 + }, { + "field" : "__dm_u", + "owner" : "dm", + "name" : "u", + "access" : 8, + "descriptor" : "I", + "decoder" : 1135175963 + }, { + "field" : "__dq_pe", + "owner" : "dq", + "name" : "pe", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__dq_rq", + "owner" : "dq", + "name" : "rq", + "access" : 8, + "descriptor" : "I", + "decoder" : 1351620693 + }, { + "field" : "__et_w", + "owner" : "et", + "name" : "w", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "__et_f", + "owner" : "et", + "name" : "f", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__et_m", + "owner" : "et", + "name" : "m", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__et_p", + "owner" : "et", + "name" : "p", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__et_r", + "owner" : "et", + "name" : "r", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__eb_ah", + "owner" : "eb", + "name" : "ah", + "access" : 8, + "descriptor" : "Lla;" + }, { + "field" : "__ek_x", + "owner" : "ek", + "name" : "x", + "access" : 8, + "descriptor" : "I", + "decoder" : 2096389021 + }, { + "field" : "__em_ab", + "owner" : "em", + "name" : "ab", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__em_ac", + "owner" : "em", + "name" : "ac", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__em_a", + "owner" : "em", + "name" : "a", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__em_ad", + "owner" : "em", + "name" : "ad", + "access" : 8, + "descriptor" : "I" + }, { + "field" : "__em_aa", + "owner" : "em", + "name" : "aa", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__em_af", + "owner" : "em", + "name" : "af", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__em_ai", + "owner" : "em", + "name" : "ai", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__em_ao", + "owner" : "em", + "name" : "ao", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__em_au", + "owner" : "em", + "name" : "au", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__em_ax", + "owner" : "em", + "name" : "ax", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__em_ba", + "owner" : "em", + "name" : "ba", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__ej_jv", + "owner" : "ej", + "name" : "jv", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "__el_x", + "owner" : "el", + "name" : "x", + "access" : 9, + "descriptor" : "I", + "decoder" : 422473713 + }, { + "field" : "__el_gm", + "owner" : "el", + "name" : "gm", + "access" : 8, + "descriptor" : "Lln;" + }, { + "field" : "__en_bc", + "owner" : "en", + "name" : "bc", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "__eh_fy", + "owner" : "eh", + "name" : "fy", + "access" : 8, + "descriptor" : "I", + "decoder" : -457229589 + }, { + "field" : "__eo_u", + "owner" : "eo", + "name" : "u", + "access" : 8, + "descriptor" : "I", + "decoder" : -883931753 + }, { + "field" : "__eo_ak", + "owner" : "eo", + "name" : "ak", + "access" : 8, + "descriptor" : "Lla;" + }, { + "field" : "__ey_bx", + "owner" : "ey", + "name" : "bx", + "access" : 8, + "descriptor" : "[Llq;" + }, { + "field" : "__fw_nm", + "owner" : "fw", + "name" : "nm", + "access" : 8, + "descriptor" : "I", + "decoder" : 1006519291 + }, { + "field" : "__fg_jh", + "owner" : "fg", + "name" : "jh", + "access" : 8, + "descriptor" : "Lho;" + }, { + "field" : "__fh_x", + "owner" : "fh", + "name" : "x", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__fx_w", + "owner" : "fx", + "name" : "w", + "access" : 9, + "descriptor" : "I", + "decoder" : 121013503 + }, { + "field" : "__fs_o", + "owner" : "fs", + "name" : "o", + "access" : 9, + "descriptor" : "Ljava/io/File;" + }, { + "field" : "__fs_au", + "owner" : "fs", + "name" : "au", + "access" : 8, + "descriptor" : "I", + "decoder" : 1181569415 + }, { + "field" : "__fo_m", + "owner" : "fo", + "name" : "m", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "__fo_f", + "owner" : "fo", + "name" : "f", + "access" : 9, + "descriptor" : "Ljava/io/File;" + }, { + "field" : "__fo_ro", + "owner" : "fo", + "name" : "ro", + "access" : 8, + "descriptor" : "I", + "decoder" : -852697585 + }, { + "field" : "__fo_q", + "owner" : "fo", + "name" : "q", + "access" : 8, + "descriptor" : "Ljava/util/Hashtable;" + }, { + "field" : "__fb_bm", + "owner" : "fb", + "name" : "bm", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__fi_e", + "owner" : "fi", + "name" : "e", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__fi_l", + "owner" : "fi", + "name" : "l", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__fi_q", + "owner" : "fi", + "name" : "q", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "__fi_w", + "owner" : "fi", + "name" : "w", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "__fe_e", + "owner" : "fe", + "name" : "e", + "access" : 8, + "descriptor" : "[[[B" + }, { + "field" : "__ge_a", + "owner" : "ge", + "name" : "a", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_aa", + "owner" : "ge", + "name" : "aa", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ab", + "owner" : "ge", + "name" : "ab", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ac", + "owner" : "ge", + "name" : "ac", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ad", + "owner" : "ge", + "name" : "ad", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ae", + "owner" : "ge", + "name" : "ae", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_af", + "owner" : "ge", + "name" : "af", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ag", + "owner" : "ge", + "name" : "ag", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ah", + "owner" : "ge", + "name" : "ah", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ai", + "owner" : "ge", + "name" : "ai", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_aj", + "owner" : "ge", + "name" : "aj", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ak", + "owner" : "ge", + "name" : "ak", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_al", + "owner" : "ge", + "name" : "al", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_am", + "owner" : "ge", + "name" : "am", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_an", + "owner" : "ge", + "name" : "an", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ao", + "owner" : "ge", + "name" : "ao", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ap", + "owner" : "ge", + "name" : "ap", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_aq", + "owner" : "ge", + "name" : "aq", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ar", + "owner" : "ge", + "name" : "ar", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_as", + "owner" : "ge", + "name" : "as", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_at", + "owner" : "ge", + "name" : "at", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_au", + "owner" : "ge", + "name" : "au", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_av", + "owner" : "ge", + "name" : "av", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_aw", + "owner" : "ge", + "name" : "aw", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ax", + "owner" : "ge", + "name" : "ax", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ay", + "owner" : "ge", + "name" : "ay", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_az", + "owner" : "ge", + "name" : "az", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_b", + "owner" : "ge", + "name" : "b", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ba", + "owner" : "ge", + "name" : "ba", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bb", + "owner" : "ge", + "name" : "bb", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bc", + "owner" : "ge", + "name" : "bc", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bd", + "owner" : "ge", + "name" : "bd", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_be", + "owner" : "ge", + "name" : "be", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bf", + "owner" : "ge", + "name" : "bf", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bg", + "owner" : "ge", + "name" : "bg", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bh", + "owner" : "ge", + "name" : "bh", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bi", + "owner" : "ge", + "name" : "bi", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bj", + "owner" : "ge", + "name" : "bj", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bk", + "owner" : "ge", + "name" : "bk", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bl", + "owner" : "ge", + "name" : "bl", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bm", + "owner" : "ge", + "name" : "bm", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bn", + "owner" : "ge", + "name" : "bn", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bo", + "owner" : "ge", + "name" : "bo", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bp", + "owner" : "ge", + "name" : "bp", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bq", + "owner" : "ge", + "name" : "bq", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_br", + "owner" : "ge", + "name" : "br", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bs", + "owner" : "ge", + "name" : "bs", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bt", + "owner" : "ge", + "name" : "bt", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bu", + "owner" : "ge", + "name" : "bu", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bv", + "owner" : "ge", + "name" : "bv", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bw", + "owner" : "ge", + "name" : "bw", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bx", + "owner" : "ge", + "name" : "bx", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_by", + "owner" : "ge", + "name" : "by", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_bz", + "owner" : "ge", + "name" : "bz", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_c", + "owner" : "ge", + "name" : "c", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_ce", + "owner" : "ge", + "name" : "ce", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_cj", + "owner" : "ge", + "name" : "cj", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_cm", + "owner" : "ge", + "name" : "cm", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_cr", + "owner" : "ge", + "name" : "cr", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_cs", + "owner" : "ge", + "name" : "cs", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_cv", + "owner" : "ge", + "name" : "cv", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_cy", + "owner" : "ge", + "name" : "cy", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_d", + "owner" : "ge", + "name" : "d", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_e", + "owner" : "ge", + "name" : "e", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_f", + "owner" : "ge", + "name" : "f", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_g", + "owner" : "ge", + "name" : "g", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_h", + "owner" : "ge", + "name" : "h", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_i", + "owner" : "ge", + "name" : "i", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_j", + "owner" : "ge", + "name" : "j", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_k", + "owner" : "ge", + "name" : "k", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_l", + "owner" : "ge", + "name" : "l", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_m", + "owner" : "ge", + "name" : "m", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_n", + "owner" : "ge", + "name" : "n", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_o", + "owner" : "ge", + "name" : "o", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_p", + "owner" : "ge", + "name" : "p", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_q", + "owner" : "ge", + "name" : "q", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_r", + "owner" : "ge", + "name" : "r", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_s", + "owner" : "ge", + "name" : "s", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_t", + "owner" : "ge", + "name" : "t", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_u", + "owner" : "ge", + "name" : "u", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_v", + "owner" : "ge", + "name" : "v", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_w", + "owner" : "ge", + "name" : "w", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_x", + "owner" : "ge", + "name" : "x", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_y", + "owner" : "ge", + "name" : "y", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__ge_z", + "owner" : "ge", + "name" : "z", + "access" : 25, + "descriptor" : "Lge;" + }, { + "field" : "__gs_a", + "owner" : "gs", + "name" : "a", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_aa", + "owner" : "gs", + "name" : "aa", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ab", + "owner" : "gs", + "name" : "ab", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ac", + "owner" : "gs", + "name" : "ac", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ad", + "owner" : "gs", + "name" : "ad", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ae", + "owner" : "gs", + "name" : "ae", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_af", + "owner" : "gs", + "name" : "af", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ag", + "owner" : "gs", + "name" : "ag", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ah", + "owner" : "gs", + "name" : "ah", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ai", + "owner" : "gs", + "name" : "ai", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_aj", + "owner" : "gs", + "name" : "aj", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ak", + "owner" : "gs", + "name" : "ak", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_al", + "owner" : "gs", + "name" : "al", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_an", + "owner" : "gs", + "name" : "an", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ao", + "owner" : "gs", + "name" : "ao", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ap", + "owner" : "gs", + "name" : "ap", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_aq", + "owner" : "gs", + "name" : "aq", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ar", + "owner" : "gs", + "name" : "ar", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_as", + "owner" : "gs", + "name" : "as", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_at", + "owner" : "gs", + "name" : "at", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_au", + "owner" : "gs", + "name" : "au", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_av", + "owner" : "gs", + "name" : "av", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_aw", + "owner" : "gs", + "name" : "aw", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ax", + "owner" : "gs", + "name" : "ax", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ay", + "owner" : "gs", + "name" : "ay", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_az", + "owner" : "gs", + "name" : "az", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_b", + "owner" : "gs", + "name" : "b", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ba", + "owner" : "gs", + "name" : "ba", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bb", + "owner" : "gs", + "name" : "bb", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bc", + "owner" : "gs", + "name" : "bc", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bd", + "owner" : "gs", + "name" : "bd", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_be", + "owner" : "gs", + "name" : "be", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bf", + "owner" : "gs", + "name" : "bf", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bg", + "owner" : "gs", + "name" : "bg", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bh", + "owner" : "gs", + "name" : "bh", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bi", + "owner" : "gs", + "name" : "bi", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bj", + "owner" : "gs", + "name" : "bj", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bk", + "owner" : "gs", + "name" : "bk", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bl", + "owner" : "gs", + "name" : "bl", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bm", + "owner" : "gs", + "name" : "bm", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bn", + "owner" : "gs", + "name" : "bn", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bo", + "owner" : "gs", + "name" : "bo", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bp", + "owner" : "gs", + "name" : "bp", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bq", + "owner" : "gs", + "name" : "bq", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_br", + "owner" : "gs", + "name" : "br", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bs", + "owner" : "gs", + "name" : "bs", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bt", + "owner" : "gs", + "name" : "bt", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bu", + "owner" : "gs", + "name" : "bu", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bv", + "owner" : "gs", + "name" : "bv", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bw", + "owner" : "gs", + "name" : "bw", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bx", + "owner" : "gs", + "name" : "bx", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_by", + "owner" : "gs", + "name" : "by", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_bz", + "owner" : "gs", + "name" : "bz", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_c", + "owner" : "gs", + "name" : "c", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cb", + "owner" : "gs", + "name" : "cb", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cc", + "owner" : "gs", + "name" : "cc", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ce", + "owner" : "gs", + "name" : "ce", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cf", + "owner" : "gs", + "name" : "cf", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cg", + "owner" : "gs", + "name" : "cg", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ch", + "owner" : "gs", + "name" : "ch", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cj", + "owner" : "gs", + "name" : "cj", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ck", + "owner" : "gs", + "name" : "ck", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cl", + "owner" : "gs", + "name" : "cl", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cm", + "owner" : "gs", + "name" : "cm", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cn", + "owner" : "gs", + "name" : "cn", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cp", + "owner" : "gs", + "name" : "cp", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cq", + "owner" : "gs", + "name" : "cq", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cr", + "owner" : "gs", + "name" : "cr", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cs", + "owner" : "gs", + "name" : "cs", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ct", + "owner" : "gs", + "name" : "ct", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cu", + "owner" : "gs", + "name" : "cu", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cv", + "owner" : "gs", + "name" : "cv", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cw", + "owner" : "gs", + "name" : "cw", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cy", + "owner" : "gs", + "name" : "cy", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_cz", + "owner" : "gs", + "name" : "cz", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_d", + "owner" : "gs", + "name" : "d", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_e", + "owner" : "gs", + "name" : "e", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_f", + "owner" : "gs", + "name" : "f", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_g", + "owner" : "gs", + "name" : "g", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_h", + "owner" : "gs", + "name" : "h", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_i", + "owner" : "gs", + "name" : "i", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_j", + "owner" : "gs", + "name" : "j", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_k", + "owner" : "gs", + "name" : "k", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_l", + "owner" : "gs", + "name" : "l", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_m", + "owner" : "gs", + "name" : "m", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_n", + "owner" : "gs", + "name" : "n", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_o", + "owner" : "gs", + "name" : "o", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_p", + "owner" : "gs", + "name" : "p", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_q", + "owner" : "gs", + "name" : "q", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_r", + "owner" : "gs", + "name" : "r", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_s", + "owner" : "gs", + "name" : "s", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_t", + "owner" : "gs", + "name" : "t", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_u", + "owner" : "gs", + "name" : "u", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_v", + "owner" : "gs", + "name" : "v", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_w", + "owner" : "gs", + "name" : "w", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_x", + "owner" : "gs", + "name" : "x", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_y", + "owner" : "gs", + "name" : "y", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_z", + "owner" : "gs", + "name" : "z", + "access" : 25, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_qh", + "owner" : "gs", + "name" : "qh", + "access" : 8, + "descriptor" : "I", + "decoder" : 1076448827 + }, { + "field" : "__gs_am", + "owner" : "gs", + "name" : "am", + "access" : 24, + "descriptor" : "Lgs;" + }, { + "field" : "__gs_ci", + "owner" : "gs", + "name" : "ci", + "access" : 24, + "descriptor" : "Lgs;" + }, { + "field" : "__gl_m", + "owner" : "gl", + "name" : "m", + "access" : 25, + "descriptor" : "Lgl;" + }, { + "field" : "__gl_q", + "owner" : "gl", + "name" : "q", + "access" : 25, + "descriptor" : "Lgl;" + }, { + "field" : "__gl_w", + "owner" : "gl", + "name" : "w", + "access" : 25, + "descriptor" : "Lgl;" + }, { + "field" : "__gl_f", + "owner" : "gl", + "name" : "f", + "access" : 24, + "descriptor" : "Lgl;" + }, { + "field" : "__gl_o", + "owner" : "gl", + "name" : "o", + "access" : 24, + "descriptor" : "Lgl;" + }, { + "field" : "__gl_g", + "owner" : "gl", + "name" : "g", + "access" : 24, + "descriptor" : "[Lgl;" + }, { + "field" : "__gg_u", + "owner" : "gg", + "name" : "u", + "access" : 9, + "descriptor" : "I", + "decoder" : -1583654139 + }, { + "field" : "__gd_e", + "owner" : "gd", + "name" : "e", + "access" : 8, + "descriptor" : "[[I" + }, { + "field" : "__go_ck", + "owner" : "go", + "name" : "ck", + "access" : 9, + "descriptor" : "C" + }, { + "field" : "__gr_q", + "owner" : "gr", + "name" : "q", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__gr_o", + "owner" : "gr", + "name" : "o", + "access" : 8, + "descriptor" : "[J" + }, { + "field" : "__gi_g", + "owner" : "gi", + "name" : "g", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__gx_n", + "owner" : "gx", + "name" : "n", + "access" : 9, + "descriptor" : "Lkk;" + }, { + "field" : "__gx_d", + "owner" : "gx", + "name" : "d", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__gx_x", + "owner" : "gx", + "name" : "x", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__gu_et", + "owner" : "gu", + "name" : "et", + "access" : 8, + "descriptor" : "Lit;" + }, { + "field" : "__hx_z", + "owner" : "hx", + "name" : "z", + "access" : 9, + "descriptor" : "I", + "decoder" : 701739159 + }, { + "field" : "__hg_q", + "owner" : "hg", + "name" : "q", + "access" : 8, + "descriptor" : "Ljava/util/Calendar;" + }, { + "field" : "__hg_f", + "owner" : "hg", + "name" : "f", + "access" : 24, + "descriptor" : "[Ljava/lang/String;" + }, { + "field" : "__hg_m", + "owner" : "hg", + "name" : "m", + "access" : 24, + "descriptor" : "[[Ljava/lang/String;" + }, { + "field" : "__hd_fc", + "owner" : "hd", + "name" : "fc", + "access" : 8, + "descriptor" : "J", + "decoder" : -6780258776884306463 + }, { + "field" : "__hf_o", + "owner" : "hf", + "name" : "o", + "access" : 9, + "descriptor" : "I", + "decoder" : -848833001 + }, { + "field" : "__hf_f", + "owner" : "hf", + "name" : "f", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__hf_q", + "owner" : "hf", + "name" : "q", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__hf_u", + "owner" : "hf", + "name" : "u", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__hf_k", + "owner" : "hf", + "name" : "k", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__hs_x", + "owner" : "hs", + "name" : "x", + "access" : 24, + "descriptor" : "[B" + }, { + "field" : "__hq_qg", + "owner" : "hq", + "name" : "qg", + "access" : 8, + "descriptor" : "I", + "decoder" : -1367955455 + }, { + "field" : "__hv_h", + "owner" : "hv", + "name" : "h", + "access" : 8, + "descriptor" : "I", + "decoder" : 120772859 + }, { + "field" : "__hi_g", + "owner" : "hi", + "name" : "g", + "access" : 9, + "descriptor" : "[S" + }, { + "field" : "__hi_d", + "owner" : "hi", + "name" : "d", + "access" : 24, + "descriptor" : "[I" + }, { + "field" : "__ht_m", + "owner" : "ht", + "name" : "m", + "access" : 25, + "descriptor" : "[S" + }, { + "field" : "__ht_q", + "owner" : "ht", + "name" : "q", + "access" : 25, + "descriptor" : "[S" + }, { + "field" : "__ht_f", + "owner" : "ht", + "name" : "f", + "access" : 25, + "descriptor" : "[[S" + }, { + "field" : "__ht_w", + "owner" : "ht", + "name" : "w", + "access" : 25, + "descriptor" : "[[S" + }, { + "field" : "__hj_e", + "owner" : "hj", + "name" : "e", + "access" : 9, + "descriptor" : "[S" + }, { + "field" : "__ho_j", + "owner" : "ho", + "name" : "j", + "access" : 9, + "descriptor" : "Z" + }, { + "field" : "__ho_d", + "owner" : "ho", + "name" : "d", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__ho_n", + "owner" : "ho", + "name" : "n", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "__ho_z", + "owner" : "ho", + "name" : "z", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "__hz_l", + "owner" : "hz", + "name" : "l", + "access" : 9, + "descriptor" : "[[S" + }, { + "field" : "__hy_az", + "owner" : "hy", + "name" : "az", + "access" : 12, + "descriptor" : "Z" + }, { + "field" : "__hb_sg", + "owner" : "hb", + "name" : "sg", + "access" : 8, + "descriptor" : "I", + "decoder" : -745071109 + }, { + "field" : "__hb_av", + "owner" : "hb", + "name" : "av", + "access" : 8, + "descriptor" : "Ljava/awt/Font;" + }, { + "field" : "__hc_ef", + "owner" : "hc", + "name" : "ef", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__id_aa", + "owner" : "id", + "name" : "aa", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ad", + "owner" : "id", + "name" : "ad", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ae", + "owner" : "id", + "name" : "ae", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_af", + "owner" : "id", + "name" : "af", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ai", + "owner" : "id", + "name" : "ai", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_am", + "owner" : "id", + "name" : "am", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_an", + "owner" : "id", + "name" : "an", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ao", + "owner" : "id", + "name" : "ao", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ap", + "owner" : "id", + "name" : "ap", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_as", + "owner" : "id", + "name" : "as", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_at", + "owner" : "id", + "name" : "at", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_au", + "owner" : "id", + "name" : "au", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ax", + "owner" : "id", + "name" : "ax", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_az", + "owner" : "id", + "name" : "az", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ba", + "owner" : "id", + "name" : "ba", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bb", + "owner" : "id", + "name" : "bb", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bc", + "owner" : "id", + "name" : "bc", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bd", + "owner" : "id", + "name" : "bd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_be", + "owner" : "id", + "name" : "be", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bf", + "owner" : "id", + "name" : "bf", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bg", + "owner" : "id", + "name" : "bg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bh", + "owner" : "id", + "name" : "bh", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bi", + "owner" : "id", + "name" : "bi", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bj", + "owner" : "id", + "name" : "bj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bk", + "owner" : "id", + "name" : "bk", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bl", + "owner" : "id", + "name" : "bl", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bm", + "owner" : "id", + "name" : "bm", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bn", + "owner" : "id", + "name" : "bn", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bo", + "owner" : "id", + "name" : "bo", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bp", + "owner" : "id", + "name" : "bp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bq", + "owner" : "id", + "name" : "bq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_br", + "owner" : "id", + "name" : "br", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bs", + "owner" : "id", + "name" : "bs", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bt", + "owner" : "id", + "name" : "bt", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bu", + "owner" : "id", + "name" : "bu", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bv", + "owner" : "id", + "name" : "bv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bw", + "owner" : "id", + "name" : "bw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bx", + "owner" : "id", + "name" : "bx", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_by", + "owner" : "id", + "name" : "by", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_bz", + "owner" : "id", + "name" : "bz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ca", + "owner" : "id", + "name" : "ca", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cb", + "owner" : "id", + "name" : "cb", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cc", + "owner" : "id", + "name" : "cc", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cd", + "owner" : "id", + "name" : "cd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ce", + "owner" : "id", + "name" : "ce", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cf", + "owner" : "id", + "name" : "cf", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cg", + "owner" : "id", + "name" : "cg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ch", + "owner" : "id", + "name" : "ch", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ci", + "owner" : "id", + "name" : "ci", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cj", + "owner" : "id", + "name" : "cj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ck", + "owner" : "id", + "name" : "ck", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cl", + "owner" : "id", + "name" : "cl", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cm", + "owner" : "id", + "name" : "cm", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cn", + "owner" : "id", + "name" : "cn", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_co", + "owner" : "id", + "name" : "co", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cp", + "owner" : "id", + "name" : "cp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cq", + "owner" : "id", + "name" : "cq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cr", + "owner" : "id", + "name" : "cr", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cs", + "owner" : "id", + "name" : "cs", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ct", + "owner" : "id", + "name" : "ct", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cu", + "owner" : "id", + "name" : "cu", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cv", + "owner" : "id", + "name" : "cv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cw", + "owner" : "id", + "name" : "cw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cx", + "owner" : "id", + "name" : "cx", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cy", + "owner" : "id", + "name" : "cy", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_cz", + "owner" : "id", + "name" : "cz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_d", + "owner" : "id", + "name" : "d", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_da", + "owner" : "id", + "name" : "da", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_db", + "owner" : "id", + "name" : "db", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dc", + "owner" : "id", + "name" : "dc", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dd", + "owner" : "id", + "name" : "dd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_de", + "owner" : "id", + "name" : "de", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_df", + "owner" : "id", + "name" : "df", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dg", + "owner" : "id", + "name" : "dg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_di", + "owner" : "id", + "name" : "di", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dj", + "owner" : "id", + "name" : "dj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dk", + "owner" : "id", + "name" : "dk", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dl", + "owner" : "id", + "name" : "dl", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dm", + "owner" : "id", + "name" : "dm", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dn", + "owner" : "id", + "name" : "dn", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_do", + "owner" : "id", + "name" : "do", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dp", + "owner" : "id", + "name" : "dp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dq", + "owner" : "id", + "name" : "dq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dr", + "owner" : "id", + "name" : "dr", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ds", + "owner" : "id", + "name" : "ds", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dt", + "owner" : "id", + "name" : "dt", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_du", + "owner" : "id", + "name" : "du", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dv", + "owner" : "id", + "name" : "dv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dx", + "owner" : "id", + "name" : "dx", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dy", + "owner" : "id", + "name" : "dy", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_dz", + "owner" : "id", + "name" : "dz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_eb", + "owner" : "id", + "name" : "eb", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ec", + "owner" : "id", + "name" : "ec", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ed", + "owner" : "id", + "name" : "ed", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ee", + "owner" : "id", + "name" : "ee", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ef", + "owner" : "id", + "name" : "ef", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_eh", + "owner" : "id", + "name" : "eh", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ei", + "owner" : "id", + "name" : "ei", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ej", + "owner" : "id", + "name" : "ej", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ek", + "owner" : "id", + "name" : "ek", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_el", + "owner" : "id", + "name" : "el", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_em", + "owner" : "id", + "name" : "em", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_en", + "owner" : "id", + "name" : "en", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_eo", + "owner" : "id", + "name" : "eo", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_eq", + "owner" : "id", + "name" : "eq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_er", + "owner" : "id", + "name" : "er", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_et", + "owner" : "id", + "name" : "et", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_eu", + "owner" : "id", + "name" : "eu", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ev", + "owner" : "id", + "name" : "ev", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ew", + "owner" : "id", + "name" : "ew", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ex", + "owner" : "id", + "name" : "ex", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ey", + "owner" : "id", + "name" : "ey", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fa", + "owner" : "id", + "name" : "fa", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fb", + "owner" : "id", + "name" : "fb", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ff", + "owner" : "id", + "name" : "ff", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fk", + "owner" : "id", + "name" : "fk", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fm", + "owner" : "id", + "name" : "fm", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fn", + "owner" : "id", + "name" : "fn", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fs", + "owner" : "id", + "name" : "fs", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fv", + "owner" : "id", + "name" : "fv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fx", + "owner" : "id", + "name" : "fx", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_fz", + "owner" : "id", + "name" : "fz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ga", + "owner" : "id", + "name" : "ga", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gb", + "owner" : "id", + "name" : "gb", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gc", + "owner" : "id", + "name" : "gc", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gd", + "owner" : "id", + "name" : "gd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ge", + "owner" : "id", + "name" : "ge", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gf", + "owner" : "id", + "name" : "gf", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gg", + "owner" : "id", + "name" : "gg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gh", + "owner" : "id", + "name" : "gh", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gi", + "owner" : "id", + "name" : "gi", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gj", + "owner" : "id", + "name" : "gj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gk", + "owner" : "id", + "name" : "gk", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gl", + "owner" : "id", + "name" : "gl", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gm", + "owner" : "id", + "name" : "gm", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gn", + "owner" : "id", + "name" : "gn", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_go", + "owner" : "id", + "name" : "go", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gp", + "owner" : "id", + "name" : "gp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gq", + "owner" : "id", + "name" : "gq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gr", + "owner" : "id", + "name" : "gr", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gs", + "owner" : "id", + "name" : "gs", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gt", + "owner" : "id", + "name" : "gt", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gu", + "owner" : "id", + "name" : "gu", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gv", + "owner" : "id", + "name" : "gv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gw", + "owner" : "id", + "name" : "gw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gx", + "owner" : "id", + "name" : "gx", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gy", + "owner" : "id", + "name" : "gy", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_gz", + "owner" : "id", + "name" : "gz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ha", + "owner" : "id", + "name" : "ha", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hb", + "owner" : "id", + "name" : "hb", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hc", + "owner" : "id", + "name" : "hc", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hd", + "owner" : "id", + "name" : "hd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hf", + "owner" : "id", + "name" : "hf", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hg", + "owner" : "id", + "name" : "hg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hh", + "owner" : "id", + "name" : "hh", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hk", + "owner" : "id", + "name" : "hk", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hm", + "owner" : "id", + "name" : "hm", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hn", + "owner" : "id", + "name" : "hn", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hr", + "owner" : "id", + "name" : "hr", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hs", + "owner" : "id", + "name" : "hs", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hx", + "owner" : "id", + "name" : "hx", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_hy", + "owner" : "id", + "name" : "hy", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ia", + "owner" : "id", + "name" : "ia", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ib", + "owner" : "id", + "name" : "ib", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ic", + "owner" : "id", + "name" : "ic", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_id", + "owner" : "id", + "name" : "id", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ig", + "owner" : "id", + "name" : "ig", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ih", + "owner" : "id", + "name" : "ih", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ii", + "owner" : "id", + "name" : "ii", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ik", + "owner" : "id", + "name" : "ik", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_im", + "owner" : "id", + "name" : "im", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_io", + "owner" : "id", + "name" : "io", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ip", + "owner" : "id", + "name" : "ip", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_iq", + "owner" : "id", + "name" : "iq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ir", + "owner" : "id", + "name" : "ir", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_it", + "owner" : "id", + "name" : "it", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_iu", + "owner" : "id", + "name" : "iu", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_iv", + "owner" : "id", + "name" : "iv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_iw", + "owner" : "id", + "name" : "iw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ix", + "owner" : "id", + "name" : "ix", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ja", + "owner" : "id", + "name" : "ja", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jb", + "owner" : "id", + "name" : "jb", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jc", + "owner" : "id", + "name" : "jc", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jd", + "owner" : "id", + "name" : "jd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_je", + "owner" : "id", + "name" : "je", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jf", + "owner" : "id", + "name" : "jf", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jg", + "owner" : "id", + "name" : "jg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jh", + "owner" : "id", + "name" : "jh", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ji", + "owner" : "id", + "name" : "ji", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jj", + "owner" : "id", + "name" : "jj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jk", + "owner" : "id", + "name" : "jk", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jl", + "owner" : "id", + "name" : "jl", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jm", + "owner" : "id", + "name" : "jm", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jn", + "owner" : "id", + "name" : "jn", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jo", + "owner" : "id", + "name" : "jo", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jp", + "owner" : "id", + "name" : "jp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jq", + "owner" : "id", + "name" : "jq", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jr", + "owner" : "id", + "name" : "jr", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_js", + "owner" : "id", + "name" : "js", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jt", + "owner" : "id", + "name" : "jt", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ju", + "owner" : "id", + "name" : "ju", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jv", + "owner" : "id", + "name" : "jv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jw", + "owner" : "id", + "name" : "jw", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jx", + "owner" : "id", + "name" : "jx", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jy", + "owner" : "id", + "name" : "jy", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_jz", + "owner" : "id", + "name" : "jz", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_kd", + "owner" : "id", + "name" : "kd", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ke", + "owner" : "id", + "name" : "ke", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_kf", + "owner" : "id", + "name" : "kf", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_kg", + "owner" : "id", + "name" : "kg", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_kj", + "owner" : "id", + "name" : "kj", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_km", + "owner" : "id", + "name" : "km", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_kp", + "owner" : "id", + "name" : "kp", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ks", + "owner" : "id", + "name" : "ks", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_kv", + "owner" : "id", + "name" : "kv", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ky", + "owner" : "id", + "name" : "ky", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_l", + "owner" : "id", + "name" : "l", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_x", + "owner" : "id", + "name" : "x", + "access" : 9, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__id_ab", + "owner" : "id", + "name" : "ab", + "access" : 8, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__ij_ak", + "owner" : "ij", + "name" : "ak", + "access" : 8, + "descriptor" : "Ljava/awt/Image;" + }, { + "field" : "__iy_f", + "owner" : "iy", + "name" : "f", + "access" : 25, + "descriptor" : "Liy;" + }, { + "field" : "__iy_m", + "owner" : "iy", + "name" : "m", + "access" : 25, + "descriptor" : "Liy;" + }, { + "field" : "__iy_q", + "owner" : "iy", + "name" : "q", + "access" : 25, + "descriptor" : "Liy;" + }, { + "field" : "__iy_w", + "owner" : "iy", + "name" : "w", + "access" : 25, + "descriptor" : "Liy;" + }, { + "field" : "__iy_lo", + "owner" : "iy", + "name" : "lo", + "access" : 8, + "descriptor" : "I", + "decoder" : -365366303 + }, { + "field" : "__is_u", + "owner" : "is", + "name" : "u", + "access" : 25, + "descriptor" : "Lis;" + }, { + "field" : "__is_f", + "owner" : "is", + "name" : "f", + "access" : 24, + "descriptor" : "Lis;" + }, { + "field" : "__is_m", + "owner" : "is", + "name" : "m", + "access" : 24, + "descriptor" : "Lis;" + }, { + "field" : "__is_o", + "owner" : "is", + "name" : "o", + "access" : 24, + "descriptor" : "Lis;" + }, { + "field" : "__is_q", + "owner" : "is", + "name" : "q", + "access" : 24, + "descriptor" : "Lis;" + }, { + "field" : "__is_w", + "owner" : "is", + "name" : "w", + "access" : 24, + "descriptor" : "Lis;" + }, { + "field" : "__ik_cn", + "owner" : "ik", + "name" : "cn", + "access" : 9, + "descriptor" : "I", + "decoder" : -1753937079 + }, { + "field" : "__ik_rt", + "owner" : "ik", + "name" : "rt", + "access" : 8, + "descriptor" : "I", + "decoder" : -1086790653 + }, { + "field" : "__ir_bu", + "owner" : "ir", + "name" : "bu", + "access" : 8, + "descriptor" : "I", + "decoder" : 334735939 + }, { + "field" : "__ir_s", + "owner" : "ir", + "name" : "s", + "access" : 8, + "descriptor" : "I", + "decoder" : -244224193 + }, { + "field" : "__iv_q", + "owner" : "iv", + "name" : "q", + "access" : 8, + "descriptor" : "I", + "decoder" : -1282224505 + }, { + "field" : "__iq_b", + "owner" : "iq", + "name" : "b", + "access" : 9, + "descriptor" : "B" + }, { + "field" : "__iq_f", + "owner" : "iq", + "name" : "f", + "access" : 9, + "descriptor" : "I", + "decoder" : 948359621 + }, { + "field" : "__iq_j", + "owner" : "iq", + "name" : "j", + "access" : 9, + "descriptor" : "I", + "decoder" : 840549915 + }, { + "field" : "__iq_q", + "owner" : "iq", + "name" : "q", + "access" : 9, + "descriptor" : "J", + "decoder" : -4580427166942649525 + }, { + "field" : "__iu_n", + "owner" : "iu", + "name" : "n", + "access" : 8, + "descriptor" : "I", + "decoder" : 662119345 + }, { + "field" : "__iu_e", + "owner" : "iu", + "name" : "e", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__ib_f", + "owner" : "ib", + "name" : "f", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "__ix_f", + "owner" : "ix", + "name" : "f", + "access" : 9, + "descriptor" : "I", + "decoder" : 510774535 + }, { + "field" : "__ix_m", + "owner" : "ix", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__ic_m", + "owner" : "ic", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__iw_f", + "owner" : "iw", + "name" : "f", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "__iw_m", + "owner" : "iw", + "name" : "m", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "__im_q", + "owner" : "im", + "name" : "q", + "access" : 9, + "descriptor" : "I", + "decoder" : 235389995 + }, { + "field" : "__im_f", + "owner" : "im", + "name" : "f", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__ii_f", + "owner" : "ii", + "name" : "f", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__ii_m", + "owner" : "ii", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__ia_u", + "owner" : "ia", + "name" : "u", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__jb_m", + "owner" : "jb", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__jq_f", + "owner" : "jq", + "name" : "f", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "__jq_m", + "owner" : "jq", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__jm_o", + "owner" : "jm", + "name" : "o", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "__jm_f", + "owner" : "jm", + "name" : "f", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "__jm_m", + "owner" : "jm", + "name" : "m", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "__jm_q", + "owner" : "jm", + "name" : "q", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "__jr_o", + "owner" : "jr", + "name" : "o", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "__jr_l", + "owner" : "jr", + "name" : "l", + "access" : 8, + "descriptor" : "[Ldw;" + }, { + "field" : "__jr_u", + "owner" : "jr", + "name" : "u", + "access" : 8, + "descriptor" : "Ler;" + }, { + "field" : "__jr_q", + "owner" : "jr", + "name" : "q", + "access" : 8, + "descriptor" : "Lir;" + }, { + "field" : "__jf_f", + "owner" : "jf", + "name" : "f", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "__jf_m", + "owner" : "jf", + "name" : "m", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__jh_o", + "owner" : "jh", + "name" : "o", + "access" : 9, + "descriptor" : "Ler;" + }, { + "field" : "__jh_f", + "owner" : "jh", + "name" : "f", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__jh_q", + "owner" : "jh", + "name" : "q", + "access" : 9, + "descriptor" : "Lir;" + }, { + "field" : "__jn_by", + "owner" : "jn", + "name" : "by", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__jx_ne", + "owner" : "jx", + "name" : "ne", + "access" : 8, + "descriptor" : "[Lho;" + }, { + "field" : "__ji_i", + "owner" : "ji", + "name" : "i", + "access" : 25, + "descriptor" : "Lji;" + }, { + "field" : "__ji_n", + "owner" : "ji", + "name" : "n", + "access" : 25, + "descriptor" : "Lji;" + }, { + "field" : "__ji_fp", + "owner" : "ji", + "name" : "fp", + "access" : 8, + "descriptor" : "Lfu;" + }, { + "field" : "__ji_a", + "owner" : "ji", + "name" : "a", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_d", + "owner" : "ji", + "name" : "d", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_e", + "owner" : "ji", + "name" : "e", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_f", + "owner" : "ji", + "name" : "f", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_g", + "owner" : "ji", + "name" : "g", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_j", + "owner" : "ji", + "name" : "j", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_k", + "owner" : "ji", + "name" : "k", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_l", + "owner" : "ji", + "name" : "l", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_m", + "owner" : "ji", + "name" : "m", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_o", + "owner" : "ji", + "name" : "o", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_q", + "owner" : "ji", + "name" : "q", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_s", + "owner" : "ji", + "name" : "s", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_t", + "owner" : "ji", + "name" : "t", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_u", + "owner" : "ji", + "name" : "u", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_w", + "owner" : "ji", + "name" : "w", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_x", + "owner" : "ji", + "name" : "x", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ji_z", + "owner" : "ji", + "name" : "z", + "access" : 24, + "descriptor" : "Lji;" + }, { + "field" : "__ks_at", + "owner" : "ks", + "name" : "at", + "access" : 12, + "descriptor" : "Ljava/lang/String;" + }, { + "field" : "__kn_x", + "owner" : "kn", + "name" : "x", + "access" : 8, + "descriptor" : "Ley;" + }, { + "field" : "__kz_o", + "owner" : "kz", + "name" : "o", + "access" : 8, + "descriptor" : "[[[B" + }, { + "field" : "__kz_l", + "owner" : "kz", + "name" : "l", + "access" : 8, + "descriptor" : "Lln;" + }, { + "field" : "__kb_q", + "owner" : "kb", + "name" : "q", + "access" : 24, + "descriptor" : "[C" + }, { + "field" : "__kb_w", + "owner" : "kb", + "name" : "w", + "access" : 24, + "descriptor" : "[C" + }, { + "field" : "__kc_m", + "owner" : "kc", + "name" : "m", + "access" : 9, + "descriptor" : "[C" + }, { + "field" : "__kc_g", + "owner" : "kc", + "name" : "g", + "access" : 8, + "descriptor" : "[[[B" + }, { + "field" : "__kc_f", + "owner" : "kc", + "name" : "f", + "access" : 8, + "descriptor" : "[C" + }, { + "field" : "__kc_q", + "owner" : "kc", + "name" : "q", + "access" : 8, + "descriptor" : "[C" + }, { + "field" : "__kc_w", + "owner" : "kc", + "name" : "w", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__kw_n", + "owner" : "kw", + "name" : "n", + "access" : 8, + "descriptor" : "Llq;" + }, { + "field" : "__ka_e", + "owner" : "ka", + "name" : "e", + "access" : 8, + "descriptor" : "I", + "decoder" : -2077113503 + }, { + "field" : "__lp_ca", + "owner" : "lp", + "name" : "ca", + "access" : 8, + "descriptor" : "Z" + }, { + "field" : "__lj_m", + "owner" : "lj", + "name" : "m", + "access" : 25, + "descriptor" : "Llj;" + }, { + "field" : "__lj_f", + "owner" : "lj", + "name" : "f", + "access" : 24, + "descriptor" : "Llj;" + }, { + "field" : "__lj_q", + "owner" : "lj", + "name" : "q", + "access" : 24, + "descriptor" : "Llj;" + }, { + "field" : "__lr_e", + "owner" : "lr", + "name" : "e", + "access" : 8, + "descriptor" : "[[B" + }, { + "field" : "__lr_f", + "owner" : "lr", + "name" : "f", + "access" : 8, + "descriptor" : "I", + "decoder" : 161627197 + }, { + "field" : "__lr_m", + "owner" : "lr", + "name" : "m", + "access" : 8, + "descriptor" : "I", + "decoder" : -1119867679 + }, { + "field" : "__lr_q", + "owner" : "lr", + "name" : "q", + "access" : 8, + "descriptor" : "I", + "decoder" : -76329055 + }, { + "field" : "__lr_l", + "owner" : "lr", + "name" : "l", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__lr_o", + "owner" : "lr", + "name" : "o", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__lr_w", + "owner" : "lr", + "name" : "w", + "access" : 8, + "descriptor" : "[I" + }, { + "field" : "__lx_e", + "owner" : "lx", + "name" : "e", + "access" : 25, + "descriptor" : "Llx;" + }, { + "field" : "__lx_m", + "owner" : "lx", + "name" : "m", + "access" : 25, + "descriptor" : "Llx;" + }, { + "field" : "__lx_f", + "owner" : "lx", + "name" : "f", + "access" : 24, + "descriptor" : "Llx;" + }, { + "field" : "__lx_g", + "owner" : "lx", + "name" : "g", + "access" : 24, + "descriptor" : "Llx;" + }, { + "field" : "__lx_l", + "owner" : "lx", + "name" : "l", + "access" : 24, + "descriptor" : "Llx;" + }, { + "field" : "__lx_o", + "owner" : "lx", + "name" : "o", + "access" : 24, + "descriptor" : "Llx;" + }, { + "field" : "__lx_q", + "owner" : "lx", + "name" : "q", + "access" : 24, + "descriptor" : "Llx;" + }, { + "field" : "__lx_u", + "owner" : "lx", + "name" : "u", + "access" : 24, + "descriptor" : "Llx;" + }, { + "field" : "__lx_w", + "owner" : "lx", + "name" : "w", + "access" : 24, + "descriptor" : "Llx;" + } ], + "methods" : [ { + "method" : "AbstractFont_drawGlyph", + "owner" : "kt", + "name" : "ah", + "access" : 8, + "parameters" : [ "pixels", "x", "y", "width", "height", "color" ], + "descriptor" : "([BIIIII)V" + }, { + "method" : "AbstractFont_drawGlyphAlpha", + "owner" : "kt", + "name" : "aw", + "access" : 8, + "parameters" : [ "pixels", "x", "y", "width", "height", "color", "alpha" ], + "descriptor" : "([BIIIIII)V" + }, { + "method" : "AbstractFont_placeGlyph", + "owner" : "kt", + "name" : "ak", + "access" : 8, + "descriptor" : "([I[BIIIIIII)V" + }, { + "method" : "AbstractFont_placeGlyphAlpha", + "owner" : "kt", + "name" : "al", + "access" : 8, + "descriptor" : "([I[BIIIIIIII)V" + }, { + "method" : "ByteArrayPool_get", + "owner" : "gi", + "name" : "f", + "access" : 40, + "descriptor" : "(IZI)[B" + }, { + "method" : "Bzip2Decompressor_decompress", + "owner" : "gk", + "name" : "m", + "access" : 9, + "descriptor" : "([BI[BII)I" + }, { + "method" : "IterableNodeDeque_addBefore", + "owner" : "ja", + "name" : "w", + "access" : 9, + "parameters" : [ "node", "old" ], + "descriptor" : "(Lgw;Lgw;)V" + }, { + "method" : "PcmStream_disable", + "owner" : "hm", + "name" : "al", + "access" : 24, + "parameters" : [ "stream" ], + "descriptor" : "(Ldc;B)V" + }, { + "method" : "Rasterizer2D_clear", + "owner" : "lf", + "name" : "dd", + "access" : 9, + "descriptor" : "()V" + }, { + "method" : "Rasterizer2D_drawHorizontalLine", + "owner" : "lf", + "name" : "dj", + "access" : 9, + "parameters" : [ "x", "y", "length", "color" ], + "descriptor" : "(IIII)V" + }, { + "method" : "Rasterizer2D_drawHorizontalLineAlpha", + "owner" : "lf", + "name" : "du", + "access" : 8, + "parameters" : [ "x", "y", "length", "rgb", "alpha" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "Rasterizer2D_drawLine", + "owner" : "lf", + "name" : "et", + "access" : 9, + "parameters" : [ "x0", "y0", "x1", "y1", "color" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "Rasterizer2D_drawRectangle", + "owner" : "lf", + "name" : "dh", + "access" : 9, + "parameters" : [ "x", "y", "width", "height", "color" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "Rasterizer2D_drawRectangleAlpha", + "owner" : "lf", + "name" : "dz", + "access" : 9, + "parameters" : [ "x", "y", "width", "height", "rgb", "alpha" ], + "descriptor" : "(IIIIII)V" + }, { + "method" : "Rasterizer2D_drawVerticalLine", + "owner" : "lf", + "name" : "dm", + "access" : 9, + "parameters" : [ "x", "y", "length", "color" ], + "descriptor" : "(IIII)V" + }, { + "method" : "Rasterizer2D_drawVerticalLineAlpha", + "owner" : "lf", + "name" : "dq", + "access" : 8, + "parameters" : [ "x", "y", "length", "rgb", "alpha" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "Rasterizer2D_expandClip", + "owner" : "lf", + "name" : "dc", + "access" : 9, + "parameters" : [ "xStart", "yStart", "xEnd", "yEnd" ], + "descriptor" : "(IIII)V" + }, { + "method" : "Rasterizer2D_fillRectangle", + "owner" : "lf", + "name" : "dr", + "access" : 9, + "parameters" : [ "x", "y", "width", "height", "color" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "Rasterizer2D_getClipArray", + "owner" : "lf", + "name" : "dg", + "access" : 9, + "parameters" : [ "dst" ], + "descriptor" : "([I)V" + }, { + "method" : "Rasterizer2D_replace", + "owner" : "lf", + "name" : "dp", + "access" : 9, + "parameters" : [ "pixels", "width", "height" ], + "descriptor" : "([III)V" + }, { + "method" : "Rasterizer2D_resetClip", + "owner" : "lf", + "name" : "ds", + "access" : 9, + "descriptor" : "()V" + }, { + "method" : "Rasterizer2D_setClip", + "owner" : "lf", + "name" : "di", + "access" : 9, + "parameters" : [ "xStart", "yStart", "xEnd", "yEnd" ], + "descriptor" : "(IIII)V" + }, { + "method" : "Rasterizer2D_setClipArray", + "owner" : "lf", + "name" : "db", + "access" : 9, + "parameters" : [ "src" ], + "descriptor" : "([I)V" + }, { + "method" : "Rasterizer2D_setPixel", + "owner" : "lf", + "name" : "eb", + "access" : 8, + "parameters" : [ "x", "y", "color" ], + "descriptor" : "(III)V" + }, { + "method" : "Rasterizer3D_brighten", + "owner" : "et", + "name" : "l", + "access" : 8, + "parameters" : [ "rgb", "brightness" ], + "descriptor" : "(ID)I" + }, { + "method" : "Rasterizer3D_buildPalette", + "owner" : "et", + "name" : "g", + "access" : 24, + "parameters" : [ "brightness", "hsMin", "hsMax" ], + "descriptor" : "(DII)V" + }, { + "method" : "Rasterizer3D_method1", + "owner" : "et", + "name" : "m", + "access" : 25, + "descriptor" : "()V" + }, { + "method" : "Rasterizer3D_method3", + "owner" : "et", + "name" : "q", + "access" : 25, + "descriptor" : "()V" + }, { + "method" : "Rasterizer3D_setBrightness", + "owner" : "et", + "name" : "u", + "access" : 25, + "parameters" : [ "brightness" ], + "descriptor" : "(D)V" + }, { + "method" : "Rasterizer3D_setClip", + "owner" : "et", + "name" : "f", + "access" : 24, + "parameters" : [ "xStart", "yStart", "xEnd", "yEnd" ], + "descriptor" : "(IIII)V" + }, { + "method" : "Rasterizer3D_setTextureLoader", + "owner" : "et", + "name" : "o", + "access" : 25, + "parameters" : [ "textureLoader" ], + "descriptor" : "(Lei;)V" + }, { + "method" : "Scene_addOccluder", + "owner" : "em", + "name" : "w", + "access" : 9, + "descriptor" : "(IIIIIIII)V" + }, { + "method" : "Scene_buildVisiblityMap", + "owner" : "em", + "name" : "at", + "access" : 9, + "parameters" : [ "a", "b", "c", "viewportWidth", "viewportHeight" ], + "descriptor" : "([IIIII)V" + }, { + "method" : "addMessage", + "owner" : "g", + "name" : "f", + "access" : 8, + "parameters" : [ "type", "sender", "text", "prefix" ], + "descriptor" : "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V" + }, { + "method" : "addNpcToMenu", + "owner" : "dj", + "name" : "is", + "access" : 24, + "parameters" : [ "npc", "menuArg0", "menuArg1", "menuArg2" ], + "descriptor" : "(Ljz;IIIB)V" + }, { + "method" : "addPlayerToMenu", + "owner" : "e", + "name" : "ik", + "access" : 24, + "parameters" : [ "player", "menuArg0", "menuArg1", "menuArg2" ], + "descriptor" : "(Lbr;IIII)V" + }, { + "method" : "addPlayerToScene", + "owner" : "aw", + "name" : "gk", + "access" : 8, + "parameters" : [ "player", "b" ], + "descriptor" : "(Lbr;ZI)V" + }, { + "method" : "alignWidget", + "owner" : "client", + "name" : "ip", + "access" : 0, + "parameters" : [ "widget" ], + "descriptor" : "(Lho;B)V" + }, { + "method" : "alignWidgetPosition", + "owner" : "jf", + "name" : "iw", + "access" : 8, + "parameters" : [ "widget", "parentWidth", "parentHeight" ], + "descriptor" : "(Lho;IIB)V" + }, { + "method" : "alignWidgetSize", + "owner" : "p", + "name" : "ic", + "access" : 8, + "parameters" : [ "widget", "parentWidth", "parentHeight", "b" ], + "descriptor" : "(Lho;IIZB)V" + }, { + "method" : "byteArrayFromObject", + "owner" : "dl", + "name" : "u", + "access" : 9, + "parameters" : [ "o", "copyArray" ], + "descriptor" : "(Ljava/lang/Object;ZB)[B" + }, { + "method" : "byteArrayToObject", + "owner" : "cb", + "name" : "o", + "access" : 9, + "parameters" : [ "bytes", "copyArray" ], + "descriptor" : "([BZB)Ljava/lang/Object;" + }, { + "method" : "charToByteCp1252", + "owner" : "cr", + "name" : "m", + "access" : 9, + "parameters" : [ "c" ], + "descriptor" : "(CI)B" + }, { + "method" : "clearIntArray", + "owner" : "hh", + "name" : "x", + "access" : 9, + "descriptor" : "([III)V" + }, { + "method" : "clickWidget", + "owner" : "cq", + "name" : "jf", + "access" : 24, + "parameters" : [ "widget", "x", "y" ], + "descriptor" : "(Lho;III)V" + }, { + "method" : "closeWidgetGroup", + "owner" : "cs", + "name" : "jd", + "access" : 24, + "parameters" : [ "w", "b" ], + "descriptor" : "(Lbx;ZI)V" + }, { + "method" : "colorStartTag", + "owner" : "dy", + "name" : "f", + "access" : 8, + "parameters" : [ "color" ], + "descriptor" : "(II)Ljava/lang/String;" + }, { + "method" : "compareWorlds", + "owner" : "aj", + "name" : "u", + "access" : 8, + "parameters" : [ "w0", "w1", "mode", "b" ], + "descriptor" : "(Lbt;Lbt;IZI)I" + }, { + "method" : "currentTimeMs", + "owner" : "ga", + "name" : "m", + "access" : 41, + "parameters" : [ ], + "descriptor" : "(I)J" + }, { + "method" : "decodeStringCp1252", + "owner" : "bx", + "name" : "o", + "access" : 9, + "parameters" : [ "src", "srcStart", "length" ], + "descriptor" : "([BIII)Ljava/lang/String;" + }, { + "method" : "decompressBytes", + "owner" : "id", + "name" : "ay", + "access" : 24, + "descriptor" : "([BI)[B" + }, { + "method" : "doCycle", + "owner" : "client", + "name" : "al", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "doCycleJs5", + "owner" : "client", + "name" : "ef", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "doCycleJs5Connect", + "owner" : "client", + "name" : "ev", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "doCycleLoggedIn", + "owner" : "client", + "name" : "fx", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "doCycleLoggedOut", + "owner" : "client", + "name" : "fg", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)V" + }, { + "method" : "draw", + "owner" : "client", + "name" : "ab", + "access" : 20, + "descriptor" : "(ZI)V" + }, { + "method" : "drawActor2d", + "owner" : "at", + "name" : "gr", + "access" : 24, + "parameters" : [ "actor", "a", "b", "c", "d", "e" ], + "descriptor" : "(Lbz;IIIIIB)V" + }, { + "method" : "drawLoadingMessage", + "owner" : "bi", + "name" : "gl", + "access" : 24, + "descriptor" : "(Ljava/lang/String;ZI)V" + }, { + "method" : "drawLoggedIn", + "owner" : "client", + "name" : "gs", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "drawTitle", + "owner" : "bd", + "name" : "x", + "access" : 8, + "descriptor" : "(Lkk;Lkk;Lkk;I)V" + }, { + "method" : "drawWidgetGroup", + "owner" : "az", + "name" : "ir", + "access" : 24, + "descriptor" : "([Lho;IIIIIIIII)V" + }, { + "method" : "encodeStringCp1252", + "owner" : "dt", + "name" : "w", + "access" : 9, + "parameters" : [ "src", "srcStart", "srcEnd", "dst", "dstStart" ], + "descriptor" : "(Ljava/lang/CharSequence;II[BII)I" + }, { + "method" : "escapeBrackets", + "owner" : "kt", + "name" : "s", + "access" : 9, + "parameters" : [ "s" ], + "descriptor" : "(Ljava/lang/String;)Ljava/lang/String;" + }, { + "method" : "findEnumerated", + "owner" : "bn", + "name" : "m", + "access" : 9, + "parameters" : [ "values", "ordinal" ], + "descriptor" : "([Lgc;II)Lgc;" + }, { + "method" : "getFrames", + "owner" : "bc", + "name" : "x", + "access" : 8, + "parameters" : [ "id" ], + "descriptor" : "(II)Len;" + }, { + "method" : "getHitSplatDefinition", + "owner" : "bp", + "name" : "f", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(II)Ljm;" + }, { + "method" : "getItemDefinition", + "owner" : "hc", + "name" : "m", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(II)Ljv;" + }, { + "method" : "getItemSprite", + "owner" : "ht", + "name" : "d", + "access" : 25, + "parameters" : [ "id", "quantity", "n0", "n1", "n2", "b0" ], + "descriptor" : "(IIIIIZI)Lln;" + }, { + "method" : "getKitDefinition", + "owner" : "as", + "name" : "m", + "access" : 9, + "descriptor" : "(II)Lim;" + }, { + "method" : "getNpcDefinition", + "owner" : "jr", + "name" : "f", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(II)Ljz;" + }, { + "method" : "getObjectDefinition", + "owner" : "af", + "name" : "f", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(II)Ljr;" + }, { + "method" : "getParamKeyDefinition", + "owner" : "hz", + "name" : "m", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(IB)Ljb;" + }, { + "method" : "getPreferencesFile", + "owner" : "gl", + "name" : "q", + "access" : 9, + "descriptor" : "(Ljava/lang/String;Ljava/lang/String;ZS)Ldk;" + }, { + "method" : "getSequenceDefinition", + "owner" : "ae", + "name" : "m", + "access" : 9, + "descriptor" : "(II)Ljh;" + }, { + "method" : "getSpotAnimationDefinition", + "owner" : "af", + "name" : "m", + "access" : 9, + "descriptor" : "(IB)Lio;" + }, { + "method" : "getTileHeight", + "owner" : "ay", + "name" : "gu", + "access" : 24, + "descriptor" : "(IIII)I" + }, { + "method" : "getVarbit", + "owner" : "ah", + "name" : "m", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(II)I" + }, { + "method" : "getWidget", + "owner" : "gd", + "name" : "m", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(IB)Lho;" + }, { + "method" : "getWidgetChild", + "owner" : "gx", + "name" : "f", + "access" : 9, + "descriptor" : "(III)Lho;" + }, { + "method" : "getWidgetClickMask", + "owner" : "f", + "name" : "kp", + "access" : 8, + "parameters" : [ "widget" ], + "descriptor" : "(Lho;I)I" + }, { + "method" : "getWorldMapElement", + "owner" : "dm", + "name" : "m", + "access" : 9, + "parameters" : [ "id" ], + "descriptor" : "(IB)Lic;" + }, { + "method" : "hashString", + "owner" : "client", + "name" : "l", + "access" : 9, + "parameters" : [ "chars" ], + "descriptor" : "(Ljava/lang/CharSequence;I)I" + }, { + "method" : "init", + "owner" : "client", + "name" : "init", + "access" : 17, + "parameters" : [ ], + "descriptor" : "()V" + }, { + "method" : "insertMenuItem", + "owner" : "j", + "name" : "il", + "access" : 24, + "parameters" : [ "action", "targetName", "opcode", "arg0", "arg1", "arg2", "b" ], + "descriptor" : "(Ljava/lang/String;Ljava/lang/String;IIIIZB)V" + }, { + "method" : "itemContainerSetItem", + "owner" : "al", + "name" : "w", + "access" : 8, + "parameters" : [ "itemContainerId", "index", "itemId", "itemQuantity" ], + "descriptor" : "(IIIII)V" + }, { + "method" : "js5Error", + "owner" : "client", + "name" : "ea", + "access" : 0, + "parameters" : [ "code" ], + "descriptor" : "(IS)V" + }, { + "method" : "kill0", + "owner" : "client", + "name" : "ae", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "loadClassFromDescriptor", + "owner" : "iw", + "name" : "w", + "access" : 8, + "parameters" : [ "descriptor" ], + "descriptor" : "(Ljava/lang/String;I)Ljava/lang/Class;" + }, { + "method" : "loadRegions", + "owner" : "af", + "name" : "gc", + "access" : 24, + "parameters" : [ "isInInstance", "packetBuffer" ], + "descriptor" : "(ZLhx;B)V" + }, { + "method" : "loadTerrain", + "owner" : "e", + "name" : "o", + "access" : 24, + "parameters" : [ "buffer", "plane", "x", "y", "x0", "y0", "n" ], + "descriptor" : "(Lgr;IIIIIIB)V" + }, { + "method" : "loadWidgetGroup", + "owner" : "dr", + "name" : "q", + "access" : 9, + "parameters" : [ "widgetGroup" ], + "descriptor" : "(IB)Z" + }, { + "method" : "loadWorlds", + "owner" : "ji", + "name" : "m", + "access" : 8, + "parameters" : [ ], + "descriptor" : "(I)Z" + }, { + "method" : "menuAction", + "owner" : "bz", + "name" : "hb", + "access" : 24, + "parameters" : [ "argument1", "argument2", "opcode", "argument0", "action", "targetName", "mouseX", "mouseY" ], + "descriptor" : "(IIIILjava/lang/String;Ljava/lang/String;III)V" + }, { + "method" : "newIndexCache", + "owner" : "c", + "name" : "fw", + "access" : 8, + "descriptor" : "(IZZZB)Lit;" + }, { + "method" : "newPcmPlayer", + "owner" : "cq", + "name" : "aj", + "access" : 25, + "descriptor" : "(Lfz;III)Lco;" + }, { + "method" : "newScript", + "owner" : "ee", + "name" : "w", + "access" : 8, + "parameters" : [ "bytes" ], + "descriptor" : "([BI)Lcg;" + }, { + "method" : "openMenu", + "owner" : "client", + "name" : "hj", + "access" : 16, + "parameters" : [ "x", "y" ], + "descriptor" : "(IIB)V" + }, { + "method" : "queueSoundEffect", + "owner" : "ks", + "name" : "fv", + "access" : 8, + "descriptor" : "(IIIB)V" + }, { + "method" : "readMusicSample", + "owner" : "cd", + "name" : "e", + "access" : 8, + "descriptor" : "(Lir;II)Lcd;" + }, { + "method" : "readSoundEffect", + "owner" : "ci", + "name" : "m", + "access" : 9, + "descriptor" : "(Lir;II)Lci;" + }, { + "method" : "readSprite", + "owner" : "le", + "name" : "m", + "access" : 9, + "parameters" : [ "indexCache", "index", "record" ], + "descriptor" : "(Lir;III)Lln;" + }, { + "method" : "readStringIntParameters", + "owner" : "ir", + "name" : "m", + "access" : 24, + "parameters" : [ "buffer", "hashTable" ], + "descriptor" : "(Lgr;Llh;I)Llh;" + }, { + "method" : "readTrack", + "owner" : "he", + "name" : "m", + "access" : 9, + "descriptor" : "(Lir;II)Lhe;" + }, { + "method" : "requestNetFile", + "owner" : "hx", + "name" : "f", + "access" : 8, + "descriptor" : "(Lit;IIIBZI)V" + }, { + "method" : "runCs1", + "owner" : "il", + "name" : "im", + "access" : 24, + "parameters" : [ "widget" ], + "descriptor" : "(Lho;I)Z" + }, { + "method" : "runScript", + "owner" : "ir", + "name" : "m", + "access" : 9, + "parameters" : [ "scriptEvent" ], + "descriptor" : "(Lby;S)V" + }, { + "method" : "runScript0", + "owner" : "l", + "name" : "f", + "access" : 8, + "parameters" : [ "scriptEvent", "n" ], + "descriptor" : "(Lby;II)V" + }, { + "method" : "sendStackTrace", + "owner" : "jz", + "name" : "m", + "access" : 9, + "descriptor" : "(Ljava/lang/String;Ljava/lang/Throwable;I)V" + }, { + "method" : "setUp", + "owner" : "client", + "name" : "aw", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "setViewportShape", + "owner" : "kx", + "name" : "gg", + "access" : 24, + "parameters" : [ "x", "y", "width", "height", "clear" ], + "descriptor" : "(IIIIZI)V" + }, { + "method" : "updateExternalPlayer", + "owner" : "ie", + "name" : "o", + "access" : 8, + "descriptor" : "(Lhx;II)Z" + }, { + "method" : "updateGameState", + "owner" : "ba", + "name" : "ec", + "access" : 8, + "parameters" : [ "gameState" ], + "descriptor" : "(IB)V" + }, { + "method" : "updatePlayer", + "owner" : "k", + "name" : "m", + "access" : 24, + "descriptor" : "(Lhx;B)V" + }, { + "method" : "updateWidgetGroup", + "owner" : "il", + "name" : "jr", + "access" : 24, + "parameters" : [ "widgets", "parentId", "a", "b", "c", "d", "x", "y" ], + "descriptor" : "([Lho;IIIIIIII)V" + }, { + "method" : "username", + "owner" : "client", + "name" : "kr", + "access" : 1, + "descriptor" : "(B)Lkp;" + }, { + "method" : "worldMap", + "owner" : "dy", + "name" : "er", + "access" : 8, + "descriptor" : "(I)Llz;" + }, { + "method" : "worldToMinimap", + "owner" : "ep", + "name" : "jk", + "access" : 24, + "descriptor" : "(IIIILln;Lhp;I)V" + }, { + "method" : "worldToScreen", + "owner" : "aj", + "name" : "gx", + "access" : 24, + "descriptor" : "(IIII)V" + }, { + "method" : "__au_135", + "owner" : "client", + "name" : "au", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__j_136", + "owner" : "client", + "name" : "j", + "access" : 20, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__ge_137", + "owner" : "client", + "name" : "ge", + "access" : 0, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__hg_138", + "owner" : "client", + "name" : "hg", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(Lcl;I)Z" + }, { + "method" : "__hi_139", + "owner" : "client", + "name" : "hi", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + }, { + "method" : "__ht_140", + "owner" : "client", + "name" : "ht", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(B)Z" + }, { + "method" : "__iu_141", + "owner" : "client", + "name" : "iu", + "access" : 16, + "parameters" : [ "arg0" ], + "descriptor" : "(ZI)V" + }, { + "method" : "__jh_142", + "owner" : "client", + "name" : "jh", + "access" : 16, + "parameters" : [ ], + "descriptor" : "(I)V" + } ], + "constructors" : [ { + "access" : 1, + "descriptor" : "()V" + } ] +} ] \ No newline at end of file diff --git a/deobfuscator/src/test/resources/deob-test.properties b/deobfuscator/src/test/resources/deob-test.properties new file mode 100644 index 0000000000..9d858d1a0b --- /dev/null +++ b/deobfuscator/src/test/resources/deob-test.properties @@ -0,0 +1,3 @@ +rs.client=${net.runelite.rs:rs-client:jar} +rs.version=${rs.version} +vanilla.client=${net.runelite.rs:vanilla:jar} \ No newline at end of file diff --git a/http-api/pom.xml b/http-api/pom.xml new file mode 100644 index 0000000000..ccd886a376 --- /dev/null +++ b/http-api/pom.xml @@ -0,0 +1,118 @@ + + + + 4.0.0 + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + Web API + http-api + + + 1.4 + + 2.2.6 + + nogit + false + + + + + com.squareup.okhttp3 + okhttp + + + com.google.code.gson + gson + + + org.slf4j + slf4j-api + + + org.projectlombok + lombok + provided + + + org.apache.commons + commons-csv + ${commons.csv.version} + + + + junit + junit + + + org.slf4j + slf4j-simple + + + com.squareup.okhttp3 + mockwebserver + + + + + + + src/main/resources + true + + + + + pl.project13.maven + git-commit-id-plugin + ${maven.git.commit.id.version} + + + query-git-info + + revision + + + false + false + + true + + + git.commit.id.abbrev + git.dirty + + + + + + + + diff --git a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java new file mode 100644 index 0000000000..7d256096b6 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import okhttp3.HttpUrl; +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +public class RuneLiteAPI +{ + public static final String RUNELITE_AUTH = "RUNELITE-AUTH"; + public static final OkHttpClient CLIENT; + public static final OkHttpClient RLP_CLIENT; + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static final Logger logger = LoggerFactory.getLogger(RuneLiteAPI.class); + private static final String BASE = "https://api.runelite.net"; + private static final String PLUS_BASE = "https://api.runelitepl.us"; + private static final String RLPLUS = "https://session.runelitepl.us"; + private static final String WSBASE = "https://api.runelite.net/ws"; + private static final String STATICBASE = "https://static.runelite.net"; + private static final String MAVEN_METADATA = + "http://repo.runelite.net/net/runelite/runelite-parent/maven-metadata.xml"; + private static final String GITHUB_API = "https://api.github.com/repos/runelite/runelite/commits/master"; + private static final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; + private static final Properties properties = new Properties(); + private static String userAgent; + private static String rlpUserAgent; + private static String version; + private static String rlpVersion; + private static int rsVersion; + + static + { + try + { + InputStream in = RuneLiteAPI.class.getResourceAsStream("/runelite.properties"); + properties.load(in); + + parseMavenVersion(); + String commit = parseGithubCommit(); + + rlpVersion = properties.getProperty("runelite.version"); + rsVersion = Integer.parseInt(properties.getProperty("rs.version")); + String rlpCommit = properties.getProperty("runelite.commit"); + boolean dirty = Boolean.parseBoolean(properties.getProperty("runelite.dirty")); + + userAgent = "RuneLite/" + version + "-" + commit + (dirty ? "+" : ""); + rlpUserAgent = "RuneLite/" + rlpVersion + "-" + rlpCommit + (dirty ? "+" : ""); + } + catch (NumberFormatException e) + { + throw new RuntimeException("Version string has not been substituted; Re-run maven"); + } + catch (IOException ex) + { + logger.error(null, ex); + } + + CLIENT = new OkHttpClient.Builder() + .pingInterval(30, TimeUnit.SECONDS) + .addNetworkInterceptor(new Interceptor() + { + @Override + public Response intercept(Chain chain) throws IOException + { + Request userAgentRequest = chain.request() + .newBuilder() + .header("User-Agent", userAgent) + .build(); + return chain.proceed(userAgentRequest); + } + }) + .build(); + + RLP_CLIENT = new OkHttpClient.Builder() + .pingInterval(30, TimeUnit.SECONDS) + .addNetworkInterceptor(new Interceptor() + { + @Override + public Response intercept(Chain chain) throws IOException + { + Request userAgentRequest = chain.request() + .newBuilder() + .header("User-Agent", rlpUserAgent) + .build(); + return chain.proceed(userAgentRequest); + } + }) + .build(); + } + + public static HttpUrl getSessionBase() + { + final String prop = System.getProperty("runelite.session.url"); + + if (prop != null && !prop.isEmpty()) + { + return HttpUrl.parse(prop); + } + + return HttpUrl.parse(BASE + "/session"); + } + + public static HttpUrl getRuneLitePlusSessionBase() + { + return HttpUrl.parse(RLPLUS); + } + + public static HttpUrl getApiBase() + { + final String prop = System.getProperty("runelite.http-service.url"); + + if (prop != null && !prop.isEmpty()) + { + return HttpUrl.parse(prop); + } + + return HttpUrl.parse(BASE + "/runelite-" + getVersion()); + } + + public static HttpUrl getPlusApiBase() + { + return HttpUrl.parse(PLUS_BASE + "/runelite-" + getRlpVersion()); + } + + public static HttpUrl getStaticBase() + { + final String prop = System.getProperty("runelite.static.url"); + + if (prop != null && !prop.isEmpty()) + { + return HttpUrl.parse(prop); + } + + return HttpUrl.parse(STATICBASE); + } + + public static HttpUrl getWsEndpoint() + { + final String prop = System.getProperty("runelite.ws.url"); + + if (prop != null && !prop.isEmpty()) + { + return HttpUrl.parse(prop); + } + + return HttpUrl.parse(WSBASE); + } + + public static String getVersion() + { + return version; + } + + public static void setVersion(String version) + { + RuneLiteAPI.version = version; + } + + public static int getRsVersion() + { + return rsVersion; + } + + public static String getRlpVersion() + { + return rlpVersion; + } + + private static byte[] downloadUrl(URL toDownload) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + InputStream stream; + try + { + byte[] chunk = new byte[4096]; + int bytesRead; + URLConnection conn = toDownload.openConnection(); + conn.setRequestProperty("User-Agent", toDownload.getHost().contains("runelite") ? randomAlphaNumeric(8) : "runelite-extended"); + stream = conn.getInputStream(); + + while ((bytesRead = stream.read(chunk)) > 0) + { + outputStream.write(chunk, 0, bytesRead); + } + stream.close(); + } + catch (IOException e) + { + e.printStackTrace(); + return null; + } + + return outputStream.toByteArray(); + } + + private static void parseMavenVersion() + { + try (ByteArrayInputStream fis = new ByteArrayInputStream(downloadUrl(new URL(MAVEN_METADATA)))) + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + factory.setIgnoringElementContentWhitespace(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(fis); + NodeList versionList = doc.getElementsByTagName("version"); + for (int i = 0; i != versionList.getLength(); i++) + { + Node node = versionList.item(i); + if (node.getTextContent() != null) + { + version = node.getTextContent(); + } + } + } + catch (ParserConfigurationException | IOException | SAXException ex) + { + logger.error(null, ex); + } + } + + private static String parseGithubCommit() + { + try + { + byte[] commits = downloadUrl(new URL(GITHUB_API)); + + if (commits == null) + { + return null; + } + + String jsonData = new String(commits); + + for (String s : jsonData.split("\n")) + { + if (s.startsWith("\"sha\":")) + { + s = s.replace(",", ""); + s = s.replace(" ", ""); + s = s.replace("\"", ""); + return s.split(":")[1]; + } + } + } + catch (MalformedURLException e) + { + e.printStackTrace(); + } + return null; + } + + private static String randomAlphaNumeric(int count) + { + StringBuilder builder = new StringBuilder(); + while (count-- != 0) + { + int character = (int) (Math.random() * ALPHA_NUMERIC_STRING.length()); + builder.append(ALPHA_NUMERIC_STRING.charAt(character)); + } + return builder.toString(); + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/account/AccountClient.java b/http-api/src/main/java/net/runelite/http/api/account/AccountClient.java new file mode 100644 index 0000000000..0a286cd70e --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/account/AccountClient.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.account; + +import com.google.gson.JsonParseException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.UUID; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AccountClient +{ + private static final Logger logger = LoggerFactory.getLogger(AccountClient.class); + + private UUID uuid; + + public AccountClient() + { + } + + public AccountClient(UUID uuid) + { + this.uuid = uuid; + } + + public OAuthResponse login() throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("account") + .addPathSegment("login") + .addQueryParameter("uuid", uuid.toString()) + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), OAuthResponse.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public void logout() throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("account") + .addPathSegment("logout") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + logger.debug("Sent logout request"); + } + } + + public boolean sessionCheck() + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("account") + .addPathSegment("session-check") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + catch (IOException ex) + { + logger.debug("Unable to verify session", ex); + return true; // assume it is still valid if the server is unreachable + } + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/account/OAuthResponse.java b/http-api/src/main/java/net/runelite/http/api/account/OAuthResponse.java new file mode 100644 index 0000000000..dc9d3c34ad --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/account/OAuthResponse.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.account; + +import java.util.UUID; + +public class OAuthResponse +{ + private String oauthUrl; + private UUID uid; + + public String getOauthUrl() + { + return oauthUrl; + } + + public void setOauthUrl(String oauthUrl) + { + this.oauthUrl = oauthUrl; + } + + public UUID getUid() + { + return uid; + } + + public void setUid(UUID uid) + { + this.uid = uid; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/animation/AnimationClient.java b/http-api/src/main/java/net/runelite/http/api/animation/AnimationClient.java new file mode 100644 index 0000000000..7da50db2f4 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/animation/AnimationClient.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.animation; + +import com.google.gson.JsonParseException; +import com.google.gson.reflect.TypeToken; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AnimationClient +{ + private static final MediaType JSON = MediaType.parse("application/json"); + + private static final Logger logger = LoggerFactory.getLogger(AnimationClient.class); + + public void submit(AnimationRequest animationRequest) + { + String json = RuneLiteAPI.GSON.toJson(animationRequest); + + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("animation") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .post(RequestBody.create(JSON, json)) + .url(url) + .build(); + + try + { + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + logger.debug("animation response " + response.code()); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + + RuneLiteAPI.RLP_CLIENT.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + logger.warn("unable to submit animations", e); + } + + @Override + public void onResponse(Call call, Response response) + { + try + { + if (!response.isSuccessful()) + { + logger.debug("unsuccessful animation response"); + } + } + finally + { + response.close(); + } + } + }); + } + + public List get() throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("animation") + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + InputStream in = response.body().byteStream(); + // CHECKSTYLE:OFF + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), new TypeToken>() + { + }.getType()); + // CHECKSTYLE:ON + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public AnimationKey get(int npcid) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("animation") + .addPathSegment(Integer.toString(npcid)) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), AnimationKey.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/animation/AnimationKey.java b/http-api/src/main/java/net/runelite/http/api/animation/AnimationKey.java new file mode 100644 index 0000000000..c4ce919326 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/animation/AnimationKey.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.animation; + +public class AnimationKey +{ + private int npcid; + private int[] animations; + + public int getNPCId() + { + return npcid; + } + + public void setNPCId(int npcid) + { + this.npcid = npcid; + } + + public int[] getAnimations() + { + return animations; + } + + public void setAnimations(int[] keys) + { + this.animations = keys; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/animation/AnimationRequest.java b/http-api/src/main/java/net/runelite/http/api/animation/AnimationRequest.java new file mode 100644 index 0000000000..9310c17ffc --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/animation/AnimationRequest.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.animation; + +import java.util.ArrayList; +import java.util.List; + +public class AnimationRequest +{ + private int revision; + private List keys = new ArrayList<>(); + + public int getRevision() + { + return revision; + } + + public void setRevision(int revision) + { + this.revision = revision; + } + + public List getKeys() + { + return keys; + } + + public void addKey(AnimationKey key) + { + keys.add(key); + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/cache/Cache.java b/http-api/src/main/java/net/runelite/http/api/cache/Cache.java new file mode 100644 index 0000000000..0fe91d6f98 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/cache/Cache.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.cache; + +import java.time.Instant; +import java.util.Objects; + +public class Cache +{ + private final int id; + private final int revision; + private final Instant date; + + public Cache(int id, int revision, Instant date) + { + this.id = id; + this.revision = revision; + this.date = date; + } + + @Override + public String toString() + { + return "Cache{" + "id=" + id + ", revision=" + revision + ", date=" + date + '}'; + } + + @Override + public int hashCode() + { + int hash = 5; + hash = 29 * hash + this.id; + hash = 29 * hash + this.revision; + hash = 29 * hash + Objects.hashCode(this.date); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final Cache other = (Cache) obj; + if (this.id != other.id) + { + return false; + } + if (this.revision != other.revision) + { + return false; + } + if (!Objects.equals(this.date, other.date)) + { + return false; + } + return true; + } + + public int getId() + { + return id; + } + + public int getRevision() + { + return revision; + } + + public Instant getDate() + { + return date; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/cache/CacheArchive.java b/http-api/src/main/java/net/runelite/http/api/cache/CacheArchive.java new file mode 100644 index 0000000000..a642f1fe4e --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/cache/CacheArchive.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.cache; + +public class CacheArchive +{ + private final int archiveId; + private final int nameHash; + private final int revision; + + public CacheArchive(int archiveId, int nameHash, int revision) + { + this.archiveId = archiveId; + this.nameHash = nameHash; + this.revision = revision; + } + + @Override + public String toString() + { + return "CacheArchive{" + "archiveId=" + archiveId + ", nameHash=" + nameHash + ", revision=" + revision + '}'; + } + + @Override + public int hashCode() + { + int hash = 5; + hash = 71 * hash + this.archiveId; + hash = 71 * hash + this.nameHash; + hash = 71 * hash + this.revision; + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final CacheArchive other = (CacheArchive) obj; + if (this.archiveId != other.archiveId) + { + return false; + } + if (this.nameHash != other.nameHash) + { + return false; + } + if (this.revision != other.revision) + { + return false; + } + return true; + } + + public int getArchiveId() + { + return archiveId; + } + + public int getNameHash() + { + return nameHash; + } + + public int getRevision() + { + return revision; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/cache/CacheIndex.java b/http-api/src/main/java/net/runelite/http/api/cache/CacheIndex.java new file mode 100644 index 0000000000..17558e4531 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/cache/CacheIndex.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.cache; + +public class CacheIndex +{ + private final int indexId; + private final int revision; + + public CacheIndex(int indexId, int revision) + { + this.indexId = indexId; + this.revision = revision; + } + + @Override + public String toString() + { + return "CacheIndex{" + "indexId=" + indexId + ", revision=" + revision + '}'; + } + + @Override + public int hashCode() + { + int hash = 5; + hash = 61 * hash + this.indexId; + hash = 61 * hash + this.revision; + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final CacheIndex other = (CacheIndex) obj; + if (this.indexId != other.indexId) + { + return false; + } + if (this.revision != other.revision) + { + return false; + } + return true; + } + + public int getIndexId() + { + return indexId; + } + + public int getRevision() + { + return revision; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java new file mode 100644 index 0000000000..bd8c83f5ef --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java @@ -0,0 +1,465 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.chat; + +import com.google.gson.JsonParseException; +import java.io.IOException; +import java.io.InputStream; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.io.InputStreamReader; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class ChatClient +{ + private static final Predicate LAYOUT_VALIDATOR = Pattern + .compile("\\[[A-Z]+]:(\\s*\\w+\\s*(\\([A-Za-z]+\\))?,?)+") + .asPredicate(); + + public boolean submitKc(String username, String boss, int kc) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("kc") + .addQueryParameter("name", username) + .addQueryParameter("boss", boss) + .addQueryParameter("kc", Integer.toString(kc)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public int getKc(String username, String boss) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("kc") + .addQueryParameter("name", username) + .addQueryParameter("boss", boss) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up killcount!"); + } + return Integer.parseInt(response.body().string()); + } + } + + public boolean submitQp(String username, int qp) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("qp") + .addQueryParameter("name", username) + .addQueryParameter("qp", Integer.toString(qp)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public int getQp(String username) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("qp") + .addQueryParameter("name", username) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up quest points!"); + } + return Integer.parseInt(response.body().string()); + } + } + + public boolean submitTask(String username, String task, int amount, int initialAmount, String location) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("task") + .addQueryParameter("name", username) + .addQueryParameter("task", task) + .addQueryParameter("amount", Integer.toString(amount)) + .addQueryParameter("initialAmount", Integer.toString(initialAmount)) + .addQueryParameter("location", location) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public Task getTask(String username) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("task") + .addQueryParameter("name", username) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up task!"); + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), Task.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public boolean submitPb(String username, String boss, int pb) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("pb") + .addQueryParameter("name", username) + .addQueryParameter("boss", boss) + .addQueryParameter("pb", Integer.toString(pb)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public int getPb(String username, String boss) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("pb") + .addQueryParameter("name", username) + .addQueryParameter("boss", boss) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up personal best!"); + } + return Integer.parseInt(response.body().string()); + } + } + + public boolean submitGc(String username, int gc) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("gc") + .addQueryParameter("name", username) + .addQueryParameter("gc", Integer.toString(gc)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public int getGc(String username) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("gc") + .addQueryParameter("name", username) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up gamble count!"); + } + return Integer.parseInt(response.body().string()); + } + } + + public boolean submitLayout(String username, String layout) throws IOException + { + if (!testLayout(layout)) + { + throw new IOException("Layout " + layout + " is not valid!"); + } + + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("layout") + .addQueryParameter("name", username) + .addQueryParameter("layout", layout) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public boolean submitDuels(String username, int wins, int losses, int winningStreak, int losingStreak) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("duels") + .addQueryParameter("name", username) + .addQueryParameter("wins", Integer.toString(wins)) + .addQueryParameter("losses", Integer.toString(losses)) + .addQueryParameter("winningStreak", Integer.toString(winningStreak)) + .addQueryParameter("losingStreak", Integer.toString(losingStreak)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public String getLayout(String username) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("layout") + .addQueryParameter("name", username) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up layout!"); + } + + final String layout = response.body().string(); + + if (!testLayout(layout)) + { + throw new IOException("Layout " + layout + " is not valid!"); + } + + return layout; + } + } + + public boolean testLayout(String layout) + { + return LAYOUT_VALIDATOR.test(layout); + } + + public House[] getHosts(int world, String location) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up hosts!"); + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), House[].class); + + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public Duels getDuels(String username) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("duels") + .addQueryParameter("name", username) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up duels!"); + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), Duels.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public boolean submitHost(int world, String location, House house) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .addQueryParameter("owner", house.getOwner()) + .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) + .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) + .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) + .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) + .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) + .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) + .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public boolean removeHost(int world, String location, House house) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .addQueryParameter("owner", house.getOwner()) + .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) + .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) + .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) + .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) + .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) + .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) + .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) + .addQueryParameter("remove", Boolean.toString(true)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } +} \ No newline at end of file diff --git a/http-api/src/main/java/net/runelite/http/api/chat/Duels.java b/http-api/src/main/java/net/runelite/http/api/chat/Duels.java new file mode 100644 index 0000000000..ba117a526a --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/chat/Duels.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.chat; + +import lombok.Data; + +@Data +public class Duels +{ + private int wins; + private int losses; + private int winningStreak; + private int losingStreak; +} diff --git a/RuneLitePlus/TestConfig.java b/http-api/src/main/java/net/runelite/http/api/chat/House.java similarity index 70% rename from RuneLitePlus/TestConfig.java rename to http-api/src/main/java/net/runelite/http/api/chat/House.java index 940c65441a..5ae614e129 100644 --- a/RuneLitePlus/TestConfig.java +++ b/http-api/src/main/java/net/runelite/http/api/chat/House.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Cas + * Copyright (c) 2019, Spedwards * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,25 +22,26 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package com.runeswag.client.plugins; +package net.runelite.http.api.chat; -import com.runeswag.client.config.Config; -import com.runeswag.client.config.ConfigGroup; -import com.runeswag.client.config.ConfigItem; +import lombok.Data; +import net.runelite.http.api.RuneLiteAPI; -import java.awt.*; - -@ConfigGroup("test") -public interface TestConfig extends Config +@Data +public class House { - @ConfigItem( - keyName = "Testing 1", - name = "Test option", - description = "Enable/disable nothing", - position = 1 - ) - default boolean tested() + private String owner; + private boolean guildedAltarPresent; + private boolean occultAltarPresent; + private boolean spiritTreePresent; + private boolean fairyRingPresent; + private boolean wildernessObeliskPresent; + private boolean repairStandPresent; + private boolean combatDummyPresent; + + @Override + public String toString() { - return true; + return RuneLiteAPI.GSON.toJson(this); } -} +} \ No newline at end of file diff --git a/http-api/src/main/java/net/runelite/http/api/chat/Task.java b/http-api/src/main/java/net/runelite/http/api/chat/Task.java new file mode 100644 index 0000000000..db38c90109 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/chat/Task.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.chat; + +import lombok.Data; + +@Data +public class Task +{ + private String task; + private int amount; + private int initialAmount; + private String location; +} diff --git a/http-api/src/main/java/net/runelite/http/api/examine/ExamineClient.java b/http-api/src/main/java/net/runelite/http/api/examine/ExamineClient.java new file mode 100644 index 0000000000..5997799c2e --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/examine/ExamineClient.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.examine; + +import java.io.IOException; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ExamineClient +{ + private static final Logger logger = LoggerFactory.getLogger(ExamineClient.class); + + private static final MediaType TEXT = MediaType.parse("text"); + + public void submitObject(int id, String text) + { + submit("object", id, text); + } + + public void submitNpc(int id, String text) + { + submit("npc", id, text); + } + + public void submitItem(int id, String text) + { + submit("item", id, text); + } + + private void submit(String type, int id, String text) + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("examine") + .addPathSegment(type) + .addPathSegment(Integer.toString(id)) + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .post(RequestBody.create(TEXT, text)) + .build(); + + RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + logger.warn("Error submitting examine", e); + } + + @Override + public void onResponse(Call call, Response response) + { + response.close(); + logger.debug("Submitted examine info for {} {}: {}", type, id, text); + } + }); + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/feed/FeedClient.java b/http-api/src/main/java/net/runelite/http/api/feed/FeedClient.java new file mode 100644 index 0000000000..6b05ad20ba --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/feed/FeedClient.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.feed; + +import com.google.gson.JsonParseException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FeedClient +{ + private static final Logger logger = LoggerFactory.getLogger(FeedClient.class); + + public FeedResult lookupFeed() throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("feed.js") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.debug("Error looking up feed: {}", response); + return null; + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), FeedResult.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/feed/FeedItem.java b/http-api/src/main/java/net/runelite/http/api/feed/FeedItem.java new file mode 100644 index 0000000000..620f639d15 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/feed/FeedItem.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.feed; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@AllArgsConstructor +public class FeedItem +{ + private final FeedItemType type; + private String avatar; + private final String title; + private final String content; + private final String url; + private final long timestamp; +} diff --git a/http-api/src/main/java/net/runelite/http/api/feed/FeedItemType.java b/http-api/src/main/java/net/runelite/http/api/feed/FeedItemType.java new file mode 100644 index 0000000000..e3cc9443cd --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/feed/FeedItemType.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.feed; + +public enum FeedItemType +{ + BLOG_POST, + TWEET, + OSRS_NEWS +} diff --git a/http-api/src/main/java/net/runelite/http/api/feed/FeedResult.java b/http-api/src/main/java/net/runelite/http/api/feed/FeedResult.java new file mode 100644 index 0000000000..cf862b5be0 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/feed/FeedResult.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.feed; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class FeedResult +{ + private List items; +} diff --git a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java new file mode 100644 index 0000000000..a1b97bc390 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ge; + +import com.google.gson.Gson; +import java.io.IOException; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +@Slf4j +@AllArgsConstructor +public class GrandExchangeClient +{ + private static final MediaType JSON = MediaType.parse("application/json"); + private static final Gson GSON = RuneLiteAPI.GSON; + + private final UUID uuid; + + public void submit(GrandExchangeTrade grandExchangeTrade) + { + final HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("ge") + .build(); + + Request request = new Request.Builder() + .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) + .post(RequestBody.create(JSON, GSON.toJson(grandExchangeTrade))) + .url(url) + .build(); + + RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + log.debug("unable to submit trade", e); + } + + @Override + public void onResponse(Call call, Response response) + { + log.debug("Submitted trade"); + response.close(); + } + }); + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeTrade.java b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeTrade.java new file mode 100644 index 0000000000..b5d0012b16 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeTrade.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ge; + +import java.time.Instant; +import lombok.Data; + +@Data +public class GrandExchangeTrade +{ + private boolean buy; + private int itemId; + private int quantity; + private int price; + private Instant time; +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreClient.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreClient.java new file mode 100644 index 0000000000..a725089de4 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreClient.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.hiscore; + +import java.io.IOException; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.Response; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; + +@Slf4j +public class HiscoreClient +{ + public HiscoreResult lookup(String username, HiscoreEndpoint endpoint) throws IOException + { + return lookup(username, endpoint.getHiscoreURL()); + } + + public HiscoreResult lookup(String username, HttpUrl endpoint) throws IOException + { + HiscoreResultBuilder resultBuilder = lookupUsername(username, endpoint); + + if (resultBuilder == null) + { + return null; + } + + return resultBuilder.build(); + } + + public HiscoreResult lookup(String username) throws IOException + { + return lookup(username, HiscoreEndpoint.NORMAL); + } + + public SingleHiscoreSkillResult lookup(String username, HiscoreSkill skill, HiscoreEndpoint endpoint) throws IOException + { + HiscoreResultBuilder resultBuilder = lookupUsername(username, endpoint.getHiscoreURL()); + + if (resultBuilder == null) + { + return null; + } + + HiscoreResult result = resultBuilder.build(); + + Skill requested = result.getSkill(skill); + SingleHiscoreSkillResult skillResult = new SingleHiscoreSkillResult(); + skillResult.setPlayer(username); + skillResult.setSkillName(skill.getName()); + skillResult.setSkill(requested); + return skillResult; + } + + public SingleHiscoreSkillResult lookup(String username, HiscoreSkill skill) throws IOException + { + return lookup(username, skill, HiscoreEndpoint.NORMAL); + } + + private HiscoreResultBuilder lookupUsername(String username, HttpUrl hiscoreUrl) throws IOException + { + HttpUrl url = hiscoreUrl.newBuilder() + .addQueryParameter("player", username) + .build(); + + log.debug("Built URL {}", url); + + Request okrequest = new Request.Builder() + .url(url) + .build(); + + String responseStr; + + try (Response okresponse = RuneLiteAPI.CLIENT.newCall(okrequest).execute()) + { + if (!okresponse.isSuccessful()) + { + switch (okresponse.code()) + { + case 404: + return null; + default: + throw new IOException("Error retrieving data from Jagex Hiscores: " + okresponse); + } + } + + responseStr = okresponse.body().string(); + } + + CSVParser parser = CSVParser.parse(responseStr, CSVFormat.DEFAULT); + + HiscoreResultBuilder hiscoreBuilder = new HiscoreResultBuilder(); + hiscoreBuilder.setPlayer(username); + + int count = 0; + + for (CSVRecord record : parser.getRecords()) + { + if (count++ >= HiscoreSkill.values().length) + { + log.warn("Jagex Hiscore API returned unexpected data"); + break; // rest is other things? + } + + // rank, level, experience + int rank = Integer.parseInt(record.get(0)); + int level = Integer.parseInt(record.get(1)); + + // items that are not skills do not have an experience parameter + long experience = -1; + if (record.size() == 3) + { + experience = Long.parseLong(record.get(2)); + } + + Skill skill = new Skill(rank, level, experience); + hiscoreBuilder.setNextSkill(skill); + } + + return hiscoreBuilder; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreEndpoint.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreEndpoint.java new file mode 100644 index 0000000000..a88f2e208e --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreEndpoint.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.http.api.hiscore; + +import okhttp3.HttpUrl; + +public enum HiscoreEndpoint +{ + NORMAL("Normal", "https://services.runescape.com/m=hiscore_oldschool/index_lite.ws"), + IRONMAN("Ironman", "https://services.runescape.com/m=hiscore_oldschool_ironman/index_lite.ws"), + HARDCORE_IRONMAN("Hardcore Ironman", "https://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/index_lite.ws"), + ULTIMATE_IRONMAN("Ultimate Ironman", "https://services.runescape.com/m=hiscore_oldschool_ultimate/index_lite.ws"), + DEADMAN("Deadman", "https://services.runescape.com/m=hiscore_oldschool_deadman/index_lite.ws"), + SEASONAL_DEADMAN("Seasonal Deadman", "https://services.runescape.com/m=hiscore_oldschool_seasonal/index_lite.ws"), + DEADMAN_TOURNAMENT("Deadman Tournament", "https://services.runescape.com/m=hiscore_oldschool_tournament/index_lite.ws"); + + private final String name; + private final HttpUrl hiscoreURL; + + HiscoreEndpoint(String name, String hiscoreURL) + { + this.name = name; + this.hiscoreURL = HttpUrl.parse(hiscoreURL); + } + + public String getName() + { + return name; + } + + public HttpUrl getHiscoreURL() + { + return hiscoreURL; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java new file mode 100644 index 0000000000..9af6f6e4b9 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.hiscore; + +import lombok.Data; + +@Data +public class HiscoreResult +{ + private String player; + private Skill overall; + private Skill attack; + private Skill defence; + private Skill strength; + private Skill hitpoints; + private Skill ranged; + private Skill prayer; + private Skill magic; + private Skill cooking; + private Skill woodcutting; + private Skill fletching; + private Skill fishing; + private Skill firemaking; + private Skill crafting; + private Skill smithing; + private Skill mining; + private Skill herblore; + private Skill agility; + private Skill thieving; + private Skill slayer; + private Skill farming; + private Skill runecraft; + private Skill hunter; + private Skill construction; + private Skill bountyHunterHunter; + private Skill bountyHunterRogue; + private Skill clueScrollAll; + private Skill clueScrollBeginner; + private Skill clueScrollEasy; + private Skill clueScrollMedium; + private Skill clueScrollHard; + private Skill clueScrollElite; + private Skill clueScrollMaster; + private Skill lastManStanding; + + public Skill getSkill(HiscoreSkill skill) + { + switch (skill) + { + case ATTACK: + return getAttack(); + case DEFENCE: + return getDefence(); + case STRENGTH: + return getStrength(); + case HITPOINTS: + return getHitpoints(); + case RANGED: + return getRanged(); + case PRAYER: + return getPrayer(); + case MAGIC: + return getMagic(); + case COOKING: + return getCooking(); + case WOODCUTTING: + return getWoodcutting(); + case FLETCHING: + return getFletching(); + case FISHING: + return getFishing(); + case FIREMAKING: + return getFiremaking(); + case CRAFTING: + return getCrafting(); + case SMITHING: + return getSmithing(); + case MINING: + return getMining(); + case HERBLORE: + return getHerblore(); + case AGILITY: + return getAgility(); + case THIEVING: + return getThieving(); + case SLAYER: + return getSlayer(); + case FARMING: + return getFarming(); + case RUNECRAFT: + return getRunecraft(); + case HUNTER: + return getHunter(); + case CONSTRUCTION: + return getConstruction(); + case OVERALL: + return getOverall(); + case BOUNTY_HUNTER_HUNTER: + return getBountyHunterHunter(); + case BOUNTY_HUNTER_ROGUE: + return getBountyHunterRogue(); + case CLUE_SCROLL_ALL: + return getClueScrollAll(); + case CLUE_SCROLL_BEGINNER: + return getClueScrollBeginner(); + case CLUE_SCROLL_EASY: + return getClueScrollEasy(); + case CLUE_SCROLL_MEDIUM: + return getClueScrollMedium(); + case CLUE_SCROLL_HARD: + return getClueScrollHard(); + case CLUE_SCROLL_ELITE: + return getClueScrollElite(); + case CLUE_SCROLL_MASTER: + return getClueScrollMaster(); + case LAST_MAN_STANDING: + return getLastManStanding(); + } + + throw new IllegalArgumentException("Invalid hiscore item"); + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java new file mode 100644 index 0000000000..a6117160a4 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.hiscore; + +import java.util.ArrayList; +import java.util.List; +import net.runelite.http.api.hiscore.HiscoreResult; +import net.runelite.http.api.hiscore.Skill; + +public class HiscoreResultBuilder +{ + private String player; + private final List skills = new ArrayList<>(); + + public void setPlayer(String player) + { + this.player = player; + } + + public void setNextSkill(Skill skill) + { + skills.add(skill); + } + + public Skill getSkill(int index) + { + return skills.get(index); + } + + public HiscoreResult build() + { + HiscoreResult hiscoreResult = new HiscoreResult(); + hiscoreResult.setPlayer(player); + hiscoreResult.setOverall(skills.get(0)); + hiscoreResult.setAttack(skills.get(1)); + hiscoreResult.setDefence(skills.get(2)); + hiscoreResult.setStrength(skills.get(3)); + hiscoreResult.setHitpoints(skills.get(4)); + hiscoreResult.setRanged(skills.get(5)); + hiscoreResult.setPrayer(skills.get(6)); + hiscoreResult.setMagic(skills.get(7)); + hiscoreResult.setCooking(skills.get(8)); + hiscoreResult.setWoodcutting(skills.get(9)); + hiscoreResult.setFletching(skills.get(10)); + hiscoreResult.setFishing(skills.get(11)); + hiscoreResult.setFiremaking(skills.get(12)); + hiscoreResult.setCrafting(skills.get(13)); + hiscoreResult.setSmithing(skills.get(14)); + hiscoreResult.setMining(skills.get(15)); + hiscoreResult.setHerblore(skills.get(16)); + hiscoreResult.setAgility(skills.get(17)); + hiscoreResult.setThieving(skills.get(18)); + hiscoreResult.setSlayer(skills.get(19)); + hiscoreResult.setFarming(skills.get(20)); + hiscoreResult.setRunecraft(skills.get(21)); + hiscoreResult.setHunter(skills.get(22)); + hiscoreResult.setConstruction(skills.get(23)); + hiscoreResult.setBountyHunterHunter(skills.get(24)); + hiscoreResult.setBountyHunterRogue(skills.get(25)); + hiscoreResult.setLastManStanding(skills.get(26)); + hiscoreResult.setClueScrollAll(skills.get(27)); + hiscoreResult.setClueScrollBeginner(skills.get(28)); + hiscoreResult.setClueScrollEasy(skills.get(29)); + hiscoreResult.setClueScrollMedium(skills.get(30)); + hiscoreResult.setClueScrollHard(skills.get(31)); + hiscoreResult.setClueScrollElite(skills.get(32)); + hiscoreResult.setClueScrollMaster(skills.get(33)); + return hiscoreResult; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java new file mode 100644 index 0000000000..db043dfcfb --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.hiscore; + +public enum HiscoreSkill +{ + OVERALL("Overall"), + ATTACK("Attack"), + DEFENCE("Defence"), + STRENGTH("Strength"), + HITPOINTS("Hitpoints"), + RANGED("Ranged"), + PRAYER("Prayer"), + MAGIC("Magic"), + COOKING("Cooking"), + WOODCUTTING("Woodcutting"), + FLETCHING("Fletching"), + FISHING("Fishing"), + FIREMAKING("Firemaking"), + CRAFTING("Crafting"), + SMITHING("Smithing"), + MINING("Mining"), + HERBLORE("Herblore"), + AGILITY("Agility"), + THIEVING("Thieving"), + SLAYER("Slayer"), + FARMING("Farming"), + RUNECRAFT("Runecraft"), + HUNTER("Hunter"), + CONSTRUCTION("Construction"), + BOUNTY_HUNTER_HUNTER("Bounty Hunter - Hunter"), + BOUNTY_HUNTER_ROGUE("Bounty Hunter - Rogue"), + LAST_MAN_STANDING("Last Man Standing"), + CLUE_SCROLL_ALL("Clue Scrolls (all)"), + CLUE_SCROLL_BEGINNER("Clue Scrolls (beginner)"), + CLUE_SCROLL_EASY("Clue Scrolls (easy)"), + CLUE_SCROLL_MEDIUM("Clue Scrolls (medium)"), + CLUE_SCROLL_HARD("Clue Scrolls (hard)"), + CLUE_SCROLL_ELITE("Clue Scrolls (elite)"), + CLUE_SCROLL_MASTER("Clue Scrolls (master)"); + + private final String name; + + HiscoreSkill(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/SingleHiscoreSkillResult.java b/http-api/src/main/java/net/runelite/http/api/hiscore/SingleHiscoreSkillResult.java new file mode 100644 index 0000000000..c2ab3407a1 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/SingleHiscoreSkillResult.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2017. l2- + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.hiscore; + +import java.util.Objects; + +public class SingleHiscoreSkillResult +{ + private String player; + private String skillName; + private Skill skill; + + public String getPlayer() + { + return player; + } + + public void setPlayer(String player) + { + this.player = player; + } + + public String getSkillName() + { + return skillName; + } + + public void setSkillName(String skillName) + { + this.skillName = skillName; + } + + public Skill getSkill() + { + return skill; + } + + public void setSkill(Skill skill) + { + this.skill = skill; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 37 * hash + Objects.hashCode(this.player); + hash = 37 * hash + Objects.hashCode(this.skillName); + hash = 37 * hash + Objects.hashCode(this.skill); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final SingleHiscoreSkillResult other = (SingleHiscoreSkillResult) obj; + if (!Objects.equals(this.player, other.player)) + { + return false; + } + if (!Objects.equals(this.skillName, other.skillName)) + { + return false; + } + if (!Objects.equals(this.skill, other.skill)) + { + return false; + } + return true; + } + + @Override + public String toString() + { + return "SingleHiscoreSkillResult{" + "player=" + player + ", skillName=" + skillName + ", skill=" + skill + '}'; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/Skill.java b/http-api/src/main/java/net/runelite/http/api/hiscore/Skill.java new file mode 100644 index 0000000000..fa779381bc --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/Skill.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.hiscore; + +public class Skill +{ + private final int rank; + private final int level; + private final long experience; + + public Skill(int rank, int level, long experience) + { + this.rank = rank; + this.level = level; + this.experience = experience; + } + + public int getRank() + { + return rank; + } + + public int getLevel() + { + return level; + } + + public long getExperience() + { + return experience; + } + + @Override + public int hashCode() + { + int hash = 3; + hash = 59 * hash + this.rank; + hash = 59 * hash + this.level; + hash = 59 * hash + (int) (this.experience ^ (this.experience >>> 32)); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (getClass() != obj.getClass()) + { + return false; + } + final Skill other = (Skill) obj; + if (this.rank != other.rank) + { + return false; + } + if (this.level != other.level) + { + return false; + } + if (this.experience != other.experience) + { + return false; + } + return true; + } + + @Override + public String toString() + { + return "Skill{" + "rank=" + rank + ", level=" + level + ", experience=" + experience + '}'; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/item/Item.java b/http-api/src/main/java/net/runelite/http/api/item/Item.java new file mode 100644 index 0000000000..3a6f0346c4 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/item/Item.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.item; + +import lombok.Data; + +@Data +public class Item +{ + private int id; + private String name; + private String description; + private ItemType type; +} diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java new file mode 100644 index 0000000000..17784dd67b --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.item; + +import com.google.gson.JsonParseException; +import com.google.gson.reflect.TypeToken; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.Map; +import javax.imageio.ImageIO; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ItemClient +{ + private static final Logger logger = LoggerFactory.getLogger(ItemClient.class); + + public ItemPrice lookupItemPrice(int itemId) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("item") + .addPathSegment("" + itemId) + .addPathSegment("price") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.debug("Error looking up item {}: {}", itemId, response); + return null; + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public ItemPrice[] lookupItemPrice(Integer[] itemIds) throws IOException + { + HttpUrl.Builder urlBuilder = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("item") + .addPathSegment("price"); + + for (int itemId : itemIds) + { + urlBuilder.addQueryParameter("id", String.valueOf(itemId)); + } + + HttpUrl url = urlBuilder.build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.debug("Error looking up items {}: {}", Arrays.toString(itemIds), response); + return null; + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public BufferedImage getIcon(int itemId) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("item") + .addPathSegment("" + itemId) + .addPathSegment("icon") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.debug("Error grabbing icon {}: {}", itemId, response); + return null; + } + + InputStream in = response.body().byteStream(); + synchronized (ImageIO.class) + { + return ImageIO.read(in); + } + } + } + + public SearchResult search(String itemName) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("item") + .addPathSegment("search") + .addQueryParameter("query", itemName) + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.debug("Error looking up item {}: {}", itemName, response); + return null; + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public ItemPrice[] getPrices() throws IOException + { + HttpUrl.Builder urlBuilder = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("item") + .addPathSegment("prices.js"); + + HttpUrl url = urlBuilder.build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.warn("Error looking up prices: {}", response); + return null; + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public Map getStats() throws IOException + { + HttpUrl.Builder urlBuilder = RuneLiteAPI.getStaticBase().newBuilder() + .addPathSegment("item") + // TODO: Change this to stats.min.json later after release is undeployed + .addPathSegment("stats.ids.min.json"); + + HttpUrl url = urlBuilder.build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.warn("Error looking up item stats: {}", response); + return null; + } + + InputStream in = response.body().byteStream(); + final Type typeToken = new TypeToken>() + { + }.getType(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), typeToken); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemEquipmentStats.java b/http-api/src/main/java/net/runelite/http/api/item/ItemEquipmentStats.java new file mode 100644 index 0000000000..5f7fdaccbe --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemEquipmentStats.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.item; + +import lombok.Builder; +import lombok.Value; + +@Value +@Builder +public class ItemEquipmentStats +{ + private int slot; + + private int astab; + private int aslash; + private int acrush; + private int amagic; + private int arange; + + private int dstab; + private int dslash; + private int dcrush; + private int dmagic; + private int drange; + + private int str; + private int rstr; + private int mdmg; + private int prayer; + private int aspeed; +} + diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemPrice.java b/http-api/src/main/java/net/runelite/http/api/item/ItemPrice.java new file mode 100644 index 0000000000..001c63deb8 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemPrice.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.item; + +import java.time.Instant; +import lombok.Data; + +@Data +public class ItemPrice +{ + private int id; + private String name; + private int price; + private Instant time; +} diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemStats.java b/http-api/src/main/java/net/runelite/http/api/item/ItemStats.java new file mode 100644 index 0000000000..3ebc17970f --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemStats.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.item; + +import lombok.Value; + +@Value +public class ItemStats +{ + private boolean quest; + private boolean equipable; + private double weight; + + private ItemEquipmentStats equipment; + + public ItemStats subtract(ItemStats other) + { + if (other == null) + { + return this; + } + + final double newWeight = weight - other.weight; + final ItemEquipmentStats newEquipment; + + + if (other.equipment != null) + { + final ItemEquipmentStats equipment = this.equipment != null + ? this.equipment + : new ItemEquipmentStats.ItemEquipmentStatsBuilder().build(); + + newEquipment = new ItemEquipmentStats.ItemEquipmentStatsBuilder() + .slot(equipment.getSlot()) + .astab(equipment.getAstab() - other.equipment.getAstab()) + .aslash(equipment.getAslash() - other.equipment.getAslash()) + .acrush(equipment.getAcrush() - other.equipment.getAcrush()) + .amagic(equipment.getAmagic() - other.equipment.getAmagic()) + .arange(equipment.getArange() - other.equipment.getArange()) + .dstab(equipment.getDstab() - other.equipment.getDstab()) + .dslash(equipment.getDslash() - other.equipment.getDslash()) + .dcrush(equipment.getDcrush() - other.equipment.getDcrush()) + .dmagic(equipment.getDmagic() - other.equipment.getDmagic()) + .drange(equipment.getDrange() - other.equipment.getDrange()) + .str(equipment.getStr() - other.equipment.getStr()) + .rstr(equipment.getRstr() - other.equipment.getRstr()) + .mdmg(equipment.getMdmg() - other.equipment.getMdmg()) + .prayer(equipment.getPrayer() - other.equipment.getPrayer()) + .aspeed(equipment.getAspeed() - other.equipment.getAspeed()) + .build(); + } + else + { + newEquipment = equipment; + } + + return new ItemStats(quest, equipable, newWeight, newEquipment); + } +} + diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemType.java b/http-api/src/main/java/net/runelite/http/api/item/ItemType.java new file mode 100644 index 0000000000..9221f096b2 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemType.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.item; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public enum ItemType +{ + DEFAULT; + + private static final Logger logger = LoggerFactory.getLogger(ItemType.class); + + public static ItemType of(String type) + { + try + { + return ItemType.valueOf(type.toUpperCase()); + } + catch (IllegalArgumentException ex) + { + logger.warn("unable to convert type", ex); + return DEFAULT; + } + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/item/SearchResult.java b/http-api/src/main/java/net/runelite/http/api/item/SearchResult.java new file mode 100644 index 0000000000..90ae1ec783 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/item/SearchResult.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.item; + +import java.util.List; + +public class SearchResult +{ + private List items; + + public List getItems() + { + return items; + } + + public void setItems(List items) + { + this.items = items; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/GameItem.java b/http-api/src/main/java/net/runelite/http/api/loottracker/GameItem.java new file mode 100644 index 0000000000..7e9b06c21b --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/GameItem.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.loottracker; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GameItem +{ + private int id; + private int qty; +} diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootRecord.java b/http-api/src/main/java/net/runelite/http/api/loottracker/LootRecord.java new file mode 100644 index 0000000000..993959ee88 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/LootRecord.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.loottracker; + +import java.time.Instant; +import java.util.Collection; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LootRecord +{ + private String eventId; + @Getter + private String username; + private LootRecordType type; + private Collection drops; + private Instant time; + + /** + * constructor for lootRecords retrieved by http api (doesn't store/retrieve username) + * @param eventId - the eventID or the name/title of the LootRecord + * @param type - The LootRecordType + * @param gameItems - the list of items/quantities + * @param time - the Instant that the Loot Record was received + */ + public LootRecord(String eventId, LootRecordType type, List gameItems, Instant time) + { + // Insert blank username + this.username = ""; + this.eventId = eventId; + this.type = type; + this.drops = gameItems; + this.time = time; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootRecordType.java b/http-api/src/main/java/net/runelite/http/api/loottracker/LootRecordType.java new file mode 100644 index 0000000000..daf515b896 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/LootRecordType.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.loottracker; + +public enum LootRecordType +{ + NPC, + PLAYER, + EVENT, + DEATH, + UNKNOWN +} diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java new file mode 100644 index 0000000000..d250620905 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.loottracker; + +import com.google.gson.Gson; +import com.google.gson.JsonParseException; +import com.google.gson.reflect.TypeToken; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collection; +import java.util.List; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +@Slf4j +@AllArgsConstructor +public class LootTrackerClient +{ + private static final MediaType JSON = MediaType.parse("application/json"); + private static final Gson GSON = RuneLiteAPI.GSON; + + private final UUID uuid; + + public void submit(LootRecord lootRecord) + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("loottracker") + .build(); + + Request request = new Request.Builder() + .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) + .post(RequestBody.create(JSON, GSON.toJson(lootRecord))) + .url(url) + .build(); + + RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + log.warn("unable to submit loot", e); + } + + @Override + public void onResponse(Call call, Response response) + { + log.debug("Submitted loot"); + response.close(); + } + }); + } + + public Collection get() throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("loottracker") + .build(); + + Request request = new Request.Builder() + .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + log.debug("Error looking up loot: {}", response); + return null; + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), new TypeToken>() + { + }.getType()); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public void delete(String eventId) + { + HttpUrl.Builder builder = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("loottracker"); + + if (eventId != null) + { + builder.addQueryParameter("eventId", eventId); + } + + Request request = new Request.Builder() + .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) + .delete() + .url(builder.build()) + .build(); + + RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + log.warn("unable to delete loot", e); + } + + @Override + public void onResponse(Call call, Response response) + { + log.debug("Deleted loot"); + response.close(); + } + }); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/Calls.java b/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java similarity index 52% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/Calls.java rename to http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java index 0fb721d7a2..c01337fdc0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/Calls.java +++ b/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, AeonLucid * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,55 +22,48 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.batools; +package net.runelite.http.api.osbuddy; -import java.util.HashMap; -import java.util.Map; -import lombok.Getter; +import com.google.gson.JsonParseException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.Response; -@Getter -public enum Calls +@Slf4j +public class OSBGrandExchangeClient { - //Attacker Calls - RED_EGG("Red egg", "Tell-red"), - GREEN_EGG("Green egg", "Tell-green"), - BLUE_EGG("Blue egg", "Tell-blue"), - //Collector Calls - CONTROLLED("Controlled/Bullet/Wind", "Tell-controlled"), - ACCURATE("Accurate/Field/Water", "Tell-accurate"), - AGGRESSIVE("Aggressive/Blunt/Earth", "Tell-aggressive"), - DEFENSIVE("Defensive/Barbed/Fire", "Tell-defensive"), - //Healer Calls - TOFU("Tofu", "Tell-tofu"), - CRACKERS("Crackers", "Tell-crackers"), - WORMS("Worms", "Tell-worms"), - //Defender Calls - POIS_WORMS("Pois. Worms", "Tell-worms"), - POIS_TOFU("Pois. Tofu", "Tell-tofu"), - POIS_MEAT("Pois. Meat", "Tell-meat"); - - private final String call; - private final String option; - - private static final Map CALL_MENU = new HashMap<>(); - - static + public OSBGrandExchangeResult lookupItem(int itemId) throws IOException { - for (Calls s : values()) + final HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("osb") + .addPathSegment("ge") + .addQueryParameter("itemId", Integer.toString(itemId)) + .build(); + + log.debug("Built URI: {}", url); + + final Request request = new Request.Builder() + .url(url) + .build(); + + try (final Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - CALL_MENU.put(s.getCall(), s.getOption()); + if (!response.isSuccessful()) + { + throw new IOException("Error looking up item id: " + response); + } + + final InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), OSBGrandExchangeResult.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); } } - - Calls(String call, String option) - { - this.call = call; - this.option = option; - } - - public static String getOption(String call) - { - return CALL_MENU.get(call); - } - } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/FermentTimerSession.java b/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeResult.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/FermentTimerSession.java rename to http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeResult.java index 1e6520d091..13e5f5e8e4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/FermentTimerSession.java +++ b/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Lucas C + * Copyright (c) 2018, AeonLucid * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,19 +22,17 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.cooking; +package net.runelite.http.api.osbuddy; import java.time.Instant; -import lombok.AccessLevel; -import lombok.Getter; +import lombok.Data; -class FermentTimerSession +@Data +public class OSBGrandExchangeResult { - @Getter(AccessLevel.PACKAGE) - private Instant lastWineMakingAction; - - void updateLastWineMakingAction() - { - this.lastWineMakingAction = Instant.now(); - } + private int item_id; + private int buy_average; + private int sell_average; + private int overall_average; + private Instant last_update; } diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/World.java b/http-api/src/main/java/net/runelite/http/api/worlds/World.java new file mode 100644 index 0000000000..2c1e6f6798 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/worlds/World.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.worlds; + +import java.util.EnumSet; +import lombok.Builder; +import lombok.Value; + +@Value +@Builder +public class World +{ + private int id; + private EnumSet types; + private String address; + private String activity; + private int location; + private int players; +} diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java new file mode 100644 index 0000000000..668e088404 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017, Adam + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.worlds; + +import com.google.gson.JsonParseException; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class WorldClient +{ + private static final Logger logger = LoggerFactory.getLogger(WorldClient.class); + + public WorldResult lookupWorlds() throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("worlds.js") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + logger.debug("Error looking up worlds: {}", response); + return null; + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), WorldResult.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldResult.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldResult.java new file mode 100644 index 0000000000..a4afe23e85 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldResult.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.worlds; + +import java.util.List; + +public class WorldResult +{ + private List worlds; + + public List getWorlds() + { + return worlds; + } + + public void setWorlds(List worlds) + { + this.worlds = worlds; + } + + public World findWorld(int worldNum) + { + for (World world : worlds) + { + if (world.getId() == worldNum) + { + return world; + } + } + return null; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java new file mode 100644 index 0000000000..c94a7c70e6 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.worlds; + +public enum WorldType +{ + MEMBERS, + PVP, + BOUNTY, + SKILL_TOTAL, + HIGH_RISK, + LAST_MAN_STANDING, + TOURNAMENT, + DEADMAN, + SEASONAL_DEADMAN, + DEADMAN_TOURNAMENT +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/RuntimeTypeAdapterFactory.java b/http-api/src/main/java/net/runelite/http/api/ws/RuntimeTypeAdapterFactory.java new file mode 100644 index 0000000000..2819c92ceb --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/RuntimeTypeAdapterFactory.java @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.runelite.http.api.ws; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.internal.Streams; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +/** + * Adapts values whose runtime type may differ from their declaration type. This + * is necessary when a field's type is not the same type that GSON should create + * when deserializing that field. For example, consider these types: + *

   {@code
+ *   abstract class Shape {
+ *     int x;
+ *     int y;
+ *   }
+ *   class Circle extends Shape {
+ *     int radius;
+ *   }
+ *   class Rectangle extends Shape {
+ *     int width;
+ *     int height;
+ *   }
+ *   class Diamond extends Shape {
+ *     int width;
+ *     int height;
+ *   }
+ *   class Drawing {
+ *     Shape bottomShape;
+ *     Shape topShape;
+ *   }
+ * }
+ *

Without additional type information, the serialized JSON is ambiguous. Is + * the bottom shape in this drawing a rectangle or a diamond?

   {@code
+ *   {
+ *     "bottomShape": {
+ *       "width": 10,
+ *       "height": 5,
+ *       "x": 0,
+ *       "y": 0
+ *     },
+ *     "topShape": {
+ *       "radius": 2,
+ *       "x": 4,
+ *       "y": 1
+ *     }
+ *   }}
+ * This class addresses this problem by adding type information to the + * serialized JSON and honoring that type information when the JSON is + * deserialized:
   {@code
+ *   {
+ *     "bottomShape": {
+ *       "type": "Diamond",
+ *       "width": 10,
+ *       "height": 5,
+ *       "x": 0,
+ *       "y": 0
+ *     },
+ *     "topShape": {
+ *       "type": "Circle",
+ *       "radius": 2,
+ *       "x": 4,
+ *       "y": 1
+ *     }
+ *   }}
+ * Both the type field name ({@code "type"}) and the type labels ({@code + * "Rectangle"}) are configurable. + * + *

Registering Types

+ * Create a {@code RuntimeTypeAdapterFactory} by passing the base type and type field + * name to the {@link #of} factory method. If you don't supply an explicit type + * field name, {@code "type"} will be used.
   {@code
+ *   RuntimeTypeAdapterFactory shapeAdapterFactory
+ *       = RuntimeTypeAdapterFactory.of(Shape.class, "type");
+ * }
+ * Next register all of your subtypes. Every subtype must be explicitly + * registered. This protects your application from injection attacks. If you + * don't supply an explicit type label, the type's simple name will be used. + *
   {@code
+ *   shapeAdapter.registerSubtype(Rectangle.class, "Rectangle");
+ *   shapeAdapter.registerSubtype(Circle.class, "Circle");
+ *   shapeAdapter.registerSubtype(Diamond.class, "Diamond");
+ * }
+ * Finally, register the type adapter factory in your application's GSON builder: + *
   {@code
+ *   Gson gson = new GsonBuilder()
+ *       .registerTypeAdapterFactory(shapeAdapterFactory)
+ *       .create();
+ * }
+ * Like {@code GsonBuilder}, this API supports chaining:
   {@code
+ *   RuntimeTypeAdapterFactory shapeAdapterFactory = RuntimeTypeAdapterFactory.of(Shape.class)
+ *       .registerSubtype(Rectangle.class)
+ *       .registerSubtype(Circle.class)
+ *       .registerSubtype(Diamond.class);
+ * }
+ */ +public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { + private final Class baseType; + private final String typeFieldName; + private final Map> labelToSubtype = new LinkedHashMap>(); + private final Map, String> subtypeToLabel = new LinkedHashMap, String>(); + + private RuntimeTypeAdapterFactory(Class baseType, String typeFieldName) { + if (typeFieldName == null || baseType == null) { + throw new NullPointerException(); + } + this.baseType = baseType; + this.typeFieldName = typeFieldName; + } + + /** + * Creates a new runtime type adapter using for {@code baseType} using {@code + * typeFieldName} as the type field name. Type field names are case sensitive. + */ + public static RuntimeTypeAdapterFactory of(Class baseType, String typeFieldName) { + return new RuntimeTypeAdapterFactory(baseType, typeFieldName); + } + + /** + * Creates a new runtime type adapter for {@code baseType} using {@code "type"} as + * the type field name. + */ + public static RuntimeTypeAdapterFactory of(Class baseType) { + return new RuntimeTypeAdapterFactory(baseType, "type"); + } + + /** + * Registers {@code type} identified by {@code label}. Labels are case + * sensitive. + * + * @throws IllegalArgumentException if either {@code type} or {@code label} + * have already been registered on this type adapter. + */ + public RuntimeTypeAdapterFactory registerSubtype(Class type, String label) { + if (type == null || label == null) { + throw new NullPointerException(); + } + if (subtypeToLabel.containsKey(type) || labelToSubtype.containsKey(label)) { + throw new IllegalArgumentException("types and labels must be unique"); + } + labelToSubtype.put(label, type); + subtypeToLabel.put(type, label); + return this; + } + + /** + * Registers {@code type} identified by its {@link Class#getSimpleName simple + * name}. Labels are case sensitive. + * + * @throws IllegalArgumentException if either {@code type} or its simple name + * have already been registered on this type adapter. + */ + public RuntimeTypeAdapterFactory registerSubtype(Class type) { + return registerSubtype(type, type.getSimpleName()); + } + + public TypeAdapter create(Gson gson, TypeToken type) { + if (type.getRawType() != baseType) { + return null; + } + + final Map> labelToDelegate + = new LinkedHashMap>(); + final Map, TypeAdapter> subtypeToDelegate + = new LinkedHashMap, TypeAdapter>(); + for (Map.Entry> entry : labelToSubtype.entrySet()) { + TypeAdapter delegate = gson.getDelegateAdapter(this, TypeToken.get(entry.getValue())); + labelToDelegate.put(entry.getKey(), delegate); + subtypeToDelegate.put(entry.getValue(), delegate); + } + + return new TypeAdapter() { + @Override public R read(JsonReader in) throws IOException { + JsonElement jsonElement = Streams.parse(in); + JsonElement labelJsonElement = jsonElement.getAsJsonObject().remove(typeFieldName); + if (labelJsonElement == null) { + throw new JsonParseException("cannot deserialize " + baseType + + " because it does not define a field named " + typeFieldName); + } + String label = labelJsonElement.getAsString(); + @SuppressWarnings("unchecked") // registration requires that subtype extends T + TypeAdapter delegate = (TypeAdapter) labelToDelegate.get(label); + if (delegate == null) { + throw new JsonParseException("cannot deserialize " + baseType + " subtype named " + + label + "; did you forget to register a subtype?"); + } + return delegate.fromJsonTree(jsonElement); + } + + @Override public void write(JsonWriter out, R value) throws IOException { + Class srcType = value.getClass(); + String label = subtypeToLabel.get(srcType); + @SuppressWarnings("unchecked") // registration requires that subtype extends T + TypeAdapter delegate = (TypeAdapter) subtypeToDelegate.get(srcType); + if (delegate == null) { + throw new JsonParseException("cannot serialize " + srcType.getName() + + "; did you forget to register a subtype?"); + } + JsonObject jsonObject = delegate.toJsonTree(value).getAsJsonObject(); + if (jsonObject.has(typeFieldName)) { + throw new JsonParseException("cannot serialize " + srcType.getName() + + " because it already defines a field named " + typeFieldName); + } + JsonObject clone = new JsonObject(); + clone.add(typeFieldName, new JsonPrimitive(label)); + for (Map.Entry e : jsonObject.entrySet()) { + clone.add(e.getKey(), e.getValue()); + } + Streams.write(clone, out); + } + }.nullSafe(); + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/WebsocketGsonFactory.java b/http-api/src/main/java/net/runelite/http/api/ws/WebsocketGsonFactory.java new file mode 100644 index 0000000000..589a538de3 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/WebsocketGsonFactory.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import net.runelite.http.api.ws.messages.Handshake; +import net.runelite.http.api.ws.messages.LoginResponse; +import net.runelite.http.api.ws.messages.party.Join; +import net.runelite.http.api.ws.messages.party.Part; +import net.runelite.http.api.ws.messages.party.UserJoin; +import net.runelite.http.api.ws.messages.party.UserPart; +import net.runelite.http.api.ws.messages.party.UserSync; + +public class WebsocketGsonFactory +{ + private static final Collection> MESSAGES; + + static + { + final List> messages = new ArrayList<>(); + messages.add(Handshake.class); + messages.add(LoginResponse.class); + messages.add(Join.class); + messages.add(Part.class); + messages.add(UserJoin.class); + messages.add(UserPart.class); + messages.add(UserSync.class); + MESSAGES = messages; + } + + public static RuntimeTypeAdapterFactory factory(final Collection> messages) + { + final RuntimeTypeAdapterFactory factory = RuntimeTypeAdapterFactory.of(WebsocketMessage.class); + + for (Class message : MESSAGES) + { + factory.registerSubtype(message); + } + + for (Class message : messages) + { + factory.registerSubtype(message); + } + + return factory; + } + + public static Gson build(final RuntimeTypeAdapterFactory factory) + { + return new GsonBuilder() + .registerTypeAdapterFactory(factory) + .create(); + } + + public static Gson build() + { + return build(factory(Collections.emptyList())); + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/WebsocketMessage.java b/http-api/src/main/java/net/runelite/http/api/ws/WebsocketMessage.java new file mode 100644 index 0000000000..d732c110cd --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/WebsocketMessage.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws; + +public class WebsocketMessage +{ + protected boolean _party; + + public boolean isParty() + { + return _party; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/Handshake.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/Handshake.java new file mode 100644 index 0000000000..557f8f524b --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/Handshake.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages; + +import java.util.UUID; +import net.runelite.http.api.ws.WebsocketMessage; + +public class Handshake extends WebsocketMessage +{ + private UUID session; + + public UUID getSession() + { + return session; + } + + public void setSession(UUID session) + { + this.session = session; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/LoginResponse.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/LoginResponse.java new file mode 100644 index 0000000000..b517e773a2 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/LoginResponse.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages; + +import net.runelite.http.api.ws.WebsocketMessage; + +/** + * Called after a successful login to the server + * @author Adam + */ +public class LoginResponse extends WebsocketMessage +{ + private String username; + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + @Override + public String toString() + { + return "LoginResponse{" + "username=" + username + '}'; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/Join.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/Join.java new file mode 100644 index 0000000000..21aed0f653 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/Join.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages.party; + +import java.util.UUID; +import lombok.EqualsAndHashCode; +import lombok.Value; +import net.runelite.http.api.ws.WebsocketMessage; + +@Value +@EqualsAndHashCode(callSuper = true) +public class Join extends WebsocketMessage +{ + private final UUID partyId; + private final String name; +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/Part.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/Part.java new file mode 100644 index 0000000000..e284ff0cf8 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/Part.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages.party; + +import net.runelite.http.api.ws.WebsocketMessage; + +public class Part extends WebsocketMessage +{ +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/PartyMemberMessage.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/PartyMemberMessage.java new file mode 100644 index 0000000000..9d5cab8545 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/PartyMemberMessage.java @@ -0,0 +1,12 @@ +package net.runelite.http.api.ws.messages.party; + +import java.util.UUID; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public abstract class PartyMemberMessage extends PartyMessage +{ + private UUID memberId; +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/PartyMessage.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/PartyMessage.java new file mode 100644 index 0000000000..709457ed8c --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/PartyMessage.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages.party; + +import net.runelite.http.api.ws.WebsocketMessage; + +public abstract class PartyMessage extends WebsocketMessage +{ + public PartyMessage() + { + _party = true; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserJoin.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserJoin.java new file mode 100644 index 0000000000..7f940e8060 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserJoin.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages.party; + +import java.util.UUID; +import lombok.EqualsAndHashCode; +import lombok.Value; +import net.runelite.http.api.ws.WebsocketMessage; + +@Value +@EqualsAndHashCode(callSuper = true) +public class UserJoin extends WebsocketMessage +{ + private final UUID memberId; + private final UUID partyId; + private final String name; +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserPart.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserPart.java new file mode 100644 index 0000000000..e80c6002bd --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserPart.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages.party; + +import java.util.UUID; +import lombok.EqualsAndHashCode; +import lombok.Value; +import net.runelite.http.api.ws.WebsocketMessage; + +@Value +@EqualsAndHashCode(callSuper = true) +public class UserPart extends WebsocketMessage +{ + private final UUID memberId; +} diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserSync.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserSync.java new file mode 100644 index 0000000000..c95038c9fa --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserSync.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.ws.messages.party; + +import lombok.EqualsAndHashCode; +import lombok.Value; + +@Value +@EqualsAndHashCode(callSuper = true) +public class UserSync extends PartyMemberMessage +{ +} diff --git a/RuneLitePlus/TestOverlay.java b/http-api/src/main/java/net/runelite/http/api/xp/XpClient.java similarity index 58% rename from RuneLitePlus/TestOverlay.java rename to http-api/src/main/java/net/runelite/http/api/xp/XpClient.java index 94b47c5bd5..c45fe2e209 100644 --- a/RuneLitePlus/TestOverlay.java +++ b/http-api/src/main/java/net/runelite/http/api/xp/XpClient.java @@ -1,6 +1,5 @@ /* * Copyright (c) 2018, Adam - * Copyright (c) 2018, Cas * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,41 +22,48 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package com.runeswag.client.plugins; +package net.runelite.http.api.xp; -import api.Client; -import com.runeswag.client.ui.Overlay; -import com.runeswag.client.ui.OverlayLayer; -import com.runeswag.client.ui.OverlayPosition; +import java.io.IOException; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.inject.Inject; -import java.awt.*; - -class TestOverlay extends Overlay +public class XpClient { - private static final Color SHORTCUT_HIGH_LEVEL_COLOR = Color.ORANGE; + private static final Logger logger = LoggerFactory.getLogger(XpClient.class); - private final Client client; - private final Test plugin; - private final TestConfig config; - - @Inject - private TestOverlay(Client client, Test plugin, TestConfig config) + public void update(String username) { - super(plugin); - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_SCENE); - this.client = client; - this.plugin = plugin; - this.config = config; - } + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("xp") + .addPathSegment("update") + .addQueryParameter("username", username) + .build(); - @Override - public Dimension render(Graphics2D graphics) - { - System.out.println("Rendered Test"); - graphics.setColor(Color.RED); - graphics.drawString("Hello World", 20, 20); - return null; + Request request = new Request.Builder() + .url(url) + .build(); + + RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + logger.warn("Error submitting xp track", e); + } + + @Override + public void onResponse(Call call, Response response) + { + response.close(); + logger.debug("Submitted xp track for {}", username); + } + }); } } diff --git a/http-api/src/main/java/net/runelite/http/api/xp/XpData.java b/http-api/src/main/java/net/runelite/http/api/xp/XpData.java new file mode 100644 index 0000000000..348faa5c78 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/xp/XpData.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.xp; + +import java.time.Instant; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(exclude = "time") +public class XpData +{ + private Instant time; + + private int attack_xp; + private int defence_xp; + private int strength_xp; + private int hitpoints_xp; + private int ranged_xp; + private int prayer_xp; + private int magic_xp; + private int cooking_xp; + private int woodcutting_xp; + private int fletching_xp; + private int fishing_xp; + private int firemaking_xp; + private int crafting_xp; + private int smithing_xp; + private int mining_xp; + private int herblore_xp; + private int agility_xp; + private int thieving_xp; + private int slayer_xp; + private int farming_xp; + private int runecraft_xp; + private int hunter_xp; + private int construction_xp; + + private int overall_rank; + private int attack_rank; + private int defence_rank; + private int strength_rank; + private int hitpoints_rank; + private int ranged_rank; + private int prayer_rank; + private int magic_rank; + private int cooking_rank; + private int woodcutting_rank; + private int fletching_rank; + private int fishing_rank; + private int firemaking_rank; + private int crafting_rank; + private int smithing_rank; + private int mining_rank; + private int herblore_rank; + private int agility_rank; + private int thieving_rank; + private int slayer_rank; + private int farming_rank; + private int runecraft_rank; + private int hunter_rank; + private int construction_rank; +} diff --git a/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java b/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java new file mode 100644 index 0000000000..7e01dc4b56 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.xtea; + +import com.google.gson.JsonParseException; +import com.google.gson.reflect.TypeToken; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class XteaClient +{ + private static final MediaType JSON = MediaType.parse("application/json"); + + private static final Logger logger = LoggerFactory.getLogger(XteaClient.class); + + public void submit(XteaRequest xteaRequest) + { + String json = RuneLiteAPI.GSON.toJson(xteaRequest); + + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("xtea") + .build(); + + logger.debug("Built URI: {}", url); + + Request request = new Request.Builder() + .post(RequestBody.create(JSON, json)) + .url(url) + .build(); + + try + { + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) + { + logger.debug("xtea response " + response.code()); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + + RuneLiteAPI.RLP_CLIENT.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + logger.warn("unable to submit xtea keys", e); + } + + @Override + public void onResponse(Call call, Response response) + { + try + { + if (!response.isSuccessful()) + { + logger.debug("unsuccessful xtea response"); + } + } + finally + { + response.close(); + } + } + }); + } + + public List get() throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("xtea") + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + InputStream in = response.body().byteStream(); + // CHECKSTYLE:OFF + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), new TypeToken>() + { + }.getType()); + // CHECKSTYLE:ON + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public XteaKey get(int region) throws IOException + { + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() + .addPathSegment("xtea") + .addPathSegment(Integer.toString(region)) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), XteaKey.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/xtea/XteaKey.java b/http-api/src/main/java/net/runelite/http/api/xtea/XteaKey.java new file mode 100644 index 0000000000..668a93038d --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/xtea/XteaKey.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.xtea; + +public class XteaKey +{ + private int region; + private int[] keys; + + public int getRegion() + { + return region; + } + + public void setRegion(int region) + { + this.region = region; + } + + public int[] getKeys() + { + return keys; + } + + public void setKeys(int[] keys) + { + this.keys = keys; + } +} diff --git a/http-api/src/main/java/net/runelite/http/api/xtea/XteaRequest.java b/http-api/src/main/java/net/runelite/http/api/xtea/XteaRequest.java new file mode 100644 index 0000000000..f84c85b83b --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/xtea/XteaRequest.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.xtea; + +import java.util.ArrayList; +import java.util.List; + +public class XteaRequest +{ + private int revision; + private List keys = new ArrayList<>(); + + public int getRevision() + { + return revision; + } + + public void setRevision(int revision) + { + this.revision = revision; + } + + public List getKeys() + { + return keys; + } + + public void addKey(XteaKey key) + { + keys.add(key); + } +} diff --git a/http-api/src/main/resources/runelite.properties b/http-api/src/main/resources/runelite.properties new file mode 100644 index 0000000000..4011664529 --- /dev/null +++ b/http-api/src/main/resources/runelite.properties @@ -0,0 +1,4 @@ +runelite.version=${project.version} +rs.version=${rs.version} +runelite.commit=${git.commit.id.abbrev} +runelite.dirty=${git.dirty} \ No newline at end of file diff --git a/http-service/pom.xml b/http-service/pom.xml new file mode 100644 index 0000000000..3a532c422f --- /dev/null +++ b/http-service/pom.xml @@ -0,0 +1,235 @@ + + + + 4.0.0 + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + Web Service + http-service + war + + + 1.5.6.RELEASE + 1.2.0.Final + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + org.springframework.boot + spring-boot-devtools + true + + + org.springframework + spring-jdbc + + + + org.mapstruct + mapstruct-jdk8 + ${mapstruct.version} + + + org.projectlombok + lombok + provided + + + + net.runelite + http-api + ${project.version} + + + net.runelite + cache + ${project.version} + + + + org.mariadb.jdbc + mariadb-java-client + 2.2.3 + provided + + + org.sql2o + sql2o + 1.5.4 + + + com.google.guava + guava + + + org.slf4j + slf4j-api + + + com.github.scribejava + scribejava-apis + 4.1.0 + + + io.minio + minio + 3.0.6 + + + redis.clients + jedis + 2.10.0 + + + org.apache.commons + commons-pool2 + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.squareup.okhttp3 + mockwebserver + 3.7.0 + test + + + com.h2database + h2 + test + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + + + runelite-${project.version} + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + com.github.kongchen + swagger-maven-plugin + 3.1.8 + + + + javax.xml.bind + jaxb-api + 2.3.1 + + + + + + true + + net.runelite + + + https + + api.runelite.net + /runelite-${project.version} + + ${project.parent.name} HTTP API + ${project.version} + ${project.description} + + https://tldrlegal.com/license/bsd-2-clause-license-(freebsd) + BSD 2-Clause "Simplified" + + + ${basedir}/src/main/templates/template.html.hbs + ${project.build.directory}/swagger-ui + ${project.build.directory}/site/api.html + true + json + + + + + + compile + + generate + + + + + + + diff --git a/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java b/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java new file mode 100644 index 0000000000..344e2ec916 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service; + +import ch.qos.logback.classic.LoggerContext; +import com.google.common.base.Strings; +import java.io.IOException; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.ServletException; +import javax.sql.DataSource; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.service.util.InstantConverter; +import okhttp3.Cache; +import okhttp3.OkHttpClient; +import org.slf4j.ILoggerFactory; +import org.slf4j.impl.StaticLoggerBinder; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.sql2o.Sql2o; +import org.sql2o.converters.Converter; +import org.sql2o.quirks.NoQuirks; + +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +@EnableScheduling +@Slf4j +public class SpringBootWebApplication extends SpringBootServletInitializer +{ + @Bean + protected ServletContextListener listener() + { + return new ServletContextListener() + { + @Override + public void contextInitialized(ServletContextEvent sce) + { + log.info("RuneLitePlus API started"); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) + { + // Destroy okhttp client + OkHttpClient client = RuneLiteAPI.CLIENT; + client.dispatcher().executorService().shutdown(); + client.connectionPool().evictAll(); + try + { + Cache cache = client.cache(); + if (cache != null) + { + cache.close(); + } + } + catch (IOException ex) + { + log.warn(null, ex); + } + + log.info("RuneLite API stopped"); + } + + }; + } + + @ConfigurationProperties(prefix = "datasource.runelite") + @Bean("dataSourceRuneLite") + public DataSourceProperties dataSourceProperties() + { + return new DataSourceProperties(); + } + + @ConfigurationProperties(prefix = "datasource.runelite-cache") + @Bean("dataSourceRuneLiteCache") + public DataSourceProperties dataSourcePropertiesCache() + { + return new DataSourceProperties(); + } + + @ConfigurationProperties(prefix = "datasource.runelite-tracker") + @Bean("dataSourceRuneLiteTracker") + public DataSourceProperties dataSourcePropertiesTracker() + { + return new DataSourceProperties(); + } + + @Bean(value = "runelite", destroyMethod = "") + public DataSource runeliteDataSource(@Qualifier("dataSourceRuneLite") DataSourceProperties dataSourceProperties) + { + return getDataSource(dataSourceProperties); + } + + @Bean(value = "runelite-cache2", destroyMethod = "") + public DataSource runeliteCache2DataSource(@Qualifier("dataSourceRuneLiteCache") DataSourceProperties dataSourceProperties) + { + return getDataSource(dataSourceProperties); + } + + @Bean(value = "runelite-tracker", destroyMethod = "") + public DataSource runeliteTrackerDataSource(@Qualifier("dataSourceRuneLiteTracker") DataSourceProperties dataSourceProperties) + { + return getDataSource(dataSourceProperties); + } + + @Bean("Runelite SQL2O") + public Sql2o sql2o(@Qualifier("runelite") DataSource dataSource) + { + return createSql2oFromDataSource(dataSource); + } + + @Bean("Runelite Cache SQL2O") + public Sql2o cacheSql2o(@Qualifier("runelite-cache2") DataSource dataSource) + { + return createSql2oFromDataSource(dataSource); + } + + @Bean("Runelite XP Tracker SQL2O") + public Sql2o trackerSql2o(@Qualifier("runelite-tracker") DataSource dataSource) + { + return createSql2oFromDataSource(dataSource); + } + + private static DataSource getDataSource(DataSourceProperties dataSourceProperties) + { + if (!Strings.isNullOrEmpty(dataSourceProperties.getJndiName())) + { + // Use JNDI provided datasource, which is already configured with pooling + JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); + return dataSourceLookup.getDataSource(dataSourceProperties.getJndiName()); + } + else + { + return dataSourceProperties.initializeDataSourceBuilder().build(); + } + } + + private static Sql2o createSql2oFromDataSource(final DataSource dataSource) + { + final Map converters = new HashMap<>(); + converters.put(Instant.class, new InstantConverter()); + return new Sql2o(dataSource, new NoQuirks(converters)); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(SpringBootWebApplication.class); + } + + @Override + public void onStartup(ServletContext servletContext) throws ServletException + { + super.onStartup(servletContext); + ILoggerFactory loggerFactory = StaticLoggerBinder.getSingleton().getLoggerFactory(); + if (loggerFactory instanceof LoggerContext) + { + LoggerContext loggerContext = (LoggerContext) loggerFactory; + loggerContext.setPackagingDataEnabled(false); + log.debug("Disabling logback packaging data"); + } + } + + public static void main(String[] args) + { + SpringApplication.run(SpringBootWebApplication.class, args); + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/SpringWebMvcConfigurer.java b/http-service/src/main/java/net/runelite/http/service/SpringWebMvcConfigurer.java new file mode 100644 index 0000000000..704e4f9cb2 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/SpringWebMvcConfigurer.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service; + +import java.util.List; +import net.runelite.http.api.RuneLiteAPI; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.GsonHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +@EnableWebMvc +public class SpringWebMvcConfigurer extends WebMvcConfigurerAdapter +{ + /** + * Configure .js as application/json to trick Cloudflare into caching json responses + */ + @Override + public void configureContentNegotiation(ContentNegotiationConfigurer configurer) + { + configurer.mediaType("js", MediaType.APPLICATION_JSON); + } + + /** + * Use GSON instead of Jackson for JSON serialization + * @param converters + */ + @Override + public void extendMessageConverters(List> converters) + { + // Could not figure out a better way to force GSON + converters.removeIf(MappingJackson2HttpMessageConverter.class::isInstance); + + GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter(); + gsonHttpMessageConverter.setGson(RuneLiteAPI.GSON); + converters.add(gsonHttpMessageConverter); + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/animation/AnimationCache.java b/http-service/src/main/java/net/runelite/http/service/animation/AnimationCache.java new file mode 100644 index 0000000000..05f8e5ae11 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/animation/AnimationCache.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.animation; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +class AnimationCache +{ + private int npcid; + private int anim1; + private int anim2; + private int anim3; + private int anim4; + private int anim5; + private int anim6; + private int anim7; + private int anim8; + private int anim9; + private int anim10; +} diff --git a/http-service/src/main/java/net/runelite/http/service/animation/AnimationController.java b/http-service/src/main/java/net/runelite/http/service/animation/AnimationController.java new file mode 100644 index 0000000000..c588b8193d --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/animation/AnimationController.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.animation; + +import java.util.List; +import java.util.stream.Collectors; +import net.runelite.http.api.animation.AnimationKey; +import net.runelite.http.api.animation.AnimationRequest; +import net.runelite.http.service.util.exception.NotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import static org.springframework.web.bind.annotation.RequestMethod.POST; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/animation") +public class AnimationController +{ + @Autowired + private AnimationEndpoint animationService; + + @RequestMapping(method = POST) + public void submit(@RequestBody AnimationRequest animationRequest) + { + animationService.submit(animationRequest); + } + + @GetMapping + public List get() + { + return animationService.get().stream() + .map(AnimationController::entryToKey) + .collect(Collectors.toList()); + } + + @GetMapping("/{npcid}") + public AnimationKey getRegion(@PathVariable int npcid) + { + AnimationEntry animationEntry = animationService.getNPC(npcid); + if (animationEntry == null) + { + throw new NotFoundException(); + } + + return entryToKey(animationEntry); + } + + private static AnimationKey entryToKey(AnimationEntry xe) + { + AnimationKey animationKey = new AnimationKey(); + animationKey.setNPCId(xe.getNPCId()); + animationKey.setAnimations(new int[] + { + xe.getAnimations()[0], + xe.getAnimations()[1], + xe.getAnimations()[2], + xe.getAnimations()[3], + xe.getAnimations()[4], + xe.getAnimations()[5], + xe.getAnimations()[6], + xe.getAnimations()[7], + xe.getAnimations()[8], + xe.getAnimations()[9], + }); + return animationKey; + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/animation/AnimationEndpoint.java b/http-service/src/main/java/net/runelite/http/service/animation/AnimationEndpoint.java new file mode 100644 index 0000000000..d33ca43051 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/animation/AnimationEndpoint.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.animation; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import java.util.List; +import net.runelite.http.api.animation.AnimationKey; +import net.runelite.http.api.animation.AnimationRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import org.sql2o.Connection; +import org.sql2o.Query; +import org.sql2o.Sql2o; + +@Service +public class AnimationEndpoint +{ + private static final String CREATE_SQL = "CREATE TABLE IF NOT EXISTS `animation` (\n" + + " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + + " `npcid` int(11) NOT NULL,\n" + + " `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" + + " `rev` int(11) NOT NULL,\n" + + " `anim1` int(11) NOT NULL,\n" + + " `anim2` int(11),\n" + + " `anim3` int(11),\n" + + " `anim4` int(11),\n" + + " `anim5` int(11),\n" + + " `anim6` int(11),\n" + + " `anim7` int(11),\n" + + " `anim8` int(11),\n" + + " `anim9` int(11),\n" + + " `anim10` int(11),\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `npcid` (`npcid`,`time`)\n" + + ") ENGINE=InnoDB"; + + private final Sql2o sql2o; + + private final Cache keyCache = CacheBuilder.newBuilder() + .maximumSize(1024) + .build(); + + @Autowired + public AnimationEndpoint( + @Qualifier("Runelite SQL2O") Sql2o sql2o + ) + { + this.sql2o = sql2o; + + try (Connection con = sql2o.beginTransaction()) + { + con.createQuery(CREATE_SQL) + .executeUpdate(); + } + } + + private AnimationEntry findLatestAnimations(Connection con, int npcid) + { + return con.createQuery("select npcid, time, anim1, anim2, anim3, anim4, anim5, anim6, anim7, anim8, anim9, anim10 from animation " + + "where npcid = :npcid " + + "order by time desc " + + "limit 1") + .addParameter("npcid", npcid) + .executeAndFetchFirst(AnimationEntry.class); + } + + public void submit(AnimationRequest animationRequest) + { + boolean cached = true; + for (AnimationKey key : animationRequest.getKeys()) + { + int npcid = key.getNPCId(); + int[] animations = key.getAnimations(); + + AnimationCache animationCache = keyCache.getIfPresent(npcid); + if (animationCache == null + || animationCache.getAnim1() != animations[0] + || animationCache.getAnim2() != animations[1] + || animationCache.getAnim3() != animations[2] + || animationCache.getAnim4() != animations[3] + || animationCache.getAnim5() != animations[4] + || animationCache.getAnim6() != animations[5] + || animationCache.getAnim7() != animations[6] + || animationCache.getAnim8() != animations[7] + || animationCache.getAnim9() != animations[8] + || animationCache.getAnim10() != animations[9]) + { + cached = false; + keyCache.put(npcid, new AnimationCache(npcid, animations[0], animations[1], animations[2], animations[3], animations[4], animations[5], animations[6], animations[7], animations[8], animations[9])); + } + } + + if (cached) + { + return; + } + + try (Connection con = sql2o.beginTransaction()) + { + Query query = null; + + for (AnimationKey key : animationRequest.getKeys()) + { + int npcid = key.getNPCId(); + int[] animations = key.getAnimations(); + + AnimationEntry animationEntry = findLatestAnimations(con, npcid); + + if (animations.length != 10) + { + throw new IllegalArgumentException("Key length must be 10"); + } + + // already have these? + if (animationEntry != null + && animationEntry.getAnimations()[0] == animations[0] + && animationEntry.getAnimations()[1] == animations[1] + && animationEntry.getAnimations()[2] == animations[2] + && animationEntry.getAnimations()[3] == animations[3] + && animationEntry.getAnimations()[4] == animations[4] + && animationEntry.getAnimations()[5] == animations[5] + && animationEntry.getAnimations()[6] == animations[6] + && animationEntry.getAnimations()[7] == animations[7] + && animationEntry.getAnimations()[8] == animations[8] + && animationEntry.getAnimations()[9] == animations[9]) + { + continue; + } + + + if (query == null) + { + query = con.createQuery("insert into animation (npcid, rev, anim1, anim2, anim3, anim4, anim5, anim6, anim7, anim8, anim9, anim10) " + + "values (:npcid, :rev, :anim1, :anim2, :anim3, :anim4, anim5, anim6, anim7, anim8, anim9, anim10)"); + } + + query.addParameter("npcid", npcid) + .addParameter("rev", animationRequest.getRevision()) + .addParameter("anim1", animations[0]) + .addParameter("anim2", animations[1]) + .addParameter("anim3", animations[2]) + .addParameter("anim4", animations[3]) + .addParameter("anim5", animations[4]) + .addParameter("anim6", animations[5]) + .addParameter("anim7", animations[6]) + .addParameter("anim8", animations[7]) + .addParameter("anim9", animations[8]) + .addParameter("anim10", animations[9]) + .addToBatch(); + } + + if (query != null) + { + query.executeBatch(); + con.commit(false); + } + } + } + + public List get() + { + try (Connection con = sql2o.open()) + { + return con.createQuery( + "select t1.npcid, t2.time, t2.rev, t2.anim1, t2.anim2, t2.anim3, t2.anim4, t2.anim5, t2.anim6, t2.anim7, t2.anim8, t2.anim9, t2.anim10 from " + + "(select npcid,max(id) as id from animation group by npcid) t1 " + + "join animation t2 on t1.id = t2.id") + .executeAndFetch(AnimationEntry.class); + } + } + + public AnimationEntry getNPC(int npcid) + { + try (Connection con = sql2o.open()) + { + return con.createQuery("select npcid, time, rev, anim1, anim2, anim3, anim4, anim5, anim6, anim7, anim8, anim9, anim10 from animation " + + "where npcid = :npcid order by time desc limit 1") + .addParameter("npcid", npcid) + .executeAndFetchFirst(AnimationEntry.class); + } + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/animation/AnimationEntry.java b/http-service/src/main/java/net/runelite/http/service/animation/AnimationEntry.java new file mode 100644 index 0000000000..af8ed67257 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/animation/AnimationEntry.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.animation; + +import java.time.Instant; + +public class AnimationEntry +{ + private int npcid; + private Instant time; + private int rev; + private int[] animations; + + public int getNPCId() + { + return npcid; + } + + public void setNPCId(int npcid) + { + this.npcid = npcid; + } + + public Instant getTime() + { + return time; + } + + public void setTime(Instant time) + { + this.time = time; + } + + public int getRev() + { + return rev; + } + + public void setRev(int rev) + { + this.rev = rev; + } + + public int[] getAnimations() + { + return animations; + } + + public void setAnimations(int[] animations) + { + this.animations = animations; + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java new file mode 100644 index 0000000000..df287e6512 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.chat; + +import java.util.regex.Pattern; +import com.google.common.base.Strings; +import net.runelite.http.api.chat.House; +import net.runelite.http.service.util.exception.NotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/chat") +public class ChatController +{ + private static final Pattern STRING_VALIDATION = Pattern.compile("[^a-zA-Z0-9' -]"); + private static final int STRING_MAX_LENGTH = 50; + + @Autowired + private ChatService chatService; + + @PostMapping("/layout") + public void submitLayout(@RequestParam String name, @RequestParam String layout) + { + if (Strings.isNullOrEmpty(layout)) + { + return; + } + + chatService.setLayout(name, layout); + } + + @GetMapping("/layout") + public String getLayout(@RequestParam String name) + { + String layout = chatService.getLayout(name); + if (layout == null) + { + throw new NotFoundException(); + } + return layout; + } + + @PostMapping("/hosts") + public void submitHost(@RequestParam int world, @RequestParam String location, @RequestParam String owner, @RequestParam boolean guildedAltar, @RequestParam boolean occultAltar, @RequestParam boolean spiritTree, @RequestParam boolean fairyRing, @RequestParam boolean wildernessObelisk, @RequestParam boolean repairStand, @RequestParam boolean combatDummy, @RequestParam(required = false, defaultValue = "false") boolean remove) + { + if (!location.equals("Rimmington") && !location.equals("Yanille")) + { + return; + } + + House house = new House(); + house.setOwner(owner); + house.setGuildedAltarPresent(guildedAltar); + house.setOccultAltarPresent(occultAltar); + house.setSpiritTreePresent(spiritTree); + house.setFairyRingPresent(fairyRing); + house.setWildernessObeliskPresent(wildernessObelisk); + house.setRepairStandPresent(repairStand); + house.setCombatDummyPresent(combatDummy); + + if (remove) + { + chatService.removeHost(world, location, house); + } + else + { + chatService.addHost(world, location, house); + } + } + + @GetMapping("/hosts") + public House[] getHosts(@RequestParam int world, @RequestParam String location) + { + return chatService.getHosts(world, location); + } +} \ No newline at end of file diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java new file mode 100644 index 0000000000..aa23d3f18d --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.chat; + +import java.time.Duration; +import java.util.List; +import net.runelite.http.api.chat.ChatClient; +import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.chat.House; +import net.runelite.http.service.util.redis.RedisPool; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import redis.clients.jedis.Jedis; + +@Service +public class ChatService +{ + private static final Duration EXPIRE = Duration.ofMinutes(2); + + private final RedisPool jedisPool; + private final ChatClient chatClient = new ChatClient(); + + + @Autowired + public ChatService(RedisPool jedisPool) + { + this.jedisPool = jedisPool; + } + + public String getLayout(String name) + { + String value; + try (Jedis jedis = jedisPool.getResource()) + { + value = jedis.get("layout." + name); + } + return value; + } + + public void setLayout(String name, String layout) + { + if (!chatClient.testLayout(layout)) + { + throw new IllegalArgumentException(layout); + } + + try (Jedis jedis = jedisPool.getResource()) + { + jedis.setex("layout." + name, (int) EXPIRE.getSeconds(), layout); + } + } + + public void addHost(int world, String location, House house) + { + String houseJSON = house.toString(); + + String key = "hosts.w" + Integer.toString(world) + "." + location; + + try (Jedis jedis = jedisPool.getResource()) + { + jedis.rpush(key, houseJSON); + } + } + + public House[] getHosts(int world, String location) + { + List json; + String key = "hosts.w" + Integer.toString(world) + "." + location; + + try (Jedis jedis = jedisPool.getResource()) + { + json = jedis.lrange(key, 0, 25); + } + + if (json.isEmpty()) + { + return null; + } + + House[] hosts = new House[json.size()]; + for (int i = 0; i < json.size(); i++) + { + hosts[i] = RuneLiteAPI.GSON.fromJson(json.get(i), House.class); + } + return hosts; + } + + public void removeHost(int world, String location, House house) + { + String json = house.toString(); + String key = "hosts.w" + Integer.toString(world) + "." + location; + + try (Jedis jedis = jedisPool.getResource()) + { + jedis.lrem(key, 0, json); + } + } +} \ No newline at end of file diff --git a/http-service/src/main/java/net/runelite/http/service/util/CacheControlFilter.java b/http-service/src/main/java/net/runelite/http/service/util/CacheControlFilter.java new file mode 100644 index 0000000000..f0bd95e914 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/util/CacheControlFilter.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.util; + +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +@ControllerAdvice +public class CacheControlFilter implements ResponseBodyAdvice +{ + + @Override + public boolean supports(MethodParameter returnType, Class> converterType) + { + return true; + } + + @Override + public Object beforeBodyWrite( + Object body, + MethodParameter returnType, + MediaType selectedContentType, + Class> selectedConverterType, + ServerHttpRequest request, + ServerHttpResponse response + ) + { + if (!response.getHeaders().containsKey("Cache-Control")) + { + response.getHeaders().add("Cache-Control", "no-cache, no-store, must-revalidate"); + response.getHeaders().add("pragma", "no-cache"); + } + return body; + } +} \ No newline at end of file diff --git a/http-service/src/main/java/net/runelite/http/service/util/HiscoreEndpointEditor.java b/http-service/src/main/java/net/runelite/http/service/util/HiscoreEndpointEditor.java new file mode 100644 index 0000000000..816981f99a --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/util/HiscoreEndpointEditor.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.http.service.util; + +import net.runelite.http.api.hiscore.HiscoreEndpoint; + +import java.beans.PropertyEditorSupport; + +public class HiscoreEndpointEditor extends PropertyEditorSupport +{ + @Override + public void setAsText(String text) throws IllegalArgumentException + { + setValue(HiscoreEndpoint.valueOf(text.toUpperCase())); + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/util/InstantConverter.java b/http-service/src/main/java/net/runelite/http/service/util/InstantConverter.java new file mode 100644 index 0000000000..785ad00266 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/util/InstantConverter.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.util; + +import java.sql.Timestamp; +import java.time.Instant; +import org.sql2o.converters.Converter; +import org.sql2o.converters.ConverterException; + +public class InstantConverter implements Converter +{ + @Override + public Instant convert(Object val) throws ConverterException + { + Timestamp ts = (Timestamp) val; + return ts.toInstant(); + } + + @Override + public Object toDatabaseParam(Instant val) + { + return Timestamp.from(val); + } + +} diff --git a/http-service/src/main/java/net/runelite/http/service/util/exception/InternalServerErrorException.java b/http-service/src/main/java/net/runelite/http/service/util/exception/InternalServerErrorException.java new file mode 100644 index 0000000000..30e0ffda4e --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/util/exception/InternalServerErrorException.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.util.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) +public class InternalServerErrorException extends RuntimeException +{ + public InternalServerErrorException(String message) + { + super(message); + } +} \ No newline at end of file diff --git a/http-service/src/main/java/net/runelite/http/service/util/exception/NotFoundException.java b/http-service/src/main/java/net/runelite/http/service/util/exception/NotFoundException.java new file mode 100644 index 0000000000..840c125ff5 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/util/exception/NotFoundException.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.util.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Not found") +public class NotFoundException extends RuntimeException +{ + +} \ No newline at end of file diff --git a/http-service/src/main/java/net/runelite/http/service/util/redis/RedisPool.java b/http-service/src/main/java/net/runelite/http/service/util/redis/RedisPool.java new file mode 100644 index 0000000000..a69232ed55 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/util/redis/RedisPool.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.util.redis; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; + +@Component +public class RedisPool +{ + private final BlockingQueue queue; + + RedisPool(@Value("${redis.pool.size:10}") int queueSize, @Value("${redis.host:localhost}") String redisHost) + { + queue = new ArrayBlockingQueue<>(queueSize); + for (int i = 0; i < queueSize; ++i) + { + Jedis jedis = new PooledJedis(redisHost); + queue.offer(jedis); + } + } + + public Jedis getResource() + { + Jedis jedis; + try + { + jedis = queue.poll(1, TimeUnit.SECONDS); + } + catch (InterruptedException e) + { + throw new RuntimeException(e); + } + if (jedis == null) + { + throw new RuntimeException("Unable to acquire connection from pool, timeout"); + } + return jedis; + } + + class PooledJedis extends Jedis + { + PooledJedis(String host) + { + super(host); + } + + @Override + public void close() + { + queue.offer(this); + } + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaCache.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaCache.java new file mode 100644 index 0000000000..7c5f2bb5b0 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaCache.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.xtea; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +class XteaCache +{ + private int region; + private int key1; + private int key2; + private int key3; + private int key4; +} diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaController.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaController.java new file mode 100644 index 0000000000..b0c592fc70 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaController.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.xtea; + +import java.util.List; +import java.util.stream.Collectors; +import net.runelite.http.api.xtea.XteaKey; +import net.runelite.http.api.xtea.XteaRequest; +import net.runelite.http.service.util.exception.NotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import static org.springframework.web.bind.annotation.RequestMethod.POST; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/xtea") +public class XteaController +{ + @Autowired + private XteaEndpoint xteaService; + + @RequestMapping(method = POST) + public void submit(@RequestBody XteaRequest xteaRequest) + { + xteaService.submit(xteaRequest); + } + + @GetMapping + public List get() + { + return xteaService.get().stream() + .map(XteaController::entryToKey) + .collect(Collectors.toList()); + } + + @GetMapping("/{region}") + public XteaKey getRegion(@PathVariable int region) + { + XteaEntry xteaRegion = xteaService.getRegion(region); + if (xteaRegion == null) + { + throw new NotFoundException(); + } + + return entryToKey(xteaRegion); + } + + private static XteaKey entryToKey(XteaEntry xe) + { + XteaKey xteaKey = new XteaKey(); + xteaKey.setRegion(xe.getRegion()); + xteaKey.setKeys(new int[] + { + xe.getKey1(), + xe.getKey2(), + xe.getKey3(), + xe.getKey4() + }); + return xteaKey; + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaEndpoint.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEndpoint.java new file mode 100644 index 0000000000..e6c82d74ac --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEndpoint.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.xtea; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import java.util.List; +import net.runelite.http.api.xtea.XteaKey; +import net.runelite.http.api.xtea.XteaRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import org.sql2o.Connection; +import org.sql2o.Query; +import org.sql2o.Sql2o; + +@Service +public class XteaEndpoint +{ + private static final String CREATE_SQL = "CREATE TABLE IF NOT EXISTS `xtea` (\n" + + " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + + " `region` int(11) NOT NULL,\n" + + " `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" + + " `rev` int(11) NOT NULL,\n" + + " `key1` int(11) NOT NULL,\n" + + " `key2` int(11) NOT NULL,\n" + + " `key3` int(11) NOT NULL,\n" + + " `key4` int(11) NOT NULL,\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `region` (`region`,`time`)\n" + + ") ENGINE=InnoDB"; + + private final Sql2o sql2o; + + private final Cache keyCache = CacheBuilder.newBuilder() + .maximumSize(1024) + .build(); + + @Autowired + public XteaEndpoint( + @Qualifier("Runelite SQL2O") Sql2o sql2o + ) + { + this.sql2o = sql2o; + + try (Connection con = sql2o.beginTransaction()) + { + con.createQuery(CREATE_SQL) + .executeUpdate(); + } + } + + private XteaEntry findLatestXtea(Connection con, int region) + { + return con.createQuery("select region, time, key1, key2, key3, key4 from xtea " + + "where region = :region " + + "order by time desc " + + "limit 1") + .addParameter("region", region) + .executeAndFetchFirst(XteaEntry.class); + } + + public void submit(XteaRequest xteaRequest) + { + boolean cached = true; + for (XteaKey key : xteaRequest.getKeys()) + { + int region = key.getRegion(); + int[] keys = key.getKeys(); + + XteaCache xteaCache = keyCache.getIfPresent(region); + if (xteaCache == null + || xteaCache.getKey1() != keys[0] + || xteaCache.getKey2() != keys[1] + || xteaCache.getKey3() != keys[2] + || xteaCache.getKey4() != keys[3]) + { + cached = false; + keyCache.put(region, new XteaCache(region, keys[0], keys[1], keys[2], keys[3])); + } + } + + if (cached) + { + return; + } + + try (Connection con = sql2o.beginTransaction()) + { + Query query = null; + + for (XteaKey key : xteaRequest.getKeys()) + { + int region = key.getRegion(); + int[] keys = key.getKeys(); + + XteaEntry xteaEntry = findLatestXtea(con, region); + + if (keys.length != 4) + { + throw new IllegalArgumentException("Key length must be 4"); + } + + // already have these? + // TODO : check if useful / works should check with findLatestXtea + if (xteaEntry != null + && xteaEntry.getKey1() == keys[0] + && xteaEntry.getKey2() == keys[1] + && xteaEntry.getKey3() == keys[2] + && xteaEntry.getKey4() == keys[3]) + { + continue; + } + + + if (query == null) + { + query = con.createQuery("insert into xtea (region, rev, key1, key2, key3, key4) " + + "values (:region, :rev, :key1, :key2, :key3, :key4)"); + } + + query.addParameter("region", region) + .addParameter("rev", xteaRequest.getRevision()) + .addParameter("key1", keys[0]) + .addParameter("key2", keys[1]) + .addParameter("key3", keys[2]) + .addParameter("key4", keys[3]) + .addToBatch(); + } + + if (query != null) + { + query.executeBatch(); + con.commit(false); + } + } + } + + public List get() + { + try (Connection con = sql2o.open()) + { + return con.createQuery( + "select t1.region, t2.time, t2.rev, t2.key1, t2.key2, t2.key3, t2.key4 from " + + "(select region,max(id) as id from xtea group by region) t1 " + + "join xtea t2 on t1.id = t2.id") + .executeAndFetch(XteaEntry.class); + } + } + + public XteaEntry getRegion(int region) + { + try (Connection con = sql2o.open()) + { + return con.createQuery("select region, time, rev, key1, key2, key3, key4 from xtea " + + "where region = :region order by time desc limit 1") + .addParameter("region", region) + .executeAndFetchFirst(XteaEntry.class); + } + } +} diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java new file mode 100644 index 0000000000..e1e86d0bf7 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.xtea; + +import java.time.Instant; + +public class XteaEntry +{ + private int region; + private Instant time; + private int rev; + private int key1; + private int key2; + private int key3; + private int key4; + + public int getRegion() + { + return region; + } + + public void setRegion(int region) + { + this.region = region; + } + + public Instant getTime() + { + return time; + } + + public void setTime(Instant time) + { + this.time = time; + } + + public int getRev() + { + return rev; + } + + public void setRev(int rev) + { + this.rev = rev; + } + + public int getKey1() + { + return key1; + } + + public void setKey1(int key1) + { + this.key1 = key1; + } + + public int getKey2() + { + return key2; + } + + public void setKey2(int key2) + { + this.key2 = key2; + } + + public int getKey3() + { + return key3; + } + + public void setKey3(int key3) + { + this.key3 = key3; + } + + public int getKey4() + { + return key4; + } + + public void setKey4(int key4) + { + this.key4 = key4; + } + +} diff --git a/http-service/src/main/resources/application-dev.yaml b/http-service/src/main/resources/application-dev.yaml new file mode 100644 index 0000000000..cc2286e9b3 --- /dev/null +++ b/http-service/src/main/resources/application-dev.yaml @@ -0,0 +1,31 @@ +# Enable debug logging +debug: true +logging.level.net.runelite: DEBUG + +# Development data sources +datasource: + runelite: + jndiName: + driverClassName: org.mariadb.jdbc.Driver + type: org.mariadb.jdbc.MariaDbDataSource + url: jdbc:mariadb://localhost:3306/runelite + username: runelite + password: runelite + runelite-cache: + jndiName: + driverClassName: org.mariadb.jdbc.Driver + type: org.mariadb.jdbc.MariaDbDataSource + url: jdbc:mariadb://localhost:3306/cache + username: runelite + password: runelite + runelite-tracker: + jndiName: + driverClassName: org.mariadb.jdbc.Driver + type: org.mariadb.jdbc.MariaDbDataSource + url: jdbc:mariadb://localhost:3306/xptracker + username: runelite + password: runelite + +# Development oauth callback (without proxy) +oauth: + callback: http://localhost:8080/account/callback diff --git a/http-service/src/main/resources/application.yaml b/http-service/src/main/resources/application.yaml new file mode 100644 index 0000000000..06b5933704 --- /dev/null +++ b/http-service/src/main/resources/application.yaml @@ -0,0 +1,39 @@ +datasource: + runelite: + jndiName: java:comp/env/jdbc/runelite + runelite-cache: + jndiName: java:comp/env/jdbc/runelite-cache2 + runelite-tracker: + jndiName: java:comp/env/jdbc/runelite-tracker + +# By default Spring tries to register the datasource as an MXBean, +# so if multiple apis are deployed on one web container with +# shared datasource it tries to register it multiples times and +# fails when starting the 2nd api +spring.jmx.enabled: false + +# Google OAuth client +oauth: + client-id: + client-secret: + callback: https://api.runelite.net/oauth/ + +# Minio client storage for cache +minio: + endpoint: http://localhost:9000 + accesskey: AM54M27O4WZK65N6F8IP + secretkey: /PZCxzmsJzwCHYlogcymuprniGCaaLUOET2n6yMP + bucket: runelite + +# Redis client for temporary data storage +redis: + pool.size: 10 + host: http://localhost:6379 + + +# Twitter client for feed +runelite: + twitter: + consumerkey: + secretkey: + listid: 968949795153948673 \ No newline at end of file diff --git a/http-service/src/main/resources/net/runelite/http/service/xp/schema.sql b/http-service/src/main/resources/net/runelite/http/service/xp/schema.sql new file mode 100644 index 0000000000..70f83a30fd --- /dev/null +++ b/http-service/src/main/resources/net/runelite/http/service/xp/schema.sql @@ -0,0 +1,135 @@ +-- MySQL dump 10.16 Distrib 10.2.18-MariaDB, for Linux (x86_64) +-- +-- Host: localhost Database: xptracker +-- ------------------------------------------------------ +-- Server version 10.2.18-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `player` +-- + +DROP TABLE IF EXISTS `player`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `player` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(32) NOT NULL, + `tracked_since` timestamp NOT NULL DEFAULT current_timestamp(), + `last_updated` timestamp NOT NULL DEFAULT current_timestamp(), + `rank` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `xp` +-- + +DROP TABLE IF EXISTS `xp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `xp` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `time` timestamp NOT NULL DEFAULT current_timestamp(), + `player` int(11) NOT NULL, + `attack_xp` int(11) NOT NULL, + `defence_xp` int(11) NOT NULL, + `strength_xp` int(11) NOT NULL, + `hitpoints_xp` int(11) NOT NULL, + `ranged_xp` int(11) NOT NULL, + `prayer_xp` int(11) NOT NULL, + `magic_xp` int(11) NOT NULL, + `cooking_xp` int(11) NOT NULL, + `woodcutting_xp` int(11) NOT NULL, + `fletching_xp` int(11) NOT NULL, + `fishing_xp` int(11) NOT NULL, + `firemaking_xp` int(11) NOT NULL, + `crafting_xp` int(11) NOT NULL, + `smithing_xp` int(11) NOT NULL, + `mining_xp` int(11) NOT NULL, + `herblore_xp` int(11) NOT NULL, + `agility_xp` int(11) NOT NULL, + `thieving_xp` int(11) NOT NULL, + `slayer_xp` int(11) NOT NULL, + `farming_xp` int(11) NOT NULL, + `runecraft_xp` int(11) NOT NULL, + `hunter_xp` int(11) NOT NULL, + `construction_xp` int(11) NOT NULL, + `overall_xp` int(11) GENERATED ALWAYS AS (`attack_xp` + `defence_xp` + `strength_xp` + `hitpoints_xp` + `ranged_xp` + `prayer_xp` + `magic_xp` + `cooking_xp` + `woodcutting_xp` + `fletching_xp` + `fishing_xp` + `firemaking_xp` + `crafting_xp` + `smithing_xp` + `mining_xp` + `herblore_xp` + `agility_xp` + `thieving_xp` + `slayer_xp` + `farming_xp` + `runecraft_xp` + `hunter_xp` + `construction_xp`) VIRTUAL, + `attack_level` int(11) GENERATED ALWAYS AS (level_for_xp(`attack_xp` AS `attack_xp`)) VIRTUAL, + `defence_level` int(11) GENERATED ALWAYS AS (level_for_xp(`defence_xp` AS `defence_xp`)) VIRTUAL, + `strength_level` int(11) GENERATED ALWAYS AS (level_for_xp(`strength_xp` AS `strength_xp`)) VIRTUAL, + `hitpoints_level` int(11) GENERATED ALWAYS AS (level_for_xp(`hitpoints_xp` AS `hitpoints_xp`)) VIRTUAL, + `ranged_level` int(11) GENERATED ALWAYS AS (level_for_xp(`ranged_xp` AS `ranged_xp`)) VIRTUAL, + `prayer_level` int(11) GENERATED ALWAYS AS (level_for_xp(`prayer_xp` AS `prayer_xp`)) VIRTUAL, + `magic_level` int(11) GENERATED ALWAYS AS (level_for_xp(`magic_xp` AS `magic_xp`)) VIRTUAL, + `cooking_level` int(11) GENERATED ALWAYS AS (level_for_xp(`cooking_xp` AS `cooking_xp`)) VIRTUAL, + `woodcutting_level` int(11) GENERATED ALWAYS AS (level_for_xp(`woodcutting_xp` AS `woodcutting_xp`)) VIRTUAL, + `fletching_level` int(11) GENERATED ALWAYS AS (level_for_xp(`fletching_xp` AS `fletching_xp`)) VIRTUAL, + `fishing_level` int(11) GENERATED ALWAYS AS (level_for_xp(`fishing_xp` AS `fishing_xp`)) VIRTUAL, + `firemaking_level` int(11) GENERATED ALWAYS AS (level_for_xp(`firemaking_xp` AS `firemaking_xp`)) VIRTUAL, + `crafting_level` int(11) GENERATED ALWAYS AS (level_for_xp(`crafting_xp` AS `crafting_xp`)) VIRTUAL, + `smithing_level` int(11) GENERATED ALWAYS AS (level_for_xp(`smithing_xp` AS `smithing_xp`)) VIRTUAL, + `mining_level` int(11) GENERATED ALWAYS AS (level_for_xp(`mining_xp` AS `mining_xp`)) VIRTUAL, + `herblore_level` int(11) GENERATED ALWAYS AS (level_for_xp(`herblore_xp` AS `herblore_xp`)) VIRTUAL, + `agility_level` int(11) GENERATED ALWAYS AS (level_for_xp(`agility_xp` AS `agility_xp`)) VIRTUAL, + `thieving_level` int(11) GENERATED ALWAYS AS (level_for_xp(`thieving_xp` AS `thieving_xp`)) VIRTUAL, + `slayer_level` int(11) GENERATED ALWAYS AS (level_for_xp(`slayer_xp` AS `slayer_xp`)) VIRTUAL, + `farming_level` int(11) GENERATED ALWAYS AS (level_for_xp(`farming_xp` AS `farming_xp`)) VIRTUAL, + `runecraft_level` int(11) GENERATED ALWAYS AS (level_for_xp(`runecraft_xp` AS `runecraft_xp`)) VIRTUAL, + `hunter_level` int(11) GENERATED ALWAYS AS (level_for_xp(`hunter_xp` AS `hunter_xp`)) VIRTUAL, + `construction_level` int(11) GENERATED ALWAYS AS (level_for_xp(`construction_xp` AS `construction_xp`)) VIRTUAL, + `overall_level` int(11) GENERATED ALWAYS AS (`attack_level` + `defence_level` + `strength_level` + `hitpoints_level` + `ranged_level` + `prayer_level` + `magic_level` + `cooking_level` + `woodcutting_level` + `fletching_level` + `fishing_level` + `firemaking_level` + `crafting_level` + `smithing_level` + `mining_level` + `herblore_level` + `agility_level` + `thieving_level` + `slayer_level` + `farming_level` + `runecraft_level` + `hunter_level` + `construction_level`) VIRTUAL, + `attack_rank` int(11) NOT NULL, + `defence_rank` int(11) NOT NULL, + `strength_rank` int(11) NOT NULL, + `hitpoints_rank` int(11) NOT NULL, + `ranged_rank` int(11) NOT NULL, + `prayer_rank` int(11) NOT NULL, + `magic_rank` int(11) NOT NULL, + `cooking_rank` int(11) NOT NULL, + `woodcutting_rank` int(11) NOT NULL, + `fletching_rank` int(11) NOT NULL, + `fishing_rank` int(11) NOT NULL, + `firemaking_rank` int(11) NOT NULL, + `crafting_rank` int(11) NOT NULL, + `smithing_rank` int(11) NOT NULL, + `mining_rank` int(11) NOT NULL, + `herblore_rank` int(11) NOT NULL, + `agility_rank` int(11) NOT NULL, + `thieving_rank` int(11) NOT NULL, + `slayer_rank` int(11) NOT NULL, + `farming_rank` int(11) NOT NULL, + `runecraft_rank` int(11) NOT NULL, + `hunter_rank` int(11) NOT NULL, + `construction_rank` int(11) NOT NULL, + `overall_rank` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `player_time` (`player`,`time`), + KEY `idx_time` (`time`), + CONSTRAINT `fk_player` FOREIGN KEY (`player`) REFERENCES `player` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2019-02-15 21:01:17 \ No newline at end of file diff --git a/http-service/src/main/templates/markdown.hbs b/http-service/src/main/templates/markdown.hbs new file mode 100644 index 0000000000..1beacd052a --- /dev/null +++ b/http-service/src/main/templates/markdown.hbs @@ -0,0 +1,110 @@ +{{#info}} +# {{title}} +{{join schemes " | "}}://{{host}}{{basePath}} + +{{description}} + +{{#contact}} +[**Contact the developer**](mailto:{{email}}) +{{/contact}} + +**Version** {{version}} + +{{#if termsOfService}} +[**Terms of Service**]({{termsOfService}}) +{{/if}} + +{{/info}} + +{{#if consumes}}__Consumes:__ {{join consumes ", "}}{{/if}} + +{{#if produces}}__Produces:__ {{join produces ", "}}{{/if}} + +{{#if securityDefinitions}} +# Security Definitions +{{> security}} +{{/if}} + +
+Table Of Contents +[toc] +
+ +# APIs + +{{#each paths}} +## {{@key}} +{{#this}} +{{#get}} +### GET +{{> operation}} +{{/get}} + +{{#put}} +### PUT +{{> operation}} +{{/put}} + +{{#post}} +### POST + +{{> operation}} + +{{/post}} + +{{#delete}} +### DELETE +{{> operation}} +{{/delete}} + +{{#option}} +### OPTION +{{> operation}} +{{/option}} + +{{#patch}} +### PATCH +{{> operation}} +{{/patch}} + +{{#head}} +### HEAD +{{> operation}} +{{/head}} + +{{/this}} +{{/each}} + +# Definitions +{{#each definitions}} +## {{@key}} + + + + + + + + + + {{#each this.properties}} + + + + + + + + {{/each}} +
nametyperequireddescriptionexample
{{@key}} + {{#ifeq type "array"}} + {{#items.$ref}} + {{type}}[{{basename items.$ref}}] + {{/items.$ref}} + {{^items.$ref}}{{type}}[{{items.type}}]{{/items.$ref}} + {{else}} + {{#$ref}}{{basename $ref}}{{/$ref}} + {{^$ref}}{{type}}{{#format}} ({{format}}){{/format}}{{/$ref}} + {{/ifeq}} + {{#required}}required{{/required}}{{^required}}optional{{/required}}{{#description}}{{{description}}}{{/description}}{{^description}}-{{/description}}{{example}}
+{{/each}} diff --git a/http-service/src/main/templates/operation.hbs b/http-service/src/main/templates/operation.hbs new file mode 100644 index 0000000000..f7015850b8 --- /dev/null +++ b/http-service/src/main/templates/operation.hbs @@ -0,0 +1,71 @@ +{{#deprecated}}-deprecated-{{/deprecated}} +{{summary}} + +{{description}} + +{{#if externalDocs.url}}{{externalDocs.description}}. [See external documents for more details]({{externalDocs.url}}) +{{/if}} + +{{#if security}} +#### Security +{{/if}} + +{{#security}} +{{#each this}} +* {{@key}} +{{#this}} * {{this}} +{{/this}} +{{/each}} +{{/security}} + +#### Request + +{{#if consumes}}__Content-Type:__ {{join consumes ", "}}{{/if}} + +##### Parameters +{{#if parameters}} + + + + + + + + + +{{/if}} + +{{#parameters}} + + + + + + +{{#ifeq in "body"}} + +{{else}} + {{#ifeq type "array"}} + + {{else}} + + {{/ifeq}} +{{/ifeq}} + +{{/parameters}} +{{#if parameters}} +
NameLocated inRequiredDescriptionDefaultSchema
{{name}}{{in}}{{#if required}}yes{{else}}no{{/if}}{{description}}{{#if pattern}} (**Pattern**: `{{pattern}}`){{/if}} - + {{#ifeq schema.type "array"}}Array[{{basename schema.items.$ref}}]{{/ifeq}} + {{#schema.$ref}}{{basename schema.$ref}} {{/schema.$ref}} + Array[{{items.type}}] ({{collectionFormat}}){{type}} {{#format}}({{format}}){{/format}}
+{{/if}} + + +#### Response + +{{#if produces}}__Content-Type:__ {{join produces ", "}}{{/if}} + +| Status Code | Reason | Response Model | +|-------------|-------------|----------------| +{{#each responses}}| {{@key}} | {{description}} | {{#schema.$ref}}{{basename schema.$ref}}{{/schema.$ref}}{{#ifeq schema.type "array"}}Array[{{basename schema.items.$ref}}]{{/ifeq}}{{^schema}} - {{/schema}}| +{{/each}} diff --git a/http-service/src/main/templates/security.hbs b/http-service/src/main/templates/security.hbs new file mode 100644 index 0000000000..04f86e8380 --- /dev/null +++ b/http-service/src/main/templates/security.hbs @@ -0,0 +1,88 @@ +{{#each securityDefinitions}} +### {{@key}} +{{#this}} +{{#ifeq type "oauth2"}} + + + + + +{{#if description}} + + + + +{{/if}} +{{#if authorizationUrl}} + + + + +{{/if}} +{{#if flow}} + + + + +{{/if}} +{{#if tokenUrl}} + + + + +{{/if}} +{{#if scopes}} + + +{{#each scopes}} + + + + +{{/each}} + +{{/if}} +
type{{type}}
description{{description}}
authorizationUrl{{authorizationUrl}}
flow{{flow}}
tokenUrl{{tokenUrl}}
scopes{{@key}}{{this}}
+{{/ifeq}} +{{#ifeq type "apiKey"}} + + + + + +{{#if description}} + + + + +{{/if}} +{{#if name}} + + + + +{{/if}} +{{#if in}} + + + + +{{/if}} +
type{{type}}
description{{description}}
name{{name}}
in{{in}}
+{{/ifeq}} +{{#ifeq type "basic"}} + + + + + +{{#if description}} + + + + +{{/if}} +
type{{type}}
description{{description}}
+{{/ifeq}} +{{/this}} +{{/each}} \ No newline at end of file diff --git a/http-service/src/main/templates/template.html.hbs b/http-service/src/main/templates/template.html.hbs new file mode 100644 index 0000000000..da587c2cc4 --- /dev/null +++ b/http-service/src/main/templates/template.html.hbs @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + {{info.title}} {{info.version}} + + + + + \ No newline at end of file diff --git a/http-service/src/main/webapp/WEB-INF/web.xml b/http-service/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..0b07dbb973 --- /dev/null +++ b/http-service/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,32 @@ + + + + RuneLite API + \ No newline at end of file diff --git a/http-service/src/test/resources/application-test.yaml b/http-service/src/test/resources/application-test.yaml new file mode 100644 index 0000000000..0532963ade --- /dev/null +++ b/http-service/src/test/resources/application-test.yaml @@ -0,0 +1,17 @@ +# Use in-memory database for tests +datasource: + runelite: + jndiName: + driverClassName: org.h2.Driver + type: org.h2.jdbcx.JdbcDataSource + url: jdbc:h2:mem:runelite + runelite-cache: + jndiName: + driverClassName: org.h2.Driver + type: org.h2.jdbcx.JdbcDataSource + url: jdbc:h2:mem:cache + runelite-tracker: + jndiName: + driverClassName: org.h2.Driver + type: org.h2.jdbcx.JdbcDataSource + url: jdbc:h2:mem:xptracker diff --git a/http-service/src/test/resources/net/runelite/http/service/worlds/worldlist b/http-service/src/test/resources/net/runelite/http/service/worlds/worldlist new file mode 100644 index 0000000000..1d1360e579 Binary files /dev/null and b/http-service/src/test/resources/net/runelite/http/service/worlds/worldlist differ diff --git a/injected-client/pom.xml b/injected-client/pom.xml index f0a49fedc2..474adda69b 100644 --- a/injected-client/pom.xml +++ b/injected-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.25-SNAPSHOT + 1.5.28-SNAPSHOT injected-client @@ -37,17 +37,11 @@ - com.runeswag - client - 1.0-SNAPSHOT + net.runelite.rs + rs-client + ${project.version} true - - com.runeswag - api - 1.0-SNAPSHOT - false - net.runelite.rs vanilla diff --git a/injector-plugin/pom.xml b/injector-plugin/pom.xml index dfe006260b..a80ce1afb3 100644 --- a/injector-plugin/pom.xml +++ b/injector-plugin/pom.xml @@ -23,13 +23,14 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --> - + 4.0.0 net.runelite runelite-parent - 1.5.25-SNAPSHOT + 1.5.28-SNAPSHOT net.runelite.rs @@ -39,21 +40,26 @@ - com.runeswag + net.runelite deobfuscator - 1.0-SNAPSHOT + ${project.version} - com.runeswag + net.runelite mixins - 1.0-SNAPSHOT + ${project.version} - com.runeswag - api - 1.0-SNAPSHOT + net.runelite + runelite-api + ${project.version} - + + net.runelite.rs + runescape-api + ${project.version} + + org.apache.maven maven-plugin-api diff --git a/injector-plugin/src/main/java/net/runelite/injector/Inject.java b/injector-plugin/src/main/java/net/runelite/injector/Inject.java index 6b67942910..ad0e2a61ae 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/Inject.java +++ b/injector-plugin/src/main/java/net/runelite/injector/Inject.java @@ -47,23 +47,23 @@ import net.runelite.deob.DeobAnnotations; import net.runelite.deob.deobfuscators.arithmetic.DMath; import net.runelite.injector.raw.ClearColorBuffer; import net.runelite.injector.raw.DrawAfterWidgets; +import net.runelite.injector.raw.DrawMenu; +import net.runelite.injector.raw.HidePlayerAttacks; +import net.runelite.injector.raw.Occluder; import net.runelite.injector.raw.RasterizerHook; import net.runelite.injector.raw.RenderDraw; import net.runelite.injector.raw.ScriptVM; import net.runelite.mapping.Import; +import net.runelite.rs.api.RSClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import rs.api.RSClient; public class Inject { - private static final Logger logger = LoggerFactory.getLogger(Inject.class); - public static final java.lang.Class CLIENT_CLASS = RSClient.class; - - public static final String API_PACKAGE_BASE = "rs.api.RS"; - public static final String RL_API_PACKAGE_BASE = "api."; - + public static final String API_PACKAGE_BASE = "net.runelite.rs.api.RS"; + public static final String RL_API_PACKAGE_BASE = "net.runelite.api."; + private static final Logger logger = LoggerFactory.getLogger(Inject.class); private final InjectHookMethod hookMethod = new InjectHookMethod(this); private final InjectGetter getters = new InjectGetter(this); @@ -71,12 +71,15 @@ public class Inject private final InjectInvoker invokes = new InjectInvoker(this); private final InjectConstruct construct = new InjectConstruct(this); + private final DrawMenu drawMenu = new DrawMenu(this); private final RasterizerHook rasterizerHook = new RasterizerHook(this); private final MixinInjector mixinInjector = new MixinInjector(this); private final DrawAfterWidgets drawAfterWidgets = new DrawAfterWidgets(this); private final ScriptVM scriptVM = new ScriptVM(this); private final ClearColorBuffer clearColorBuffer = new ClearColorBuffer(this); private final RenderDraw renderDraw = new RenderDraw(this); + private final Occluder occluder = new Occluder(this); + private final HidePlayerAttacks hidePlayerAttacks = new HidePlayerAttacks(this); // deobfuscated contains exports etc to apply to vanilla private final ClassGroup deobfuscated, vanilla; @@ -87,34 +90,6 @@ public class Inject this.vanilla = vanilla; } - public Type getFieldType(Field f) - { - Type type = f.getType(); - - Annotation obfSignature = f.getAnnotations().find(DeobAnnotations.OBFUSCATED_SIGNATURE); - if (obfSignature != null) - { - //Annotation exists. Type was updated by us during deobfuscation - type = DeobAnnotations.getObfuscatedType(f); - } - - return type; - } - - public Signature getMethodSignature(Method m) - { - Signature signature = m.getDescriptor(); - - Annotation obfSignature = m.getAnnotations().find(DeobAnnotations.OBFUSCATED_SIGNATURE); - if (obfSignature != null) - { - //Annotation exists. Signature was updated by us during deobfuscation - signature = DeobAnnotations.getObfuscatedSignature(m); - } - - return signature; - } - /** * Convert a java.lang.Class to a Type * @@ -173,6 +148,34 @@ public class Inject return Type.getType("L" + c.getName().replace('.', '/') + ";", dimms); } + public Type getFieldType(Field f) + { + Type type = f.getType(); + + Annotation obfSignature = f.getAnnotations().find(DeobAnnotations.OBFUSCATED_SIGNATURE); + if (obfSignature != null) + { + //Annotation exists. Type was updated by us during deobfuscation + type = DeobAnnotations.getObfuscatedType(f); + } + + return type; + } + + public Signature getMethodSignature(Method m) + { + Signature signature = m.getDescriptor(); + + Annotation obfSignature = m.getAnnotations().find(DeobAnnotations.OBFUSCATED_SIGNATURE); + if (obfSignature != null) + { + //Annotation exists. Signature was updated by us during deobfuscation + signature = DeobAnnotations.getObfuscatedSignature(m); + } + + return signature; + } + /** * Build a Signature from a java method * @@ -284,7 +287,7 @@ public class Inject assert !f.isStatic(); // non static field exported on non exported interface - // logger.debug("Non static exported field {} on non exported interface", exportedName); + // logger.debug("Non static exported field {} on non exported interface", exportedName); continue; } @@ -303,7 +306,7 @@ public class Inject apiMethod = findImportMethodOnApi(targetApiClass, exportedName, false); if (apiMethod == null) { - // logger.debug("Unable to find import method on api class {} with imported name {}, not injecting getter", targetApiClass, exportedName); + //logger.debug("Unable to find import method on api class {} with imported name {}, not injecting getter", targetApiClass, exportedName); continue; } @@ -325,7 +328,7 @@ public class Inject invokes.process(m, other, implementingClass); } } - + logger.info("Injected {} getters, {} setters, {} invokers", getters.getInjectedGetters(), setters.getInjectedSetters(), invokes.getInjectedInvokers()); @@ -334,6 +337,9 @@ public class Inject scriptVM.inject(); clearColorBuffer.inject(); renderDraw.inject(); + drawMenu.inject(); + occluder.inject(); + hidePlayerAttacks.inject(); } private java.lang.Class injectInterface(ClassFile cf, ClassFile other) @@ -466,7 +472,7 @@ public class Inject return null; } - Field toObField(Field field) + public Field toObField(Field field) { String obfuscatedClassName = DeobAnnotations.getObfuscatedName(field.getClassFile().getAnnotations()); String obfuscatedFieldName = DeobAnnotations.getObfuscatedName(field.getAnnotations()); // obfuscated name of field @@ -514,17 +520,17 @@ public class Inject } } - // if (rlApiType == null) - // { - // throw new InjectionException("RS API type " + rsApiType + " does not extend RL API interface"); - // } + // if (rlApiType == null) + // { + // throw new InjectionException("RS API type " + rsApiType + " does not extend RL API interface"); + // } final java.lang.Class finalType = rlApiType == null ? rsApiType : rlApiType; return Type.getType("L" + finalType.getName().replace('.', '/') + ";", type.getDimensions()); } - Type apiTypeToDeobfuscatedType(Type type) throws InjectionException + Type apiTypeToDeobfuscatedType(Type type) { if (type.isPrimitive()) { @@ -539,7 +545,7 @@ public class Inject return Type.getType("L" + type.getInternalName().substring(API_PACKAGE_BASE.length()) + ";", type.getDimensions()); } - + ClassFile findVanillaForInterface(java.lang.Class clazz) { String className = clazz.getName().replace('.', '/'); diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java b/injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java index 295f636eaa..8a87451da6 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java @@ -54,7 +54,7 @@ public class InjectConstruct private final Inject inject; - public InjectConstruct(Inject inject) + InjectConstruct(Inject inject) { this.inject = inject; } @@ -99,7 +99,7 @@ public class InjectConstruct } } - public void injectConstruct(ClassFile targetClass, java.lang.reflect.Method apiMethod) throws InjectionException + void injectConstruct(ClassFile targetClass, java.lang.reflect.Method apiMethod) throws InjectionException { logger.info("Injecting construct for {}", apiMethod); @@ -115,19 +115,19 @@ public class InjectConstruct Signature sig = inject.javaMethodToSignature(apiMethod); Signature constructorSig = new Signature.Builder() - .addArguments(Stream.of(apiMethod.getParameterTypes()) - .map(arg -> - { - ClassFile vanilla = inject.findVanillaForInterface(arg); - if (vanilla != null) - { - return new Type("L" + vanilla.getName() + ";"); - } - return Inject.classToType(arg); - }) - .collect(Collectors.toList())) - .setReturnType(Type.VOID) - .build(); + .addArguments(Stream.of(apiMethod.getParameterTypes()) + .map(arg -> + { + ClassFile vanilla = inject.findVanillaForInterface(arg); + if (vanilla != null) + { + return new Type("L" + vanilla.getName() + ";"); + } + return Inject.classToType(arg); + }) + .collect(Collectors.toList())) + .setReturnType(Type.VOID) + .build(); Method vanillaConstructor = vanillaClass.findMethod("", constructorSig); if (vanillaConstructor == null) { diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java b/injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java index 3ac2752f6f..cd94ee80d8 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java @@ -44,20 +44,20 @@ import static org.objectweb.asm.Opcodes.ACC_PUBLIC; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class InjectGetter +class InjectGetter { private static final Logger logger = LoggerFactory.getLogger(InjectGetter.class); - + private final Inject inject; - + private int injectedGetters; - public InjectGetter(Inject inject) + InjectGetter(Inject inject) { this.inject = inject; } - - public void injectGetter(ClassFile clazz, java.lang.reflect.Method method, Field field, Number getter) + + void injectGetter(ClassFile clazz, java.lang.reflect.Method method, Field field, Number getter) { // clazz = class file we're injecting the method into. // method = api method (java reflect) that we're overriding @@ -148,7 +148,7 @@ public class InjectGetter ++injectedGetters; } - public int getInjectedGetters() + int getInjectedGetters() { return injectedGetters; } diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectHook.java b/injector-plugin/src/main/java/net/runelite/injector/InjectHook.java index a89c8019bf..19ae3a3df6 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectHook.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectHook.java @@ -41,9 +41,11 @@ import net.runelite.asm.attributes.code.instruction.types.SetFieldInstruction; import net.runelite.asm.attributes.code.instructions.ArrayStore; import net.runelite.asm.attributes.code.instructions.CheckCast; import net.runelite.asm.attributes.code.instructions.Dup; +import net.runelite.asm.attributes.code.instructions.IMul; import net.runelite.asm.attributes.code.instructions.InvokeStatic; import net.runelite.asm.attributes.code.instructions.InvokeVirtual; import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.LMul; import net.runelite.asm.attributes.code.instructions.PutField; import net.runelite.asm.attributes.code.instructions.Swap; import net.runelite.asm.execution.Execution; @@ -53,28 +55,16 @@ import net.runelite.asm.signature.Signature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class InjectHook +class InjectHook { private static final Logger logger = LoggerFactory.getLogger(InjectHook.class); - - static class HookInfo - { - String fieldName; - String clazz; - Method method; - boolean before; - } - private static final String HOOK_METHOD_SIGNATURE = "(I)V"; - private static final String CLINIT = ""; - private final Inject inject; private final Map hooked = new HashMap<>(); - private int injectedHooks; - public InjectHook(Inject inject) + InjectHook(Inject inject) { this.inject = inject; } @@ -84,7 +74,7 @@ public class InjectHook hooked.put(field, hookInfo); } - public void run() + void run() { Execution e = new Execution(inject.getVanilla()); e.populateInitialMethods(); @@ -139,8 +129,7 @@ public class InjectHook StackContext objectStackContext = null; if (sfi instanceof PutField) { - StackContext objectStack = ic.getPops().get(1); // Object being set on - objectStackContext = objectStack; + objectStackContext = ic.getPops().get(1); } int idx = ins.getInstructions().indexOf(sfi); @@ -154,7 +143,7 @@ public class InjectHook } else { - // idx + 1 to insert after the set + // idx + 1 to insert after the set injectCallback(ins, idx + 1, hookInfo, null, objectStackContext); } } @@ -216,8 +205,7 @@ public class InjectHook StackContext objectStackContext = null; if (arrayReferencePushed.getInstruction().getType() == InstructionType.GETFIELD) { - StackContext objectReference = arrayReferencePushed.getPops().get(0); - objectStackContext = objectReference; + objectStackContext = arrayReferencePushed.getPops().get(0); } // inject hook after 'i' @@ -262,6 +250,21 @@ public class InjectHook ins.getInstructions().add(idx++, new Dup(ins)); // dup value idx = recursivelyPush(ins, idx, object); ins.getInstructions().add(idx++, new Swap(ins)); + if (hookInfo.getter != null) + { + assert hookInfo.getter instanceof Integer || hookInfo.getter instanceof Long; + + if (hookInfo.getter instanceof Integer) + { + ins.getInstructions().add(idx++, new LDC(ins, (int) hookInfo.getter)); + ins.getInstructions().add(idx++, new IMul(ins)); + } + else + { + ins.getInstructions().add(idx++, new LDC(ins, (long) hookInfo.getter)); + ins.getInstructions().add(idx++, new LMul(ins)); + } + } if (!value.type.equals(methodArgumentType)) { CheckCast checkCast = new CheckCast(ins); @@ -377,8 +380,17 @@ public class InjectHook } } - public int getInjectedHooks() + int getInjectedHooks() { return injectedHooks; } + + static class HookInfo + { + String fieldName; + String clazz; + Method method; + boolean before; + Number getter; + } } diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java b/injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java index 6c74fbc5fa..be654e127d 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java @@ -49,18 +49,16 @@ import org.slf4j.LoggerFactory; public class InjectHookMethod { - private static final Logger logger = LoggerFactory.getLogger(InjectHookMethod.class); - public static final String HOOKS = "net/runelite/client/callback/Hooks"; - + private static final Logger logger = LoggerFactory.getLogger(InjectHookMethod.class); private final Inject inject; - public InjectHookMethod(Inject inject) + InjectHookMethod(Inject inject) { this.inject = inject; } - public void process(Method method) throws InjectionException + void process(Method method) throws InjectionException { Annotations an = method.getAnnotations(); if (an == null) @@ -115,7 +113,7 @@ public class InjectHookMethod Instructions instructions = vanillaMethod.getCode().getInstructions(); Signature.Builder builder = new Signature.Builder() - .setReturnType(Type.VOID); // Hooks always return void + .setReturnType(Type.VOID); // Hooks always return void for (Type type : deobMethod.getDescriptor().getArguments()) { @@ -164,11 +162,11 @@ public class InjectHookMethod { // Invoke callback invoke = new InvokeStatic(instructions, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(HOOKS), - hookName, - signature - ) + new net.runelite.asm.pool.Method( + new net.runelite.asm.pool.Class(HOOKS), + hookName, + signature + ) ); } else @@ -179,11 +177,11 @@ public class InjectHookMethod if (vanillaMethod.isStatic()) { invoke = new InvokeStatic(instructions, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class("client"), // Static methods are in client - hookMethod.getName(), - signature - ) + new net.runelite.asm.pool.Method( + new net.runelite.asm.pool.Class("client"), // Static methods are in client + hookMethod.getName(), + signature + ) ); } else @@ -191,11 +189,11 @@ public class InjectHookMethod // otherwise invoke member function //instructions.addInstruction(insertPos++, new ALoad(instructions, 0)); invoke = new InvokeVirtual(instructions, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(vanillaMethod.getClassFile().getName()), - hookMethod.getName(), - signature - ) + new net.runelite.asm.pool.Method( + new net.runelite.asm.pool.Class(vanillaMethod.getClassFile().getName()), + hookMethod.getName(), + hookMethod.getDescriptor() + ) ); } } diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java b/injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java index 1b59e63b4c..1153609b8e 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java @@ -51,7 +51,7 @@ import static org.objectweb.asm.Opcodes.ACC_PUBLIC; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class InjectInvoker +class InjectInvoker { private static final Logger logger = LoggerFactory.getLogger(InjectInvoker.class); @@ -59,7 +59,7 @@ public class InjectInvoker private int injectedInvokers; - public InjectInvoker(Inject inject) + InjectInvoker(Inject inject) { this.inject = inject; } @@ -67,13 +67,13 @@ public class InjectInvoker /** * Inject an invoker for a method * - * @param m Method in the deobfuscated client to inject an invoker for - * @param other Class in the vanilla client of the same class m is a - * member of + * @param m Method in the deobfuscated client to inject an invoker for + * @param other Class in the vanilla client of the same class m is a + * member of * @param implementingClass Java class for the API interface the class - * will implement + * will implement */ - public void process(Method m, ClassFile other, java.lang.Class implementingClass) + void process(Method m, ClassFile other, java.lang.Class implementingClass) { Annotations an = m.getAnnotations(); @@ -108,14 +108,14 @@ public class InjectInvoker assert !m.isStatic(); // non static exported method on non exported interface, weird. - // logger.debug("Non static exported method {} on non exported interface", exportedName); + // logger.debug("Non static exported method {} on non exported interface", exportedName); return; } java.lang.reflect.Method apiMethod = inject.findImportMethodOnApi(targetClassJava, exportedName, null); // api method to invoke 'otherm' if (apiMethod == null) { - // logger.debug("Unable to find api method on {} with imported name {}, not injecting invoker", targetClassJava, exportedName); + // logger.debug("Unable to find api method on {} with imported name {}, not injecting invoker", targetClassJava, exportedName); return; } @@ -284,7 +284,7 @@ public class InjectInvoker clazz.addMethod(invokerMethodSignature); } - public int getInjectedInvokers() + int getInjectedInvokers() { return injectedInvokers; } diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java b/injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java index c697043e04..b7c22194fe 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java @@ -45,17 +45,14 @@ import org.apache.maven.plugins.annotations.Parameter; ) public class InjectMojo extends AbstractMojo { + private final Log log = getLog(); @Parameter(defaultValue = "${project.build.outputDirectory}") private File outputDirectory; - - @Parameter(defaultValue = "./rs-client/target/rs-client-1.0-SNAPSHOT.jar", readonly = true, required = true) + @Parameter(defaultValue = "./runescape-client/target/rs-client-${project.version}.jar", readonly = true, required = true) private String rsClientPath; - @Parameter(defaultValue = "${net.runelite.rs:vanilla:jar}", readonly = true, required = true) private String vanillaPath; - private final Log log = getLog(); - @Override public void execute() throws MojoExecutionException, MojoFailureException { diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java b/injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java index bcb8b1815d..58c225fa87 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java @@ -45,15 +45,15 @@ import static org.objectweb.asm.Opcodes.ACC_PUBLIC; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class InjectSetter +class InjectSetter { private static final Logger logger = LoggerFactory.getLogger(InjectSetter.class); private final Inject inject; - + private int injectedSetters; - public InjectSetter(Inject inject) + InjectSetter(Inject inject) { this.inject = inject; } @@ -61,15 +61,14 @@ public class InjectSetter /** * inject a setter into the vanilla classgroup * - * @param targetClass Class where to inject the setter (field's class, - * or client) + * @param targetClass Class where to inject the setter (field's class, + * or client) * @param targetApiClass API targetClass implements, which may have the - * setter declared - * @param field Field of vanilla that will be set - * @param exportedName exported name of field - * @param setter + * setter declared + * @param field Field of vanilla that will be set + * @param exportedName exported name of field */ - public void injectSetter(ClassFile targetClass, Class targetApiClass, Field field, String exportedName, Number setter) + void injectSetter(ClassFile targetClass, Class targetApiClass, Field field, String exportedName, Number setter) { java.lang.reflect.Method method = inject.findImportMethodOnApi(targetApiClass, exportedName, true); if (method == null) @@ -114,7 +113,7 @@ public class InjectSetter // load argument Type argumentType = sig.getTypeOfArg(0); ins.add(inject.createLoadForTypeIndex(instructions, argumentType, 1)); - + // cast argument to field type Type fieldType = field.getType(); if (!argumentType.equals(fieldType)) @@ -152,7 +151,7 @@ public class InjectSetter ins.add(new VReturn(instructions)); } - public int getInjectedSetters() + int getInjectedSetters() { return injectedSetters; } diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java b/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java new file mode 100644 index 0000000000..e00b76428a --- /dev/null +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java @@ -0,0 +1,157 @@ +package net.runelite.injector; + +import net.runelite.asm.ClassFile; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.signature.Signature; +import net.runelite.deob.DeobAnnotations; + +public class InjectUtil +{ + public static Method findStaticObMethod(Inject inject, String name) throws InjectionException + { + for (ClassFile c : inject.getVanilla().getClasses()) + { + for (Method m : c.getMethods()) + { + if (!m.getName().equals(name)) + { + continue; + } + return m; + } + } + + throw new InjectionException(String.format("Method \"%s\" could not be found.", name)); + } + + public static Method findMethod(Inject inject, String name) throws InjectionException + { + for (ClassFile c : inject.getDeobfuscated().getClasses()) + { + for (Method m : c.getMethods()) + { + if (!m.getName().equals(name)) + { + continue; + } + + String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); + Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(m); + + ClassFile c2 = inject.toObClass(c); + + return c2.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : m.getDescriptor()); + } + } + + throw new InjectionException("Couldn't find method " + name); + } + + public static Method findStaticMethod(Inject inject, String name) throws InjectionException + { + for (ClassFile c : inject.getDeobfuscated().getClasses()) + { + for (Method m : c.getMethods()) + { + if (!m.isStatic() || !m.getName().equals(name)) + { + continue; + } + + String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); + Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(m); + + ClassFile c2 = inject.toObClass(c); + + return c2.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : m.getDescriptor()); + } + } + + throw new InjectionException("Couldn't find static method " + name); + } + + + public static Field findObField(Inject inject, String name) throws InjectionException + { + for (ClassFile c : inject.getVanilla().getClasses()) + { + for (Field f : c.getFields()) + { + if (!f.getName().equals(name)) + { + continue; + } + return f; + } + } + + throw new InjectionException(String.format("Field \"%s\" could not be found.", name)); + } + + public static Field findDeobField(Inject inject, String name) throws InjectionException + { + return findDeobField(inject, name, null); + } + + public static Field findDeobField(Inject inject, String name, String hint) throws InjectionException + { + if (hint != null) + { + ClassFile c = inject.getDeobfuscated().findClass(hint); + if (c == null) + { + throw new InjectionException("Class " + hint + " doesn't exist. (check capitalization)"); + } + + for (Field f : c.getFields()) + { + if (!f.getName().equals(name)) + { + continue; + } + + String obfuscatedName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); + + ClassFile c2 = inject.toObClass(c); + return c2.findField(obfuscatedName); + } + } + + for (ClassFile c : inject.getDeobfuscated().getClasses()) + { + for (Field f : c.getFields()) + { + if (!f.getName().equals(name)) + { + continue; + } + + String obfuscatedName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); + + ClassFile c2 = inject.toObClass(c); + return c2.findField(obfuscatedName); + } + } + + throw new InjectionException(String.format("Mapped field \"%s\" could not be found.", name)); + } + + public static Field findDeobFieldButUseless(Inject inject, String name) throws InjectionException + { + for (ClassFile c : inject.getDeobfuscated().getClasses()) + { + for (Field f : c.getFields()) + { + if (!f.getName().equals(name)) + { + continue; + } + + return f; + } + } + + throw new InjectionException(String.format("Mapped field \"%s\" could not be found.", name)); + } +} diff --git a/injector-plugin/src/main/java/net/runelite/injector/Injector.java b/injector-plugin/src/main/java/net/runelite/injector/Injector.java index 60577cfbd4..9409b02075 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/Injector.java +++ b/injector-plugin/src/main/java/net/runelite/injector/Injector.java @@ -39,17 +39,6 @@ public class Injector this.vanilla = vanilla; } - public void inject() throws InjectionException - { - Inject instance = new Inject(deobfuscated, vanilla); - instance.run(); - } - - public void save(File out) throws IOException - { - JarUtil.saveJar(vanilla, out); - } - public static void main(String[] args) throws IOException, InjectionException { if (args.length < 3) @@ -72,5 +61,16 @@ public class Injector u.save(new File(args[2])); } + public void inject() throws InjectionException + { + Inject instance = new Inject(deobfuscated, vanilla); + instance.run(); + } + + private void save(File out) throws IOException + { + JarUtil.saveJar(vanilla, out); + } + } diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java b/injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java index f52f5f4de9..a49df63a3a 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java @@ -39,22 +39,22 @@ import org.slf4j.LoggerFactory; * * @author Adam */ -public class InjectorValidator +class InjectorValidator { private static final Logger logger = LoggerFactory.getLogger(InjectorValidator.class); - private static final String API_PACKAGE_BASE = "rs/api/"; + private static final String API_PACKAGE_BASE = "net/runelite/rs/api/"; private final ClassGroup group; private int error, missing, okay; - public InjectorValidator(ClassGroup group) + InjectorValidator(ClassGroup group) { this.group = group; } - public void validate() + void validate() { for (ClassFile cf : group.getClasses()) { @@ -131,17 +131,17 @@ public class InjectorValidator } } - public int getError() + int getError() { return error; } - public int getMissing() + int getMissing() { return missing; } - public int getOkay() + int getOkay() { return okay; } diff --git a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java b/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java index 8273a204e8..815b3699aa 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java +++ b/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java @@ -48,6 +48,7 @@ import net.runelite.asm.attributes.code.instruction.types.LVTInstruction; import net.runelite.asm.attributes.code.instruction.types.PushConstantInstruction; import net.runelite.asm.attributes.code.instruction.types.ReturnInstruction; import net.runelite.asm.attributes.code.instructions.ALoad; +import net.runelite.asm.attributes.code.instructions.ANewArray; import net.runelite.asm.attributes.code.instructions.CheckCast; import net.runelite.asm.attributes.code.instructions.GetField; import net.runelite.asm.attributes.code.instructions.ILoad; @@ -86,7 +87,7 @@ public class MixinInjector // Use net.runelite.asm.pool.Field instead of Field because the pool version has hashcode implemented private final Map shadowFields = new HashMap<>(); - public MixinInjector(Inject inject) + MixinInjector(Inject inject) { this.inject = inject; } @@ -164,9 +165,6 @@ public class MixinInjector /** * Finds fields that are marked @Inject and inject them into the target - * - * @param mixinClasses - * @throws InjectionException */ private void injectFields(Map, List> mixinClasses) throws InjectionException { @@ -229,10 +227,10 @@ public class MixinInjector cf.addField(copy); - if (injectedFields.containsKey(field.getName())) + if (injectedFields.containsKey(field.getName()) && !field.getName().equals(ASSERTION_FIELD)) { - java.util.logging.Logger.getAnonymousLogger().severe("Duplicate field : "+ field.getName()); - //throw new InjectionException("Injected field names must be globally unique"); + java.util.logging.Logger.getAnonymousLogger().severe("Duplicate field : " + field.getName()); + throw new InjectionException("Injected field names must be globally unique"); } injectedFields.put(field.getName(), copy); @@ -244,9 +242,6 @@ public class MixinInjector /** * Find fields which are marked @Shadow, and what they shadow - * - * @param mixinClasses - * @throws InjectionException */ private void findShadowFields(Map, List> mixinClasses) throws InjectionException { @@ -286,7 +281,7 @@ public class MixinInjector else { // Shadow a field already in the gamepack - Field shadowField = findDeobField(shadowName); + Field shadowField = InjectUtil.findDeobFieldButUseless(inject, shadowName); if (shadowField == null) { @@ -315,21 +310,6 @@ public class MixinInjector } } - private Field findDeobField(String name) - { - for (ClassFile cf : inject.getDeobfuscated().getClasses()) - { - for (Field f : cf.getFields()) - { - if (f.getName().equals(name) && f.isStatic()) - { - return f; - } - } - } - return null; - } - private void injectMethods(ClassFile mixinCf, ClassFile cf, Map shadowFields) throws InjectionException { @@ -403,7 +383,7 @@ public class MixinInjector care of the garbage parameter itself. */ boolean hasGarbageValue = method.getDescriptor().size() != obMethod.getDescriptor().size() - && deobMethod.getDescriptor().size() < obMethodSignature.size(); + && deobMethod.getDescriptor().size() < obMethodSignature.size(); copiedMethods.put(method.getPoolMethod(), new CopiedMethod(copy, hasGarbageValue)); logger.debug("Injected copy of {} to {}", obMethod, copy); @@ -576,7 +556,7 @@ public class MixinInjector if (!returnType.equals(deobReturnType)) { ClassFile deobReturnTypeClassFile = inject.getDeobfuscated() - .findClass(deobReturnType.getInternalName()); + .findClass(deobReturnType.getInternalName()); if (deobReturnTypeClassFile != null) { ClassFile obReturnTypeClass = inject.toObClass(deobReturnTypeClassFile); @@ -600,13 +580,13 @@ public class MixinInjector moveCode(obMethod, method.getCode()); boolean hasGarbageValue = method.getDescriptor().size() != obMethod.getDescriptor().size() - && deobMethod.getDescriptor().size() < obMethodSignature.size(); + && deobMethod.getDescriptor().size() < obMethodSignature.size(); if (hasGarbageValue) { int garbageIndex = obMethod.isStatic() - ? obMethod.getDescriptor().size() - 1 - : obMethod.getDescriptor().size(); + ? obMethod.getDescriptor().size() - 1 + : obMethod.getDescriptor().size(); /* If the mixin method doesn't have the garbage parameter, @@ -644,8 +624,8 @@ public class MixinInjector } private void setOwnersToTargetClass(ClassFile mixinCf, ClassFile cf, Method method, - Map shadowFields, - Map copiedMethods) + Map shadowFields, + Map copiedMethods) throws InjectionException { ListIterator iterator = method.getCode().getInstructions().getInstructions().listIterator(); @@ -654,6 +634,21 @@ public class MixinInjector { Instruction i = iterator.next(); + if (i instanceof ANewArray) + { + Type type = ((ANewArray) i).getType_(); + ClassFile deobCf = inject.getDeobfuscated().findClass(type.toString().replace("Lnet/runelite/rs/api/RS", "").replace(";", "")); + + if (deobCf != null) + { + ClassFile obReturnTypeClass = inject.toObClass(deobCf); + Type newType = new Type("L" + obReturnTypeClass.getName() + ";"); + + ((ANewArray) i).setType(newType); + logger.info("Replaced {} type {} with type {}", i, type, newType); + } + } + if (i instanceof InvokeInstruction) { InvokeInstruction ii = (InvokeInstruction) i; @@ -885,7 +880,7 @@ public class MixinInjector if (targetField == null) { // first try non static fields, then static - targetField = findDeobField(hookName); + targetField = InjectUtil.findDeobFieldButUseless(inject, hookName); } if (targetField == null) @@ -893,6 +888,13 @@ public class MixinInjector throw new InjectionException("Field hook for nonexistent field " + hookName + " on " + method); } + Annotation an = targetField.getAnnotations().find(DeobAnnotations.OBFUSCATED_GETTER); + Number getter = null; + if (an != null) + { + getter = (Number) an.getElement().getValue(); + } + Field obField = inject.toObField(targetField); if (method.isStatic() != targetField.isStatic()) @@ -906,6 +908,7 @@ public class MixinInjector hookInfo.fieldName = hookName; hookInfo.method = method; hookInfo.before = before; + hookInfo.getter = getter; injectHook.hook(obField, hookInfo); } } diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java b/injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java index a934ce6ed4..f4de5d056e 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java @@ -1,16 +1,18 @@ package net.runelite.injector.raw; -import java.util.ArrayList; -import java.util.List; +import java.util.ListIterator; import net.runelite.asm.ClassFile; import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.ILoad; import net.runelite.asm.attributes.code.instructions.InvokeStatic; +import net.runelite.asm.attributes.code.instructions.LDC; import net.runelite.asm.pool.Class; import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; import net.runelite.injector.Inject; +import net.runelite.injector.InjectUtil; import net.runelite.injector.InjectionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,57 +39,86 @@ public class ClearColorBuffer private void injectColorBufferHooks() throws InjectionException { - Method obmethod = findStaticMethod("drawEntities"); - net.runelite.asm.pool.Method fillRectangle = findStaticMethod("Rasterizer2D_fillRectangle").getPoolMethod(); - Instructions ins = obmethod.getCode().getInstructions(); - replace(ins, fillRectangle); - } + net.runelite.asm.pool.Method fillRectangle = InjectUtil.findStaticMethod(inject, "Rasterizer2D_fillRectangle").getPoolMethod(); - private void replace(Instructions ins, net.runelite.asm.pool.Method meth) - { - List insList = new ArrayList<>(); - for (Instruction i : ins.getInstructions()) + int count = 0; + int replaced = 0; + + for (ClassFile cf : inject.getVanilla().getClasses()) { - if (i instanceof InvokeStatic) + for (Method m : cf.getMethods()) { - if (((InvokeStatic) i).getMethod().equals(meth)) - { - int index = ins.getInstructions().indexOf(i); - log.info("Found drawRectangle at index {}", index); - - insList.add(i); - } - } - } - - for (Instruction i : insList) - { - Instruction invoke = new InvokeStatic(ins, clearBuffer); - ins.replace(i, invoke); - } - } - - private Method findStaticMethod(String name) throws InjectionException - { - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Method m : c.getMethods()) - { - if (!m.getName().equals(name)) + if (!m.isStatic()) { continue; } - String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); - Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(m); + Code c = m.getCode(); + if (c == null) + { + continue; + } - ClassFile c2 = inject.toObClass(c); + Instructions ins = c.getInstructions(); + ListIterator it = ins.getInstructions().listIterator(); - return c2.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : m.getDescriptor()); + for (; it.hasNext(); ) + { + Instruction i = it.next(); + if (!(i instanceof InvokeStatic)) + { + continue; + } + + if (!((InvokeStatic) i).getMethod().equals(fillRectangle)) + { + continue; + } + + int indexToReturnTo = it.nextIndex(); + count++; + it.previous(); + Instruction current = it.previous(); + if (current instanceof LDC && ((LDC) current).getConstantAsInt() == 0) + { + int varIdx = 0; + for (; ; ) + { + current = it.previous(); + if (current instanceof ILoad && ((ILoad) current).getVariableIndex() == 3 - varIdx) + { + varIdx++; + log.debug(varIdx + " we can count yay"); + continue; + } + + break; + } + + if (varIdx == 4) + { + for (; !(current instanceof InvokeStatic); ) + { + current = it.next(); + } + assert it.nextIndex() == indexToReturnTo; + + it.set(new InvokeStatic(ins, clearBuffer)); + replaced++; + log.debug("Found drawRectangle at {}. Found: {}, replaced {}", m.getName(), count, replaced); + } + else + { + log.debug("Welp, guess this wasn't it chief " + m); + } + } + + while (it.nextIndex() != indexToReturnTo) + { + it.next(); + } + } } } - - throw new InjectionException("Couldn't find static method " + name); } - } \ No newline at end of file diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java b/injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java index caa406b77c..e2250b894e 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java @@ -38,9 +38,9 @@ import net.runelite.asm.attributes.code.instructions.GetStatic; import net.runelite.asm.attributes.code.instructions.IMul; import net.runelite.asm.attributes.code.instructions.InvokeStatic; import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; import net.runelite.injector.Inject; import static net.runelite.injector.InjectHookMethod.HOOKS; +import static net.runelite.injector.InjectUtil.findStaticMethod; import net.runelite.injector.InjectionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,7 +107,7 @@ public class DrawAfterWidgets boolean injected = false; - Method noClip = findStaticMethod("Rasterizer2D_resetClip"); // !!!!! + Method noClip = findStaticMethod(inject, "Rasterizer2D_resetClip"); // !!!!! if (noClip == null) { @@ -166,7 +166,7 @@ public class DrawAfterWidgets { // If we get here, we're either in the wrong method // or Jagex has removed the "if (535573958 * kl != -1)" - logger.debug("Could not find the label for jumping to the " + noClip + " call in " + m); + // logger.debug("Could not find the label for jumping to the " + noClip + " call in " + m); continue; } @@ -261,27 +261,4 @@ public class DrawAfterWidgets throw new InjectionException("injectDrawAfterWidgets failed to inject!"); } } - - private Method findStaticMethod(String name) - { - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Method m : c.getMethods()) - { - if (!m.getName().equals(name)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); - Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(m); - - ClassFile c2 = inject.toObClass(c); - - return c2.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : m.getDescriptor()); - } - } - - return null; - } } diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/DrawMenu.java b/injector-plugin/src/main/java/net/runelite/injector/raw/DrawMenu.java new file mode 100644 index 0000000000..b6634e68c5 --- /dev/null +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/DrawMenu.java @@ -0,0 +1,135 @@ +package net.runelite.injector.raw; + +import java.util.ListIterator; +import net.runelite.asm.ClassFile; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.Label; +import net.runelite.asm.attributes.code.instruction.types.JumpingInstruction; +import net.runelite.asm.attributes.code.instructions.GetStatic; +import net.runelite.asm.attributes.code.instructions.IfEq; +import net.runelite.asm.attributes.code.instructions.IfNe; +import net.runelite.asm.attributes.code.instructions.InvokeStatic; +import net.runelite.asm.pool.Class; +import net.runelite.asm.pool.Field; +import net.runelite.asm.signature.Signature; +import net.runelite.injector.Inject; +import static net.runelite.injector.InjectUtil.findDeobField; +import static net.runelite.injector.InjectUtil.findStaticMethod; +import net.runelite.injector.InjectionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DrawMenu +{ + private final Logger log = LoggerFactory.getLogger(DrawMenu.class); + private final Inject inject; + private static final net.runelite.asm.pool.Method hook = new net.runelite.asm.pool.Method( + new Class("net.runelite.client.callback.Hooks"), + "drawMenu", + new Signature("()Z") + ); + + //Label Getstatic client.isMenuOpen + //Ifne -> Label Drawmenu + //Jump -> Label Drawtext + + //Label drawtext + //Ldc xxx + //Getstatic client. something with viewport size? + //Imul + //Iconst_m1 + //Ifne -> Label after draw menu <- info we need + //Getstatic / LDC (same getstatic and LDC before) + //Getstatic / LDC + + public DrawMenu(Inject inject) + { + this.inject = inject; + } + + public void inject() throws InjectionException + { + Field isMenuOpen = findDeobField(inject, "isMenuOpen").getPoolField(); + net.runelite.asm.pool.Method topLeftText = findStaticMethod(inject, "drawMenuActionTextAt").getPoolMethod(); + + for (ClassFile cf : inject.getVanilla().getClasses()) + { + for (Method m : cf.getMethods()) + { + Code c = m.getCode(); + if (c == null) + { + continue; + } + + Instructions ins = c.getInstructions(); + ListIterator it = ins.getInstructions().listIterator(); + int injectIndex = -1; + Label after = null; + boolean foundBefore = false; + boolean foundAfter = false; + + while (it.hasNext()) + { + Instruction i = it.next(); + + if (!(i instanceof GetStatic) && !(i instanceof InvokeStatic)) + { + continue; + } + + if (!foundBefore && i instanceof GetStatic) + { + if (!((GetStatic) i).getField().equals(isMenuOpen)) + { + continue; + } + + i = it.next(); + if (!(i instanceof IfEq) && !(i instanceof IfNe)) + { + continue; + } + + if (i instanceof IfEq) + { + injectIndex = it.nextIndex(); + } + else + { + injectIndex = ins.getInstructions().indexOf(((IfNe) i).getJumps().get(0)) + 1; + } + foundBefore = true; + } + else if (!foundAfter && i instanceof InvokeStatic + && ((InvokeStatic) i).getMethod().equals(topLeftText)) + { + i = it.next(); + assert i instanceof JumpingInstruction; + after = ((JumpingInstruction) i).getJumps().get(0); + foundAfter = true; + } + + if (foundBefore && foundAfter) + { + break; + } + } + + if (!foundBefore || !foundAfter || injectIndex == -1) + { + continue; + } + + ins.addInstruction(injectIndex, new IfNe(ins, after)); + ins.addInstruction(injectIndex, new InvokeStatic(ins, hook)); + log.info("Injected drawmenu hook in {} at index {}", m, injectIndex); + return; + } + } + + } +} \ No newline at end of file diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/HidePlayerAttacks.java b/injector-plugin/src/main/java/net/runelite/injector/raw/HidePlayerAttacks.java new file mode 100644 index 0000000000..249d1e4774 --- /dev/null +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/HidePlayerAttacks.java @@ -0,0 +1,131 @@ +package net.runelite.injector.raw; + +import com.google.common.base.Stopwatch; +import java.util.Iterator; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.Label; +import net.runelite.asm.attributes.code.instruction.types.ComparisonInstruction; +import net.runelite.asm.attributes.code.instruction.types.JumpingInstruction; +import net.runelite.asm.attributes.code.instructions.ALoad; +import net.runelite.asm.attributes.code.instructions.GetStatic; +import net.runelite.asm.attributes.code.instructions.IfACmpEq; +import net.runelite.asm.attributes.code.instructions.IfACmpNe; +import net.runelite.asm.attributes.code.instructions.IfNe; +import net.runelite.asm.attributes.code.instructions.InvokeStatic; +import net.runelite.asm.pool.Field; +import net.runelite.injector.Inject; +import net.runelite.injector.InjectUtil; +import net.runelite.injector.InjectionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HidePlayerAttacks +{ + private final Logger log = LoggerFactory.getLogger(HidePlayerAttacks.class); + private final Inject inject; + + public HidePlayerAttacks(Inject inject) + { + this.inject = inject; + } + + public void inject() throws InjectionException + { + Stopwatch stopwatch = Stopwatch.createStarted(); + + final Method addPlayerOptions = InjectUtil.findStaticMethod(inject, "addPlayerToMenu"); + final Field AttackOption_hidden = InjectUtil.findDeobField(inject, "AttackOption_hidden", "AttackOption").getPoolField(); + final Field attackOption = InjectUtil.findDeobField(inject, "playerAttackOption", "Client").getPoolField(); + final net.runelite.asm.pool.Method shouldHideAttackOptionFor = inject.getVanilla().findClass("client").findMethod("shouldHideAttackOptionFor").getPoolMethod(); + + // GETSTATIC GETSTATIC + // GETSTATIC GETSTATIC + // IFACMPEQ -> label continue IFACMPNE -> label whatever lets carry on + // MORE OBFUSCATION + + int injectIdx = -1; + Instruction labelIns = null; + Label label = null; + + Instructions ins = addPlayerOptions.getCode().getInstructions(); + Iterator iterator = ins.getInstructions().iterator(); + while (iterator.hasNext()) + { + Instruction i = iterator.next(); + if (!(i instanceof GetStatic)) + { + continue; + } + + Field field = ((GetStatic) i).getField(); + if (!field.equals(AttackOption_hidden) && !field.equals(attackOption)) + { + continue; + } + + i = iterator.next(); + if (!(i instanceof GetStatic)) + { + continue; + } + + field = ((GetStatic) i).getField(); + if (!field.equals(AttackOption_hidden) && !field.equals(attackOption)) + { + continue; + } + + i = iterator.next(); + if (!(i instanceof ComparisonInstruction && i instanceof JumpingInstruction)) + { + log.info("You're not supposed to see this lol"); + continue; + } + + if (i instanceof IfACmpEq) + { + injectIdx = ins.getInstructions().indexOf(i) + 1; + label = ((IfACmpEq) i).getJumps().get(0); + } + else if (i instanceof IfACmpNe) + { + injectIdx = ins.getInstructions().indexOf(((IfACmpNe) i).getJumps().get(0)) + 1; + // We're gonna have to inject a extra label + labelIns = iterator.next(); + } + + break; + } + + if (injectIdx <= 0 || label == null && labelIns == null) + { + throw new InjectionException("HidePlayerAttacks failed"); + } + + // Load the player + ALoad i1 = new ALoad(ins, 0); + // Get the boolean + InvokeStatic i2 = new InvokeStatic(ins, shouldHideAttackOptionFor); + + ins.addInstruction(injectIdx, i1); + ins.addInstruction(injectIdx + 1, i2); + + if (label == null) + { + label = ins.createLabelFor(labelIns); + ins.rebuildLabels(); + injectIdx = ins.getInstructions().indexOf(i2) + 1; + } + + // Compare n such + IfNe i3 = new IfNe(ins, label); + + ins.addInstruction(injectIdx, i3); + + stopwatch.stop(); + + log.info("HidePlayerAttacks took {}", stopwatch.toString()); + } +} diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java b/injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java new file mode 100644 index 0000000000..f9297b7209 --- /dev/null +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java @@ -0,0 +1,83 @@ +package net.runelite.injector.raw; + +import com.google.common.base.Stopwatch; +import java.util.ListIterator; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.BiPush; +import net.runelite.injector.Inject; +import net.runelite.injector.InjectUtil; +import net.runelite.injector.InjectionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Occluder +{ + private final Inject inject; + private static final Logger log = LoggerFactory.getLogger(Occluder.class); + private static final byte OLDVALUE = 25; + private static final byte NEWVALUE = 90; + + public Occluder(Inject inject) + { + this.inject = inject; + } + + public void inject() throws InjectionException + { + Stopwatch stopwatch = Stopwatch.createStarted(); + Method occlude = InjectUtil.findMethod(inject, "occlude"); + int replaced = 0; + + if (occlude == null) + { + throw new InjectionException("Occlude couldn't be found"); + } + + Code code = occlude.getCode(); + + if (code == null) + { + throw new InjectionException("Occlude code was null"); + } + + Instructions ins = code.getInstructions(); + + ListIterator it = ins.getInstructions().listIterator(); + + while (it.hasNext()) + { + Instruction i = it.next(); + + if (!(i instanceof BiPush)) + { + continue; + } + + boolean shouldChange = (byte) ((BiPush) i).getConstant() == OLDVALUE; + + if (!shouldChange) + { + continue; + } + + replaced++; + + Instruction biPush = new BiPush(ins, NEWVALUE); + + it.set(biPush); + } + + stopwatch.stop(); + + if (replaced != 10) + { + throw new InjectionException("Only found " + replaced + " 25's to replace in occlude instead of expected 10"); + } + + log.info("Changed {} values in occlude()", replaced); + log.info("Occluder took {}", stopwatch.toString()); + } +} diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java b/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java index 644be16cff..f7b1c6df33 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java @@ -4,13 +4,14 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import net.runelite.asm.ClassFile; import net.runelite.asm.Field; import net.runelite.asm.Method; import net.runelite.asm.attributes.Code; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.InstructionType; import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instruction.types.LVTInstruction; +import net.runelite.asm.attributes.code.instructions.ALoad; import net.runelite.asm.attributes.code.instructions.ArrayStore; import net.runelite.asm.attributes.code.instructions.GetField; import net.runelite.asm.attributes.code.instructions.GetStatic; @@ -25,14 +26,16 @@ import net.runelite.asm.execution.Execution; import net.runelite.asm.execution.InstructionContext; import net.runelite.asm.pool.Class; import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; import net.runelite.injector.Inject; +import static net.runelite.injector.InjectUtil.findDeobField; +import static net.runelite.injector.InjectUtil.findStaticMethod; import net.runelite.injector.InjectionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RasterizerHook { + // TODO: Should probably make this better private static final Logger logger = LoggerFactory.getLogger(ClearColorBuffer.class); private static final int val = -16777216; @@ -40,10 +43,12 @@ public class RasterizerHook private static final String circle_alpha = "Rasterizer2D_drawCircleAlpha"; private static final String line_alpha = "Rasterizer2D_drawHorizontalLineAlpha"; private static final String line_alpha2 = "Rasterizer2D_drawVerticalLineAlpha"; - private static final String more_alpha = "Rasterizer2D_moreAlpha"; + private static final String fill_rect_alpha = "Rasterizer2D_fillRectangleAlpha"; private static final String r3d_vert = "Rasterizer3D_vertAlpha"; private static final String r3d_horiz = "Rasterizer3D_horizAlpha"; private static final String r3d_field = "Rasterizer3D_alpha"; + private static final String sprite_alpha1 = "Sprite_alpha1"; + private static final String sprite_alpha2 = "Sprite_alpha2"; private static final String font = "AbstractFont_placeGlyph"; private static final String rast3D = "Rasterizer3D_iDontKnow"; @@ -71,15 +76,14 @@ public class RasterizerHook public void inject() throws InjectionException { runDrawAlpha(); + logger.info("Injected {} drawAlpha's", count); + assert count == 35 : "Either too many or not enough drawAlpha's were injected"; + count = 0; runVars(); - { - // throw new InjectionException("Not all variable alpha thingshits were found"); - } - run(); } @@ -91,13 +95,15 @@ public class RasterizerHook runAlpha(circle_alpha, 2, 4); runAlpha(line_alpha, 1, 4); runAlpha(line_alpha2, 1, 4); - runAlpha(more_alpha, 1, 5); + runAlpha(fill_rect_alpha, 1, 5); + runAlpha(sprite_alpha1, 1, 9, 0); + runAlpha(sprite_alpha2, 1, 12, 0); } private void runR3DAlpha(String methodName, int req, String fieldName) throws InjectionException { - Method meth = findStaticMethod(methodName); - Field field = findDeobField(fieldName); + Method meth = findStaticMethod(inject, methodName); + Field field = findDeobField(inject, fieldName); Instructions ins = meth.getCode().getInstructions(); int varIdx = 0; // This is obviously dumb but I cba making this better int added = 0; @@ -113,8 +119,6 @@ public class RasterizerHook throw new InjectionException("Couldn't find hook location in " + methodName); } - int oldCount = count; - for (int i : indices) { for (int codeIndex = i + added; codeIndex < ins.getInstructions().size(); codeIndex++) @@ -136,15 +140,26 @@ public class RasterizerHook private void runAlpha(String methodName, int req, int extraArg) throws InjectionException { - final net.runelite.asm.pool.Field pixels = findDeobField("Rasterizer2D_pixels").getPoolField(); - Method meth = findStaticMethod(methodName); - Instructions ins = meth.getCode().getInstructions(); + runAlpha(methodName, req, extraArg, -1); + } + + private void runAlpha(String methodName, int req, int extraArg, int varIndex) throws InjectionException + { + final net.runelite.asm.pool.Field pixels = findDeobField(inject, "Rasterizer2D_pixels").getPoolField(); + Method meth = findStaticMethod(inject, methodName); + if (meth == null) + { + throw new InjectionException(methodName + " couldnt be found"); + } + + Code code = meth.getCode(); + Instructions ins = code.getInstructions(); int added = 0; List indices = new ArrayList<>(); for (Instruction i : ins.getInstructions()) { - if (!(i instanceof IALoad) && !(i instanceof GetField)) + if (!(i instanceof IALoad) && !(i instanceof GetField) && !(i instanceof ALoad)) { continue; } @@ -155,10 +170,15 @@ public class RasterizerHook { indices.add(ins.getInstructions().indexOf(i)); } - continue; } - - indices.add(ins.getInstructions().indexOf(i)); + else if ((i instanceof ALoad) && varIndex >= 0 && ((LVTInstruction) i).getVariableIndex() == varIndex) + { + indices.add(ins.getInstructions().indexOf(i)); + } + else if (varIndex == -1) + { + indices.add(ins.getInstructions().indexOf(i)); + } } if (indices.isEmpty()) @@ -194,8 +214,7 @@ public class RasterizerHook private void runFontAlpha(String methodName, int req, int extraArg) throws InjectionException { - final net.runelite.asm.pool.Field pixels = findDeobField("Rasterizer2D_pixels").getPoolField(); - Method meth = findStaticMethod(methodName); + Method meth = findStaticMethod(inject, methodName); Instructions ins = meth.getCode().getInstructions(); int varIdx = 0; // This is obviously dumb but I cba making this better int added = 0; @@ -231,13 +250,9 @@ public class RasterizerHook } } - if (count - oldCount > req) + if (count - req != oldCount) { - throw new InjectionException("Too many drawAlpha's were injected into " + methodName); - } - if (count == oldCount) - { - throw new InjectionException("Couldn't find any drawAlpha positions in " + methodName); + throw new InjectionException(req != oldCount ? req > count - oldCount ? "Not enough" : "Too many" : "No" + " drawAlpha's were injected into " + methodName); } } @@ -261,7 +276,7 @@ public class RasterizerHook private void run() throws InjectionException { final int startCount = count; // Cause you can't just count shit ty - final net.runelite.asm.pool.Field pixels = findDeobField("Rasterizer2D_pixels").getPoolField(); + final net.runelite.asm.pool.Field pixels = findDeobField(inject, "Rasterizer2D_pixels").getPoolField(); Execution ex = new Execution(inject.getVanilla()); ex.populateInitialMethods(); @@ -273,7 +288,7 @@ public class RasterizerHook Instructions ins = i.getInstructions(); Code code = ins.getCode(); Method method = code.getMethod(); - logger.debug(i.toString()); + //logger.debug(i.toString()); if (!(i instanceof IAStore)) { @@ -304,7 +319,7 @@ public class RasterizerHook { if ((int) ic.getPops().get(0).getValue().getValue() == 0) { - logger.info("Didn't add hook in method {}.{}. {} added, {} total, value 0", method.getClassFile().getClassName(), method.getName(), count - startCount, count); + logger.debug("Didn't add hook in method {}.{}. {} added, {} total, value 0", method.getClassFile().getClassName(), method.getName(), count - startCount, count); return; } } @@ -312,7 +327,7 @@ public class RasterizerHook ins.getInstructions().add(index, new IOr(ins, InstructionType.IOR)); // Add instructions backwards ins.getInstructions().add(index, new LDC(ins, val)); count++; - logger.info("Added hook in method {}.{}. {} added, {} total", method.getClassFile().getClassName(), method.getName(), count - startCount, count); + logger.debug("Added hook in method {}.{}. {} added, {} total", method.getClassFile().getClassName(), method.getName(), count - startCount, count); }); ex.run(); @@ -320,7 +335,7 @@ public class RasterizerHook private void runOnMethodWithVar(String meth, int varIndex) throws InjectionException { - Method method = findStaticMethod(meth); + Method method = findStaticMethod(inject, meth); Instructions ins = method.getCode().getInstructions(); List indices = new ArrayList<>(); @@ -353,48 +368,4 @@ public class RasterizerHook logger.info("Added {} instructions in {}. {} total", added >>> 1, meth, count); } - - private Method findStaticMethod(String name) throws InjectionException - { - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Method m : c.getMethods()) - { - if (!m.getName().equals(name)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); - Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(m); - - ClassFile c2 = inject.toObClass(c); - - return c2.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : m.getDescriptor()); - } - } - - throw new InjectionException("Couldn't find static method " + name); - } - - private Field findDeobField(String name) throws InjectionException - { - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Field f : c.getFields()) - { - if (!f.getName().equals(name)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); - - ClassFile c2 = inject.toObClass(c); - return c2.findField(obfuscatedName); - } - } - - throw new InjectionException(String.format("Mapped field \"%s\" could not be found.", name)); - } } diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java b/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java index a46b6634c7..25cccfc653 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java @@ -1,8 +1,8 @@ package net.runelite.injector.raw; +import com.google.common.base.Stopwatch; import java.util.ArrayList; import java.util.List; -import net.runelite.asm.ClassFile; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.Instructions; import net.runelite.asm.attributes.code.instructions.InvokeStatic; @@ -10,19 +10,19 @@ import net.runelite.asm.attributes.code.instructions.InvokeVirtual; import net.runelite.asm.pool.Class; import net.runelite.asm.pool.Method; import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; import net.runelite.injector.Inject; +import static net.runelite.injector.InjectUtil.findMethod; import net.runelite.injector.InjectionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RenderDraw { - private static final Logger log = LoggerFactory.getLogger(ClearColorBuffer.class); + private static final Logger log = LoggerFactory.getLogger(RenderDraw.class); private static final net.runelite.asm.pool.Method renderDraw = new net.runelite.asm.pool.Method( new Class("net.runelite.client.callback.Hooks"), "renderDraw", - new Signature("(Lapi/Renderable;IIIIIIIIJ)V") + new Signature("(Lnet/runelite/api/Renderable;IIIIIIIIJ)V") ); private final Inject inject; @@ -33,18 +33,18 @@ public class RenderDraw public void inject() throws InjectionException { - injectColorBufferHooks(); - } + Stopwatch stopwatch = Stopwatch.createStarted(); + + net.runelite.asm.Method obmethod = findMethod(inject, "drawTile"); + Method renderDraw = findMethod(inject, "renderDraw").getPoolMethod(); - private void injectColorBufferHooks() throws InjectionException - { - net.runelite.asm.Method obmethod = findObMethod("drawTile"); - Method renderDraw = findObMethod("renderDraw").getPoolMethod(); Instructions ins = obmethod.getCode().getInstructions(); replace(ins, renderDraw); + + log.info("RenderDraw took {}", stopwatch.toString()); } - private void replace(Instructions ins, net.runelite.asm.pool.Method meth) + private void replace(Instructions ins, net.runelite.asm.pool.Method meth) throws InjectionException { List insList = new ArrayList<>(); int count = 0; @@ -56,37 +56,31 @@ public class RenderDraw { int index = ins.getInstructions().indexOf(i); count++; - log.info("Found renderDraw at index {}, {} found.", index, count); + log.debug("Found renderDraw at index {}, {} found.", index, count); insList.add(i); } } } + if (count < 21) + { + throw new InjectionException("Not all renderDraws were found"); + } + else if (count != 21) + { + log.warn("Found {} renderDraws while 21 were expected. Rev update?", count); + } + else + { + log.info("RenderDraw replaced {} method calls", count); + } + + for (Instruction i : insList) { Instruction invoke = new InvokeStatic(ins, renderDraw); ins.replace(i, invoke); } } - - private net.runelite.asm.Method findObMethod(String name) throws InjectionException - { - for (ClassFile cf : inject.getDeobfuscated().getClasses()) - { - for (net.runelite.asm.Method m : cf.getMethods()) - { - if (!m.getName().equals(name)) - { - continue; - } - String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); - - ClassFile c2 = inject.toObClass(cf); - return c2.findMethod(obfuscatedName); - } - } - - throw new InjectionException(String.format("Method \"%s\" could not be found.", name)); - } } diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/ScriptVM.java b/injector-plugin/src/main/java/net/runelite/injector/raw/ScriptVM.java index 143e21b953..9fe87975c1 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/ScriptVM.java +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/ScriptVM.java @@ -28,7 +28,6 @@ import java.util.HashSet; import java.util.ListIterator; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; -import net.runelite.asm.ClassFile; import net.runelite.asm.Field; import net.runelite.asm.Method; import net.runelite.asm.Type; @@ -54,6 +53,9 @@ import net.runelite.asm.execution.MethodContext; import net.runelite.asm.execution.StackContext; import net.runelite.deob.DeobAnnotations; import net.runelite.injector.Inject; +import net.runelite.injector.InjectUtil; +import static net.runelite.injector.InjectUtil.findDeobField; +import static net.runelite.injector.InjectUtil.findObField; import net.runelite.injector.InjectionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -104,12 +106,12 @@ public class ScriptVM */ String scriptObName = DeobAnnotations.getObfuscatedName(inject.getDeobfuscated().findClass("Script").getAnnotations()); - Method runScript = findObMethod("copy$runScript0"); - Method vmExecuteOpcode = findObMethod("vmExecuteOpcode"); - Field scriptInstructions = findDeobField("opcodes"); - Field scriptStatePC = findDeobField("pc"); - Field currentScriptField = findObField("currentScript"); - Field currentScriptPCField = findObField("currentScriptPC"); + Method runScript = InjectUtil.findStaticObMethod(inject, "copy$runScript0"); + Method vmExecuteOpcode = InjectUtil.findStaticObMethod(inject, "vmExecuteOpcode"); + Field scriptInstructions = findDeobField(inject, "opcodes"); + Field scriptStatePC = findDeobField(inject, "pc"); + Field currentScriptField = findObField(inject, "currentScript"); + Field currentScriptPCField = findObField(inject, "currentScriptPC"); Execution e = new Execution(inject.getVanilla()); e.addMethod(runScript); @@ -295,59 +297,4 @@ public class ScriptVM instrs.addInstruction(istorepc + 2, new InvokeStatic(instrs, vmExecuteOpcode.getPoolMethod())); instrs.addInstruction(istorepc + 3, new IfNe(instrs, nextIteration)); } - - private Method findObMethod(String name) throws InjectionException - { - for (ClassFile c : inject.getVanilla().getClasses()) - { - for (Method m : c.getMethods()) - { - if (!m.getName().equals(name)) - { - continue; - } - return m; - } - } - - throw new InjectionException(String.format("Method \"%s\" could not be found.", name)); - } - - private Field findObField(String name) throws InjectionException - { - for (ClassFile c : inject.getVanilla().getClasses()) - { - for (Field f : c.getFields()) - { - if (!f.getName().equals(name)) - { - continue; - } - return f; - } - } - - throw new InjectionException(String.format("Field \"%s\" could not be found.", name)); - } - - private Field findDeobField(String name) throws InjectionException - { - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Field f : c.getFields()) - { - if (!f.getName().equals(name)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); - - ClassFile c2 = inject.toObClass(c); - return c2.findField(obfuscatedName); - } - } - - throw new InjectionException(String.format("Mapped field \"%s\" could not be found.", name)); - } } diff --git a/injector-plugin/src/test/java/net/runelite/injector/InjectConstructTest.java b/injector-plugin/src/test/java/net/runelite/injector/InjectConstructTest.java new file mode 100644 index 0000000000..dbde5e10bd --- /dev/null +++ b/injector-plugin/src/test/java/net/runelite/injector/InjectConstructTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.injector; + +import net.runelite.asm.ClassFile; +import net.runelite.asm.Method; +import net.runelite.asm.signature.Signature; +import static org.junit.Assert.assertNotNull; +import org.junit.Test; +import org.mockito.Matchers; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class InjectConstructTest +{ + @Test + public void testInjectConstruct() throws Exception + { + ClassFile targetClass = new ClassFile(); + targetClass.setName("test"); + + ClassFile vanillaClass = new ClassFile(); + vanillaClass.setName("ab"); + Method constructor = new Method(vanillaClass, "", new Signature("()V")); + vanillaClass.addMethod(constructor); + + Inject inject = mock(Inject.class); + when(inject.findVanillaForInterface(Matchers.any(Class.class))) + .thenReturn(vanillaClass); + InjectConstruct injectConstruct = new InjectConstruct(inject); + injectConstruct.injectConstruct(targetClass, APIClass.class.getDeclaredMethod("create")); + + assertNotNull(targetClass.findMethod("create")); + } + + interface APIClass + { + APIClass create(); + } + +} diff --git a/injector-plugin/src/test/java/net/runelite/injector/InjectSetterTest.java b/injector-plugin/src/test/java/net/runelite/injector/InjectSetterTest.java new file mode 100644 index 0000000000..48ff708bc5 --- /dev/null +++ b/injector-plugin/src/test/java/net/runelite/injector/InjectSetterTest.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.injector; + +import net.runelite.asm.ClassFile; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.Type; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import static net.runelite.asm.attributes.code.InstructionType.CHECKCAST; +import net.runelite.asm.attributes.code.Instructions; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import org.junit.Test; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class InjectSetterTest +{ + @Test + public void testInjectSetterInt() throws NoSuchMethodException + { + Inject inject = mock(Inject.class); + + when(inject.findImportMethodOnApi(any(Class.class), anyString(), any(Boolean.class))) + .thenReturn(APIClass.class.getDeclaredMethod("setTest", int.class)); + + when(inject.createLoadForTypeIndex(any(Instructions.class), any(Type.class), anyInt())) + .thenReturn(mock(Instruction.class)); + + InjectSetter instance = new InjectSetter(inject); + ClassFile targetClass = new ClassFile(); + targetClass.setName("test"); + + Field field = new Field(targetClass, "test", Type.INT); + targetClass.addField(field); + + instance.injectSetter(targetClass, APIClass.class, field, "test", null); + + Method injectedMethod = targetClass.findMethod("setTest"); + assertNotNull(injectedMethod); + + Code code = injectedMethod.getCode(); + Instructions instructions = code.getInstructions(); + assertFalse(instructions.getInstructions().stream() + .filter(i -> i.getType() == CHECKCAST) + .findAny() + .isPresent()); + } + + @Test + public void testInjectSetterObject() throws NoSuchMethodException + { + Inject inject = mock(Inject.class); + + when(inject.findImportMethodOnApi(any(Class.class), anyString(), any(Boolean.class))) + .thenReturn(APIClass.class.getDeclaredMethod("setTestObject", Object.class)); + + when(inject.createLoadForTypeIndex(any(Instructions.class), any(Type.class), anyInt())) + .thenReturn(mock(Instruction.class)); + + InjectSetter instance = new InjectSetter(inject); + ClassFile targetClass = new ClassFile(); + targetClass.setName("test"); + + Field field = new Field(targetClass, "testObject", Type.STRING); + targetClass.addField(field); + + instance.injectSetter(targetClass, APIClass.class, field, "testObject", null); + + Method injectedMethod = targetClass.findMethod("setTestObject"); + assertNotNull(injectedMethod); + + Code code = injectedMethod.getCode(); + Instructions instructions = code.getInstructions(); + assertTrue(instructions.getInstructions().stream() + .filter(i -> i.getType() == CHECKCAST) + .findAny() + .isPresent()); + } + + interface APIClass + { + void setTest(int i); + + void setTestObject(Object str); + } + +} diff --git a/injector-plugin/src/test/java/net/runelite/injector/InjectTest.java b/injector-plugin/src/test/java/net/runelite/injector/InjectTest.java new file mode 100644 index 0000000000..109550d5b9 --- /dev/null +++ b/injector-plugin/src/test/java/net/runelite/injector/InjectTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.injector; + +import java.io.File; +import java.io.IOException; +import net.runelite.asm.ClassGroup; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.TemporyFolderLocation; +import net.runelite.deob.util.JarUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class InjectTest +{ + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Rule + public TemporaryFolder folder = TemporyFolderLocation.getTemporaryFolder(); + + private ClassGroup deob, vanilla; + + @Before + public void before() throws IOException + { + deob = JarUtil.loadJar(new File(properties.getRsClient())); + vanilla = JarUtil.loadJar(new File(properties.getVanillaClient())); + } + + @After + public void after() throws IOException + { + JarUtil.saveJar(vanilla, folder.newFile()); + } + + @Test + @Ignore + public void testRun() throws InjectionException + { + Inject instance = new Inject(deob, vanilla); + instance.run(); + + InjectorValidator iv = new InjectorValidator(vanilla); + iv.validate(); + } + +} diff --git a/injector-plugin/src/test/java/net/runelite/injector/MixinInjectorTest.java b/injector-plugin/src/test/java/net/runelite/injector/MixinInjectorTest.java new file mode 100644 index 0000000000..9a96626f27 --- /dev/null +++ b/injector-plugin/src/test/java/net/runelite/injector/MixinInjectorTest.java @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.injector; + +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.runelite.api.mixins.Copy; +import net.runelite.api.mixins.Replace; +import net.runelite.api.mixins.Shadow; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import static net.runelite.asm.Type.INT; +import net.runelite.asm.attributes.code.instructions.GetStatic; +import net.runelite.asm.attributes.code.instructions.InvokeVirtual; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.signature.Signature; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import org.junit.Test; +import static org.objectweb.asm.Opcodes.ACC_PUBLIC; +import static org.objectweb.asm.Opcodes.ACC_STATIC; + +@ObfuscatedName("net/runelite/injector/VanillaTarget") +class DeobTarget +{ + @ObfuscatedName("ob_foo4") + private static int foo4; + + @ObfuscatedName("ob_foo3") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "123" + ) + private void foo3() + { + // De-obfuscated foo3 + System.out.println("foo3"); + } +} + +class VanillaTarget +{ + private static int ob_foo4; + + private void ob_foo3(int garbageValue) + { + // Obfuscated foo3 + if (garbageValue != 123) + { + return; + } + System.out.println("foo3"); + } +} + +abstract class Source +{ + @net.runelite.api.mixins.Inject + private static int foo; + @Shadow("foo4") + private static int foo4; + + @net.runelite.api.mixins.Inject + private void foo2() + { + } + + @Copy("foo3") + abstract void foo3(); + + @Replace("foo3") + private void rl$foo3() + { + System.out.println("replaced"); + System.out.println(foo4); + foo3(); + } +} + +// Test shadowing the "foo" field injected by Source +abstract class Source2 +{ + @Shadow("foo") + private static int foo; + + @net.runelite.api.mixins.Inject + private void foo5() + { + System.out.println(foo); + } +} + +public class MixinInjectorTest +{ + @Test + public void testInject() throws Exception + { + InputStream deobIn = getClass().getResourceAsStream("DeobTarget.class"); + ClassFile deobTarget = ClassUtil.loadClass(deobIn); + + ClassGroup deob = new ClassGroup(); + deob.addClass(deobTarget); + + InputStream vanillaIn = getClass().getResourceAsStream("VanillaTarget.class"); + ClassFile vanillaTarget = ClassUtil.loadClass(vanillaIn); + + ClassGroup vanilla = new ClassGroup(); + vanilla.addClass(vanillaTarget); + + Map, List> mixinClasses = new HashMap<>(); + mixinClasses.put(Source.class, Collections.singletonList(vanillaTarget)); + mixinClasses.put(Source2.class, Collections.singletonList(vanillaTarget)); + + Inject inject = new Inject(deob, vanilla); + new MixinInjector(inject).inject(mixinClasses); + + // Check if "foo" has been injected + Field foo = vanillaTarget.findField("foo"); + assertNotNull(foo); + assertEquals(INT, foo.getType()); + assertEquals(ACC_PUBLIC | ACC_STATIC, foo.getAccessFlags()); + + // Check if "foo2()V" has been injected + Method foo2 = vanillaTarget.findMethod("foo2"); + assertNotNull(foo2); + assertEquals(new Signature("()V"), foo2.getDescriptor()); + assertEquals(ACC_PUBLIC, foo2.getAccessFlags()); + + // Check if "ob_foo3(I)V" was copied + Method foo3 = vanillaTarget.findMethod("copy$foo3"); + assertNotNull(foo3); + assertEquals(new Signature("(I)V"), foo3.getDescriptor()); + assertEquals(ACC_PUBLIC, foo3.getAccessFlags()); + + // Check if "ob_foo3(I)V" was replaced + Method ob_foo3 = vanillaTarget.findMethod("ob_foo3"); + assertNotNull(ob_foo3); + assertEquals(new Signature("(I)V"), ob_foo3.getDescriptor()); + assertEquals(ob_foo3 + .getCode() + .getInstructions() + .getInstructions() + .stream() + .filter(i -> i instanceof LDC && ((LDC) i).getConstant().equals("replaced")) + .count(), 1); + // Check that the "foo4" field access in the new code body was mapped correctly + assertEquals(ob_foo3 + .getCode() + .getInstructions() + .getInstructions() + .stream() + .filter(i -> + { + if (!(i instanceof GetStatic)) + { + return false; + } + + net.runelite.asm.pool.Field field = ((GetStatic) i).getField(); + + if (!field.getClazz().getName().equals("net/runelite/injector/VanillaTarget")) + { + return false; + } + + if (!field.getName().equals("ob_foo4")) + { + return false; + } + + return true; + }) + .count(), 1); + // Check that the "foo3()" call in the new code body was mapped to the copy + assertEquals(ob_foo3 + .getCode() + .getInstructions() + .getInstructions() + .stream() + .filter(i -> + { + if (!(i instanceof InvokeVirtual)) + { + return false; + } + + net.runelite.asm.pool.Method method = ((InvokeVirtual) i).getMethod(); + + if (!method.getClazz().getName().equals("net/runelite/injector/VanillaTarget")) + { + return false; + } + + if (!method.getName().equals("copy$foo3")) + { + return false; + } + + return true; + }) + .count(), 1); + + // Check if "foo5()V" was injected + Method foo5 = vanillaTarget.findMethod("foo5"); + assertNotNull(foo5); + assertEquals(new Signature("()V"), foo5.getDescriptor()); + assertEquals(ACC_PUBLIC, foo5.getAccessFlags()); + // Check that the shadow "foo" field access was mapped correctly + assertEquals(foo5 + .getCode() + .getInstructions() + .getInstructions() + .stream() + .filter(i -> + { + if (!(i instanceof GetStatic)) + { + return false; + } + + net.runelite.asm.pool.Field field = ((GetStatic) i).getField(); + + if (!field.getClazz().getName().equals("net/runelite/injector/VanillaTarget")) + { + return false; + } + + if (!field.getName().equals("foo")) + { + return false; + } + + return true; + }) + .count(), 1); + } +} diff --git a/injector-plugin/src/test/java/net/runelite/injector/raw/DrawAfterWidgetsTest.java b/injector-plugin/src/test/java/net/runelite/injector/raw/DrawAfterWidgetsTest.java new file mode 100644 index 0000000000..fa8a439f83 --- /dev/null +++ b/injector-plugin/src/test/java/net/runelite/injector/raw/DrawAfterWidgetsTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.injector.raw; + +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.ClassUtil; +import net.runelite.injector.Inject; +import org.junit.Test; + +public class DrawAfterWidgetsTest +{ + @Test + public void testInjectDrawWidgetsRev160() throws Exception + { + // Rev 160 does not have the drawWidgets call inlined + + ClassFile deobClient = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Client_deob160.class")); + ClassFile deobRasterizer = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Rasterizer2D_deob160.class")); + + ClassGroup deob = new ClassGroup(); + deob.addClass(deobClient); + deob.addClass(deobRasterizer); + + ClassFile obClient = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Client_ob160.class")); + ClassFile obRasterizer = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Rasterizer2D_ob160.class")); + + ClassGroup vanilla = new ClassGroup(); + vanilla.addClass(obClient); + vanilla.addClass(obRasterizer); + + Inject inject = new Inject(deob, vanilla); + new DrawAfterWidgets(inject).inject(); + } + + @Test + public void testInjectDrawWidgetsRev180() throws Exception + { + // Rev 180 has the drawWidgets call inlined + + ClassFile deobClient = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Client_deob180.class")); + ClassFile deobRasterizer = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Rasterizer2D_deob180.class")); + + ClassGroup deob = new ClassGroup(); + deob.addClass(deobClient); + deob.addClass(deobRasterizer); + + ClassFile obClient = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Client_ob180.class")); + ClassFile obRasterizer = ClassUtil.loadClass(getClass().getResourceAsStream("/drawafterwidgets/Rasterizer2D_ob180.class")); + + ClassGroup vanilla = new ClassGroup(); + vanilla.addClass(obClient); + vanilla.addClass(obRasterizer); + + Inject inject = new Inject(deob, vanilla); + new DrawAfterWidgets(inject).inject(); + } +} diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Client_deob153.class b/injector-plugin/src/test/resources/drawafterwidgets/Client_deob153.class new file mode 100644 index 0000000000..1ba0acf69d Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Client_deob153.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Client_deob160.class b/injector-plugin/src/test/resources/drawafterwidgets/Client_deob160.class new file mode 100644 index 0000000000..e1267ab1ed Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Client_deob160.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Client_deob180.class b/injector-plugin/src/test/resources/drawafterwidgets/Client_deob180.class new file mode 100644 index 0000000000..d950650dff Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Client_deob180.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Client_ob153.class b/injector-plugin/src/test/resources/drawafterwidgets/Client_ob153.class new file mode 100644 index 0000000000..385d4545ab Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Client_ob153.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Client_ob160.class b/injector-plugin/src/test/resources/drawafterwidgets/Client_ob160.class new file mode 100644 index 0000000000..9ae3013b49 Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Client_ob160.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Client_ob180.class b/injector-plugin/src/test/resources/drawafterwidgets/Client_ob180.class new file mode 100644 index 0000000000..2c65c24391 Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Client_ob180.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob153.class b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob153.class new file mode 100644 index 0000000000..2a6d08f961 Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob153.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob160.class b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob160.class new file mode 100644 index 0000000000..90fa97c4da Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob160.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob180.class b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob180.class new file mode 100644 index 0000000000..a545ad9ccb Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob180.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob153.class b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob153.class new file mode 100644 index 0000000000..3e3a057acc Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob153.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob160.class b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob160.class new file mode 100644 index 0000000000..5197519177 Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob160.class differ diff --git a/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob180.class b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob180.class new file mode 100644 index 0000000000..441fe42017 Binary files /dev/null and b/injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob180.class differ diff --git a/mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java b/mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java deleted file mode 100644 index 2e92d4b177..0000000000 --- a/mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2018, SomeoneWithAnInternetConnection - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.mixins; - -import net.runelite.api.mixins.Inject; -import net.runelite.api.mixins.Mixin; -import rs.api.RSClient; -import rs.api.RSSoundEffect; - -@Mixin(RSClient.class) -public abstract class PlaySoundEffectMixin implements RSClient -{ - - @Inject - @Override - public void playSoundEffect(int id) - { - playSoundEffect(id, 0, 0, 0); - } - - @Inject - @Override - public void playSoundEffect(int id, int x, int y, int range) - { - int position = ((x & 255) << 16) + ((y & 255) << 8) + (range & 255); - - int[] queuedSoundEffectIDs = getQueuedSoundEffectIDs(); - int[] unknownSoundValues1 = getUnknownSoundValues1(); - int[] queuedSoundEffectDelays = getQueuedSoundEffectDelays(); - RSSoundEffect[] audioEffects = getAudioEffects(); - int[] soundLocations = getSoundLocations(); - int queuedSoundEffectCount = getQueuedSoundEffectCount(); - - queuedSoundEffectIDs[queuedSoundEffectCount] = id; - unknownSoundValues1[queuedSoundEffectCount] = 0; - queuedSoundEffectDelays[queuedSoundEffectCount] = 0; - audioEffects[queuedSoundEffectCount] = null; - soundLocations[queuedSoundEffectCount] = position; - - setQueuedSoundEffectCount(queuedSoundEffectCount + 1); - } -} diff --git a/mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java b/mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java deleted file mode 100644 index d2ae1a869a..0000000000 --- a/mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.runelite.mixins; - -import java.awt.geom.Area; -import net.runelite.api.mixins.Inject; -import net.runelite.api.mixins.Mixin; -import rs.api.RSGroundItemPile; - -@Mixin(RSGroundItemPile.class) -public abstract class RSGroundItemPileMixin implements RSGroundItemPile -{ - @Inject - private int itemLayerPlane; - - @Inject - @Override - public int getPlane() - { - return itemLayerPlane; - } - - @Inject - @Override - public void setPlane(int plane) - { - this.itemLayerPlane = plane; - } - - @Inject - @Override - public Area getClickbox() - { - throw new UnsupportedOperationException(); - } -} diff --git a/mixins/src/main/java/net/runelite/mixins/RSHealthBarDefinitionMixin.java b/mixins/src/main/java/net/runelite/mixins/RSHealthBarDefinitionMixin.java deleted file mode 100644 index d3eb7926f7..0000000000 --- a/mixins/src/main/java/net/runelite/mixins/RSHealthBarDefinitionMixin.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.runelite.mixins; - -import api.HealthBarOverride; -import api.events.PostHealthBar; -import net.runelite.api.mixins.Copy; -import net.runelite.api.mixins.Inject; -import net.runelite.api.mixins.MethodHook; -import net.runelite.api.mixins.Mixin; -import net.runelite.api.mixins.Replace; -import net.runelite.api.mixins.Shadow; -import rs.api.RSBuffer; -import rs.api.RSClient; -import rs.api.RSHealthBarDefinition; -import rs.api.RSSprite; - -@Mixin(RSHealthBarDefinition.class) -public abstract class RSHealthBarDefinitionMixin implements RSHealthBarDefinition -{ - // Larger values are used for bosses like Corporeal Beast - private static final int DEFAULT_HEALTH_SCALE = 30; - - @Shadow("client") - private static RSClient client; - - @Shadow("healthBarOverride") - private static HealthBarOverride healthBarOverride; - - @Copy("getSprite2") - abstract RSSprite rs$getHealthBarBackSprite(); - - @Replace("getSprite2") - public RSSprite rl$getHealthBarBackSprite() - { - /* - * If this combat info already uses sprites for health bars, - * use those instead, and don't override. - */ - RSSprite pixels = rs$getHealthBarBackSprite(); - if (pixels != null) - { - return pixels; - } - - if (healthBarOverride == null) - { - return null; - } - - return getHealthScale() == DEFAULT_HEALTH_SCALE - ? (RSSprite) healthBarOverride.backSprite - : (RSSprite) healthBarOverride.backSpriteLarge; - } - - @Copy("getSprite1") - abstract RSSprite rs$getHealthBarFrontSprite(); - - @Replace("getSprite1") - public RSSprite rl$getHealthBarFrontSprite() - { - /* - * If this combat info already uses sprites for health bars, - * use those instead, and don't override. - */ - RSSprite pixels = rs$getHealthBarFrontSprite(); - if (pixels != null) - { - return pixels; - } - - if (healthBarOverride == null) - { - return null; - } - - // 30 is the default size, large is for bosses like Corporeal Beast - return getHealthScale() == DEFAULT_HEALTH_SCALE - ? (RSSprite) healthBarOverride.frontSprite - : (RSSprite) healthBarOverride.frontSpriteLarge; - } - - @MethodHook(value = "read", end = true) - @Inject - public void onRead(RSBuffer buffer) - { - PostHealthBar postHealthBar = new PostHealthBar(); - postHealthBar.setHealthBar(this); - client.getCallbacks().post(postHealthBar); - } -} diff --git a/pom.xml b/pom.xml index 23f3459193..6a41755b67 100644 --- a/pom.xml +++ b/pom.xml @@ -1,78 +1,339 @@ + Copyright (c) 2016-2017, Adam + All rights reserved. - - 4.0.0 + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: - com.runeswag - runeswag-parent - pom - 1.0-SNAPSHOT - - RuneLitePlus - api - rs-client - mixins + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--> + + 4.0.0 + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + pom + + RuneLite + Open source RuneScape client + http://runelite.net + + + UTF-8 + 1.8 + 1.18.4 + 8.3 + 1.2.3 + 2.8.5 + 23.2-jre + 4.12 + 1.7.12 + 4.1.0.Final + 1.10.19 + 1.5.4 + 3.0.6 + 3.7.0 + 0.7 + + 3.0.2 + 3.6.1 + 2.17 + 3.0.0-M1 + 2.5.3 + 2.18 + + true + true + true + 180 + + + + + 2-Clause BSD License + https://opensource.org/licenses/BSD-2-Clause + + + + 2014 + + + https://github.com/runelite/runelite + scm:git:git://github.com/runelite/runelite + scm:git:git@github.com:runelite/runelite + HEAD + + + + + Adam- + Adam + Adam@sigterm.info + + + + + GitHub Issues + https://github.com/runelite/runelite/issues + + + + Travis CI + https://travis-ci.org/runelite/runelite + + + + + maven-central + http://repo1.maven.org/maven2 + + + runelite + RuneLite + http://repo.runelite.net + + true + always + + + + + + maven-central-plugins + http://repo1.maven.org/maven2 + + + runelite-plugins + RuneLite Plugins + http://repo.runelite.net + + true + always + + + + + + cache + cache-client + cache-updater deobfuscator - injector-plugin - injected-client - + runelite-api + runelite-client + runelite-mixins + runelite-script-assembler-plugin + runescape-api + runescape-client + injector-plugin + injected-client + runelite-plugin-archetype + http-api + http-service + protocol-api + protocol + - - - maven-central - http://repo1.maven.org/maven2 - - - runelite - RuneLite - http://repo.runelite.net - - true - always - - - + + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + com.google.code.gson + gson + ${gson.version} + + + org.sql2o + sql2o + ${sql2o.version} + + + io.netty + netty-buffer + ${netty.version} + + + io.minio + minio + ${minio.version} + + + io.netty + netty-all + ${netty.version} + + + com.squareup.okhttp3 + okhttp + ${okhttp3.version} + + + com.squareup.okhttp3 + mockwebserver + ${okhttp3.version} + test + + + org.slf4j + slf4j-simple + ${slf4j.version} + test + + + org.mockito + mockito-all + ${mockito.version} + test + + + junit + junit + ${junit.version} + test + + + ch.qos.logback + logback-parent + ${logback.version} + pom + import + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + pom + import + + + - - - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - 8 - - - - - - \ No newline at end of file + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire-plugin.version} + + true + -Xmx512m + false + + + + org.apache.maven.plugins + maven-release-plugin + ${maven.release.plugin.version} + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.plugin.version} + + + 8 + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven.checkstyle.plugin.version} + + + com.puppycrawl.tools + checkstyle + ${checkstyle.version} + + + + + verify-style + process-classes + + check + + + + + checkstyle.xml + + ${project.build.sourceDirectory} + true + + + + io.github.zlika + reproducible-build-maven-plugin + ${zlika.reproducible.build.maven.plugin.version} + + + + package + + strip-jar + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + + + + diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml new file mode 100644 index 0000000000..cb85d612f9 --- /dev/null +++ b/protocol-api/pom.xml @@ -0,0 +1,65 @@ + + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + protocol-api + Protocol API + + + + net.runelite + runelite-api + ${project.version} + + + org.slf4j + slf4j-api + + + com.google.guava + guava + + + org.projectlombok + lombok + provided + + + + junit + junit + 4.12 + test + + + diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java new file mode 100644 index 0000000000..a81812813b --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.handshake; + +public abstract class HandshakePacket +{ + +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java new file mode 100644 index 0000000000..5164e042d3 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.handshake; + +import lombok.Data; +import net.runelite.protocol.api.login.HandshakeResponseType; + +@Data +public class HandshakeResponsePacket +{ + private HandshakeResponseType response; +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java new file mode 100644 index 0000000000..6da6ac01f9 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.handshake; + +public enum HandshakeType +{ + LOGIN(14), + UPDATE(15); + + private final byte value; + + HandshakeType(int value) + { + this.value = (byte) value; + } + + public byte getValue() + { + return value; + } + + public static HandshakeType of(byte value) + { + for (HandshakeType type : values()) + { + if (type.value == value) + { + return type; + } + } + return null; + } +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java new file mode 100644 index 0000000000..16ccb85694 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.handshake; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class LoginHandshakePacket extends HandshakePacket +{ + +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java new file mode 100644 index 0000000000..86b39d41e8 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.handshake; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class UpdateHandshakePacket extends HandshakePacket +{ + private int revision; +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java b/protocol-api/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java new file mode 100644 index 0000000000..8ba9816c96 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.login; + +public enum HandshakeResponseType +{ + RESPONSE_OK(0), + LOGGED_IN(2), + INVALID_USERNAME_OR_PASSWORD(3), + ACCOUNT_DISABLED(4), + ACCOUNT_ONLINE(5), + RESPONSE_OUTDATED(6), + WORLD_FULL(7), + SERVER_OFFLINE(8), + LIMITED_EXCEEDED(9), + BAD_SESSION_ID(10), + ACCOUNT_HIJACK(11), + MEMBERS_WORLD(12), + COULD_NOT_COMPLETE_LOGIN(13), + SERVER_BEING_UPDATED(14), + TOO_MANY_ATTEMPTS(16), + MEMBERS_ONLY_AREA(17), + ACCOUNT_LOCKED(18), + CLOSED_BETA(19), + INVALID_LOGINSERVER(20), + PROFILE_TRANSFER(21), + MALFORMED_PACKET(22), + NO_REPLY_FROM_LOGINSERVER(23), + ERR_LOADING_PROFILE(24), + UNEXPECTED_LOGINSERVER_RESPONSE(25), + IP_BANNED(26), + SERVICE_UNAVAILABLE(27), + NO_DISPLAY_NAME(31), + BILLING_ERROR(32), + ACCOUNT_INACCESSABLE(37), + VOTE_TO_PLAY(38), + NOT_ELIGIBLE(55), + NEED_AUTHENTICATOR(56), + AUTHENTICATOR_CODE_WRONG(57); + + private final byte value; + + HandshakeResponseType(int value) + { + this.value = (byte) value; + } + + public byte getValue() + { + return value; + } + + public static HandshakeResponseType of(byte value) + { + for (HandshakeResponseType type : values()) + { + if (type.value == value) + { + return type; + } + } + return null; + } +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java b/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java new file mode 100644 index 0000000000..fd545b8745 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.update; + +public class ArchiveRequestPacket +{ + private boolean priority; + private int index; + private int archive; + + @Override + public String toString() + { + return "ArchiveRequestPacket{" + "priority=" + priority + ", index=" + index + ", archive=" + archive + '}'; + } + + public boolean isPriority() + { + return priority; + } + + public void setPriority(boolean priority) + { + this.priority = priority; + } + + public int getIndex() + { + return index; + } + + public void setIndex(int index) + { + this.index = index; + } + + public int getArchive() + { + return archive; + } + + public void setArchive(int archive) + { + this.archive = archive; + } +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java b/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java new file mode 100644 index 0000000000..1a9a0b6178 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.update; + +public class ArchiveResponsePacket +{ + private int index; + private int archive; + private byte[] data; + + @Override + public String toString() + { + return "ArchiveResponsePacket{" + "index=" + index + ", archive=" + archive + ", data=" + data + '}'; + } + + public int getIndex() + { + return index; + } + + public void setIndex(int index) + { + this.index = index; + } + + public int getArchive() + { + return archive; + } + + public void setArchive(int archive) + { + this.archive = archive; + } + + public byte[] getData() + { + return data; + } + + public void setData(byte[] data) + { + this.data = data; + } +} diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java b/protocol-api/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java new file mode 100644 index 0000000000..dbd8ab6eb9 --- /dev/null +++ b/protocol-api/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.api.update; + +import lombok.Data; + +@Data +public class EncryptionPacket +{ + private byte key; +} diff --git a/protocol/pom.xml b/protocol/pom.xml new file mode 100644 index 0000000000..1e03da9e36 --- /dev/null +++ b/protocol/pom.xml @@ -0,0 +1,72 @@ + + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + protocol + Protocol + + + + net.runelite + protocol-api + ${project.version} + + + net.runelite + cache + ${project.version} + + + + com.google.guava + guava + + + io.netty + netty-all + 4.1.0.Final + + + org.projectlombok + lombok + provided + + + + junit + junit + 4.12 + test + + + diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java b/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java new file mode 100644 index 0000000000..b733d77041 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.handshake; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import net.runelite.protocol.api.handshake.HandshakeType; +import net.runelite.protocol.api.handshake.LoginHandshakePacket; +import net.runelite.protocol.api.handshake.UpdateHandshakePacket; + +@Slf4j +public class HandshakeDecoder extends ByteToMessageDecoder +{ + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List out) throws Exception + { + buf.markReaderIndex(); + byte handshakeOpcode = buf.readByte(); + + HandshakeType handshakeType = HandshakeType.of(handshakeOpcode); + if (handshakeType == null) + { + log.warn("Unknown handshake type {} from {}", + handshakeOpcode, ctx.channel().remoteAddress()); + ctx.close(); + return; + } + + switch (handshakeType) + { + case LOGIN: + { + LoginHandshakePacket packet = new LoginHandshakePacket(); + out.add(packet); + break; + } + case UPDATE: + { + if (buf.readableBytes() < 4) + { + buf.resetReaderIndex(); + return; + } + + int revision = buf.readInt(); + UpdateHandshakePacket packet = new UpdateHandshakePacket(revision); + out.add(packet); + break; + } + } + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java b/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java new file mode 100644 index 0000000000..91f2c9f753 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.handshake; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import net.runelite.protocol.api.handshake.HandshakeResponsePacket; +import net.runelite.protocol.api.login.HandshakeResponseType; + +public class HandshakeResponseEncoder extends MessageToByteEncoder +{ + + @Override + protected void encode(ChannelHandlerContext ctx, HandshakeResponsePacket handshakeResponse, ByteBuf out) throws Exception + { + HandshakeResponseType handshakeResponseType = handshakeResponse.getResponse(); + out.writeByte(handshakeResponseType.getValue()); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java b/protocol/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java new file mode 100644 index 0000000000..54189c4ec3 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.handshake; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import net.runelite.protocol.api.handshake.HandshakeType; +import net.runelite.protocol.api.handshake.LoginHandshakePacket; + +public class LoginHandshakeEncoder extends MessageToByteEncoder +{ + @Override + protected void encode(ChannelHandlerContext ctx, LoginHandshakePacket packet, ByteBuf buf) throws Exception + { + buf.writeByte(HandshakeType.LOGIN.getValue()); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java b/protocol/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java new file mode 100644 index 0000000000..cb3dec90ec --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.handshake; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import net.runelite.protocol.api.handshake.HandshakeType; +import net.runelite.protocol.api.handshake.UpdateHandshakePacket; + +public class UpdateHandshakeEncoder extends MessageToByteEncoder +{ + @Override + protected void encode(ChannelHandlerContext ctx, UpdateHandshakePacket packet, ByteBuf buf) throws Exception + { + buf.writeByte(HandshakeType.UPDATE.getValue()); + buf.writeInt(packet.getRevision()); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java b/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java new file mode 100644 index 0000000000..449f8cf3b7 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.decoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; +import net.runelite.protocol.api.update.ArchiveRequestPacket; + +public class ArchiveRequestDecoder extends ByteToMessageDecoder +{ + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception + { + byte opcode = in.getByte(in.readerIndex()); + if (opcode != UpdateOpcodes.ARCHIVE_REQUEST_HIGH + && opcode != UpdateOpcodes.ARCHIVE_REQUEST_LOW) + { + ctx.fireChannelRead(in.retain()); + return; + } + + byte priority = in.readByte(); + int index = in.readByte() & 0xFF; + int archiveId = in.readShort() & 0xFFFF; + + ArchiveRequestPacket archiveRequest = new ArchiveRequestPacket(); + archiveRequest.setPriority(priority == 1); + archiveRequest.setIndex(index); + archiveRequest.setArchive(archiveId); + out.add(archiveRequest); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java b/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java new file mode 100644 index 0000000000..2c12a42264 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.decoders; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; +import net.runelite.cache.fs.jagex.CompressionType; +import net.runelite.protocol.api.update.ArchiveResponsePacket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ArchiveResponseDecoder extends ByteToMessageDecoder +{ + private static final Logger logger = LoggerFactory.getLogger(ArchiveResponseDecoder.class); + + private static final int CHUNK_SIZE = 512; + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception + { + if (in.readableBytes() < 8) + { + return; + } + + ByteBuf copy = in.slice(); + + int index = copy.readUnsignedByte(); + int file = copy.readUnsignedShort(); + // decompress() starts reading here + int compression = copy.readUnsignedByte(); + int compressedFileSize = copy.readInt(); + + assert compression == CompressionType.NONE || + compression == CompressionType.BZ2 || + compression == CompressionType.GZ; + + int size = compressedFileSize + + 5 // 1 byte compresion type, 4 byte compressed size + + (compression != CompressionType.NONE ? 4 : 0); // compression has leading 4 byte decompressed length + + assert size > 0; + + int breaks = calculateBreaks(size); + + // 3 for index/file + if (size + 3 + breaks > in.readableBytes()) + { + logger.trace("Index {} archive {}: Not enough data yet {} > {}", index, file, size + 3 + breaks, in.readableBytes()); + return; + } + + ByteBuf compressedData = Unpooled.buffer(size); + + int totalRead = 3; + in.skipBytes(3); // skip index/file + + for (int i = 0; i < breaks + 1; ++i) + { + int bytesInBlock = CHUNK_SIZE - (totalRead % CHUNK_SIZE); + int bytesToRead = Math.min(bytesInBlock, size - compressedData.writerIndex()); + + logger.trace("{}/{}: reading block {}/{}, read so far this block: {}, file status: {}/{}", + index, file, + (totalRead % CHUNK_SIZE), CHUNK_SIZE, + bytesInBlock, + compressedData.writerIndex(), size); + + ByteBuf chunk = in.readBytes(bytesToRead); + compressedData.writeBytes(chunk); + chunk.release(); + + totalRead += bytesToRead; + + if (i < breaks) + { + assert compressedData.writerIndex() < size; + int b = in.readUnsignedByte(); + ++totalRead; + assert b == 0xff; + } + } + + assert compressedData.writerIndex() == size; + + logger.trace("{}/{}: done downloading file, remaining buffer {}", + index, file, + in.readableBytes()); + + ArchiveResponsePacket archiveResponse = new ArchiveResponsePacket(); + archiveResponse.setIndex(index); + archiveResponse.setArchive(file); + archiveResponse.setData(compressedData.array()); + out.add(archiveResponse); + + compressedData.release(); + } + + /** + * Calculate how many breaks there are in the file stream. There are + * calculateBreaks()+1 total chunks in the file stream + * + * File contents are sent in 512 byte chunks, with the first byte of + * each chunk except for the first one being 0xff. + * + * The first chunk has an 8 byte header (index, file, compression, + * compressed size). So, the first chunk can contain 512 - 8 bytes of + * the file, and each chunk after 511 bytes. + * + * The 'size' parameter has the compression type and size included in + * it, since they haven't been read yet by the buffer stream, as + * decompress() reads it, so we use 512 - 3 (because 8-5) = 3 + */ + private static int calculateBreaks(int size) + { + int initialSize = CHUNK_SIZE - 3; + if (size <= initialSize) + { + return 0; // First in the initial chunk, no breaks + } + int left = size - initialSize; + + if (left % (CHUNK_SIZE - 1) == 0) + { + return (left / (CHUNK_SIZE - 1)); + } + else + { + // / 511 because 511 bytes of the file per chunk. + // + 1 if there is some left over, it still needs its + // own chunk + return (left / (CHUNK_SIZE - 1)) + 1; + } + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java b/protocol/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java new file mode 100644 index 0000000000..2f13f5559c --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.decoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; +import net.runelite.protocol.api.update.EncryptionPacket; + +public class EncryptionDecoder extends ByteToMessageDecoder +{ + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception + { + if (in.getByte(in.readerIndex()) != UpdateOpcodes.ENCRYPTION) + { + ctx.fireChannelRead(in.retain()); + return; + } + + in.readByte(); + byte xorKey = in.readByte(); + in.readShort(); // always 0 + + EncryptionPacket encryptionPacket = new EncryptionPacket(); + encryptionPacket.setKey(xorKey); + out.add(encryptionPacket); + } +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java b/protocol/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java new file mode 100644 index 0000000000..bcadbb6a7a --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.decoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; +import net.runelite.protocol.api.handshake.HandshakeResponsePacket; +import net.runelite.protocol.api.login.HandshakeResponseType; + +public class HandshakeResponseDecoder extends ByteToMessageDecoder +{ + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception + { + byte response = in.readByte(); + + HandshakeResponsePacket handshakeResponse = new HandshakeResponsePacket(); + handshakeResponse.setResponse(HandshakeResponseType.of(response)); + out.add(handshakeResponse); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java b/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java new file mode 100644 index 0000000000..d21ec96978 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.decoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; + +public class LoggedInDecoder extends ByteToMessageDecoder +{ + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List list) throws Exception + { + if (in.getByte(in.readerIndex()) != UpdateOpcodes.CLIENT_LOGGED_IN) + { + ctx.fireChannelRead(in.retain()); + return; + } + + in.skipBytes(4); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java b/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java new file mode 100644 index 0000000000..4fb1ced6df --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.decoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; + +public class LoggedOutDecoder extends ByteToMessageDecoder +{ + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List list) throws Exception + { + if (in.getByte(in.readerIndex()) != UpdateOpcodes.CLIENT_LOGGED_OUT) + { + ctx.fireChannelRead(in.retain()); + return; + } + + in.skipBytes(4); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java b/protocol/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java new file mode 100644 index 0000000000..46df56aa0d --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.decoders; + +public class UpdateOpcodes +{ + public static final int ARCHIVE_REQUEST_LOW = 0; + public static final int ARCHIVE_REQUEST_HIGH = 1; + public static final int CLIENT_LOGGED_IN = 2; + public static final int CLIENT_LOGGED_OUT = 3; + public static final int ENCRYPTION = 4; +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java b/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java new file mode 100644 index 0000000000..13ae829ccd --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.encoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import net.runelite.protocol.api.update.ArchiveRequestPacket; + +public class ArchiveRequestEncoder extends MessageToByteEncoder +{ + @Override + protected void encode(ChannelHandlerContext ctx, ArchiveRequestPacket archiveRequest, ByteBuf out) throws Exception + { + out.writeByte(archiveRequest.isPriority() ? 1 : 0); + out.writeByte(archiveRequest.getIndex()); + out.writeShort(archiveRequest.getArchive()); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java b/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java new file mode 100644 index 0000000000..06eb258115 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.encoders; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import net.runelite.protocol.api.update.ArchiveResponsePacket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ArchiveResponseEncoder extends MessageToByteEncoder +{ + private static final Logger logger = LoggerFactory.getLogger(ArchiveResponseEncoder.class); + + private static final int CHUNK_SIZE = 512; + + @Override + protected void encode(ChannelHandlerContext ctx, ArchiveResponsePacket archiveResponse, ByteBuf out) throws Exception + { + // archive file header + // 1 byte index + // 2 byte archive + out.writeByte(archiveResponse.getIndex()); + out.writeShort(archiveResponse.getArchive()); + + int pos = out.readableBytes(); + + // next is the compressed data which starts with compression + // type and length + ByteBuf file = Unpooled.wrappedBuffer(archiveResponse.getData()); + // - 3 for the header + int chunkSize = Math.min(file.readableBytes(), CHUNK_SIZE - 3); + + writeChunk(file.readBytes(chunkSize), out); + + while (file.isReadable()) + { + out.writeByte(0xff); + + chunkSize = Math.min(file.readableBytes(), CHUNK_SIZE - 1); + writeChunk(file.readBytes(chunkSize), out); + } + + int size = out.readableBytes() - pos; + logger.debug("Wrote index {} archive {} (size {}) in {} bytes", + archiveResponse.getIndex(), archiveResponse.getArchive(), + archiveResponse.getData().length, size); + } + + private void writeChunk(ByteBuf chunk, ByteBuf out) + { + try + { + out.writeBytes(chunk); + } + finally + { + chunk.release(); + } + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java b/protocol/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java new file mode 100644 index 0000000000..8b686358fa --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.encoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import net.runelite.protocol.api.update.EncryptionPacket; +import net.runelite.protocol.update.decoders.UpdateOpcodes; + +public class EncryptionEncoder extends MessageToByteEncoder +{ + + @Override + protected void encode(ChannelHandlerContext ctx, EncryptionPacket encryptionPacket, ByteBuf out) throws Exception + { + out.writeByte(UpdateOpcodes.ENCRYPTION); + out.writeByte(encryptionPacket.getKey()); + out.writeShort(0); + } + +} diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java b/protocol/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java new file mode 100644 index 0000000000..0d86f99f47 --- /dev/null +++ b/protocol/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.encoders; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +public class XorEncoder extends MessageToByteEncoder +{ + private byte key; + + public byte getKey() + { + return key; + } + + public void setKey(byte key) + { + this.key = key; + } + + @Override + protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception + { + if (key == 0) + { + out.writeBytes(msg); + return; + } + + while (msg.isReadable()) + { + out.writeByte(msg.readByte() ^ key); + } + } + +} diff --git a/protocol/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java b/protocol/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java new file mode 100644 index 0000000000..8cf508c834 --- /dev/null +++ b/protocol/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.encoders; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import net.runelite.cache.fs.Container; +import net.runelite.cache.fs.jagex.CompressionType; +import net.runelite.protocol.update.decoders.ArchiveResponseDecoder; +import net.runelite.protocol.api.update.ArchiveResponsePacket; +import org.junit.Assert; +import org.junit.Test; + +public class ArchiveResponseEncoderTest +{ + @Test + public void testEncode() throws Exception + { + byte[] data = new byte[1000]; + Random random = new Random(42L); + random.nextBytes(data); + + Container container = new Container(CompressionType.NONE, -1); + container.compress(data, null); + byte[] compressedData = container.data; + + ArchiveResponsePacket archiveResponse = new ArchiveResponsePacket(); + archiveResponse.setIndex(0); + archiveResponse.setArchive(1); + archiveResponse.setData(compressedData); + + ByteBuf buf = Unpooled.buffer(1024); + ArchiveResponseEncoder encoder = new ArchiveResponseEncoder(); + encoder.encode(null, archiveResponse, buf); + + ArchiveResponseDecoder decoder = new ArchiveResponseDecoder(); + List out = new ArrayList<>(); + decoder.decode(null, buf, out); + + Assert.assertEquals(1, out.size()); + ArchiveResponsePacket response = (ArchiveResponsePacket) out.get(0); + + Assert.assertEquals(archiveResponse.getIndex(), response.getIndex()); + Assert.assertEquals(archiveResponse.getArchive(), response.getArchive()); + Assert.assertArrayEquals(archiveResponse.getData(), response.getData()); + + byte[] decompressedData = Container.decompress(response.getData(), null).data; + Assert.assertArrayEquals(data, decompressedData); + } + +} diff --git a/protocol/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java b/protocol/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java new file mode 100644 index 0000000000..0b22ed87d8 --- /dev/null +++ b/protocol/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.protocol.update.encoders; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.junit.Assert; +import org.junit.Test; + +public class XorEncoderTest +{ + @Test + public void testEncode() throws Exception + { + ByteBuf buf = Unpooled.buffer(1); + buf.markWriterIndex(); + buf.writeByte(0xff); + + XorEncoder encoder = new XorEncoder(); + encoder.setKey((byte) 0x1); + + ByteBuf out = Unpooled.buffer(1); + encoder.encode(null, buf, out); + + byte encoded = out.readByte(); + Assert.assertEquals((Byte) (byte) 0xfe, (Byte) encoded); + } + +} diff --git a/rs-client/pom.xml b/rs-client/pom.xml deleted file mode 100644 index 15e789c898..0000000000 --- a/rs-client/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - - - com.runeswag - runeswag-parent - 1.0-SNAPSHOT - - - rs-client - RuneScape Client - - - - com.runeswag - api - 1.0-SNAPSHOT - - - - junit - junit - 4.12 - test - - - org.slf4j - slf4j-api - 1.7.12 - test - - - org.slf4j - slf4j-simple - 1.7.12 - test - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - - true - - - - org.apache.maven.plugins - maven-compiler-plugin - - - -parameters - - - - - - \ No newline at end of file diff --git a/rs-client/src/main/java/NetSocket.java b/rs-client/src/main/java/NetSocket.java deleted file mode 100644 index 14900a4d47..0000000000 --- a/rs-client/src/main/java/NetSocket.java +++ /dev/null @@ -1,544 +0,0 @@ -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import net.runelite.mapping.Export; -import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("fb") -@Implements("NetSocket") -public final class NetSocket extends AbstractSocket implements Runnable { - @ObfuscatedName("bm") - @ObfuscatedSignature( - signature = "Llq;" - ) - @Export("__fb_bm") - static IndexedSprite __fb_bm; - @ObfuscatedName("m") - @Export("inputStream") - InputStream inputStream; - @ObfuscatedName("f") - @Export("outputStream") - OutputStream outputStream; - @ObfuscatedName("q") - @Export("socket") - Socket socket; - @ObfuscatedName("w") - @Export("isClosed") - boolean isClosed; - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Lfz;" - ) - @Export("taskHandler") - TaskHandler taskHandler; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lfm;" - ) - @Export("task") - Task task; - @ObfuscatedName("g") - @Export("array") - byte[] array; - @ObfuscatedName("l") - @ObfuscatedGetter( - intValue = -738185459 - ) - @Export("__l") - int __l; - @ObfuscatedName("e") - @ObfuscatedGetter( - intValue = 2057244853 - ) - @Export("__e") - int __e; - @ObfuscatedName("x") - @Export("exceptionWriting") - boolean exceptionWriting; - @ObfuscatedName("d") - @ObfuscatedGetter( - intValue = -1644762957 - ) - @Export("__d") - final int __d; - @ObfuscatedName("k") - @ObfuscatedGetter( - intValue = -782964015 - ) - @Export("__k") - final int __k; - - @ObfuscatedSignature( - signature = "(Ljava/net/Socket;Lfz;I)V" - ) - public NetSocket(Socket var1, TaskHandler var2, int var3) throws IOException { - this.isClosed = false; - this.__l = 0; - this.__e = 0; - this.exceptionWriting = false; - this.taskHandler = var2; - this.socket = var1; - this.__d = var3; - this.__k = var3 - 100; - this.socket.setSoTimeout(30000); - this.socket.setTcpNoDelay(true); - this.socket.setReceiveBufferSize(65536); - this.socket.setSendBufferSize(65536); - this.inputStream = this.socket.getInputStream(); - this.outputStream = this.socket.getOutputStream(); - } - - @ObfuscatedName("f") - @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "1765046516" - ) - public boolean isAvailable(int var1) throws IOException { - return this.isClosed?false:this.inputStream.available() >= var1; - } - - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1078471130" - ) - public int available() throws IOException { - return this.isClosed?0:this.inputStream.available(); - } - - @ObfuscatedName("w") - @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "516705222" - ) - public int readUnsignedByte() throws IOException { - return this.isClosed?0:this.inputStream.read(); - } - - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "([BIII)I", - garbageValue = "-1089665746" - ) - public int read(byte[] var1, int var2, int var3) throws IOException { - if(this.isClosed) { - return 0; - } else { - int var4; - int var5; - for(var4 = var3; var3 > 0; var3 -= var5) { - var5 = this.inputStream.read(var1, var2, var3); - if(var5 <= 0) { - throw new EOFException(); - } - - var2 += var5; - } - - return var4; - } - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "-86" - ) - public void write(byte[] var1, int var2, int var3) throws IOException { - this.write0(var1, var2, var3); - } - - @ObfuscatedName("g") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1252618448" - ) - public void close() { - if(!this.isClosed) { - synchronized(this) { - this.isClosed = true; - this.notifyAll(); - } - - if(this.task != null) { - while(this.task.status == 0) { - class203.method4010(1L); - } - - if(this.task.status == 1) { - try { - ((Thread)this.task.result).join(); - } catch (InterruptedException var3) { - ; - } - } - } - - this.task = null; - } - } - - @ObfuscatedName("ay") - @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "-77" - ) - @Export("write0") - void write0(byte[] var1, int var2, int var3) throws IOException { - if(!this.isClosed) { - if(this.exceptionWriting) { - this.exceptionWriting = false; - throw new IOException(); - } else { - if(this.array == null) { - this.array = new byte[this.__d]; - } - - synchronized(this) { - for(int var5 = 0; var5 < var3; ++var5) { - this.array[this.__e] = var1[var5 + var2]; - this.__e = (this.__e + 1) % this.__d; - if((this.__k + this.__l) % this.__d == this.__e) { - throw new IOException(); - } - } - - if(this.task == null) { - this.task = this.taskHandler.newThreadTask(this, 3); - } - - this.notifyAll(); - } - } - } - } - - @Export("run") - @ObfuscatedName("run") - public void run() { - try { - while(true) { - label84: { - int var1; - int var2; - synchronized(this) { - if(this.__e == this.__l) { - if(this.isClosed) { - break label84; - } - - try { - this.wait(); - } catch (InterruptedException var10) { - ; - } - } - - var2 = this.__l; - if(this.__e >= this.__l) { - var1 = this.__e - this.__l; - } else { - var1 = this.__d - this.__l; - } - } - - if(var1 <= 0) { - continue; - } - - try { - this.outputStream.write(this.array, var2, var1); - } catch (IOException var9) { - this.exceptionWriting = true; - } - - this.__l = (var1 + this.__l) % this.__d; - - try { - if(this.__e == this.__l) { - this.outputStream.flush(); - } - } catch (IOException var8) { - this.exceptionWriting = true; - } - continue; - } - - try { - if(this.inputStream != null) { - this.inputStream.close(); - } - - if(this.outputStream != null) { - this.outputStream.close(); - } - - if(this.socket != null) { - this.socket.close(); - } - } catch (IOException var7) { - ; - } - - this.array = null; - break; - } - } catch (Exception var12) { - NpcDefinition.sendStackTrace((String)null, var12); - } - - } - - @Export("finalize") - @ObfuscatedName("finalize") - protected void finalize() { - this.close(); - } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(IIILfe;Lfy;Z[I[IB)I", - garbageValue = "-98" - ) - public static int method3571(int var0, int var1, int var2, class179 var3, CollisionMap var4, boolean var5, int[] var6, int[] var7) { - int var9; - for(int var8 = 0; var8 < 128; ++var8) { - for(var9 = 0; var9 < 128; ++var9) { - class178.__fi_q[var8][var9] = 0; - class178.__fi_w[var8][var9] = 99999999; - } - } - - int var10; - int var11; - byte var13; - int var14; - int var15; - int var17; - int var19; - int var20; - int var21; - boolean var28; - int var30; - int var31; - int var33; - if(var2 == 1) { - var10 = var0; - var11 = var1; - byte var12 = 64; - var13 = 64; - var14 = var0 - var12; - var15 = var1 - var13; - class178.__fi_q[var12][var13] = 99; - class178.__fi_w[var12][var13] = 0; - byte var16 = 0; - var17 = 0; - class178.__fi_l[var16] = var0; - var33 = var16 + 1; - class178.__fi_e[var16] = var1; - int[][] var18 = var4.flags; - - boolean var29; - while(true) { - if(var33 == var17) { - WidgetGroupParent.__bx_o = var10; - UrlRequester.__eo_u = var11; - var29 = false; - break; - } - - var10 = class178.__fi_l[var17]; - var11 = class178.__fi_e[var17]; - var17 = var17 + 1 & 4095; - var30 = var10 - var14; - var31 = var11 - var15; - var19 = var10 - var4.xInset; - var20 = var11 - var4.yInset; - if(var3.vmethod3644(1, var10, var11, var4)) { - WidgetGroupParent.__bx_o = var10; - UrlRequester.__eo_u = var11; - var29 = true; - break; - } - - var21 = class178.__fi_w[var30][var31] + 1; - if(var30 > 0 && class178.__fi_q[var30 - 1][var31] == 0 && (var18[var19 - 1][var20] & 19136776) == 0) { - class178.__fi_l[var33] = var10 - 1; - class178.__fi_e[var33] = var11; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30 - 1][var31] = 2; - class178.__fi_w[var30 - 1][var31] = var21; - } - - if(var30 < 127 && class178.__fi_q[var30 + 1][var31] == 0 && (var18[var19 + 1][var20] & 19136896) == 0) { - class178.__fi_l[var33] = var10 + 1; - class178.__fi_e[var33] = var11; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30 + 1][var31] = 8; - class178.__fi_w[var30 + 1][var31] = var21; - } - - if(var31 > 0 && class178.__fi_q[var30][var31 - 1] == 0 && (var18[var19][var20 - 1] & 19136770) == 0) { - class178.__fi_l[var33] = var10; - class178.__fi_e[var33] = var11 - 1; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30][var31 - 1] = 1; - class178.__fi_w[var30][var31 - 1] = var21; - } - - if(var31 < 127 && class178.__fi_q[var30][var31 + 1] == 0 && (var18[var19][var20 + 1] & 19136800) == 0) { - class178.__fi_l[var33] = var10; - class178.__fi_e[var33] = var11 + 1; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30][var31 + 1] = 4; - class178.__fi_w[var30][var31 + 1] = var21; - } - - if(var30 > 0 && var31 > 0 && class178.__fi_q[var30 - 1][var31 - 1] == 0 && (var18[var19 - 1][var20 - 1] & 19136782) == 0 && (var18[var19 - 1][var20] & 19136776) == 0 && (var18[var19][var20 - 1] & 19136770) == 0) { - class178.__fi_l[var33] = var10 - 1; - class178.__fi_e[var33] = var11 - 1; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30 - 1][var31 - 1] = 3; - class178.__fi_w[var30 - 1][var31 - 1] = var21; - } - - if(var30 < 127 && var31 > 0 && class178.__fi_q[var30 + 1][var31 - 1] == 0 && (var18[var19 + 1][var20 - 1] & 19136899) == 0 && (var18[var19 + 1][var20] & 19136896) == 0 && (var18[var19][var20 - 1] & 19136770) == 0) { - class178.__fi_l[var33] = var10 + 1; - class178.__fi_e[var33] = var11 - 1; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30 + 1][var31 - 1] = 9; - class178.__fi_w[var30 + 1][var31 - 1] = var21; - } - - if(var30 > 0 && var31 < 127 && class178.__fi_q[var30 - 1][var31 + 1] == 0 && (var18[var19 - 1][var20 + 1] & 19136824) == 0 && (var18[var19 - 1][var20] & 19136776) == 0 && (var18[var19][var20 + 1] & 19136800) == 0) { - class178.__fi_l[var33] = var10 - 1; - class178.__fi_e[var33] = var11 + 1; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30 - 1][var31 + 1] = 6; - class178.__fi_w[var30 - 1][var31 + 1] = var21; - } - - if(var30 < 127 && var31 < 127 && class178.__fi_q[var30 + 1][var31 + 1] == 0 && (var18[var19 + 1][var20 + 1] & 19136992) == 0 && (var18[var19 + 1][var20] & 19136896) == 0 && (var18[var19][var20 + 1] & 19136800) == 0) { - class178.__fi_l[var33] = var10 + 1; - class178.__fi_e[var33] = var11 + 1; - var33 = var33 + 1 & 4095; - class178.__fi_q[var30 + 1][var31 + 1] = 12; - class178.__fi_w[var30 + 1][var31 + 1] = var21; - } - } - - var28 = var29; - } else if(var2 == 2) { - var28 = WorldMapSection2.method593(var0, var1, var3, var4); - } else { - var28 = IndexStore.method3585(var0, var1, var2, var3, var4); - } - - var9 = var0 - 64; - var10 = var1 - 64; - var11 = WidgetGroupParent.__bx_o; - var30 = UrlRequester.__eo_u; - if(!var28) { - var31 = Integer.MAX_VALUE; - var14 = Integer.MAX_VALUE; - byte var32 = 10; - var33 = var3.field2120; - var17 = var3.field2121; - int var27 = var3.field2122; - var19 = var3.field2123; - - for(var20 = var33 - var32; var20 <= var32 + var33; ++var20) { - for(var21 = var17 - var32; var21 <= var17 + var32; ++var21) { - int var22 = var20 - var9; - int var23 = var21 - var10; - if(var22 >= 0 && var23 >= 0 && var22 < 128 && var23 < 128 && class178.__fi_w[var22][var23] < 100) { - int var24 = 0; - if(var20 < var33) { - var24 = var33 - var20; - } else if(var20 > var27 + var33 - 1) { - var24 = var20 - (var27 + var33 - 1); - } - - int var25 = 0; - if(var21 < var17) { - var25 = var17 - var21; - } else if(var21 > var19 + var17 - 1) { - var25 = var21 - (var19 + var17 - 1); - } - - int var26 = var25 * var25 + var24 * var24; - if(var26 < var31 || var26 == var31 && class178.__fi_w[var22][var23] < var14) { - var31 = var26; - var14 = class178.__fi_w[var22][var23]; - var11 = var20; - var30 = var21; - } - } - } - } - - if(var31 == Integer.MAX_VALUE) { - return -1; - } - } - - if(var0 == var11 && var30 == var1) { - return 0; - } else { - var13 = 0; - class178.__fi_l[var13] = var11; - var31 = var13 + 1; - class178.__fi_e[var13] = var30; - - for(var14 = var15 = class178.__fi_q[var11 - var9][var30 - var10]; var0 != var11 || var30 != var1; var14 = class178.__fi_q[var11 - var9][var30 - var10]) { - if(var14 != var15) { - var15 = var14; - class178.__fi_l[var31] = var11; - class178.__fi_e[var31++] = var30; - } - - if((var14 & 2) != 0) { - ++var11; - } else if((var14 & 8) != 0) { - --var11; - } - - if((var14 & 1) != 0) { - ++var30; - } else if((var14 & 4) != 0) { - --var30; - } - } - - var33 = 0; - - while(var31-- > 0) { - var6[var33] = class178.__fi_l[var31]; - var7[var33++] = class178.__fi_e[var31]; - if(var33 >= var6.length) { - break; - } - } - - return var33; - } - } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(Lir;Lir;Lir;Lhm;I)Z", - garbageValue = "-590103687" - ) - public static boolean method3537(AbstractIndexCache var0, AbstractIndexCache var1, AbstractIndexCache var2, MidiPcmStream var3) { - class1.__f_m = var0; - class214.__hf_f = var1; - class214.__hf_q = var2; - class214.midiPcmStream = var3; - return true; - } -} diff --git a/rs-client/src/main/java/ScriptEvent.java b/rs-client/src/main/java/ScriptEvent.java deleted file mode 100644 index 664404b3ce..0000000000 --- a/rs-client/src/main/java/ScriptEvent.java +++ /dev/null @@ -1,355 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("by") -@Implements("ScriptEvent") -public class ScriptEvent extends Node { - @ObfuscatedName("fv") - @ObfuscatedSignature( - signature = "Lkk;" - ) - @Export("fontPlain11") - static Font fontPlain11; - @ObfuscatedName("hb") - @ObfuscatedGetter( - intValue = -1218466245 - ) - @Export("oculusOrbFocalPointY") - static int oculusOrbFocalPointY; - @ObfuscatedName("m") - @Export("args0") - Object[] args0; - @ObfuscatedName("f") - @Export("boolean1") - boolean boolean1; - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "Lho;" - ) - @Export("widget") - Widget widget; - @ObfuscatedName("w") - @ObfuscatedGetter( - intValue = 488198377 - ) - @Export("mouseX") - int mouseX; - @ObfuscatedName("o") - @ObfuscatedGetter( - intValue = 95719815 - ) - @Export("mouseY") - int mouseY; - @ObfuscatedName("u") - @ObfuscatedGetter( - intValue = -1089993721 - ) - @Export("opIndex") - int opIndex; - @ObfuscatedName("g") - @ObfuscatedSignature( - signature = "Lho;" - ) - @Export("dragTarget") - Widget dragTarget; - @ObfuscatedName("l") - @ObfuscatedGetter( - intValue = -1330602393 - ) - @Export("keyTyped") - int keyTyped; - @ObfuscatedName("e") - @ObfuscatedGetter( - intValue = 327085889 - ) - @Export("keyPressed") - int keyPressed; - @ObfuscatedName("x") - @Export("targetName") - String targetName; - @ObfuscatedName("d") - @ObfuscatedGetter( - intValue = -2138736593 - ) - @Export("__d") - int __d; - @ObfuscatedName("k") - @ObfuscatedGetter( - intValue = -161292529 - ) - @Export("type0") - int type0; - - public ScriptEvent() { - this.type0 = 76; - } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "([Ljava/lang/Object;I)V", - garbageValue = "723852511" - ) - @Export("setArgs") - public void setArgs(Object[] var1) { - this.args0 = var1; - } - - @ObfuscatedName("f") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "-110" - ) - @Export("setType") - public void setType(int var1) { - this.type0 = var1; - } - - @ObfuscatedName("j") - @ObfuscatedSignature( - signature = "(ILcg;ZB)I", - garbageValue = "0" - ) - static int method1185(int var0, Script var1, boolean var2) { - Widget var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; - if(var0 == 1600) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollX; - return 1; - } else if(var0 == 1601) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollY; - return 1; - } else if(var0 == 1602) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.text; - return 1; - } else if(var0 == 1603) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollWidth; - return 1; - } else if(var0 == 1604) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollHeight; - return 1; - } else if(var0 == 1605) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelZoom; - return 1; - } else if(var0 == 1606) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelAngleX; - return 1; - } else if(var0 == 1607) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelAngleZ; - return 1; - } else if(var0 == 1608) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelAngleY; - return 1; - } else if(var0 == 1609) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.transparency; - return 1; - } else if(var0 == 1610) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.__af; - return 1; - } else if(var0 == 1611) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.color; - return 1; - } else if(var0 == 1612) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.color2; - return 1; - } else if(var0 == 1613) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.rectangleMode.rsOrdinal(); - return 1; - } else if(var0 == 1614) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.__bv?1:0; - return 1; - } else { - return 2; - } - } - - @ObfuscatedName("aq") - @ObfuscatedSignature( - signature = "(ILcg;ZI)I", - garbageValue = "1256509027" - ) - static int method1187(int var0, Script var1, boolean var2) { - if(var0 == 3300) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.cycle; - return 1; - } else { - int var3; - int var4; - if(var0 == 3301) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class83.method2027(var3, var4); - return 1; - } else if(var0 == 3302) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapLabel.method442(var3, var4); - return 1; - } else if(var0 == 3303) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class1.method18(var3, var4); - return 1; - } else if(var0 == 3304) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class231.method4523(var3).size; - return 1; - } else if(var0 == 3305) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.currentLevels[var3]; - return 1; - } else if(var0 == 3306) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.levels[var3]; - return 1; - } else if(var0 == 3307) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.experience[var3]; - return 1; - } else { - int var5; - if(var0 == 3308) { - var3 = SoundSystem.plane; - var4 = (Canvas.localPlayer.x >> 7) + class50.baseX; - var5 = (Canvas.localPlayer.y >> 7) + GraphicsObject.baseY; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (var4 << 14) + var5 + (var3 << 28); - return 1; - } else if(var0 == 3309) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 >> 14 & 16383; - return 1; - } else if(var0 == 3310) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 >> 28; - return 1; - } else if(var0 == 3311) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 & 16383; - return 1; - } else if(var0 == 3312) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.isMembersWorld?1:0; - return 1; - } else if(var0 == 3313) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] + 32768; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class83.method2027(var3, var4); - return 1; - } else if(var0 == 3314) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] + 32768; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapLabel.method442(var3, var4); - return 1; - } else if(var0 == 3315) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] + 32768; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class1.method18(var3, var4); - return 1; - } else if(var0 == 3316) { - if(Client.rights >= 2) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.rights; - } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if(var0 == 3317) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.rebootTimer; - return 1; - } else if(var0 == 3318) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.worldId; - return 1; - } else if(var0 == 3321) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.runEnergy; - return 1; - } else if(var0 == 3322) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.weight; - return 1; - } else if(var0 == 3323) { - if(Client.__client_mn) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; - } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if(var0 == 3324) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.worldProperties; - return 1; - } else if(var0 == 3325) { - class179.Interpreter_intStackSize -= 4; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - int var6 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3]; - var3 += var4 << 14; - var3 += var5 << 28; - var3 += var6; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3; - return 1; - } else { - return 2; - } - } - } - } - - @ObfuscatedName("ep") - @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "-52" - ) - static void method1183(int var0, int var1) { - int[] var2 = new int[9]; - - for(int var3 = 0; var3 < var2.length; ++var3) { - int var4 = var3 * 32 + 15 + 128; - int var5 = var4 * 3 + 600; - int var7 = Rasterizer3D.Rasterizer3D_sine[var4]; - int var6 = method1176(var5, var1); - var2[var3] = var6 * var7 >> 16; - } - - Scene.Scene_buildVisiblityMap(var2, 500, 800, var0 * 334 / var1, 334); - } - - @ObfuscatedName("gj") - @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "-914543563" - ) - static int method1176(int var0, int var1) { - int var2 = var1 - 334; - if(var2 < 0) { - var2 = 0; - } else if(var2 > 100) { - var2 = 100; - } - - int var3 = (Client.__client_rb - Client.__client_re) * var2 / 100 + Client.__client_re; - return var0 * var3 / 256; - } - - @ObfuscatedName("hf") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "35" - ) - static final void method1179() { - for(class68 var0 = (class68)Client.__client_kh.last(); var0 != null; var0 = (class68)Client.__client_kh.previous()) { - if(var0.field910 == -1) { - var0.field909 = 0; - class13.method165(var0); - } else { - var0.remove(); - } - } - - } -} diff --git a/rs-client/src/main/java/class178.java b/rs-client/src/main/java/class178.java deleted file mode 100644 index 39a0c68d25..0000000000 --- a/rs-client/src/main/java/class178.java +++ /dev/null @@ -1,25 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedName; - -@ObfuscatedName("fi") -public class class178 { - @ObfuscatedName("q") - @Export("__fi_q") - static int[][] __fi_q; - @ObfuscatedName("w") - @Export("__fi_w") - static int[][] __fi_w; - @ObfuscatedName("l") - @Export("__fi_l") - static int[] __fi_l; - @ObfuscatedName("e") - @Export("__fi_e") - static int[] __fi_e; - - static { - __fi_q = new int[128][128]; - __fi_w = new int[128][128]; - __fi_l = new int[4096]; - __fi_e = new int[4096]; - } -} diff --git a/rs-client/src/main/java/class65.java b/rs-client/src/main/java/class65.java deleted file mode 100644 index d42b1a1296..0000000000 --- a/rs-client/src/main/java/class65.java +++ /dev/null @@ -1,238 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("bl") -public class class65 extends class179 { - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lcz;" - ) - @Export("pcmPlayerProvider") - public static PcmPlayerProvider pcmPlayerProvider; - @ObfuscatedName("gf") - @ObfuscatedSignature( - signature = "Lem;" - ) - @Export("scene") - static Scene scene; - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(IIILfy;I)Z", - garbageValue = "-519225044" - ) - protected boolean vmethod3644(int var1, int var2, int var3, CollisionMap var4) { - return var2 == super.field2120 && var3 == super.field2121; - } - - @ObfuscatedName("fi") - @ObfuscatedSignature( - signature = "(Lbz;II)V", - garbageValue = "406386718" - ) - static final void method1232(Actor var0, int var1) { - if(var0.__bw > Client.cycle) { - SpriteIds.method5828(var0); - } else { - int var2; - int var3; - int var4; - int var5; - int var7; - if(var0.__cr >= Client.cycle) { - if(var0.__cr == Client.cycle || var0.sequence == -1 || var0.sequenceDelay != 0 || var0.sequenceFrameCycle + 1 > WorldMapAreaData.getSequenceDefinition(var0.sequence).frameLengths[var0.sequenceFrame]) { - var2 = var0.__cr - var0.__bw; - var3 = Client.cycle - var0.__bw; - var4 = var0.__bf * 128 + var0.size * 64; - var5 = var0.__be * 128 + var0.size * 64; - int var6 = var0.__bh * 128 + var0.size * 64; - var7 = var0.__bv * 128 + var0.size * 64; - var0.x = (var3 * var6 + var4 * (var2 - var3)) / var2; - var0.y = (var3 * var7 + var5 * (var2 - var3)) / var2; - } - - var0.__cq = 0; - var0.orientation = var0.__cv; - var0.__ac = var0.orientation; - } else { - var0.movementSequence = var0.idleSequence; - if(var0.pathLength == 0) { - var0.__cq = 0; - } else { - label310: { - if(var0.sequence != -1 && var0.sequenceDelay == 0) { - SequenceDefinition var11 = WorldMapAreaData.getSequenceDefinition(var0.sequence); - if(var0.__ch > 0 && var11.__j == 0) { - ++var0.__cq; - break label310; - } - - if(var0.__ch <= 0 && var11.__s == 0) { - ++var0.__cq; - break label310; - } - } - - var2 = var0.x; - var3 = var0.y; - var4 = var0.pathX[var0.pathLength - 1] * 128 + var0.size * 64; - var5 = var0.pathY[var0.pathLength - 1] * 128 + var0.size * 64; - if(var2 < var4) { - if(var3 < var5) { - var0.orientation = 1280; - } else if(var3 > var5) { - var0.orientation = 1792; - } else { - var0.orientation = 1536; - } - } else if(var2 > var4) { - if(var3 < var5) { - var0.orientation = 768; - } else if(var3 > var5) { - var0.orientation = 256; - } else { - var0.orientation = 512; - } - } else if(var3 < var5) { - var0.orientation = 1024; - } else if(var3 > var5) { - var0.orientation = 0; - } - - byte var12 = var0.pathTraversed[var0.pathLength - 1]; - if(var4 - var2 <= 256 && var4 - var2 >= -256 && var5 - var3 <= 256 && var5 - var3 >= -256) { - var7 = var0.orientation - var0.__ac & 2047; - if(var7 > 1024) { - var7 -= 2048; - } - - int var8 = var0.walkTurnSequence; - if(var7 >= -256 && var7 <= 256) { - var8 = var0.walkSequence; - } else if(var7 >= 256 && var7 < 768) { - var8 = var0.walkTurnRightSequence; - } else if(var7 >= -768 && var7 <= -256) { - var8 = var0.walkTurnLeftSequence; - } - - if(var8 == -1) { - var8 = var0.walkSequence; - } - - var0.movementSequence = var8; - int var9 = 4; - boolean var10 = true; - if(var0 instanceof Npc) { - var10 = ((Npc)var0).definition.isClickable; - } - - if(var10) { - if(var0.__ac != var0.orientation && var0.targetIndex == -1 && var0.__cj != 0) { - var9 = 2; - } - - if(var0.pathLength > 2) { - var9 = 6; - } - - if(var0.pathLength > 3) { - var9 = 8; - } - - if(var0.__cq > 0 && var0.pathLength > 1) { - var9 = 8; - --var0.__cq; - } - } else { - if(var0.pathLength > 1) { - var9 = 6; - } - - if(var0.pathLength > 2) { - var9 = 8; - } - - if(var0.__cq > 0 && var0.pathLength > 1) { - var9 = 8; - --var0.__cq; - } - } - - if(var12 == 2) { - var9 <<= 1; - } - - if(var9 >= 8 && var0.movementSequence == var0.walkSequence && var0.runSequence != -1) { - var0.movementSequence = var0.runSequence; - } - - if(var2 != var4 || var5 != var3) { - if(var2 < var4) { - var0.x += var9; - if(var0.x > var4) { - var0.x = var4; - } - } else if(var2 > var4) { - var0.x -= var9; - if(var0.x < var4) { - var0.x = var4; - } - } - - if(var3 < var5) { - var0.y += var9; - if(var0.y > var5) { - var0.y = var5; - } - } else if(var3 > var5) { - var0.y -= var9; - if(var0.y < var5) { - var0.y = var5; - } - } - } - - if(var4 == var0.x && var5 == var0.y) { - --var0.pathLength; - if(var0.__ch > 0) { - --var0.__ch; - } - } - } else { - var0.x = var4; - var0.y = var5; - --var0.pathLength; - if(var0.__ch > 0) { - --var0.__ch; - } - } - } - } - } - } - - if(var0.x < 128 || var0.y < 128 || var0.x >= 13184 || var0.y >= 13184) { - var0.sequence = -1; - var0.spotAnimation = -1; - var0.__bw = 0; - var0.__cr = 0; - var0.x = var0.pathX[0] * 128 + var0.size * 64; - var0.y = var0.pathY[0] * 128 + var0.size * 64; - var0.__bb_143(); - } - - if(Canvas.localPlayer == var0 && (var0.x < 1536 || var0.y < 1536 || var0.x >= 11776 || var0.y >= 11776)) { - var0.sequence = -1; - var0.spotAnimation = -1; - var0.__bw = 0; - var0.__cr = 0; - var0.x = var0.pathX[0] * 128 + var0.size * 64; - var0.y = var0.pathY[0] * 128 + var0.size * 64; - var0.__bb_143(); - } - - IndexStoreAction.method4553(var0); - ChatChannel.method2225(var0); - } -} diff --git a/api/pom.xml b/runelite-api/pom.xml similarity index 87% rename from api/pom.xml rename to runelite-api/pom.xml index b8e3669a06..bfcbf4c4a7 100644 --- a/api/pom.xml +++ b/runelite-api/pom.xml @@ -27,37 +27,33 @@ 4.0.0 - com.runeswag - runeswag-parent - 1.0-SNAPSHOT + net.runelite + runelite-parent + 1.5.28-SNAPSHOT - api - RuneSwag API + runelite-api + RuneLite API org.slf4j slf4j-api - 1.7.25 org.projectlombok lombok - 1.18.6 provided com.google.code.findbugs jsr305 - 3.0.2 + 1.3.9 junit junit - 4.12 - test diff --git a/api/src/main/java/api/Actor.java b/runelite-api/src/main/java/net/runelite/api/Actor.java similarity index 96% rename from api/src/main/java/api/Actor.java rename to runelite-api/src/main/java/net/runelite/api/Actor.java index 05ca187ab7..2fa6ceeed8 100644 --- a/api/src/main/java/api/Actor.java +++ b/runelite-api/src/main/java/net/runelite/api/Actor.java @@ -22,15 +22,15 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.image.BufferedImage; import javax.annotation.Nullable; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; /** * Represents a RuneScape actor/entity. @@ -107,7 +107,7 @@ public interface Actor extends Renderable * Gets the orientation of the actor. * * @return the orientation - * @see api.coords.Angle + * @see net.runelite.api.coords.Angle */ int getOrientation(); @@ -208,7 +208,7 @@ public interface Actor extends Renderable * Gets the convex hull of the actors model. * * @return the convex hull - * @see api.model.Jarvis + * @see net.runelite.api.model.Jarvis */ Polygon getConvexHull(); diff --git a/api/src/main/java/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java similarity index 83% rename from api/src/main/java/api/AnimationID.java rename to runelite-api/src/main/java/net/runelite/api/AnimationID.java index 1b215a7cbb..45ce683b6e 100644 --- a/api/src/main/java/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Utility class used for mapping animation IDs. @@ -157,7 +157,7 @@ public final class AnimationID public static final int HOME_MAKE_TABLET = 4067; public static final int THIEVING_STALL = 832; public static final int PICKPOCKET_SUCCESS = 881; - + //block animations for players and perhaps npcs as well? public static final int BLOCK_DEFENDER = 4177; public static final int BLOCK_NO_SHIELD = 420; @@ -166,18 +166,26 @@ public final class AnimationID public static final int BLOCK_UNARMED = 424; // Same Animation as failed pickpocked // NPC animations - public static final int TZTOK_JAD_MAGIC_ATTACK = 2656; public static final int TZTOK_JAD_RANGE_ATTACK = 2652; + public static final int TZTOK_JAD_MELEE_ATTACK = 2655; + public static final int TZTOK_JAD_MAGIC_ATTACK = 2656; + public static final int TOK_XIL_RANGE_ATTACK = 2633; + public static final int TOK_XIL_MELEE_ATTACK = 2628; + public static final int KET_ZEK_MELEE_ATTACK = 2644; + public static final int KET_ZEK_MAGE_ATTACK = 2647; + public static final int MEJ_KOT_MELEE_ATTACK = 2637; + public static final int MEJ_KOT_HEAL_ATTACK = 2639; public static final int HELLHOUND_DEFENCE = 6566; public static final int VORKATH_WAKE_UP = 7950; public static final int VORKATH_DEATH = 7949; public static final int VORKATH_SLASH_ATTACK = 7951; public static final int VORKATH_ATTACK = 7952; - public static final int VORKATH_FIRE_BOMB_ATTACK = 7960; + public static final int VORKATH_FIRE_BOMB_OR_SPAWN_ATTACK = 7960; public static final int VORKATH_ACID_ATTACK = 7957; public static final int BLACKJACK_KO = 838; public static final int VETION_EARTHQUAKE = 5507; public static final int ZULRAH_DEATH = 5804; + public static final int ZULRAH_PHASE = 5072; // Farming public static final int FARMING_HARVEST_FRUIT_TREE = 2280; @@ -251,4 +259,57 @@ public final class AnimationID public static final int HYDRA_RANGED_4 = 8255; public static final int HYDRA_4_1 = 8257; public static final int HYDRA_4_2 = 8258; -} + + // INFERNO animations + public static final int JAL_NIB = 7574; + public static final int JAL_MEJRAH = 7578; + public static final int JAL_AK_RANGE_ATTACK = 7581; + public static final int JAL_AK_MELEE_ATTACK = 7582; + public static final int JAL_AK_MAGIC_ATTACK = 7583; + public static final int JAL_IMKOT = 7597; + public static final int JAL_XIL_MELEE_ATTACK = 7604; + public static final int JAL_XIL_RANGE_ATTACK = 7605; + public static final int JAL_ZEK_MAGE_ATTACK = 7610; + public static final int JAL_ZEK_MELEE_ATTACK = 7612; + public static final int JALTOK_JAD_MELEE_ATTACK = 7590; + public static final int JALTOK_JAD_MAGE_ATTACK = 7592; + public static final int JALTOK_JAD_RANGE_ATTACK = 7593; + public static final int TZKAL_ZUK = 7566; + public static final int JAL_MEJJAK = 2858; + + //General Graardor + public static final int MINION_AUTO1 = 6154; + public static final int MINION_AUTO2 = 6156; + public static final int MINION_AUTO3 = 7071; + public static final int MINION_AUTO4 = 7073; + public static final int GENERAL_AUTO1 = 7018; + public static final int GENERAL_AUTO2 = 7020; + public static final int GENERAL_AUTO3 = 7021; + + //Zammy-poo + public static final int ZAMMY_GENERIC_AUTO = 64; + public static final int KRIL_AUTO = 6948; + public static final int KRIL_SPEC = 6950; + public static final int ZAKL_AUTO = 7077; + public static final int BALFRUG_AUTO = 4630; + + //Sara-Poo + public static final int ZILYANA_MELEE_AUTO = 6964; + public static final int ZILYANA_AUTO = 6967; + public static final int ZILYANA_SPEC = 6970; + public static final int STARLIGHT_AUTO = 6376; + public static final int BREE_AUTO = 7026; + public static final int GROWLER_AUTO = 7037; + + //Arma-Poo + public static final int KREE_RANGED = 6978; + public static final int SKREE_AUTO = 6955; + public static final int GEERIN_AUTO = 6956; + public static final int GEERIN_FLINCH = 6958; + public static final int KILISA_AUTO = 6957; + + //Dag Kings + public static final int DAG_REX = 2853; + public static final int DAG_PRIME = 2854; + public static final int DAG_SUPREME = 2855; +} \ No newline at end of file diff --git a/api/src/main/java/api/BufferProvider.java b/runelite-api/src/main/java/net/runelite/api/BufferProvider.java similarity index 98% rename from api/src/main/java/api/BufferProvider.java rename to runelite-api/src/main/java/net/runelite/api/BufferProvider.java index 3560b6d661..1caf77aa96 100644 --- a/api/src/main/java/api/BufferProvider.java +++ b/runelite-api/src/main/java/net/runelite/api/BufferProvider.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an engine graphic buffer. diff --git a/api/src/main/java/api/ChatLineBuffer.java b/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java similarity index 98% rename from api/src/main/java/api/ChatLineBuffer.java rename to runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java index 6d21d166fc..a1f8a7e056 100644 --- a/api/src/main/java/api/ChatLineBuffer.java +++ b/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java @@ -24,7 +24,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents the buffer containing all messages in the chatbox. diff --git a/api/src/main/java/api/ChatMessageType.java b/runelite-api/src/main/java/net/runelite/api/ChatMessageType.java similarity index 99% rename from api/src/main/java/api/ChatMessageType.java rename to runelite-api/src/main/java/net/runelite/api/ChatMessageType.java index b89756ec03..b4659dfa18 100644 --- a/api/src/main/java/api/ChatMessageType.java +++ b/runelite-api/src/main/java/net/runelite/api/ChatMessageType.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.util.HashMap; import java.util.Map; diff --git a/api/src/main/java/api/ChatPlayer.java b/runelite-api/src/main/java/net/runelite/api/ChatPlayer.java similarity index 98% rename from api/src/main/java/api/ChatPlayer.java rename to runelite-api/src/main/java/net/runelite/api/ChatPlayer.java index 436fa7f951..389a950bcd 100644 --- a/api/src/main/java/api/ChatPlayer.java +++ b/runelite-api/src/main/java/net/runelite/api/ChatPlayer.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a player in the chat. diff --git a/api/src/main/java/api/ClanMember.java b/runelite-api/src/main/java/net/runelite/api/ClanMember.java similarity index 98% rename from api/src/main/java/api/ClanMember.java rename to runelite-api/src/main/java/net/runelite/api/ClanMember.java index 30453fc807..b8082af3d9 100644 --- a/api/src/main/java/api/ClanMember.java +++ b/runelite-api/src/main/java/net/runelite/api/ClanMember.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a clan member. diff --git a/api/src/main/java/api/ClanMemberRank.java b/runelite-api/src/main/java/net/runelite/api/ClanMemberRank.java similarity index 98% rename from api/src/main/java/api/ClanMemberRank.java rename to runelite-api/src/main/java/net/runelite/api/ClanMemberRank.java index f89ab0de21..c919e343c7 100644 --- a/api/src/main/java/api/ClanMemberRank.java +++ b/runelite-api/src/main/java/net/runelite/api/ClanMemberRank.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.util.HashMap; import java.util.Map; diff --git a/api/src/main/java/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java similarity index 92% rename from api/src/main/java/api/Client.java rename to runelite-api/src/main/java/net/runelite/api/Client.java index 1ab10fe887..3be392090f 100644 --- a/api/src/main/java/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -22,21 +22,21 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.hooks.Callbacks; -import api.hooks.DrawCallbacks; -import api.vars.AccountType; -import api.widgets.Widget; -import api.widgets.WidgetInfo; import java.awt.Canvas; import java.awt.Dimension; import java.util.EnumSet; import java.util.List; import java.util.Map; import javax.annotation.Nullable; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.hooks.Callbacks; +import net.runelite.api.hooks.DrawCallbacks; +import net.runelite.api.vars.AccountType; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import org.slf4j.Logger; /** @@ -127,6 +127,13 @@ public interface Client extends GameShell */ GameState getGameState(); + /** + * Sets the current game state. + * + * @param gameState new game state + */ + void setGameState(int gameState); + /** * Gets the current logged in username. * @@ -148,6 +155,13 @@ public interface Client extends GameShell */ void setPassword(String password); + /** + * Sets the 6 digit pin used for authenticator on login screen. + * + * @param otp one time password + */ + void setOtp(String otp); + /** * Gets currently selected login field. 0 is username, and 1 is password. * @@ -155,6 +169,13 @@ public interface Client extends GameShell */ int getCurrentLoginField(); + /** + * Gets index of current login state. 2 is username/password form, 4 is authenticator form + * + * @return current login state index + */ + int getLoginIndex(); + /** * Gets the account type of the logged in player. * @@ -228,13 +249,11 @@ public interface Client extends GameShell /** * Gets the canvas height - * @return */ int getCanvasHeight(); /** * Gets the canvas width - * @return */ int getCanvasWidth(); @@ -392,23 +411,6 @@ public interface Client extends GameShell */ int getMouseCurrentButton(); - /** - * Schedules checking of current region tile for next frame, so ${@link Client#getSelectedSceneTile()} ()} will - * return actual value. - * - * @param checkClick when true next frame selected region tile will be updated - */ - void setCheckClick(boolean checkClick); - - /** - * Sets current mouse hover position. This value is automatically updated only when right-clicking in game. - * Setting this value together with ${@link Client#setCheckClick(boolean)} will update ${@link Client#getSelectedSceneTile()} ()} - * for next frame. - * - * @param position current mouse hover position - */ - void setMouseCanvasHoverPosition(Point position); - /** * Gets the currently selected tile (ie. last right clicked tile). * @@ -433,7 +435,7 @@ public interface Client extends GameShell /** * Gets the widget that is being dragged on. *

- * The widget being dragged has the {@link api.widgets.WidgetConfig#DRAG_ON} + * The widget being dragged has the {@link net.runelite.api.widgets.WidgetConfig#DRAG_ON} * flag set, and is the widget currently under the dragged widget. * * @return the dragged on widget, null if not dragging any widget @@ -540,7 +542,7 @@ public interface Client extends GameShell * @return world list */ World[] getWorldList(); - + /** * Gets an array of currently open right-click menu entries that can be * clicked and activated. @@ -549,10 +551,15 @@ public interface Client extends GameShell */ MenuEntry[] getMenuEntries(); + /** + * @return amount of menu entries the client has (same as client.getMenuEntries().size()) + */ + int getMenuOptionCount(); + /** * Sets the array of open menu entries. *

- * This method should typically be used in the context of the {@link api.events.MenuOpened} + * This method should typically be used in the context of the {@link net.runelite.api.events.MenuOpened} * event, since setting the menu entries will be overwritten the next frame * * @param entries new array of open menu entries @@ -698,7 +705,7 @@ public interface Client extends GameShell * @param varps passed varbits * @param varbitId the variable ID * @return the value - * @see Varbits#id + * @see Varbits */ int getVarbitValue(int[] varps, int varbitId); @@ -728,7 +735,7 @@ public interface Client extends GameShell * @param varps passed varbits * @param varbit the variable * @param value the value - * @see Varbits#id + * @see Varbits */ void setVarbitValue(int[] varps, int varbit, int value); @@ -772,8 +779,6 @@ public interface Client extends GameShell /** * Get the total experience of the player - * - * @return */ long getOverallExperience(); @@ -920,7 +925,7 @@ public interface Client extends GameShell * * @return all projectiles */ - java.util.List getProjectiles(); + List getProjectiles(); /** * Gets a list of all graphics objects currently drawn. @@ -951,6 +956,28 @@ public interface Client extends GameShell */ void playSoundEffect(int id, int x, int y, int range); + /** + * Play a sound effect from some point in the world. + * + * @param id the ID of the sound to play. Any int is allowed, but see + * {@link SoundEffectID} for some common ones + * @param x the ground coordinate on the x axis + * @param y the ground coordinate on the y axis + * @param range the number of tiles away that the sound can be heard + * from + * @param delay the amount of frames before the sound starts playing + */ + void playSoundEffect(int id, int x, int y, int range, int delay); + + /** + * Plays a sound effect, even if the player's sound effect volume is muted. + * + * @param id the ID of the sound effect - {@link SoundEffectID} + * @param volume the volume to play the sound effect at, see {@link SoundEffectVolume} for values used + * in the settings interface. if the sound effect volume is not muted, uses the set volume + */ + void playSoundEffect(int id, int volume); + /** * Gets the clients graphic buffer provider. * @@ -1052,15 +1079,11 @@ public interface Client extends GameShell /** * Gets the clan owner of the currently joined clan chat - * - * @return */ String getClanOwner(); /** * Gets the clan chat name of the currently joined clan chat - * - * @return */ String getClanChatName(); @@ -1073,22 +1096,16 @@ public interface Client extends GameShell /** * Gets the number of friends on the friends list. - * - * @return */ int getFriendsCount(); /** * Gets an array of players on the ignore list. - * - * @return */ Ignore[] getIgnores(); /** * Gets the number of ignored players on the ignore list. - * - * @return */ int getIgnoreCount(); @@ -1342,6 +1359,13 @@ public interface Client extends GameShell */ boolean isInInstancedRegion(); + /** + * Get the number of client ticks an item has been pressed + * + * @return the number of client ticks an item has been pressed + */ + int getItemPressedDuration(); + /** * Sets whether the client is hiding entities. *

@@ -1383,7 +1407,6 @@ public interface Client extends GameShell */ void setClanMatesHidden(boolean state); - /** * Sets whether the local player is hidden. * @@ -1406,6 +1429,13 @@ public interface Client extends GameShell */ void setNPCsHidden(boolean state); + /** + * Sets which NPCs are hidden + * + * @param names the names of the npcs seperated by ',' + */ + void setNPCsNames(String names); + /** * Sets whether 2D sprites (ie. overhead prayers) related to * the NPCs are hidden. @@ -1476,14 +1506,6 @@ public interface Client extends GameShell */ NodeCache getWidgetSpriteCache(); - /** - * Overrides health bar sprites with the sprites from the specified override. - * Pass in {@code null} to revert the health bars back to their default. - * - * @param override the health bar override - */ - void setHealthBarOverride(HealthBarOverride override); - /** * Gets the current server tick count. * @@ -1585,6 +1607,16 @@ public interface Client extends GameShell void checkClickbox(Model model, int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y, int z, long hash); + /** + * Get the if1 widget whose item is being dragged + */ + Widget getIf1DraggedWidget(); + + /** + * Get the item index of the item being dragged on an if1 widget + */ + int getIf1DraggedItemIndex(); + /** * Sets if a widget is in target mode */ @@ -1595,11 +1627,18 @@ public interface Client extends GameShell */ NodeCache getItemDefinitionCache(); + /** + * Returns the array of cross sprites that appear and animate when left-clicking + */ + Sprite[] getCrossSprites(); + EnumDefinition getEnum(int id); void draw2010Menu(); - NodeCache getHealthBarCache(); + void resetHealthBarCaches(); + + boolean getRenderSelf(); void setRenderSelf(boolean enabled); @@ -1619,5 +1658,20 @@ public interface Client extends GameShell MouseRecorder getMouseRecorder(); void setPrintMenuActions(boolean b); + + String getSelectedSpellName(); + + boolean getIsSpellSelected(); + + /** + * Set whether or not player attack options will be hidden for clanmembers/friends + */ + void setHideFriendAttackOptions(boolean yes); + + /** + * Sorts the current menu entries in the same way the client does this. + * The last entry will be the left click one after this. + */ + void sortMenuEntries(); } diff --git a/api/src/main/java/api/CollisionData.java b/runelite-api/src/main/java/net/runelite/api/CollisionData.java similarity index 96% rename from api/src/main/java/api/CollisionData.java rename to runelite-api/src/main/java/net/runelite/api/CollisionData.java index deb1a11fd4..5db393f743 100644 --- a/api/src/main/java/api/CollisionData.java +++ b/runelite-api/src/main/java/net/runelite/api/CollisionData.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents tile collision data for the scene @@ -40,7 +40,7 @@ public interface CollisionData * values can be obtained and used with the {@link CollisionDataFlag} class. * * @return all collision flags for the tiles in the scene - * @see api.config.Constants#SCENE_SIZE + * @see net.runelite.api.Constants#SCENE_SIZE */ int[][] getFlags(); } \ No newline at end of file diff --git a/api/src/main/java/api/CollisionDataFlag.java b/runelite-api/src/main/java/net/runelite/api/CollisionDataFlag.java similarity index 99% rename from api/src/main/java/api/CollisionDataFlag.java rename to runelite-api/src/main/java/net/runelite/api/CollisionDataFlag.java index c7ef4a28cb..b6deb09863 100644 --- a/api/src/main/java/api/CollisionDataFlag.java +++ b/runelite-api/src/main/java/net/runelite/api/CollisionDataFlag.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * A utility class containing collision data flags for tiles. diff --git a/api/src/main/java/api/config/Constants.java b/runelite-api/src/main/java/net/runelite/api/Constants.java similarity index 89% rename from api/src/main/java/api/config/Constants.java rename to runelite-api/src/main/java/net/runelite/api/Constants.java index e995a3232b..bdcb8f6374 100644 --- a/api/src/main/java/api/config/Constants.java +++ b/runelite-api/src/main/java/net/runelite/api/Constants.java @@ -23,7 +23,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.config; +package net.runelite.api; import java.awt.Dimension; @@ -99,7 +99,19 @@ public class Constants public static final int GAME_TICK_LENGTH = 600; /** - * Used when getting High Alchemy value - multiplied by general store price. + * High alchemy = shop price * HIGH_ALCHEMY_MULTIPLIER + * + * @see ItemDefinition#getPrice */ - public static final float HIGH_ALCHEMY_CONSTANT = 0.6f; + public static final float HIGH_ALCHEMY_MULTIPLIER = 0.6f; + + /** + * Width of a standard item sprite + */ + public static final int ITEM_SPRITE_WIDTH = 36; + + /** + * Height of a standard item sprite + */ + public static final int ITEM_SPRITE_HEIGHT = 32; } diff --git a/api/src/main/java/api/DecorativeObject.java b/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java similarity index 93% rename from api/src/main/java/api/DecorativeObject.java rename to runelite-api/src/main/java/net/runelite/api/DecorativeObject.java index d4408361c2..03bfc9df44 100644 --- a/api/src/main/java/api/DecorativeObject.java +++ b/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.awt.Polygon; @@ -42,4 +42,14 @@ public interface DecorativeObject extends TileObject Renderable getRenderable(); Renderable getRenderable2(); + + Model getModel1(); + + Model getModel2(); + + int getYOffset(); + + int getXOffset(); + + int getOrientation(); } diff --git a/runelite-api/src/main/java/net/runelite/api/DynamicObject.java b/runelite-api/src/main/java/net/runelite/api/DynamicObject.java new file mode 100644 index 0000000000..a1914605e3 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/DynamicObject.java @@ -0,0 +1,6 @@ +package net.runelite.api; + +public interface DynamicObject extends Renderable +{ + int getAnimationID(); +} diff --git a/api/src/main/java/api/EnumDefinition.java b/runelite-api/src/main/java/net/runelite/api/EnumDefinition.java similarity index 98% rename from api/src/main/java/api/EnumDefinition.java rename to runelite-api/src/main/java/net/runelite/api/EnumDefinition.java index 6793a150a3..57df54147f 100644 --- a/api/src/main/java/api/EnumDefinition.java +++ b/runelite-api/src/main/java/net/runelite/api/EnumDefinition.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface EnumDefinition { diff --git a/api/src/main/java/api/EnumID.java b/runelite-api/src/main/java/net/runelite/api/EnumID.java similarity index 98% rename from api/src/main/java/api/EnumID.java rename to runelite-api/src/main/java/net/runelite/api/EnumID.java index 2c969fdc0d..bb4ec6fa7b 100644 --- a/api/src/main/java/api/EnumID.java +++ b/runelite-api/src/main/java/net/runelite/api/EnumID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Utility class used for mapping enum IDs. diff --git a/api/src/main/java/api/EquipmentInventorySlot.java b/runelite-api/src/main/java/net/runelite/api/EquipmentInventorySlot.java similarity index 95% rename from api/src/main/java/api/EquipmentInventorySlot.java rename to runelite-api/src/main/java/net/runelite/api/EquipmentInventorySlot.java index 3db1a16926..301aefecb4 100644 --- a/api/src/main/java/api/EquipmentInventorySlot.java +++ b/runelite-api/src/main/java/net/runelite/api/EquipmentInventorySlot.java @@ -22,14 +22,14 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * An enumeration of equipment slots in the inventory {@link ItemContainer}. *

* These values are intended for use with the local players equipment * {@link ItemContainer} corresponding. For obtaining information about equipment - * in the {@link PlayerAppearance}, use {@link api.kit.KitType}. + * in the {@link PlayerAppearance}, use {@link net.runelite.api.kit.KitType}. * * @see Client#getItemContainer(InventoryID) * @see InventoryID#EQUIPMENT diff --git a/api/src/main/java/api/Experience.java b/runelite-api/src/main/java/net/runelite/api/Experience.java similarity index 99% rename from api/src/main/java/api/Experience.java rename to runelite-api/src/main/java/net/runelite/api/Experience.java index e8cb2f6b25..d83a61c97b 100644 --- a/api/src/main/java/api/Experience.java +++ b/runelite-api/src/main/java/net/runelite/api/Experience.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * A utility class used for calculating experience related values. diff --git a/api/src/main/java/api/Favour.java b/runelite-api/src/main/java/net/runelite/api/Favour.java similarity index 98% rename from api/src/main/java/api/Favour.java rename to runelite-api/src/main/java/net/runelite/api/Favour.java index a1c5569970..38904257b1 100644 --- a/api/src/main/java/api/Favour.java +++ b/runelite-api/src/main/java/net/runelite/api/Favour.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/api/src/main/java/api/FontID.java b/runelite-api/src/main/java/net/runelite/api/FontID.java similarity index 98% rename from api/src/main/java/api/FontID.java rename to runelite-api/src/main/java/net/runelite/api/FontID.java index 0126d9dad8..6f9c391e3c 100644 --- a/api/src/main/java/api/FontID.java +++ b/runelite-api/src/main/java/net/runelite/api/FontID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * IDs of fonts in the cache diff --git a/api/src/main/java/api/FontTypeFace.java b/runelite-api/src/main/java/net/runelite/api/FontTypeFace.java similarity index 98% rename from api/src/main/java/api/FontTypeFace.java rename to runelite-api/src/main/java/net/runelite/api/FontTypeFace.java index 096a659584..59241300b3 100644 --- a/api/src/main/java/api/FontTypeFace.java +++ b/runelite-api/src/main/java/net/runelite/api/FontTypeFace.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * A bitmap Font in Jagex's format diff --git a/api/src/main/java/api/Friend.java b/runelite-api/src/main/java/net/runelite/api/Friend.java similarity index 98% rename from api/src/main/java/api/Friend.java rename to runelite-api/src/main/java/net/runelite/api/Friend.java index a3fc135b3e..7b28e18a67 100644 --- a/api/src/main/java/api/Friend.java +++ b/runelite-api/src/main/java/net/runelite/api/Friend.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a player in the friends list. diff --git a/api/src/main/java/api/FriendManager.java b/runelite-api/src/main/java/net/runelite/api/FriendManager.java similarity index 98% rename from api/src/main/java/api/FriendManager.java rename to runelite-api/src/main/java/net/runelite/api/FriendManager.java index 2ab01a92d4..4bdd5a496f 100644 --- a/api/src/main/java/api/FriendManager.java +++ b/runelite-api/src/main/java/net/runelite/api/FriendManager.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents the friend and ignore list manager. diff --git a/api/src/main/java/api/GameObject.java b/runelite-api/src/main/java/net/runelite/api/GameObject.java similarity index 93% rename from api/src/main/java/api/GameObject.java rename to runelite-api/src/main/java/net/runelite/api/GameObject.java index 9ed942d75f..c12744acbb 100644 --- a/api/src/main/java/api/GameObject.java +++ b/runelite-api/src/main/java/net/runelite/api/GameObject.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.coords.Angle; +import net.runelite.api.coords.Angle; import java.awt.Polygon; /** @@ -57,7 +57,7 @@ public interface GameObject extends TileObject * Gets the convex hull of the actors model. * * @return the convex hull - * @see api.model.Jarvis + * @see //net.runelite.api.model.Jarvis */ Polygon getConvexHull(); @@ -69,4 +69,8 @@ public interface GameObject extends TileObject Angle getOrientation(); Renderable getRenderable(); + + int getRsOrientation(); + + Model getModel(); } diff --git a/api/src/main/java/api/GameShell.java b/runelite-api/src/main/java/net/runelite/api/GameShell.java similarity index 94% rename from api/src/main/java/api/GameShell.java rename to runelite-api/src/main/java/net/runelite/api/GameShell.java index 7df74c7d9c..02802e3b76 100644 --- a/api/src/main/java/api/GameShell.java +++ b/runelite-api/src/main/java/net/runelite/api/GameShell.java @@ -22,10 +22,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.hooks.DrawCallbacks; +import net.runelite.api.hooks.DrawCallbacks; import java.awt.Canvas; +import net.runelite.api.hooks.DrawCallbacks; /** * Represents the client game engine. diff --git a/api/src/main/java/api/GameState.java b/runelite-api/src/main/java/net/runelite/api/GameState.java similarity index 94% rename from api/src/main/java/api/GameState.java rename to runelite-api/src/main/java/net/runelite/api/GameState.java index f6c5bd7e18..5f9083f9ca 100644 --- a/api/src/main/java/api/GameState.java +++ b/runelite-api/src/main/java/net/runelite/api/GameState.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * An enumeration of game states the client is in. @@ -41,6 +41,10 @@ public enum GameState * The client is at the login screen. */ LOGIN_SCREEN(10), + /** + * The client is at the login screen entering authenticator code. + */ + LOGIN_SCREEN_AUTHENTICATOR(11), /** * There is a player logging in. */ diff --git a/api/src/main/java/api/GrandExchangeOffer.java b/runelite-api/src/main/java/net/runelite/api/GrandExchangeOffer.java similarity index 96% rename from api/src/main/java/api/GrandExchangeOffer.java rename to runelite-api/src/main/java/net/runelite/api/GrandExchangeOffer.java index c0a41dd515..24957bc956 100644 --- a/api/src/main/java/api/GrandExchangeOffer.java +++ b/runelite-api/src/main/java/net/runelite/api/GrandExchangeOffer.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; /** * Represents an offer in a grand exchange slot. diff --git a/api/src/main/java/api/GrandExchangeOfferState.java b/runelite-api/src/main/java/net/runelite/api/GrandExchangeOfferState.java similarity index 94% rename from api/src/main/java/api/GrandExchangeOfferState.java rename to runelite-api/src/main/java/net/runelite/api/GrandExchangeOfferState.java index 6d374dd7e6..8438e0a300 100644 --- a/api/src/main/java/api/GrandExchangeOfferState.java +++ b/runelite-api/src/main/java/net/runelite/api/GrandExchangeOfferState.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; /** * Describes the state of a Grand Exchange offer. diff --git a/api/src/main/java/api/GraphicID.java b/runelite-api/src/main/java/net/runelite/api/GraphicID.java similarity index 91% rename from api/src/main/java/api/GraphicID.java rename to runelite-api/src/main/java/net/runelite/api/GraphicID.java index 3b34cb01b0..3aa58d8b64 100644 --- a/api/src/main/java/api/GraphicID.java +++ b/runelite-api/src/main/java/net/runelite/api/GraphicID.java @@ -23,10 +23,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public class GraphicID { + public static final int WINE_MAKE = 47; public static final int SPLASH = 85; public static final int GREY_BUBBLE_TELEPORT = 86; public static final int TELEPORT = 111; @@ -50,6 +51,10 @@ public class GraphicID public static final int IMBUED_HEART = 1316; public static final int FLYING_FISH = 1387; public static final int OLM_BURN = 1351; + public static final int OLM_LIGHTNING = 1356; public static final int OLM_TELEPORT = 1359; + public static final int OLM_HEAL = 1363; + public static final int OLM_CRYSTAL = 1447; public static final int XERIC_TELEPORT = 1612; -} + public static final int HYDRA_LIGHTNING = 1666; +} \ No newline at end of file diff --git a/api/src/main/java/api/GraphicsObject.java b/runelite-api/src/main/java/net/runelite/api/GraphicsObject.java similarity index 96% rename from api/src/main/java/api/GraphicsObject.java rename to runelite-api/src/main/java/net/runelite/api/GraphicsObject.java index d66f1a0bfa..a9edebc90d 100644 --- a/api/src/main/java/api/GraphicsObject.java +++ b/runelite-api/src/main/java/net/runelite/api/GraphicsObject.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.coords.LocalPoint; +import net.runelite.api.coords.LocalPoint; /** * Represents a graphics object. diff --git a/api/src/main/java/api/GroundObject.java b/runelite-api/src/main/java/net/runelite/api/GroundObject.java similarity index 97% rename from api/src/main/java/api/GroundObject.java rename to runelite-api/src/main/java/net/runelite/api/GroundObject.java index 9c1ad358d5..828f61c8a9 100644 --- a/api/src/main/java/api/GroundObject.java +++ b/runelite-api/src/main/java/net/runelite/api/GroundObject.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an object on the ground of a tile. @@ -30,4 +30,6 @@ package api; public interface GroundObject extends TileObject { Renderable getRenderable(); + + Model getModel(); } diff --git a/api/src/main/java/api/HashTable.java b/runelite-api/src/main/java/net/runelite/api/HashTable.java similarity index 94% rename from api/src/main/java/api/HashTable.java rename to runelite-api/src/main/java/net/runelite/api/HashTable.java index fe2dd3f1a6..b1c23931b5 100644 --- a/api/src/main/java/api/HashTable.java +++ b/runelite-api/src/main/java/net/runelite/api/HashTable.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; import java.util.Collection; diff --git a/api/src/main/java/api/HeadIcon.java b/runelite-api/src/main/java/net/runelite/api/HeadIcon.java similarity index 98% rename from api/src/main/java/api/HeadIcon.java rename to runelite-api/src/main/java/net/runelite/api/HeadIcon.java index 9b071c6e51..6f70220ba9 100644 --- a/api/src/main/java/api/HeadIcon.java +++ b/runelite-api/src/main/java/net/runelite/api/HeadIcon.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * An enumeration of prayer icons above the head. diff --git a/api/src/main/java/api/HealthBar.java b/runelite-api/src/main/java/net/runelite/api/HealthBar.java similarity index 96% rename from api/src/main/java/api/HealthBar.java rename to runelite-api/src/main/java/net/runelite/api/HealthBar.java index 129d5426c3..89717b1435 100644 --- a/api/src/main/java/api/HealthBar.java +++ b/runelite-api/src/main/java/net/runelite/api/HealthBar.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface HealthBar { @@ -30,5 +30,7 @@ public interface HealthBar Sprite getHealthBarBackSprite(); + int getHealthBarFrontSpriteId(); + void setPadding(int padding); } diff --git a/api/src/main/java/api/HintArrowType.java b/runelite-api/src/main/java/net/runelite/api/HintArrowType.java similarity index 98% rename from api/src/main/java/api/HintArrowType.java rename to runelite-api/src/main/java/net/runelite/api/HintArrowType.java index b846d2b880..8aae44cef3 100644 --- a/api/src/main/java/api/HintArrowType.java +++ b/runelite-api/src/main/java/net/runelite/api/HintArrowType.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/api/src/main/java/api/Hitsplat.java b/runelite-api/src/main/java/net/runelite/api/Hitsplat.java similarity index 99% rename from api/src/main/java/api/Hitsplat.java rename to runelite-api/src/main/java/net/runelite/api/Hitsplat.java index 31f01d5c1d..cb8290d56f 100644 --- a/api/src/main/java/api/Hitsplat.java +++ b/runelite-api/src/main/java/net/runelite/api/Hitsplat.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.Getter; diff --git a/api/src/main/java/api/IconID.java b/runelite-api/src/main/java/net/runelite/api/IconID.java similarity index 98% rename from api/src/main/java/api/IconID.java rename to runelite-api/src/main/java/net/runelite/api/IconID.java index 01d9ba7d4a..7512c3b5bf 100644 --- a/api/src/main/java/api/IconID.java +++ b/runelite-api/src/main/java/net/runelite/api/IconID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/api/src/main/java/api/Ignore.java b/runelite-api/src/main/java/net/runelite/api/Ignore.java similarity index 98% rename from api/src/main/java/api/Ignore.java rename to runelite-api/src/main/java/net/runelite/api/Ignore.java index 2a24897689..52f42e0aaa 100644 --- a/api/src/main/java/api/Ignore.java +++ b/runelite-api/src/main/java/net/runelite/api/Ignore.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * An entry on the ignore list. diff --git a/api/src/main/java/api/IndexDataBase.java b/runelite-api/src/main/java/net/runelite/api/IndexDataBase.java similarity index 88% rename from api/src/main/java/api/IndexDataBase.java rename to runelite-api/src/main/java/net/runelite/api/IndexDataBase.java index 731eeffed7..58fb7d498a 100644 --- a/api/src/main/java/api/IndexDataBase.java +++ b/runelite-api/src/main/java/net/runelite/api/IndexDataBase.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; /** * Represents an index in the cache diff --git a/api/src/main/java/api/IndexedSprite.java b/runelite-api/src/main/java/net/runelite/api/IndexedSprite.java similarity index 99% rename from api/src/main/java/api/IndexedSprite.java rename to runelite-api/src/main/java/net/runelite/api/IndexedSprite.java index 817d55ecc8..b033ef61e9 100644 --- a/api/src/main/java/api/IndexedSprite.java +++ b/runelite-api/src/main/java/net/runelite/api/IndexedSprite.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an indexed sprite. diff --git a/api/src/main/java/api/InstanceTemplates.java b/runelite-api/src/main/java/net/runelite/api/InstanceTemplates.java similarity index 99% rename from api/src/main/java/api/InstanceTemplates.java rename to runelite-api/src/main/java/net/runelite/api/InstanceTemplates.java index ac3fe4572d..fe9d50a651 100644 --- a/api/src/main/java/api/InstanceTemplates.java +++ b/runelite-api/src/main/java/net/runelite/api/InstanceTemplates.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/api/src/main/java/api/IntegerNode.java b/runelite-api/src/main/java/net/runelite/api/IntegerNode.java similarity index 98% rename from api/src/main/java/api/IntegerNode.java rename to runelite-api/src/main/java/net/runelite/api/IntegerNode.java index 84d84729e9..839301ec5a 100644 --- a/api/src/main/java/api/IntegerNode.java +++ b/runelite-api/src/main/java/net/runelite/api/IntegerNode.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an integer typically in a {@link HashTable}. diff --git a/api/src/main/java/api/InventoryID.java b/runelite-api/src/main/java/net/runelite/api/InventoryID.java similarity index 98% rename from api/src/main/java/api/InventoryID.java rename to runelite-api/src/main/java/net/runelite/api/InventoryID.java index 1122304a57..df3f995df9 100644 --- a/api/src/main/java/api/InventoryID.java +++ b/runelite-api/src/main/java/net/runelite/api/InventoryID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * An enumeration of possible inventory types. diff --git a/api/src/main/java/api/Item.java b/runelite-api/src/main/java/net/runelite/api/Item.java similarity index 98% rename from api/src/main/java/api/Item.java rename to runelite-api/src/main/java/net/runelite/api/Item.java index 81e4ae0373..811b02b0a4 100644 --- a/api/src/main/java/api/Item.java +++ b/runelite-api/src/main/java/net/runelite/api/Item.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an item inside an {@link ItemContainer}. diff --git a/api/src/main/java/api/ItemContainer.java b/runelite-api/src/main/java/net/runelite/api/ItemContainer.java similarity index 98% rename from api/src/main/java/api/ItemContainer.java rename to runelite-api/src/main/java/net/runelite/api/ItemContainer.java index 9c73bb255d..e547ca03f8 100644 --- a/api/src/main/java/api/ItemContainer.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemContainer.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an inventory that contains items. diff --git a/api/src/main/java/api/ItemDefinition.java b/runelite-api/src/main/java/net/runelite/api/ItemDefinition.java similarity index 97% rename from api/src/main/java/api/ItemDefinition.java rename to runelite-api/src/main/java/net/runelite/api/ItemDefinition.java index 4d89a0b618..373d066fb9 100644 --- a/api/src/main/java/api/ItemDefinition.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemDefinition.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; /** * Represents the template of a specific item type. @@ -63,6 +63,8 @@ public interface ItemDefinition * alchemy values, respectively. * * @return the general store value of the item + * + * @see Constants#HIGH_ALCHEMY_MULTIPLIER */ int getPrice(); diff --git a/api/src/main/java/api/ItemID.java b/runelite-api/src/main/java/net/runelite/api/ItemID.java similarity index 99% rename from api/src/main/java/api/ItemID.java rename to runelite-api/src/main/java/net/runelite/api/ItemID.java index d534c0e379..ab3252792a 100644 --- a/api/src/main/java/api/ItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemID.java @@ -1,5 +1,5 @@ /* This file is automatically generated. Do not edit. */ -package api; +package net.runelite.api; public final class ItemID { @@ -10791,5 +10791,35 @@ public final class ItemID public static final int TORMENTED_BRACELET_OR = 23444; public static final int GIANT_EASTER_EGG = 23446; public static final int BUNNYMAN_MASK = 23448; + public static final int ENCHANTED_LYREI = 23458; + public static final int ATTACKER_ICON_23460 = 23460; + public static final int ATTACKER_ICON_23461 = 23461; + public static final int ATTACKER_ICON_23462 = 23462; + public static final int ATTACKER_ICON_23463 = 23463; + public static final int ATTACKER_ICON_23464 = 23464; + public static final int ATTACKER_ICON_23465 = 23465; + public static final int DEFENDER_ICON_23466 = 23466; + public static final int DEFENDER_ICON_23467 = 23467; + public static final int DEFENDER_ICON_23468 = 23468; + public static final int DEFENDER_ICON_23469 = 23469; + public static final int DEFENDER_ICON_23470 = 23470; + public static final int COLLECTOR_ICON_23471 = 23471; + public static final int COLLECTOR_ICON_23472 = 23472; + public static final int COLLECTOR_ICON_23473 = 23473; + public static final int COLLECTOR_ICON_23474 = 23474; + public static final int COLLECTOR_ICON_23475 = 23475; + public static final int COLLECTOR_ICON_23476 = 23476; + public static final int COLLECTOR_ICON_23477 = 23477; + public static final int HEALER_ICON_23478 = 23478; + public static final int HEALER_ICON_23479 = 23479; + public static final int HEALER_ICON_23480 = 23480; + public static final int HEALER_ICON_23481 = 23481; + public static final int HEALER_ICON_23482 = 23482; + public static final int HEALER_ICON_23483 = 23483; + public static final int HEALER_ICON_23484 = 23484; + public static final int HEALER_ICON_23485 = 23485; + public static final int HEALER_ICON_23486 = 23486; + public static final int WINE_OF_ZAMORAK_23489 = 23489; + public static final int LARRANS_KEY = 23490; /* This file is automatically generated. Do not edit. */ } diff --git a/api/src/main/java/api/ItemLayer.java b/runelite-api/src/main/java/net/runelite/api/ItemLayer.java similarity index 95% rename from api/src/main/java/api/ItemLayer.java rename to runelite-api/src/main/java/net/runelite/api/ItemLayer.java index b288b757f8..b4317d8d8e 100644 --- a/api/src/main/java/api/ItemLayer.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemLayer.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a pile of items held by a tile. @@ -56,4 +56,8 @@ public interface ItemLayer extends TileObject * @return the top item */ Renderable getTop(); + + Model getModelBottom(); + Model getModelMiddle(); + Model getModelTop(); } diff --git a/api/src/main/java/api/IterableHashTable.java b/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java similarity index 98% rename from api/src/main/java/api/IterableHashTable.java rename to runelite-api/src/main/java/net/runelite/api/IterableHashTable.java index a527f5c0b7..bc8c23ccd9 100644 --- a/api/src/main/java/api/IterableHashTable.java +++ b/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface IterableHashTable extends Iterable { diff --git a/api/src/main/java/api/KeyFocusListener.java b/runelite-api/src/main/java/net/runelite/api/KeyFocusListener.java similarity index 98% rename from api/src/main/java/api/KeyFocusListener.java rename to runelite-api/src/main/java/net/runelite/api/KeyFocusListener.java index dcd840ad4f..990c200086 100644 --- a/api/src/main/java/api/KeyFocusListener.java +++ b/runelite-api/src/main/java/net/runelite/api/KeyFocusListener.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Detects when the window is focused or unfocused. diff --git a/api/src/main/java/api/MainBufferProvider.java b/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java similarity index 98% rename from api/src/main/java/api/MainBufferProvider.java rename to runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java index 5a9342480d..c644859bd2 100644 --- a/api/src/main/java/api/MainBufferProvider.java +++ b/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.awt.Image; diff --git a/api/src/main/java/api/MapElementConfig.java b/runelite-api/src/main/java/net/runelite/api/MapElementConfig.java similarity index 98% rename from api/src/main/java/api/MapElementConfig.java rename to runelite-api/src/main/java/net/runelite/api/MapElementConfig.java index 0d403ca525..39ed26b546 100644 --- a/api/src/main/java/api/MapElementConfig.java +++ b/runelite-api/src/main/java/net/runelite/api/MapElementConfig.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an area in the world. diff --git a/api/src/main/java/api/MenuAction.java b/runelite-api/src/main/java/net/runelite/api/MenuAction.java similarity index 99% rename from api/src/main/java/api/MenuAction.java rename to runelite-api/src/main/java/net/runelite/api/MenuAction.java index 138c48eaac..cafbbe7706 100644 --- a/api/src/main/java/api/MenuAction.java +++ b/runelite-api/src/main/java/net/runelite/api/MenuAction.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.util.HashMap; import java.util.Map; diff --git a/api/src/main/java/api/MenuEntry.java b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java similarity index 86% rename from api/src/main/java/api/MenuEntry.java rename to runelite-api/src/main/java/net/runelite/api/MenuEntry.java index eb063560a6..d554f91043 100644 --- a/api/src/main/java/api/MenuEntry.java +++ b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java @@ -22,14 +22,18 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.RequiredArgsConstructor; /** * A menu entry in a right-click menu. */ @Data +@AllArgsConstructor +@RequiredArgsConstructor public class MenuEntry { /** @@ -66,4 +70,17 @@ public class MenuEntry * This is used for shift click */ private boolean forceLeftClick; + + public static MenuEntry copy(MenuEntry src) + { + return new MenuEntry( + src.getOption(), + src.getTarget(), + src.getIdentifier(), + src.getType(), + src.getParam0(), + src.getParam1(), + src.isForceLeftClick() + ); + } } diff --git a/api/src/main/java/api/MessageNode.java b/runelite-api/src/main/java/net/runelite/api/MessageNode.java similarity index 93% rename from api/src/main/java/api/MessageNode.java rename to runelite-api/src/main/java/net/runelite/api/MessageNode.java index 35257cc0d4..3d8097c7bb 100644 --- a/api/src/main/java/api/MessageNode.java +++ b/runelite-api/src/main/java/net/runelite/api/MessageNode.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a message in the chatbox. @@ -116,4 +116,14 @@ public interface MessageNode * @param timestamp */ void setTimestamp(int timestamp); + + /** + * Returns yes if the message is from a friend + */ + boolean isFromFriend(); + + /** + * Returns yes if the message is from a clanmate + */ + boolean isFromClanMate(); } diff --git a/api/src/main/java/api/Model.java b/runelite-api/src/main/java/net/runelite/api/Model.java similarity index 95% rename from api/src/main/java/api/Model.java rename to runelite-api/src/main/java/net/runelite/api/Model.java index 41bba14b4c..04e52f9534 100644 --- a/api/src/main/java/api/Model.java +++ b/runelite-api/src/main/java/net/runelite/api/Model.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.model.Triangle; -import api.model.Vertex; +import net.runelite.api.model.Triangle; +import net.runelite.api.model.Vertex; import java.util.List; /** @@ -103,4 +103,5 @@ public interface Model extends Renderable int getExtremeZ(); int getXYZMag(); + boolean isClickable(); } diff --git a/api/src/main/java/api/MouseRecorder.java b/runelite-api/src/main/java/net/runelite/api/MouseRecorder.java similarity index 98% rename from api/src/main/java/api/MouseRecorder.java rename to runelite-api/src/main/java/net/runelite/api/MouseRecorder.java index a5210d7027..663a4d85c9 100644 --- a/api/src/main/java/api/MouseRecorder.java +++ b/runelite-api/src/main/java/net/runelite/api/MouseRecorder.java @@ -23,7 +23,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface MouseRecorder { diff --git a/api/src/main/java/api/NPC.java b/runelite-api/src/main/java/net/runelite/api/NPC.java similarity index 95% rename from api/src/main/java/api/NPC.java rename to runelite-api/src/main/java/net/runelite/api/NPC.java index 22073e92ba..ff36c47214 100644 --- a/api/src/main/java/api/NPC.java +++ b/runelite-api/src/main/java/net/runelite/api/NPC.java @@ -22,10 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import javax.annotation.Nullable; -import rs.api.RSNPCDefinition; /** * Represents a non-player character in the game. @@ -77,5 +76,5 @@ public interface NPC extends Actor */ boolean isDead(); - void onDefinitionChanged(RSNPCDefinition composition); + void onDefinitionChanged(NPCDefinition composition); } diff --git a/api/src/main/java/api/NPCDefinition.java b/runelite-api/src/main/java/net/runelite/api/NPCDefinition.java similarity index 51% rename from api/src/main/java/api/NPCDefinition.java rename to runelite-api/src/main/java/net/runelite/api/NPCDefinition.java index 15d0b19ca2..fa70c5051e 100644 --- a/api/src/main/java/api/NPCDefinition.java +++ b/runelite-api/src/main/java/net/runelite/api/NPCDefinition.java @@ -1,4 +1,28 @@ -package api; +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; public interface NPCDefinition { diff --git a/api/src/main/java/api/Nameable.java b/runelite-api/src/main/java/net/runelite/api/Nameable.java similarity index 98% rename from api/src/main/java/api/Nameable.java rename to runelite-api/src/main/java/net/runelite/api/Nameable.java index 13c83650fa..081074594e 100644 --- a/api/src/main/java/api/Nameable.java +++ b/runelite-api/src/main/java/net/runelite/api/Nameable.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a chat entity that has a name. diff --git a/api/src/main/java/api/Node.java b/runelite-api/src/main/java/net/runelite/api/Node.java similarity index 98% rename from api/src/main/java/api/Node.java rename to runelite-api/src/main/java/net/runelite/api/Node.java index dfadcf484f..56d2755e74 100644 --- a/api/src/main/java/api/Node.java +++ b/runelite-api/src/main/java/net/runelite/api/Node.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a doubly linked node. diff --git a/api/src/main/java/api/NodeCache.java b/runelite-api/src/main/java/net/runelite/api/NodeCache.java similarity index 98% rename from api/src/main/java/api/NodeCache.java rename to runelite-api/src/main/java/net/runelite/api/NodeCache.java index 6bb3a08813..e6d8f8208b 100644 --- a/api/src/main/java/api/NodeCache.java +++ b/runelite-api/src/main/java/net/runelite/api/NodeCache.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a doubly linked node cache. diff --git a/api/src/main/java/api/NpcID.java b/runelite-api/src/main/java/net/runelite/api/NpcID.java similarity index 97% rename from api/src/main/java/api/NpcID.java rename to runelite-api/src/main/java/net/runelite/api/NpcID.java index b492b81a0b..1288a33ba7 100644 --- a/api/src/main/java/api/NpcID.java +++ b/runelite-api/src/main/java/net/runelite/api/NpcID.java @@ -1,5 +1,5 @@ /* This file is automatically generated. Do not edit. */ -package api; +package net.runelite.api; public final class NpcID { @@ -460,10 +460,9 @@ public final class NpcID public static final int SKELETAL_WYVERN_468 = 468; public static final int KILLERWATT = 469; public static final int KILLERWATT_470 = 470; - public static final int FUNGI = 471; - public static final int FUNGI_472 = 472; - public static final int ZYGOMITE = 473; - public static final int ZYGOMITE_474 = 474; + public static final int DARK_WIZARD = 472; + public static final int INVRIGAR_THE_NECROMANCER = 473; + public static final int DARK_WIZARD_474 = 474; public static final int HOLE_IN_THE_WALL = 475; public static final int WALL_BEAST = 476; public static final int GIANT_FROG = 477; @@ -493,40 +492,37 @@ public final class NpcID public static final int VANESSA = 502; public static final int RICHARD = 503; public static final int ALICE = 504; - public static final int BOB = 505; - public static final int SHOP_KEEPER = 506; - public static final int SHOP_ASSISTANT = 507; - public static final int SHOP_KEEPER_508 = 508; - public static final int SHOP_ASSISTANT_509 = 509; - public static final int SHOP_KEEPER_510 = 510; - public static final int SHOP_ASSISTANT_511 = 511; - public static final int SHOP_KEEPER_512 = 512; - public static final int SHOP_ASSISTANT_513 = 513; - public static final int SHOP_KEEPER_514 = 514; - public static final int SHOP_ASSISTANT_515 = 515; - public static final int SHOP_KEEPER_516 = 516; - public static final int SHOP_ASSISTANT_517 = 517; - public static final int SHOP_KEEPER_518 = 518; - public static final int SHOP_ASSISTANT_519 = 519; - public static final int FAIRY_SHOP_KEEPER = 520; - public static final int FAIRY_SHOP_ASSISTANT = 521; - public static final int VALAINE = 522; - public static final int SCAVVO = 523; - public static final int PEKSA = 524; - public static final int SILK_TRADER = 525; - public static final int GEM_TRADER = 526; - public static final int ZEKE = 527; - public static final int LOUIE_LEGS = 528; - public static final int KARIM = 529; - public static final int RANAEL = 530; - public static final int DOMMIK = 531; - public static final int ZAFF = 532; - public static final int BARAEK = 533; + public static final int MUGGER = 505; + public static final int WITCH = 506; + public static final int WITCH_507 = 507; + public static final int BLACK_KNIGHT = 508; + public static final int BLACK_KNIGHT_509 = 509; + public static final int HIGHWAYMAN = 510; + public static final int HIGHWAYMAN_511 = 511; + public static final int CHAOS_DRUID = 512; + public static final int PIRATE = 513; + public static final int PIRATE_514 = 514; + public static final int PIRATE_515 = 515; + public static final int PIRATE_516 = 516; + public static final int THUG = 517; + public static final int ROGUE = 518; + public static final int MONK_OF_ZAMORAK = 519; + public static final int MONK_OF_ZAMORAK_520 = 520; + public static final int MONK_OF_ZAMORAK_521 = 521; + public static final int TRIBESMAN = 522; + public static final int DARK_WARRIOR = 523; + public static final int CHAOS_DRUID_WARRIOR = 524; + public static final int NECROMANCER = 525; + public static final int BANDIT = 526; + public static final int GUARD_BANDIT = 527; + public static final int BARBARIAN_GUARD = 528; + public static final int PORTAL = 530; + public static final int PORTAL_532 = 532; + public static final int FUNGI = 533; public static final int THESSALIA = 534; - public static final int HORVIK = 535; - public static final int LOWE = 536; - public static final int SHOP_KEEPER_537 = 537; - public static final int SHOP_ASSISTANT_538 = 538; + public static final int FUNGI_535 = 535; + public static final int ZYGOMITE = 537; + public static final int FUNGI_538 = 538; public static final int ELFINLOCKS = 539; public static final int CLOCKWORK_CAT = 540; public static final int CLOCKWORK_CAT_541 = 541; @@ -625,7 +621,7 @@ public final class NpcID public static final int BREWER_634 = 634; public static final int FISHING_SPOT = 635; public static final int KARAMTHULHU = 636; - public static final int AUBURY = 637; + public static final int FUNGI_637 = 637; public static final int ELF_TRACKER = 638; public static final int TYRAS_GUARD = 639; public static final int UG = 640; @@ -678,7 +674,7 @@ public final class NpcID public static final int BARTENDER = 687; public static final int EBLIS = 688; public static final int EBLIS_689 = 689; - public static final int BANDIT = 690; + public static final int BANDIT_690 = 690; public static final int BANDIT_691 = 691; public static final int BANDIT_692 = 692; public static final int BANDIT_693 = 693; @@ -992,37 +988,34 @@ public final class NpcID public static final int RAT = 1020; public static final int RAT_1021 = 1021; public static final int RAT_1022 = 1022; - public static final int FANCY_DRESS_SHOP_OWNER = 1023; - public static final int SHOP_KEEPER_1024 = 1024; - public static final int GRUM = 1025; - public static final int WYDIN = 1026; - public static final int GERRANT = 1027; - public static final int BRIAN = 1028; - public static final int JIMINUA = 1029; - public static final int SHOP_KEEPER_1030 = 1030; - public static final int CANDLE_MAKER = 1031; - public static final int ARHEIN = 1032; - public static final int JUKAT = 1033; - public static final int LUNDERWIN = 1034; - public static final int IRKSOL = 1035; - public static final int FAIRY = 1036; - public static final int ZAMBO = 1037; - public static final int SILVER_MERCHANT = 1038; - public static final int GEM_MERCHANT = 1039; - public static final int BAKER = 1040; - public static final int SPICE_SELLER = 1041; - public static final int FUR_TRADER = 1042; - public static final int SILK_MERCHANT = 1043; - public static final int HICKTON = 1044; - public static final int HARRY = 1045; - public static final int CASSIE = 1046; - public static final int FRINCOS = 1047; - public static final int DROGO_DWARF = 1048; - public static final int FLYNN = 1049; - public static final int WAYNE = 1050; - public static final int DWARF_1051 = 1051; - public static final int BETTY = 1052; - public static final int HERQUIN = 1053; + public static final int ZYGOMITE_1024 = 1024; + public static final int BANKER_1027 = 1027; + public static final int BANKER_1028 = 1028; + public static final int BANKER_1029 = 1029; + public static final int BANKER_1030 = 1030; + public static final int BANKER_1031 = 1031; + public static final int BANKER_1032 = 1032; + public static final int BANKER_1033 = 1033; + public static final int BANKER_1034 = 1034; + public static final int BANKER_1035 = 1035; + public static final int BANKER_1036 = 1036; + public static final int SNAKE = 1037; + public static final int MONKEY_1038 = 1038; + public static final int ALBINO_BAT = 1039; + public static final int CRAB = 1040; + public static final int GIANT_MOSQUITO = 1041; + public static final int JUNGLE_HORROR = 1042; + public static final int JUNGLE_HORROR_1043 = 1043; + public static final int JUNGLE_HORROR_1044 = 1044; + public static final int JUNGLE_HORROR_1045 = 1045; + public static final int JUNGLE_HORROR_1046 = 1046; + public static final int CAVE_HORROR = 1047; + public static final int CAVE_HORROR_1048 = 1048; + public static final int CAVE_HORROR_1049 = 1049; + public static final int CAVE_HORROR_1050 = 1050; + public static final int CAVE_HORROR_1051 = 1051; + public static final int CAVEY_DAVEY = 1052; + public static final int PATCHY = 1053; public static final int LAUNA = 1054; public static final int LAUNA_1055 = 1055; public static final int BRANA = 1056; @@ -1134,13 +1127,12 @@ public final class NpcID public static final int MONK_OF_ENTRANA_1169 = 1169; public static final int MONK_OF_ENTRANA_1170 = 1170; public static final int MONK_1171 = 1171; - public static final int ROMMIK = 1172; - public static final int GAIUS = 1173; - public static final int JATIX = 1174; - public static final int DAVON = 1175; - public static final int ZENESHA = 1176; - public static final int AEMAD = 1177; - public static final int KORTAN = 1178; + public static final int CHICKEN = 1173; + public static final int CHICKEN_1174 = 1174; + public static final int ROOSTER = 1175; + public static final int LIL_LAMB = 1176; + public static final int LAMB = 1177; + public static final int SHEEP_1178 = 1178; public static final int LUMBRIDGE_GUIDE_1179 = 1179; public static final int LUMBRIDGE_GUIDE_1181 = 1181; public static final int ___ = 1182; @@ -1252,17 +1244,17 @@ public final class NpcID public static final int MORTTON_LOCAL_1296 = 1296; public static final int AFFLICTED_1297 = 1297; public static final int AFFLICTED_1298 = 1298; - public static final int ROACHEY = 1299; - public static final int FRENITA = 1300; - public static final int NURMOF = 1301; - public static final int TEA_SELLER = 1302; - public static final int FAT_TONY = 1303; - public static final int NOTERAZZO = 1304; + public static final int SHEEP_1299 = 1299; + public static final int SHEEP_1300 = 1300; + public static final int SHEEP_1301 = 1301; + public static final int SHEEP_1302 = 1302; + public static final int SHEEP_1303 = 1303; + public static final int SHEEP_1304 = 1304; public static final int HAIRDRESSER = 1305; public static final int MAKEOVER_MAGE = 1306; public static final int MAKEOVER_MAGE_1307 = 1307; - public static final int DIANGO = 1308; - public static final int BRIAN_1309 = 1309; + public static final int SHEEP_1308 = 1308; + public static final int SHEEP_1309 = 1309; public static final int BARTENDER_1310 = 1310; public static final int BARTENDER_1311 = 1311; public static final int BARTENDER_1312 = 1312; @@ -1392,12 +1384,12 @@ public final class NpcID public static final int DAERO = 1444; public static final int DAERO_1445 = 1445; public static final int WAYDAR = 1446; - public static final int PIRATE = 1447; + public static final int PIRATE_1447 = 1447; public static final int THIEF = 1448; public static final int LUMDO_1453 = 1453; public static final int LUMDO_1454 = 1454; public static final int GLO_CARANOCK = 1460; - public static final int MUGGER = 1461; + public static final int MUGGER_1461 = 1461; public static final int SMALL_NINJA_MONKEY = 1462; public static final int MEDIUM_NINJA_MONKEY = 1463; public static final int GORILLA = 1464; @@ -1478,7 +1470,7 @@ public final class NpcID public static final int FISHING_SPOT_1542 = 1542; public static final int GARGOYLE_1543 = 1543; public static final int FISHING_SPOT_1544 = 1544; - public static final int BLACK_KNIGHT = 1545; + public static final int BLACK_KNIGHT_1545 = 1545; public static final int GUARD_1546 = 1546; public static final int GUARD_1547 = 1547; public static final int GUARD_1548 = 1548; @@ -1486,7 +1478,7 @@ public final class NpcID public static final int GUARD_1550 = 1550; public static final int GUARD_1551 = 1551; public static final int GUARD_1552 = 1552; - public static final int CRAB = 1553; + public static final int CRAB_1553 = 1553; public static final int SEAGULL_1554 = 1554; public static final int SEAGULL_1555 = 1555; public static final int FIRE_WIZARD = 1556; @@ -1668,7 +1660,7 @@ public final class NpcID public static final int BRAWLER_1736 = 1736; public static final int BRAWLER_1737 = 1737; public static final int BRAWLER_1738 = 1738; - public static final int PORTAL = 1739; + public static final int PORTAL_1739 = 1739; public static final int PORTAL_1740 = 1740; public static final int PORTAL_1741 = 1741; public static final int PORTAL_1742 = 1742; @@ -1716,10 +1708,10 @@ public final class NpcID public static final int SKELETON_1785 = 1785; public static final int GHOST_1786 = 1786; public static final int SKELETON_MAGE_1787 = 1787; - public static final int BETTY_1788 = 1788; - public static final int GRUM_1789 = 1789; - public static final int GERRANT_1790 = 1790; - public static final int WYDIN_1791 = 1791; + public static final int BETTY = 1788; + public static final int GRUM = 1789; + public static final int GERRANT = 1790; + public static final int WYDIN = 1791; public static final int GOAT = 1792; public static final int GOAT_1793 = 1793; public static final int BILLY_GOAT = 1794; @@ -1767,7 +1759,7 @@ public final class NpcID public static final int STAG = 1845; public static final int WOOD_DRYAD = 1846; public static final int FAIRY_VERY_WISE = 1847; - public static final int FAIRY_1848 = 1848; + public static final int FAIRY = 1848; public static final int FAIRY_1849 = 1849; public static final int FAIRY_1850 = 1850; public static final int FAIRY_1851 = 1851; @@ -1915,7 +1907,7 @@ public final class NpcID public static final int FRITZ_THE_GLASSBLOWER = 2053; public static final int CHAOS_ELEMENTAL = 2054; public static final int CHAOS_ELEMENTAL_JR = 2055; - public static final int DARK_WIZARD = 2056; + public static final int DARK_WIZARD_2056 = 2056; public static final int DARK_WIZARD_2057 = 2057; public static final int DARK_WIZARD_2058 = 2058; public static final int DARK_WIZARD_2059 = 2059; @@ -2488,7 +2480,7 @@ public final class NpcID public static final int LILIYA = 2632; public static final int BANKER_2633 = 2633; public static final int MYRE_BLAMISH_SNAIL = 2634; - public static final int BOB_2635 = 2635; + public static final int BOB = 2635; public static final int BOB_2636 = 2636; public static final int SPHINX = 2637; public static final int NEITE = 2638; @@ -2544,11 +2536,12 @@ public final class NpcID public static final int IMIAGO = 2688; public static final int LILIWEN = 2689; public static final int COOL_MOM227 = 2690; - public static final int CHICKEN = 2692; - public static final int CHICKEN_2693 = 2693; - public static final int ROOSTER = 2694; - public static final int LIL_LAMB = 2695; - public static final int LAMB = 2696; + public static final int SHEEP_2691 = 2691; + public static final int SHEEP_2692 = 2692; + public static final int SHEEP_2693 = 2693; + public static final int SHEEP_2694 = 2694; + public static final int SHEEP_2695 = 2695; + public static final int SHEEP_2696 = 2696; public static final int SHEEP_2697 = 2697; public static final int SHEEP_2698 = 2698; public static final int SHEEP_2699 = 2699; @@ -2642,43 +2635,43 @@ public final class NpcID public static final int SHEEP_2787 = 2787; public static final int SHEEP_2788 = 2788; public static final int SHEEP_2789 = 2789; - public static final int SHEEP_2790 = 2790; - public static final int SHEEP_2791 = 2791; - public static final int SHEEP_2792 = 2792; - public static final int SHEEP_2793 = 2793; - public static final int SHEEP_2794 = 2794; - public static final int SHEEP_2795 = 2795; - public static final int SHEEP_2796 = 2796; - public static final int SHEEP_2797 = 2797; - public static final int SHEEP_2798 = 2798; - public static final int SHEEP_2799 = 2799; - public static final int SHEEP_2800 = 2800; - public static final int SHEEP_2801 = 2801; - public static final int SHEEP_2802 = 2802; - public static final int SHEEP_2803 = 2803; - public static final int SHEEP_2804 = 2804; - public static final int COW = 2805; - public static final int COW_2806 = 2806; - public static final int COW_CALF = 2807; - public static final int COW_2808 = 2808; - public static final int COW_CALF_2809 = 2809; - public static final int COW_2810 = 2810; - public static final int PIG = 2811; - public static final int PIG_2812 = 2812; - public static final int PIGLET = 2813; - public static final int PIGLET_2814 = 2814; - public static final int PIGLET_2815 = 2815; - public static final int COW_CALF_2816 = 2816; - public static final int SHEEPDOG = 2817; - public static final int ROOSTER_2818 = 2818; - public static final int CHICKEN_2819 = 2819; - public static final int CHICKEN_2820 = 2820; - public static final int CHICKEN_2821 = 2821; - public static final int PIG_2822 = 2822; - public static final int PIG_2823 = 2823; - public static final int PIGLET_2824 = 2824; - public static final int PIGLET_2825 = 2825; - public static final int PIGLET_2826 = 2826; + public static final int COW = 2790; + public static final int COW_2791 = 2791; + public static final int COW_CALF = 2792; + public static final int COW_2793 = 2793; + public static final int COW_CALF_2794 = 2794; + public static final int COW_2795 = 2795; + public static final int PIG = 2796; + public static final int PIG_2797 = 2797; + public static final int PIGLET = 2798; + public static final int PIGLET_2799 = 2799; + public static final int PIGLET_2800 = 2800; + public static final int COW_CALF_2801 = 2801; + public static final int SHEEPDOG = 2802; + public static final int ROOSTER_2803 = 2803; + public static final int CHICKEN_2804 = 2804; + public static final int CHICKEN_2805 = 2805; + public static final int CHICKEN_2806 = 2806; + public static final int PIG_2807 = 2807; + public static final int PIG_2808 = 2808; + public static final int PIGLET_2809 = 2809; + public static final int PIGLET_2810 = 2810; + public static final int PIGLET_2811 = 2811; + public static final int BOB_2812 = 2812; + public static final int SHOP_KEEPER = 2813; + public static final int SHOP_ASSISTANT = 2814; + public static final int SHOP_KEEPER_2815 = 2815; + public static final int SHOP_ASSISTANT_2816 = 2816; + public static final int SHOP_KEEPER_2817 = 2817; + public static final int SHOP_ASSISTANT_2818 = 2818; + public static final int SHOP_KEEPER_2819 = 2819; + public static final int SHOP_ASSISTANT_2820 = 2820; + public static final int SHOP_KEEPER_2821 = 2821; + public static final int SHOP_ASSISTANT_2822 = 2822; + public static final int SHOP_KEEPER_2823 = 2823; + public static final int SHOP_ASSISTANT_2824 = 2824; + public static final int SHOP_KEEPER_2825 = 2825; + public static final int SHOP_ASSISTANT_2826 = 2826; public static final int BAT = 2827; public static final int DRYAD = 2828; public static final int FAIRY_2829 = 2829; @@ -2697,7 +2690,7 @@ public final class NpcID public static final int ICE_WARRIOR_2842 = 2842; public static final int OTHERWORLDLY_BEING = 2843; public static final int MAGIC_AXE = 2844; - public static final int SNAKE = 2845; + public static final int SNAKE_2845 = 2845; public static final int SKAVID = 2846; public static final int YETI = 2847; public static final int MONKEY_2848 = 2848; @@ -2720,33 +2713,33 @@ public final class NpcID public static final int DUNGEON_RAT = 2865; public static final int DUNGEON_RAT_2866 = 2866; public static final int DUNGEON_RAT_2867 = 2867; - public static final int DARK_WIZARD_2868 = 2868; - public static final int INVRIGAR_THE_NECROMANCER = 2869; - public static final int DARK_WIZARD_2870 = 2870; - public static final int MUGGER_2871 = 2871; - public static final int WITCH = 2872; - public static final int WITCH_2873 = 2873; - public static final int BLACK_KNIGHT_2874 = 2874; - public static final int BLACK_KNIGHT_2875 = 2875; - public static final int HIGHWAYMAN = 2876; - public static final int HIGHWAYMAN_2877 = 2877; - public static final int CHAOS_DRUID = 2878; - public static final int PIRATE_2879 = 2879; - public static final int PIRATE_2880 = 2880; - public static final int PIRATE_2881 = 2881; - public static final int PIRATE_2882 = 2882; - public static final int THUG = 2883; - public static final int ROGUE = 2884; - public static final int MONK_OF_ZAMORAK = 2885; - public static final int MONK_OF_ZAMORAK_2886 = 2886; - public static final int MONK_OF_ZAMORAK_2887 = 2887; - public static final int TRIBESMAN = 2888; - public static final int DARK_WARRIOR = 2889; - public static final int CHAOS_DRUID_WARRIOR = 2890; - public static final int NECROMANCER = 2891; - public static final int BANDIT_2892 = 2892; - public static final int GUARD_BANDIT = 2893; - public static final int BARBARIAN_GUARD = 2894; + public static final int FAIRY_SHOP_KEEPER = 2868; + public static final int FAIRY_SHOP_ASSISTANT = 2869; + public static final int VALAINE = 2870; + public static final int SCAVVO = 2871; + public static final int PEKSA = 2872; + public static final int SILK_TRADER = 2873; + public static final int GEM_TRADER = 2874; + public static final int ZEKE = 2875; + public static final int LOUIE_LEGS = 2876; + public static final int KARIM = 2877; + public static final int RANAEL = 2878; + public static final int DOMMIK = 2879; + public static final int ZAFF = 2880; + public static final int BARAEK = 2881; + public static final int HORVIK = 2882; + public static final int LOWE = 2883; + public static final int SHOP_KEEPER_2884 = 2884; + public static final int SHOP_ASSISTANT_2885 = 2885; + public static final int AUBURY = 2886; + public static final int FANCY_DRESS_SHOP_OWNER = 2887; + public static final int SHOP_KEEPER_2888 = 2888; + public static final int GRUM_2889 = 2889; + public static final int WYDIN_2890 = 2890; + public static final int GERRANT_2891 = 2891; + public static final int BRIAN = 2892; + public static final int JIMINUA = 2893; + public static final int SHOP_KEEPER_2894 = 2894; public static final int COOK_2895 = 2895; public static final int COOK_2896 = 2896; public static final int BANKER_2897 = 2897; @@ -3022,23 +3015,23 @@ public final class NpcID public static final int EMERALD_BENEDICT = 3194; public static final int SPIN_BLADES = 3195; public static final int SPIN_BLADES_3196 = 3196; - public static final int SNAKE_3199 = 3199; - public static final int MONKEY_3200 = 3200; - public static final int ALBINO_BAT = 3201; - public static final int CRAB_3202 = 3202; - public static final int GIANT_MOSQUITO = 3203; - public static final int JUNGLE_HORROR = 3204; - public static final int JUNGLE_HORROR_3205 = 3205; - public static final int JUNGLE_HORROR_3206 = 3206; - public static final int JUNGLE_HORROR_3207 = 3207; - public static final int JUNGLE_HORROR_3208 = 3208; - public static final int CAVE_HORROR = 3209; - public static final int CAVE_HORROR_3210 = 3210; - public static final int CAVE_HORROR_3211 = 3211; - public static final int CAVE_HORROR_3212 = 3212; - public static final int CAVE_HORROR_3213 = 3213; - public static final int CAVEY_DAVEY = 3214; - public static final int PATCHY = 3215; + public static final int CANDLE_MAKER = 3199; + public static final int ARHEIN = 3200; + public static final int JUKAT = 3201; + public static final int LUNDERWIN = 3202; + public static final int IRKSOL = 3203; + public static final int FAIRY_3204 = 3204; + public static final int ZAMBO = 3205; + public static final int SILVER_MERCHANT = 3206; + public static final int GEM_MERCHANT = 3207; + public static final int BAKER = 3208; + public static final int SPICE_SELLER = 3209; + public static final int FUR_TRADER = 3210; + public static final int SILK_MERCHANT = 3211; + public static final int HICKTON = 3212; + public static final int HARRY = 3213; + public static final int CASSIE = 3214; + public static final int FRINCOS = 3215; public static final int MELEE_COMBAT_TUTOR = 3216; public static final int RANGED_COMBAT_TUTOR = 3217; public static final int MAGIC_COMBAT_TUTOR = 3218; @@ -4354,7 +4347,7 @@ public final class NpcID public static final int GEM_MERCHANT_4581 = 4581; public static final int SILVER_MERCHANT_4582 = 4582; public static final int SILK_MERCHANT_4583 = 4583; - public static final int ZENESHA_4584 = 4584; + public static final int ZENESHA = 4584; public static final int ALI_MORRISANE_4585 = 4585; public static final int GRIMESQUIT = 4586; public static final int PHINGSPET = 4587; @@ -5591,11 +5584,11 @@ public final class NpcID public static final int TZREKJAD = 5892; public static final int TZREKJAD_5893 = 5893; public static final int BAST = 5894; - public static final int BANKER_5895 = 5895; - public static final int BANKER_5896 = 5896; - public static final int BANKER_5897 = 5897; - public static final int BANKER_5904 = 5904; - public static final int BANKER_5905 = 5905; + public static final int DROGO_DWARF = 5895; + public static final int FLYNN = 5896; + public static final int WAYNE = 5897; + public static final int DWARF_5904 = 5904; + public static final int BETTY_5905 = 5905; public static final int PROBITA = 5906; public static final int CHAOS_ELEMENTAL_JR_5907 = 5907; public static final int ABYSSAL_SIRE_5908 = 5908; @@ -6021,8 +6014,8 @@ public final class NpcID public static final int FIDELIO = 6525; public static final int SBOTT = 6526; public static final int ROAVAR = 6527; - public static final int BANKER_6529 = 6529; - public static final int BANKER_6530 = 6530; + public static final int HERQUIN = 6529; + public static final int ROMMIK = 6530; public static final int BLURBERRY = 6531; public static final int BARMAN_6532 = 6532; public static final int ROMILY_WEAKLAX = 6533; @@ -7135,7 +7128,7 @@ public final class NpcID public static final int ANCIENT_WYVERN = 7795; public static final int LOBSTROSITY = 7796; public static final int ANCIENT_ZYGOMITE = 7797; - public static final int ANCIENT_FUNGI = 7798; + public static final int GAIUS = 7798; public static final int AMMONITE_CRAB = 7799; public static final int FOSSIL_ROCK = 7800; public static final int TAR_BUBBLES = 7801; @@ -7745,7 +7738,7 @@ public final class NpcID public static final int TRAPPED_SOUL_HARD = 8529; public static final int AMELIA_8530 = 8530; public static final int ALLANNA = 8531; - public static final int LEKE_QUO_KERAN = 8532; + public static final int JATIX = 8532; public static final int NIKKIE = 8533; public static final int ROSIE = 8534; public static final int ALAN = 8535; @@ -7855,11 +7848,23 @@ public final class NpcID public static final int ILFEEN_8677 = 8677; public static final int FERAL_VAMPYRE_8678 = 8678; public static final int ABIDOR_CRANK_8679 = 8679; - public static final int BANKER_8680 = 8680; - public static final int BANKER_8681 = 8681; - public static final int BANKER_8682 = 8682; - public static final int PORTAL_8684 = 8684; - public static final int PORTAL_8686 = 8686; + public static final int DAVON = 8680; + public static final int ZENESHA_8681 = 8681; + public static final int AEMAD = 8682; + public static final int KORTAN = 8683; + public static final int ROACHEY = 8684; + public static final int FRENITA = 8685; + public static final int NURMOF = 8686; + public static final int TEA_SELLER = 8687; + public static final int FAT_TONY = 8688; + public static final int ANCIENT_FUNGI = 8690; + public static final int ANCIENT_FUNGI_8691 = 8691; + public static final int NOTERAZZO = 8692; + public static final int DIANGO = 8693; + public static final int BRIAN_8694 = 8694; public static final int MOSOL_REI_8696 = 8696; + public static final int LEKE_QUO_KERAN = 8697; + public static final int MONK_OF_ZAMORAK_8698 = 8698; + public static final int LARRAN = 8699; /* This file is automatically generated. Do not edit. */ } diff --git a/api/src/main/java/api/NullItemID.java b/runelite-api/src/main/java/net/runelite/api/NullItemID.java similarity index 99% rename from api/src/main/java/api/NullItemID.java rename to runelite-api/src/main/java/net/runelite/api/NullItemID.java index e974930440..f31d40f26e 100644 --- a/api/src/main/java/api/NullItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullItemID.java @@ -1,5 +1,5 @@ /* This file is automatically generated. Do not edit. */ -package api; +package net.runelite.api; public final class NullItemID { @@ -12456,5 +12456,12 @@ public final class NullItemID public static final int NULL_23455 = 23455; public static final int NULL_23456 = 23456; public static final int NULL_23457 = 23457; + public static final int NULL_23459 = 23459; + public static final int NULL_23487 = 23487; + public static final int NULL_23488 = 23488; + public static final int NULL_23491 = 23491; + public static final int NULL_23492 = 23492; + public static final int NULL_23493 = 23493; + public static final int NULL_23494 = 23494; /* This file is automatically generated. Do not edit. */ } diff --git a/api/src/main/java/api/NullObjectID.java b/runelite-api/src/main/java/net/runelite/api/NullObjectID.java similarity index 99% rename from api/src/main/java/api/NullObjectID.java rename to runelite-api/src/main/java/net/runelite/api/NullObjectID.java index 20dfa2e99a..103bf0143c 100644 --- a/api/src/main/java/api/NullObjectID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullObjectID.java @@ -1,5 +1,5 @@ /* This file is automatically generated. Do not edit. */ -package api; +package net.runelite.api; public final class NullObjectID { @@ -16209,5 +16209,7 @@ public final class NullObjectID public static final int NULL_34823 = 34823; public static final int NULL_34824 = 34824; public static final int NULL_34825 = 34825; + public static final int NULL_34831 = 34831; + public static final int NULL_34832 = 34832; /* This file is automatically generated. Do not edit. */ } diff --git a/api/src/main/java/api/ObjectDefinition.java b/runelite-api/src/main/java/net/runelite/api/ObjectDefinition.java similarity index 98% rename from api/src/main/java/api/ObjectDefinition.java rename to runelite-api/src/main/java/net/runelite/api/ObjectDefinition.java index 7c252f68bc..bc2e4f5b0a 100644 --- a/api/src/main/java/api/ObjectDefinition.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectDefinition.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents the template of a specific object. diff --git a/api/src/main/java/api/ObjectID.java b/runelite-api/src/main/java/net/runelite/api/ObjectID.java similarity index 99% rename from api/src/main/java/api/ObjectID.java rename to runelite-api/src/main/java/net/runelite/api/ObjectID.java index d74b085827..9d5ee32bfb 100644 --- a/api/src/main/java/api/ObjectID.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectID.java @@ -1,5 +1,5 @@ /* This file is automatically generated. Do not edit. */ -package api; +package net.runelite.api; public final class ObjectID { @@ -16133,7 +16133,7 @@ public final class ObjectID public static final int GRAND_EXCHANGE_BOOTH_30390 = 30390; public static final int IRON_LADDER_30391 = 30391; public static final int IRON_LADDER_30392 = 30392; - public static final int JADFEST_PORTAL = 30395; + public static final int MYSTERIOUS_POOL = 30395; public static final int SHIMMERING_BARRIER_30396 = 30396; public static final int SHIMMERING_BARRIER_30397 = 30397; public static final int SHIMMERING_BARRIER_30398 = 30398; @@ -17528,7 +17528,7 @@ public final class ObjectID public static final int FIRE_OF_DEHUMIDIFICATION = 33322; public static final int PILE_OF_RUBBLE_33340 = 33340; public static final int PILE_OF_RUBBLE_33341 = 33341; - public static final int HUB_PORTAL = 33343; + public static final int LARRANS_SMALL_CHEST = 33343; public static final int BROKEN_WALL_33344 = 33344; public static final int PORTAL_NEXUS_SPACE = 33346; public static final int RUG_SPACE_33347 = 33347; @@ -18605,5 +18605,10 @@ public final class ObjectID public static final int RUBBLE_34803 = 34803; public static final int RUBBLE_34804 = 34804; public static final int RUBBLE_34805 = 34805; + public static final int JADFEST_PORTAL = 34826; + public static final int HUB_PORTAL = 34827; + public static final int LARRANS_SMALL_CHEST_34828 = 34828; + public static final int LARRANS_BIG_CHEST = 34829; + public static final int LARRANS_BIG_CHEST_34830 = 34830; /* This file is automatically generated. Do not edit. */ } diff --git a/api/src/main/java/api/Opcodes.java b/runelite-api/src/main/java/net/runelite/api/Opcodes.java similarity index 98% rename from api/src/main/java/api/Opcodes.java rename to runelite-api/src/main/java/net/runelite/api/Opcodes.java index 79f90c7398..1ee96df082 100644 --- a/api/src/main/java/api/Opcodes.java +++ b/runelite-api/src/main/java/net/runelite/api/Opcodes.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Utility class containing ASM opcodes used by the RuneLite client. diff --git a/api/src/main/java/api/PacketBuffer.java b/runelite-api/src/main/java/net/runelite/api/PacketBuffer.java similarity index 98% rename from api/src/main/java/api/PacketBuffer.java rename to runelite-api/src/main/java/net/runelite/api/PacketBuffer.java index db693575f2..a44f4c9ac9 100644 --- a/api/src/main/java/api/PacketBuffer.java +++ b/runelite-api/src/main/java/net/runelite/api/PacketBuffer.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface PacketBuffer { diff --git a/api/src/main/java/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java similarity index 98% rename from api/src/main/java/api/Perspective.java rename to runelite-api/src/main/java/net/runelite/api/Perspective.java index c8f91a17bf..4d3f312386 100644 --- a/api/src/main/java/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -22,16 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.config.Constants; -import static api.config.Constants.TILE_FLAG_BRIDGE; -import api.coords.LocalPoint; -import api.model.Jarvis; -import api.model.Triangle; -import api.model.Vertex; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import static net.runelite.api.Constants.TILE_FLAG_BRIDGE; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Polygon; @@ -44,6 +37,12 @@ import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.model.Jarvis; +import net.runelite.api.model.Triangle; +import net.runelite.api.model.Vertex; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; /** * A utility class containing methods to help with conversion between @@ -556,7 +555,7 @@ public class Perspective for (Triangle triangle : triangles) { - api.model.Vertex _a = triangle.getA(); + net.runelite.api.model.Vertex _a = triangle.getA(); Point a = localToCanvas(client, point.getX() - _a.getX(), point.getY() - _a.getZ(), diff --git a/api/src/main/java/api/Player.java b/runelite-api/src/main/java/net/runelite/api/Player.java similarity index 99% rename from api/src/main/java/api/Player.java rename to runelite-api/src/main/java/net/runelite/api/Player.java index 1aac622930..7f77a461ee 100644 --- a/api/src/main/java/api/Player.java +++ b/runelite-api/src/main/java/net/runelite/api/Player.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.awt.Polygon; import javax.annotation.Nullable; diff --git a/api/src/main/java/api/PlayerAppearance.java b/runelite-api/src/main/java/net/runelite/api/PlayerAppearance.java similarity index 97% rename from api/src/main/java/api/PlayerAppearance.java rename to runelite-api/src/main/java/net/runelite/api/PlayerAppearance.java index b188d6be4e..2348968eda 100644 --- a/api/src/main/java/api/PlayerAppearance.java +++ b/runelite-api/src/main/java/net/runelite/api/PlayerAppearance.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.kit.KitType; +import net.runelite.api.kit.KitType; /** * Represents the template of a player. diff --git a/api/src/main/java/api/Point.java b/runelite-api/src/main/java/net/runelite/api/Point.java similarity index 99% rename from api/src/main/java/api/Point.java rename to runelite-api/src/main/java/net/runelite/api/Point.java index e88d14409d..1c97a43666 100644 --- a/api/src/main/java/api/Point.java +++ b/runelite-api/src/main/java/net/runelite/api/Point.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * A two-dimensional coordinate on the canvas. diff --git a/api/src/main/java/api/Prayer.java b/runelite-api/src/main/java/net/runelite/api/Prayer.java similarity index 54% rename from api/src/main/java/api/Prayer.java rename to runelite-api/src/main/java/net/runelite/api/Prayer.java index dbf1b63d30..6b4ea06e2b 100644 --- a/api/src/main/java/api/Prayer.java +++ b/runelite-api/src/main/java/net/runelite/api/Prayer.java @@ -22,157 +22,149 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.widgets.WidgetInfo; /** * An enumeration of different prayer spells. */ +@Getter +@AllArgsConstructor public enum Prayer { /** * Thick Skin (Level 1, Defence). */ - THICK_SKIN(Varbits.PRAYER_THICK_SKIN, 5.0), + THICK_SKIN(Varbits.PRAYER_THICK_SKIN, 5.0, WidgetInfo.PRAYER_THICK_SKIN), /** * Burst of Strength (Level 4, Strength). */ - BURST_OF_STRENGTH(Varbits.PRAYER_BURST_OF_STRENGTH, 5.0), + BURST_OF_STRENGTH(Varbits.PRAYER_BURST_OF_STRENGTH, 5.0, WidgetInfo.PRAYER_BURST_OF_STRENGTH), /** * Clarity of Thought (Level 7, Attack). */ - CLARITY_OF_THOUGHT(Varbits.PRAYER_CLARITY_OF_THOUGHT, 5.0), + CLARITY_OF_THOUGHT(Varbits.PRAYER_CLARITY_OF_THOUGHT, 5.0, WidgetInfo.PRAYER_CLARITY_OF_THOUGHT), /** * Sharp Eye (Level 8, Ranging). */ - SHARP_EYE(Varbits.PRAYER_SHARP_EYE, 5.0), + SHARP_EYE(Varbits.PRAYER_SHARP_EYE, 5.0, WidgetInfo.PRAYER_SHARP_EYE), /** * Mystic Will (Level 9, Magic). */ - MYSTIC_WILL(Varbits.PRAYER_MYSTIC_WILL, 5.0), + MYSTIC_WILL(Varbits.PRAYER_MYSTIC_WILL, 5.0, WidgetInfo.PRAYER_MYSTIC_WILL), /** * Rock Skin (Level 10, Defence). */ - ROCK_SKIN(Varbits.PRAYER_ROCK_SKIN, 10.0), + ROCK_SKIN(Varbits.PRAYER_ROCK_SKIN, 10.0, WidgetInfo.PRAYER_ROCK_SKIN), /** * Superhuman Strength (Level 13, Strength). */ - SUPERHUMAN_STRENGTH(Varbits.PRAYER_SUPERHUMAN_STRENGTH, 10.0), + SUPERHUMAN_STRENGTH(Varbits.PRAYER_SUPERHUMAN_STRENGTH, 10.0, WidgetInfo.PRAYER_SUPERHUMAN_STRENGTH), /** * Improved Reflexes (Level 16, Attack). */ - IMPROVED_REFLEXES(Varbits.PRAYER_IMPROVED_REFLEXES, 10.0), + IMPROVED_REFLEXES(Varbits.PRAYER_IMPROVED_REFLEXES, 10.0, WidgetInfo.PRAYER_IMPROVED_REFLEXES), /** * Rapid Restore (Level 19, Stats). */ - RAPID_RESTORE(Varbits.PRAYER_RAPID_RESTORE, 60.0 / 36.0), + RAPID_RESTORE(Varbits.PRAYER_RAPID_RESTORE, 60.0 / 36.0, WidgetInfo.PRAYER_RAPID_RESTORE), /** * Rapid Heal (Level 22, Hitpoints). */ - RAPID_HEAL(Varbits.PRAYER_RAPID_HEAL, 60.0 / 18), + RAPID_HEAL(Varbits.PRAYER_RAPID_HEAL, 60.0 / 18, WidgetInfo.PRAYER_RAPID_HEAL), /** * Protect Item (Level 25). */ - PROTECT_ITEM(Varbits.PRAYER_PROTECT_ITEM, 60.0 / 18), + PROTECT_ITEM(Varbits.PRAYER_PROTECT_ITEM, 60.0 / 18, WidgetInfo.PRAYER_PROTECT_ITEM), /** * Hawk Eye (Level 26, Ranging). */ - HAWK_EYE(Varbits.PRAYER_HAWK_EYE, 10.0), + HAWK_EYE(Varbits.PRAYER_HAWK_EYE, 10.0, WidgetInfo.PRAYER_HAWK_EYE), /** * Mystic Lore (Level 27, Magic). */ - MYSTIC_LORE(Varbits.PRAYER_MYSTIC_LORE, 10.0), + MYSTIC_LORE(Varbits.PRAYER_MYSTIC_LORE, 10.0, WidgetInfo.PRAYER_MYSTIC_LORE), /** * Steel Skin (Level 28, Defence). */ - STEEL_SKIN(Varbits.PRAYER_STEEL_SKIN, 20.0), + STEEL_SKIN(Varbits.PRAYER_STEEL_SKIN, 20.0, WidgetInfo.PRAYER_STEEL_SKIN), /** * Ultimate Strength (Level 31, Strength). */ - ULTIMATE_STRENGTH(Varbits.PRAYER_ULTIMATE_STRENGTH, 20.0), + ULTIMATE_STRENGTH(Varbits.PRAYER_ULTIMATE_STRENGTH, 20.0, WidgetInfo.PRAYER_ULTIMATE_STRENGTH), /** * Incredible Reflexes (Level 34, Attack). */ - INCREDIBLE_REFLEXES(Varbits.PRAYER_INCREDIBLE_REFLEXES, 20.0), + INCREDIBLE_REFLEXES(Varbits.PRAYER_INCREDIBLE_REFLEXES, 20.0, WidgetInfo.PRAYER_INCREDIBLE_REFLEXES), /** * Protect from Magic (Level 37). */ - PROTECT_FROM_MAGIC(Varbits.PRAYER_PROTECT_FROM_MAGIC, 20.0), + PROTECT_FROM_MAGIC(Varbits.PRAYER_PROTECT_FROM_MAGIC, 20.0, WidgetInfo.PRAYER_PROTECT_FROM_MAGIC), /** * Protect from Missiles (Level 40). */ - PROTECT_FROM_MISSILES(Varbits.PRAYER_PROTECT_FROM_MISSILES, 20.0), + PROTECT_FROM_MISSILES(Varbits.PRAYER_PROTECT_FROM_MISSILES, 20.0, WidgetInfo.PRAYER_PROTECT_FROM_MISSILES), /** * Protect from Melee (Level 43). */ - PROTECT_FROM_MELEE(Varbits.PRAYER_PROTECT_FROM_MELEE, 20.0), + PROTECT_FROM_MELEE(Varbits.PRAYER_PROTECT_FROM_MELEE, 20.0, WidgetInfo.PRAYER_PROTECT_FROM_MELEE), /** * Eagle Eye (Level 44, Ranging). */ - EAGLE_EYE(Varbits.PRAYER_EAGLE_EYE, 20.0), + EAGLE_EYE(Varbits.PRAYER_EAGLE_EYE, 20.0, WidgetInfo.PRAYER_EAGLE_EYE), /** * Mystic Might (Level 45, Magic). */ - MYSTIC_MIGHT(Varbits.PRAYER_MYSTIC_MIGHT, 20.0), + MYSTIC_MIGHT(Varbits.PRAYER_MYSTIC_MIGHT, 20.0, WidgetInfo.PRAYER_MYSTIC_MIGHT), /** * Retribution (Level 46). */ - RETRIBUTION(Varbits.PRAYER_RETRIBUTION, 5.0), + RETRIBUTION(Varbits.PRAYER_RETRIBUTION, 5.0, WidgetInfo.PRAYER_RETRIBUTION), /** * Redemption (Level 49). */ - REDEMPTION(Varbits.PRAYER_REDEMPTION, 10.0), + REDEMPTION(Varbits.PRAYER_REDEMPTION, 10.0, WidgetInfo.PRAYER_REDEMPTION), /** * Smite (Level 52). */ - SMITE(Varbits.PRAYER_SMITE, 30.0), + SMITE(Varbits.PRAYER_SMITE, 30.0, WidgetInfo.PRAYER_SMITE), /** * Chivalry (Level 60, Defence/Strength/Attack). */ - CHIVALRY(Varbits.PRAYER_CHIVALRY, 40.0), + CHIVALRY(Varbits.PRAYER_CHIVALRY, 40.0, WidgetInfo.PRAYER_CHIVALRY), /** * Piety (Level 70, Defence/Strength/Attack). */ - PIETY(Varbits.PRAYER_PIETY, 40.0), + PIETY(Varbits.PRAYER_PIETY, 40.0, WidgetInfo.PRAYER_PIETY), /** * Preserve (Level 55). */ - PRESERVE(Varbits.PRAYER_PRESERVE, 60.0 / 18), + PRESERVE(Varbits.PRAYER_PRESERVE, 60.0 / 18, WidgetInfo.PRAYER_PRESERVE), /** * Rigour (Level 74, Ranging/Damage/Defence). */ - RIGOUR(Varbits.PRAYER_RIGOUR, 40.0), + RIGOUR(Varbits.PRAYER_RIGOUR, 40.0, WidgetInfo.PRAYER_RIGOUR), /** * Augury (Level 77, Magic/Magic Def./Defence). */ - AUGURY(Varbits.PRAYER_AUGURY, 40.0); - - private final Varbits varbit; - - private final double drainRate; - - Prayer(Varbits varbit, double drainRate) - { - this.varbit = varbit; - this.drainRate = drainRate; - } + AUGURY(Varbits.PRAYER_AUGURY, 40.0, WidgetInfo.PRAYER_AUGURY); /** * Gets the varbit that stores whether the prayer is active or not. - * - * @return the prayer active varbit */ - public Varbits getVarbit() - { - return varbit; - } + private final Varbits varbit; /** * Gets the prayer drain rate (measured in pray points/minute) - * - * @return the prayer drain rate */ - public double getDrainRate() - { - return drainRate; - } -} + private final double drainRate; + + /** + * Gets the widget info for prayer + */ + private final WidgetInfo widgetInfo; + +} \ No newline at end of file diff --git a/api/src/main/java/api/Preferences.java b/runelite-api/src/main/java/net/runelite/api/Preferences.java similarity index 98% rename from api/src/main/java/api/Preferences.java rename to runelite-api/src/main/java/net/runelite/api/Preferences.java index 4a9aba913e..ec1fb0dad7 100644 --- a/api/src/main/java/api/Preferences.java +++ b/runelite-api/src/main/java/net/runelite/api/Preferences.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Stores the clients persisting preferences. diff --git a/api/src/main/java/api/Projectile.java b/runelite-api/src/main/java/net/runelite/api/Projectile.java similarity index 99% rename from api/src/main/java/api/Projectile.java rename to runelite-api/src/main/java/net/runelite/api/Projectile.java index d01b2c65a6..d298135af9 100644 --- a/api/src/main/java/api/Projectile.java +++ b/runelite-api/src/main/java/net/runelite/api/Projectile.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents a projectile entity (ie. cannonball, arrow). diff --git a/api/src/main/java/api/ProjectileID.java b/runelite-api/src/main/java/net/runelite/api/ProjectileID.java similarity index 98% rename from api/src/main/java/api/ProjectileID.java rename to runelite-api/src/main/java/net/runelite/api/ProjectileID.java index 66362a0b56..aa714128ea 100644 --- a/api/src/main/java/api/ProjectileID.java +++ b/runelite-api/src/main/java/net/runelite/api/ProjectileID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Utility class used for mapping projectile IDs. @@ -93,7 +93,7 @@ public class ProjectileID public static final int VORKATH_MAGIC = 1479; public static final int VORKATH_PRAYER_DISABLE = 1471; public static final int VORKATH_VENOM = 1470; - public static final int VORKATH_ICE = 350; + public static final int VORKATH_ICE = 395; public static final int HYDRA_MAGIC = 1662; public static final int HYDRA_RANGED = 1663; diff --git a/api/src/main/java/api/Query.java b/runelite-api/src/main/java/net/runelite/api/Query.java similarity index 98% rename from api/src/main/java/api/Query.java rename to runelite-api/src/main/java/net/runelite/api/Query.java index 0482e62ad8..12737f299a 100644 --- a/api/src/main/java/api/Query.java +++ b/runelite-api/src/main/java/net/runelite/api/Query.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.util.function.Predicate; diff --git a/api/src/main/java/api/Quest.java b/runelite-api/src/main/java/net/runelite/api/Quest.java similarity index 99% rename from api/src/main/java/api/Quest.java rename to runelite-api/src/main/java/net/runelite/api/Quest.java index 1218c23da6..2a2d5d13fd 100644 --- a/api/src/main/java/api/Quest.java +++ b/runelite-api/src/main/java/net/runelite/api/Quest.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.Getter; diff --git a/api/src/main/java/api/QuestState.java b/runelite-api/src/main/java/net/runelite/api/QuestState.java similarity index 98% rename from api/src/main/java/api/QuestState.java rename to runelite-api/src/main/java/net/runelite/api/QuestState.java index 87d5a27979..5738f3ec76 100644 --- a/api/src/main/java/api/QuestState.java +++ b/runelite-api/src/main/java/net/runelite/api/QuestState.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public enum QuestState { diff --git a/api/src/main/java/api/RenderOverview.java b/runelite-api/src/main/java/net/runelite/api/RenderOverview.java similarity index 97% rename from api/src/main/java/api/RenderOverview.java rename to runelite-api/src/main/java/net/runelite/api/RenderOverview.java index 2112e5d7d5..0a7fe45885 100644 --- a/api/src/main/java/api/RenderOverview.java +++ b/runelite-api/src/main/java/net/runelite/api/RenderOverview.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; /** * Represents an overview of the currently rendered world map. diff --git a/api/src/main/java/api/Renderable.java b/runelite-api/src/main/java/net/runelite/api/Renderable.java similarity index 98% rename from api/src/main/java/api/Renderable.java rename to runelite-api/src/main/java/net/runelite/api/Renderable.java index 52f0cf64f4..d8d2114a8d 100644 --- a/api/src/main/java/api/Renderable.java +++ b/runelite-api/src/main/java/net/runelite/api/Renderable.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents an object that can be rendered. diff --git a/api/src/main/java/api/Scene.java b/runelite-api/src/main/java/net/runelite/api/Scene.java similarity index 98% rename from api/src/main/java/api/Scene.java rename to runelite-api/src/main/java/net/runelite/api/Scene.java index d7df98982d..53cc8fcb15 100644 --- a/api/src/main/java/api/Scene.java +++ b/runelite-api/src/main/java/net/runelite/api/Scene.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents the entire 3D scene diff --git a/api/src/main/java/api/SceneTileModel.java b/runelite-api/src/main/java/net/runelite/api/SceneTileModel.java similarity index 98% rename from api/src/main/java/api/SceneTileModel.java rename to runelite-api/src/main/java/net/runelite/api/SceneTileModel.java index 10e7729ed0..b7abcab08f 100644 --- a/api/src/main/java/api/SceneTileModel.java +++ b/runelite-api/src/main/java/net/runelite/api/SceneTileModel.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents the model of a tile in the current scene. diff --git a/api/src/main/java/api/SceneTilePaint.java b/runelite-api/src/main/java/net/runelite/api/SceneTilePaint.java similarity index 98% rename from api/src/main/java/api/SceneTilePaint.java rename to runelite-api/src/main/java/net/runelite/api/SceneTilePaint.java index 1d3e6f2c8c..0247c17e8f 100644 --- a/api/src/main/java/api/SceneTilePaint.java +++ b/runelite-api/src/main/java/net/runelite/api/SceneTilePaint.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents the paint of a tile in the current scene. diff --git a/api/src/main/java/api/Script.java b/runelite-api/src/main/java/net/runelite/api/Script.java similarity index 98% rename from api/src/main/java/api/Script.java rename to runelite-api/src/main/java/net/runelite/api/Script.java index 9b5e7a6771..eefe0dd08a 100644 --- a/api/src/main/java/api/Script.java +++ b/runelite-api/src/main/java/net/runelite/api/Script.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface Script extends Node { diff --git a/api/src/main/java/api/ScriptEvent.java b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java similarity index 93% rename from api/src/main/java/api/ScriptEvent.java rename to runelite-api/src/main/java/net/runelite/api/ScriptEvent.java index 3400f86735..743c512847 100644 --- a/api/src/main/java/api/ScriptEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.widgets.Widget; +import net.runelite.api.widgets.Widget; public interface ScriptEvent { @@ -43,7 +43,7 @@ public interface ScriptEvent * Gets the widget of the event. * * @return the widget - * @see api.widgets.Widget + * @see Widget */ Widget getSource(); @@ -58,7 +58,7 @@ public interface ScriptEvent * Gets the target of the menu option * * @return the target - * @see api.events.MenuOptionClicked + * @see net.runelite.api.events.MenuOptionClicked */ String getOpbase(); } diff --git a/api/src/main/java/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java similarity index 94% rename from api/src/main/java/api/ScriptID.java rename to runelite-api/src/main/java/net/runelite/api/ScriptID.java index 18149b7352..62acbe1454 100644 --- a/api/src/main/java/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public final class ScriptID { @@ -110,6 +110,16 @@ public final class ScriptID */ public static final int KEPT_LOST_ITEM_EXAMINE = 1603; + /** + * Displays the game messages when clicking on an item inside the Items Kept on Death interface + *

    + *
  • int (boolean) Item kept on death
  • + *
  • int Item Quantity
  • + *
  • String Item Name
  • + *
+ */ + public static final int DEATH_KEEP_ITEM_EXAMINE = 1603; + /** * Checks the state of the given stash unit. *
    diff --git a/api/src/main/java/api/Skill.java b/runelite-api/src/main/java/net/runelite/api/Skill.java similarity index 97% rename from api/src/main/java/api/Skill.java rename to runelite-api/src/main/java/net/runelite/api/Skill.java index 484a0b2994..db84b6f364 100644 --- a/api/src/main/java/api/Skill.java +++ b/runelite-api/src/main/java/net/runelite/api/Skill.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; /** * An enumeration of skills that a player can level. diff --git a/api/src/main/java/api/SkullIcon.java b/runelite-api/src/main/java/net/runelite/api/SkullIcon.java similarity index 98% rename from api/src/main/java/api/SkullIcon.java rename to runelite-api/src/main/java/net/runelite/api/SkullIcon.java index 686ed19597..f16cbc2ef9 100644 --- a/api/src/main/java/api/SkullIcon.java +++ b/runelite-api/src/main/java/net/runelite/api/SkullIcon.java @@ -23,7 +23,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * An enumeration of PK skulls. diff --git a/api/src/main/java/api/SoundEffectID.java b/runelite-api/src/main/java/net/runelite/api/SoundEffectID.java similarity index 99% rename from api/src/main/java/api/SoundEffectID.java rename to runelite-api/src/main/java/net/runelite/api/SoundEffectID.java index 7732d23090..6e794bab9b 100644 --- a/api/src/main/java/api/SoundEffectID.java +++ b/runelite-api/src/main/java/net/runelite/api/SoundEffectID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Utility class used for mapping sound effect IDs. diff --git a/runelite-api/src/main/java/net/runelite/api/SoundEffectVolume.java b/runelite-api/src/main/java/net/runelite/api/SoundEffectVolume.java new file mode 100644 index 0000000000..dee7d7c9c1 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/SoundEffectVolume.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018, trimbe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +/** + * Volume values for each of the stops on the volume interface + */ +public final class SoundEffectVolume +{ + public static final int MUTED = 0; + public static final int LOW = 32; + public static final int MEDIUM_LOW = 64; + public static final int MEDIUM_HIGH = 96; + public static final int HIGH = 127; +} diff --git a/api/src/main/java/api/Sprite.java b/runelite-api/src/main/java/net/runelite/api/Sprite.java similarity index 99% rename from api/src/main/java/api/Sprite.java rename to runelite-api/src/main/java/net/runelite/api/Sprite.java index fb605e76ec..b6fed1bab4 100644 --- a/api/src/main/java/api/Sprite.java +++ b/runelite-api/src/main/java/net/runelite/api/Sprite.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import java.awt.Color; import java.awt.image.BufferedImage; diff --git a/api/src/main/java/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java similarity index 98% rename from api/src/main/java/api/SpriteID.java rename to runelite-api/src/main/java/net/runelite/api/SpriteID.java index b6290fe527..a0c35e0367 100644 --- a/api/src/main/java/api/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; // Note: This class won't always be complete: these sprites were manually gathered // through the cache and widget inspector. Please add new sprites as you happen to use them. @@ -1564,9 +1564,28 @@ public final class SpriteID public static final int MOBILE_FUNCTION_MODE_DISABLED = 1624; public static final int MOBILE_YELLOW_TOUCH_ANIMATION_1 = 1625; public static final int MOBILE_YELLOW_TOUCH_ANIMATION_2 = 1626; + /* Unmapped: 1627~1707 */ public static final int TAB_MAGIC_SPELLBOOK_ARCEUUS_UNUSED = 1708; + /* Unmapped: 1709, 1710 */ public static final int TAB_MAGIC_SPELLBOOK_ARCEUUS = 1711; public static final int BIG_ASS_GUTHIX_SPELL = 1774; public static final int BIG_SUPERHEAT = 1800; public static final int BIG_SPEC_TRANSFER = 1959; + /* Unmapped: 1712~2175 */ + public static final int HEALTHBAR_DEFAULT_FRONT_30PX = 2176; + public static final int HEALTHBAR_DEFAULT_BACK_30PX = 2177; + public static final int HEALTHBAR_DEFAULT_FRONT_50PX = 2178; + public static final int HEALTHBAR_DEFAULT_BACK_50PX = 2179; + public static final int HEALTHBAR_DEFAULT_FRONT_60PX = 2180; + public static final int HEALTHBAR_DEFAULT_BACK_60PX = 2181; + public static final int HEALTHBAR_DEFAULT_FRONT_80PX = 2182; + public static final int HEALTHBAR_DEFAULT_BACK_80PX = 2183; + public static final int HEALTHBAR_DEFAULT_FRONT_100PX = 2184; + public static final int HEALTHBAR_DEFAULT_BACK_100PX = 2185; + public static final int HEALTHBAR_DEFAULT_FRONT_120PX = 2186; + public static final int HEALTHBAR_DEFAULT_BACK_120PX = 2187; + public static final int HEALTHBAR_DEFAULT_FRONT_140PX = 2188; + public static final int HEALTHBAR_DEFAULT_BACK_140PX = 2189; + public static final int HEALTHBAR_DEFAULT_FRONT_160PX = 2190; + public static final int HEALTHBAR_DEFAULT_BACK_160PX = 2191; } diff --git a/api/src/main/java/api/Texture.java b/runelite-api/src/main/java/net/runelite/api/Texture.java similarity index 98% rename from api/src/main/java/api/Texture.java rename to runelite-api/src/main/java/net/runelite/api/Texture.java index 979aac064e..80a4d1a45a 100644 --- a/api/src/main/java/api/Texture.java +++ b/runelite-api/src/main/java/net/runelite/api/Texture.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface Texture extends Node { diff --git a/api/src/main/java/api/TextureProvider.java b/runelite-api/src/main/java/net/runelite/api/TextureProvider.java similarity index 98% rename from api/src/main/java/api/TextureProvider.java rename to runelite-api/src/main/java/net/runelite/api/TextureProvider.java index 751f3ab804..b7df733438 100644 --- a/api/src/main/java/api/TextureProvider.java +++ b/runelite-api/src/main/java/net/runelite/api/TextureProvider.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; public interface TextureProvider { diff --git a/api/src/main/java/api/Tile.java b/runelite-api/src/main/java/net/runelite/api/Tile.java similarity index 96% rename from api/src/main/java/api/Tile.java rename to runelite-api/src/main/java/net/runelite/api/Tile.java index e0e4394ee7..e33023c172 100644 --- a/api/src/main/java/api/Tile.java +++ b/runelite-api/src/main/java/net/runelite/api/Tile.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import java.util.List; /** diff --git a/api/src/main/java/api/TileObject.java b/runelite-api/src/main/java/net/runelite/api/TileObject.java similarity index 96% rename from api/src/main/java/api/TileObject.java rename to runelite-api/src/main/java/net/runelite/api/TileObject.java index b89c3bd174..fa8e595612 100644 --- a/api/src/main/java/api/TileObject.java +++ b/runelite-api/src/main/java/net/runelite/api/TileObject.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.geom.Area; diff --git a/api/src/main/java/api/VarClientInt.java b/runelite-api/src/main/java/net/runelite/api/VarClientInt.java similarity index 98% rename from api/src/main/java/api/VarClientInt.java rename to runelite-api/src/main/java/net/runelite/api/VarClientInt.java index b10c1c1729..27df154f62 100644 --- a/api/src/main/java/api/VarClientInt.java +++ b/runelite-api/src/main/java/net/runelite/api/VarClientInt.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/api/src/main/java/api/VarClientStr.java b/runelite-api/src/main/java/net/runelite/api/VarClientStr.java similarity index 98% rename from api/src/main/java/api/VarClientStr.java rename to runelite-api/src/main/java/net/runelite/api/VarClientStr.java index 56f6dae5f3..79cfe1982b 100644 --- a/api/src/main/java/api/VarClientStr.java +++ b/runelite-api/src/main/java/net/runelite/api/VarClientStr.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/api/src/main/java/api/VarPlayer.java b/runelite-api/src/main/java/net/runelite/api/VarPlayer.java similarity index 99% rename from api/src/main/java/api/VarPlayer.java rename to runelite-api/src/main/java/net/runelite/api/VarPlayer.java index 0eb1e6a744..db9f9908d3 100644 --- a/api/src/main/java/api/VarPlayer.java +++ b/runelite-api/src/main/java/net/runelite/api/VarPlayer.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.AllArgsConstructor; import lombok.Getter; @@ -55,6 +55,7 @@ public enum VarPlayer NMZ_REWARD_POINTS(1060), ATTACKING_PLAYER(1075), + /** * -1 : Poison immune * Normal poison damage is ceil( this / 5.0f ) diff --git a/api/src/main/java/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java similarity index 97% rename from api/src/main/java/api/Varbits.java rename to runelite-api/src/main/java/net/runelite/api/Varbits.java index 7ca45356d6..1d6709bc0a 100644 --- a/api/src/main/java/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; import lombok.AllArgsConstructor; import lombok.Getter; @@ -295,6 +295,15 @@ public enum Varbits THEATRE_OF_BLOOD(6440), BLOAT_DOOR(6447), + /** + * Theatre of Blood orb varbits each number stands for the player's health on a scale of 1-27 (I think), 0 hides the orb + */ + THEATRE_OF_BLOOD_ORB_1(6442), + THEATRE_OF_BLOOD_ORB_2(6443), + THEATRE_OF_BLOOD_ORB_3(6444), + THEATRE_OF_BLOOD_ORB_4(6445), + THEATRE_OF_BLOOD_ORB_5(6446), + /** * Nightmare Zone */ diff --git a/api/src/main/java/api/WallObject.java b/runelite-api/src/main/java/net/runelite/api/WallObject.java similarity index 96% rename from api/src/main/java/api/WallObject.java rename to runelite-api/src/main/java/net/runelite/api/WallObject.java index e9942dd987..67bd09fbb5 100644 --- a/api/src/main/java/api/WallObject.java +++ b/runelite-api/src/main/java/net/runelite/api/WallObject.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents the wall of a tile, which is an un-passable boundary. @@ -52,4 +52,7 @@ public interface WallObject extends TileObject Renderable getRenderable1(); Renderable getRenderable2(); + + Model getModelA(); + Model getModelB(); } diff --git a/api/src/main/java/api/WidgetNode.java b/runelite-api/src/main/java/net/runelite/api/WidgetNode.java similarity index 89% rename from api/src/main/java/api/WidgetNode.java rename to runelite-api/src/main/java/net/runelite/api/WidgetNode.java index 03ab3885a4..f44b6bf461 100644 --- a/api/src/main/java/api/WidgetNode.java +++ b/runelite-api/src/main/java/net/runelite/api/WidgetNode.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; /** * Represents a widget as an iterable node. diff --git a/api/src/main/java/api/World.java b/runelite-api/src/main/java/net/runelite/api/World.java similarity index 98% rename from api/src/main/java/api/World.java rename to runelite-api/src/main/java/net/runelite/api/World.java index 2d5e69f59a..19829149a0 100644 --- a/api/src/main/java/api/World.java +++ b/runelite-api/src/main/java/net/runelite/api/World.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; import java.util.EnumSet; /** diff --git a/api/src/main/java/api/WorldMapData.java b/runelite-api/src/main/java/net/runelite/api/WorldMapData.java similarity index 98% rename from api/src/main/java/api/WorldMapData.java rename to runelite-api/src/main/java/net/runelite/api/WorldMapData.java index 693213016b..d3370a4ac2 100644 --- a/api/src/main/java/api/WorldMapData.java +++ b/runelite-api/src/main/java/net/runelite/api/WorldMapData.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Represents data on the world map. diff --git a/api/src/main/java/api/WorldMapManager.java b/runelite-api/src/main/java/net/runelite/api/WorldMapManager.java similarity index 98% rename from api/src/main/java/api/WorldMapManager.java rename to runelite-api/src/main/java/net/runelite/api/WorldMapManager.java index e0c8db9917..67abc42795 100644 --- a/api/src/main/java/api/WorldMapManager.java +++ b/runelite-api/src/main/java/net/runelite/api/WorldMapManager.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api; /** * Manages the world map. diff --git a/api/src/main/java/api/WorldType.java b/runelite-api/src/main/java/net/runelite/api/WorldType.java similarity index 55% rename from api/src/main/java/api/WorldType.java rename to runelite-api/src/main/java/net/runelite/api/WorldType.java index b778ad30c3..ec44fedd09 100644 --- a/api/src/main/java/api/WorldType.java +++ b/runelite-api/src/main/java/net/runelite/api/WorldType.java @@ -1,4 +1,4 @@ -package api; +package net.runelite.api; import java.util.Collection; import java.util.EnumSet; @@ -62,6 +62,40 @@ public enum WorldType PVP, SEASONAL_DEADMAN ); + + private static final EnumSet DEADMAN_WORLD_TYPES = EnumSet.of( + DEADMAN, + DEADMAN_TOURNAMENT, + SEASONAL_DEADMAN + ); + + private static final EnumSet HIGHRISK_WORLD_TYPES = EnumSet.of( + HIGH_RISK + ); + + private static final EnumSet ALL_HIGHRISK_WORLD_TYPES = EnumSet.of( + HIGH_RISK, + DEADMAN, + DEADMAN_TOURNAMENT, + SEASONAL_DEADMAN + ); + + private static final EnumSet ALL_PVP_WORLD_TYPES = EnumSet.of( + HIGH_RISK, + DEADMAN, + DEADMAN_TOURNAMENT, + PVP, + SEASONAL_DEADMAN + ); + + private static final EnumSet ALL_PK_WORLD_TYPES = EnumSet.of( + HIGH_RISK, + DEADMAN, + DEADMAN_TOURNAMENT, + PVP, + SEASONAL_DEADMAN, + BOUNTY + ); /** * Create enum set of world types from mask. @@ -103,14 +137,39 @@ public enum WorldType } /** - * Checks whether a world having a {@link Collection} of {@link WorldType}s is a PVP world. + * Checks whether a world having a {@link Collection} of {@link WorldType}s is a PVP/DEADMAN/HIGHRISK world. * * @param worldTypes A {@link Collection} of {@link WorldType}s describing the given world. - * @return True if the given worldtypes of the world are a PVP world, false otherwise. + * @return True if the given worldtypes of the world are a PVP/DEADMAN/HIGHRISK world, false otherwise. * @see Client#getWorldType() */ public static boolean isPvpWorld(final Collection worldTypes) { return worldTypes.stream().anyMatch(PVP_WORLD_TYPES::contains); } + + public static boolean isDeadmanWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(DEADMAN_WORLD_TYPES::contains); + } + + public static boolean isHighRiskWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(HIGHRISK_WORLD_TYPES::contains); + } + + public static boolean isAllHighRiskWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(ALL_HIGHRISK_WORLD_TYPES::contains); + } + + public static boolean isAllPvpWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(ALL_PVP_WORLD_TYPES::contains); + } + + public static boolean isAllPKWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(ALL_PK_WORLD_TYPES::contains); + } } diff --git a/api/src/main/java/api/annotations/VisibleForDevtools.java b/runelite-api/src/main/java/net/runelite/api/annotations/VisibleForDevtools.java similarity index 97% rename from api/src/main/java/api/annotations/VisibleForDevtools.java rename to runelite-api/src/main/java/net/runelite/api/annotations/VisibleForDevtools.java index f9e2d32711..9357969d16 100644 --- a/api/src/main/java/api/annotations/VisibleForDevtools.java +++ b/runelite-api/src/main/java/net/runelite/api/annotations/VisibleForDevtools.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.annotations; +package net.runelite.api.annotations; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/api/src/main/java/api/Constants.java b/runelite-api/src/main/java/net/runelite/api/config/Constants.java similarity index 99% rename from api/src/main/java/api/Constants.java rename to runelite-api/src/main/java/net/runelite/api/config/Constants.java index 8fff5d1c52..7d385420ee 100644 --- a/api/src/main/java/api/Constants.java +++ b/runelite-api/src/main/java/net/runelite/api/config/Constants.java @@ -23,7 +23,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.api.config; import java.awt.Dimension; diff --git a/api/src/main/java/api/coords/Angle.java b/runelite-api/src/main/java/net/runelite/api/coords/Angle.java similarity index 90% rename from api/src/main/java/api/coords/Angle.java rename to runelite-api/src/main/java/net/runelite/api/coords/Angle.java index f92f2f032a..db97e8f52f 100644 --- a/api/src/main/java/api/coords/Angle.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/Angle.java @@ -22,12 +22,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.coords; +package net.runelite.api.coords; -import static api.coords.Direction.EAST; -import static api.coords.Direction.NORTH; -import static api.coords.Direction.SOUTH; -import static api.coords.Direction.WEST; +import static net.runelite.api.coords.Direction.EAST; +import static net.runelite.api.coords.Direction.NORTH; +import static net.runelite.api.coords.Direction.SOUTH; +import static net.runelite.api.coords.Direction.WEST; import lombok.Value; /** diff --git a/api/src/main/java/api/coords/Direction.java b/runelite-api/src/main/java/net/runelite/api/coords/Direction.java similarity index 98% rename from api/src/main/java/api/coords/Direction.java rename to runelite-api/src/main/java/net/runelite/api/coords/Direction.java index 96d9fb11da..de8447389f 100644 --- a/api/src/main/java/api/coords/Direction.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/Direction.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.coords; +package net.runelite.api.coords; /** * Represents the four main cardinal points. diff --git a/api/src/main/java/api/coords/LocalPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/LocalPoint.java similarity index 97% rename from api/src/main/java/api/coords/LocalPoint.java rename to runelite-api/src/main/java/net/runelite/api/coords/LocalPoint.java index d34460608b..bf1c032426 100644 --- a/api/src/main/java/api/coords/LocalPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/LocalPoint.java @@ -23,10 +23,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.coords; +package net.runelite.api.coords; -import api.Client; -import api.Perspective; +import net.runelite.api.Client; +import net.runelite.api.Perspective; import javax.annotation.Nullable; import lombok.Value; diff --git a/api/src/main/java/api/coords/WorldArea.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java similarity index 98% rename from api/src/main/java/api/coords/WorldArea.java rename to runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java index 9062d29343..105bf9fa89 100644 --- a/api/src/main/java/api/coords/WorldArea.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java @@ -22,18 +22,18 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.coords; +package net.runelite.api.coords; -import api.Client; -import api.CollisionData; -import api.CollisionDataFlag; -import api.Point; -import api.Tile; -import api.config.Constants; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.CollisionData; +import net.runelite.api.CollisionDataFlag; +import net.runelite.api.Point; +import net.runelite.api.Tile; +import net.runelite.api.Constants; /** * Represents an area on the world. diff --git a/api/src/main/java/api/coords/WorldPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java similarity index 90% rename from api/src/main/java/api/coords/WorldPoint.java rename to runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java index 851a000eff..fb1291273a 100644 --- a/api/src/main/java/api/coords/WorldPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java @@ -23,16 +23,16 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.coords; +package net.runelite.api.coords; -import api.Client; -import api.Perspective; -import static api.config.Constants.CHUNK_SIZE; +import static net.runelite.api.Constants.CHUNK_SIZE; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import lombok.Value; +import net.runelite.api.Client; +import net.runelite.api.Perspective; /** * A three-dimensional point representing the coordinate of a Tile. @@ -305,6 +305,40 @@ public class WorldPoint return Math.max(Math.abs(getX() - other.getX()), Math.abs(getY() - other.getY())); } + /** + * Gets the straight-line distance between this point and another. + *

    + * If the other point is not on the same plane, this method will return + * {@link Float#MAX_VALUE}. If ignoring the plane is wanted, use the + * {@link #distanceTo2DHypotenuse(WorldPoint)} method. + * + * @param other other point + * @return the straight-line distance + */ + public float distanceToHypotenuse(WorldPoint other) + { + if (other.plane != plane) + { + return Float.MAX_VALUE; + } + + return distanceTo2DHypotenuse(other); + } + + /** + * Find the straight-line distance from this point to another point. + *

    + * This method disregards the plane value of the two tiles and returns + * the simple distance between the X-Z coordinate pairs. + * + * @param other other point + * @return the straight-line distance + */ + public float distanceTo2DHypotenuse(WorldPoint other) + { + return (float) Math.hypot(getX() - other.getX(), getY() - other.getY()); + } + /** * Converts the passed scene coordinates to a world space */ diff --git a/api/src/main/java/api/events/AnimationChanged.java b/runelite-api/src/main/java/net/runelite/api/events/AnimationChanged.java similarity index 79% rename from api/src/main/java/api/events/AnimationChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/AnimationChanged.java index ccfed921fe..0c4e1d5b68 100644 --- a/api/src/main/java/api/events/AnimationChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/AnimationChanged.java @@ -1,7 +1,8 @@ -package api.events; +package net.runelite.api.events; -import api.Actor; +import net.runelite.api.Actor; import lombok.Data; +import net.runelite.api.Actor; /** * An event where the {@link Actor} has changed animations. @@ -14,7 +15,7 @@ import lombok.Data; *

  • A player starts or stops dancing
  • *
* - * @see api.AnimationID + * @see net.runelite.api.AnimationID */ @Data public class AnimationChanged diff --git a/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java new file mode 100644 index 0000000000..488bff8264 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018, WooxSolo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.events; + +import lombok.Data; + +@Data +public class AreaSoundEffectPlayed +{ + private int soundId; + private int sceneX; + private int sceneY; + private int range; + private int delay; +} diff --git a/api/src/main/java/api/events/BeforeMenuRender.java b/runelite-api/src/main/java/net/runelite/api/events/BeforeMenuRender.java similarity index 97% rename from api/src/main/java/api/events/BeforeMenuRender.java rename to runelite-api/src/main/java/net/runelite/api/events/BeforeMenuRender.java index 4387e06cee..5d1e10994b 100644 --- a/api/src/main/java/api/events/BeforeMenuRender.java +++ b/runelite-api/src/main/java/net/runelite/api/events/BeforeMenuRender.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/BeforeRender.java b/runelite-api/src/main/java/net/runelite/api/events/BeforeRender.java similarity index 97% rename from api/src/main/java/api/events/BeforeRender.java rename to runelite-api/src/main/java/net/runelite/api/events/BeforeRender.java index 3c1167437f..741041e1e0 100644 --- a/api/src/main/java/api/events/BeforeRender.java +++ b/runelite-api/src/main/java/net/runelite/api/events/BeforeRender.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; /** * Posted at the start of every frame diff --git a/api/src/main/java/api/events/BoostedLevelChanged.java b/runelite-api/src/main/java/net/runelite/api/events/BoostedLevelChanged.java similarity index 93% rename from api/src/main/java/api/events/BoostedLevelChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/BoostedLevelChanged.java index 6262bdce8b..a465e3b407 100644 --- a/api/src/main/java/api/events/BoostedLevelChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/BoostedLevelChanged.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Skill; +import net.runelite.api.Skill; import lombok.Data; /** @@ -38,7 +38,7 @@ import lombok.Data; *
  • Levelling up a skill
  • * *

    - * Use {@link api.Client#getBoostedSkillLevel(Skill)} in order to + * Use {@link net.runelite.api.Client#getBoostedSkillLevel(Skill)} in order to * retrieve the newly boosted skill level. */ @Data diff --git a/api/src/main/java/api/events/CannonballFired.java b/runelite-api/src/main/java/net/runelite/api/events/CannonballFired.java similarity index 97% rename from api/src/main/java/api/events/CannonballFired.java rename to runelite-api/src/main/java/net/runelite/api/events/CannonballFired.java index e030e8e727..077a88096d 100644 --- a/api/src/main/java/api/events/CannonballFired.java +++ b/runelite-api/src/main/java/net/runelite/api/events/CannonballFired.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; /** * an event posted when a cannonball is fired diff --git a/api/src/main/java/api/events/CanvasSizeChanged.java b/runelite-api/src/main/java/net/runelite/api/events/CanvasSizeChanged.java similarity index 97% rename from api/src/main/java/api/events/CanvasSizeChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/CanvasSizeChanged.java index b417ed8559..e76e82dd6d 100644 --- a/api/src/main/java/api/events/CanvasSizeChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/CanvasSizeChanged.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; /** * An event posted when the canvas size might have changed. diff --git a/api/src/main/java/api/events/ChatMessage.java b/runelite-api/src/main/java/net/runelite/api/events/ChatMessage.java similarity index 95% rename from api/src/main/java/api/events/ChatMessage.java rename to runelite-api/src/main/java/net/runelite/api/events/ChatMessage.java index 94698ff25b..791ec350b3 100644 --- a/api/src/main/java/api/events/ChatMessage.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ChatMessage.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.ChatMessageType; -import api.MessageNode; +import net.runelite.api.ChatMessageType; +import net.runelite.api.MessageNode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/api/src/main/java/api/events/ClanChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java similarity index 97% rename from api/src/main/java/api/events/ClanChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java index c83dffa61c..e39dbc400e 100644 --- a/api/src/main/java/api/events/ClanChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Value; diff --git a/api/src/main/java/api/events/ClanMemberJoined.java b/runelite-api/src/main/java/net/runelite/api/events/ClanMemberJoined.java similarity index 95% rename from api/src/main/java/api/events/ClanMemberJoined.java rename to runelite-api/src/main/java/net/runelite/api/events/ClanMemberJoined.java index 446471a8ca..c0a694555b 100644 --- a/api/src/main/java/api/events/ClanMemberJoined.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ClanMemberJoined.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.ClanMember; +import net.runelite.api.ClanMember; import lombok.Value; @Value diff --git a/api/src/main/java/api/events/ClanMemberLeft.java b/runelite-api/src/main/java/net/runelite/api/events/ClanMemberLeft.java similarity index 95% rename from api/src/main/java/api/events/ClanMemberLeft.java rename to runelite-api/src/main/java/net/runelite/api/events/ClanMemberLeft.java index ca6683f427..c403261532 100644 --- a/api/src/main/java/api/events/ClanMemberLeft.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ClanMemberLeft.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.ClanMember; +import net.runelite.api.ClanMember; import lombok.Value; @Value diff --git a/api/src/main/java/api/events/ClientTick.java b/runelite-api/src/main/java/net/runelite/api/events/ClientTick.java similarity index 97% rename from api/src/main/java/api/events/ClientTick.java rename to runelite-api/src/main/java/net/runelite/api/events/ClientTick.java index d102e42072..369ff7982a 100644 --- a/api/src/main/java/api/events/ClientTick.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ClientTick.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; /** * Posted every client tick diff --git a/api/src/main/java/api/events/CommandExecuted.java b/runelite-api/src/main/java/net/runelite/api/events/CommandExecuted.java similarity index 98% rename from api/src/main/java/api/events/CommandExecuted.java rename to runelite-api/src/main/java/net/runelite/api/events/CommandExecuted.java index 71e747e350..d0dfae5ff2 100644 --- a/api/src/main/java/api/events/CommandExecuted.java +++ b/runelite-api/src/main/java/net/runelite/api/events/CommandExecuted.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Value; diff --git a/api/src/main/java/api/events/ConfigChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ConfigChanged.java similarity index 98% rename from api/src/main/java/api/events/ConfigChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/ConfigChanged.java index 7b346a66c2..f27f4819cb 100644 --- a/api/src/main/java/api/events/ConfigChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ConfigChanged.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/DecorativeObjectChanged.java b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectChanged.java similarity index 94% rename from api/src/main/java/api/events/DecorativeObjectChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectChanged.java index c5969d5377..a18683d7b4 100644 --- a/api/src/main/java/api/events/DecorativeObjectChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectChanged.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.DecorativeObject; -import api.Tile; +import net.runelite.api.DecorativeObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/DecorativeObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectDespawned.java similarity index 94% rename from api/src/main/java/api/events/DecorativeObjectDespawned.java rename to runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectDespawned.java index 3c5d524f0f..94c06488c7 100644 --- a/api/src/main/java/api/events/DecorativeObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectDespawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.DecorativeObject; -import api.Tile; +import net.runelite.api.DecorativeObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/DecorativeObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectSpawned.java similarity index 94% rename from api/src/main/java/api/events/DecorativeObjectSpawned.java rename to runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectSpawned.java index 529398d02f..fe8d17862f 100644 --- a/api/src/main/java/api/events/DecorativeObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectSpawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.DecorativeObject; -import api.Tile; +import net.runelite.api.DecorativeObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/DraggingWidgetChanged.java b/runelite-api/src/main/java/net/runelite/api/events/DraggingWidgetChanged.java similarity index 98% rename from api/src/main/java/api/events/DraggingWidgetChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/DraggingWidgetChanged.java index 54a365cabe..8aef02d570 100644 --- a/api/src/main/java/api/events/DraggingWidgetChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/DraggingWidgetChanged.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/ExperienceChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ExperienceChanged.java similarity index 96% rename from api/src/main/java/api/events/ExperienceChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/ExperienceChanged.java index 85981fc51e..587efd4f41 100644 --- a/api/src/main/java/api/events/ExperienceChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ExperienceChanged.java @@ -23,9 +23,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Skill; +import net.runelite.api.Skill; import lombok.Data; /** diff --git a/api/src/main/java/api/events/FocusChanged.java b/runelite-api/src/main/java/net/runelite/api/events/FocusChanged.java similarity index 98% rename from api/src/main/java/api/events/FocusChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/FocusChanged.java index da12f9929d..fd9fcb6466 100644 --- a/api/src/main/java/api/events/FocusChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/FocusChanged.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/GameObjectChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GameObjectChanged.java similarity index 94% rename from api/src/main/java/api/events/GameObjectChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/GameObjectChanged.java index fd558d1720..117ad81f60 100644 --- a/api/src/main/java/api/events/GameObjectChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameObjectChanged.java @@ -22,11 +22,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GameObject; -import api.Tile; import lombok.Data; +import net.runelite.api.GameObject; +import net.runelite.api.Tile; /** * An event where a {@link GameObject} on a {@link Tile} has been replaced. diff --git a/api/src/main/java/api/events/GameObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/GameObjectDespawned.java similarity index 94% rename from api/src/main/java/api/events/GameObjectDespawned.java rename to runelite-api/src/main/java/net/runelite/api/events/GameObjectDespawned.java index 7e334698b5..5d2e9fad1a 100644 --- a/api/src/main/java/api/events/GameObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameObjectDespawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GameObject; -import api.Tile; +import net.runelite.api.GameObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/GameObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/GameObjectSpawned.java similarity index 94% rename from api/src/main/java/api/events/GameObjectSpawned.java rename to runelite-api/src/main/java/net/runelite/api/events/GameObjectSpawned.java index 04bcc4697e..5dfc301066 100644 --- a/api/src/main/java/api/events/GameObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameObjectSpawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GameObject; -import api.Tile; +import net.runelite.api.GameObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/GameStateChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GameStateChanged.java similarity index 95% rename from api/src/main/java/api/events/GameStateChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/GameStateChanged.java index f59d35e003..2a0b61fc40 100644 --- a/api/src/main/java/api/events/GameStateChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameStateChanged.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GameState; +import net.runelite.api.GameState; import lombok.Data; /** diff --git a/api/src/main/java/api/events/GameTick.java b/runelite-api/src/main/java/net/runelite/api/events/GameTick.java similarity index 98% rename from api/src/main/java/api/events/GameTick.java rename to runelite-api/src/main/java/net/runelite/api/events/GameTick.java index e150cb6c30..aefa7fc3e4 100644 --- a/api/src/main/java/api/events/GameTick.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameTick.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/GrandExchangeOfferChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GrandExchangeOfferChanged.java similarity index 94% rename from api/src/main/java/api/events/GrandExchangeOfferChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/GrandExchangeOfferChanged.java index 025e3c44cf..7260063760 100644 --- a/api/src/main/java/api/events/GrandExchangeOfferChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GrandExchangeOfferChanged.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GrandExchangeOffer; -import api.GrandExchangeOfferState; +import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GrandExchangeOfferState; import lombok.Data; /** diff --git a/api/src/main/java/api/events/GraphicsObjectCreated.java b/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java similarity index 95% rename from api/src/main/java/api/events/GraphicsObjectCreated.java rename to runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java index 9f8341cf2f..f2cc4f35a9 100644 --- a/api/src/main/java/api/events/GraphicsObjectCreated.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GraphicsObject; +import net.runelite.api.GraphicsObject; import lombok.Value; /** diff --git a/api/src/main/java/api/events/GroundObjectChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectChanged.java similarity index 94% rename from api/src/main/java/api/events/GroundObjectChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/GroundObjectChanged.java index 8d45ba0cbe..8fa97ae503 100644 --- a/api/src/main/java/api/events/GroundObjectChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectChanged.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GroundObject; -import api.Tile; +import net.runelite.api.GroundObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/GroundObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectDespawned.java similarity index 94% rename from api/src/main/java/api/events/GroundObjectDespawned.java rename to runelite-api/src/main/java/net/runelite/api/events/GroundObjectDespawned.java index a480f2f763..54bb6dfbe0 100644 --- a/api/src/main/java/api/events/GroundObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectDespawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GroundObject; -import api.Tile; +import net.runelite.api.GroundObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/GroundObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectSpawned.java similarity index 94% rename from api/src/main/java/api/events/GroundObjectSpawned.java rename to runelite-api/src/main/java/net/runelite/api/events/GroundObjectSpawned.java index a271befde5..af1f15ab6f 100644 --- a/api/src/main/java/api/events/GroundObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectSpawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.GroundObject; -import api.Tile; +import net.runelite.api.GroundObject; +import net.runelite.api.Tile; import lombok.Data; /** diff --git a/api/src/main/java/api/events/HitsplatApplied.java b/runelite-api/src/main/java/net/runelite/api/events/HitsplatApplied.java similarity index 94% rename from api/src/main/java/api/events/HitsplatApplied.java rename to runelite-api/src/main/java/net/runelite/api/events/HitsplatApplied.java index 06c369d334..f96a0f08d7 100644 --- a/api/src/main/java/api/events/HitsplatApplied.java +++ b/runelite-api/src/main/java/net/runelite/api/events/HitsplatApplied.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Actor; -import api.Hitsplat; +import net.runelite.api.Actor; +import net.runelite.api.Hitsplat; import lombok.Data; /** diff --git a/api/src/main/java/api/events/InteractChanged.java b/runelite-api/src/main/java/net/runelite/api/events/InteractChanged.java similarity index 95% rename from api/src/main/java/api/events/InteractChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/InteractChanged.java index 89bcd12252..fcd2e54a43 100644 --- a/api/src/main/java/api/events/InteractChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/InteractChanged.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Actor; +import net.runelite.api.Actor; import lombok.Data; @Data diff --git a/api/src/main/java/api/events/InteractingChanged.java b/runelite-api/src/main/java/net/runelite/api/events/InteractingChanged.java similarity index 79% rename from api/src/main/java/api/events/InteractingChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/InteractingChanged.java index 3b2855e591..c76abd349f 100644 --- a/api/src/main/java/api/events/InteractingChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/InteractingChanged.java @@ -1,6 +1,6 @@ -package api.events; +package net.runelite.api.events; -import api.Actor; +import net.runelite.api.Actor; import lombok.Value; /** diff --git a/api/src/main/java/api/events/ItemContainerChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java similarity index 96% rename from api/src/main/java/api/events/ItemContainerChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java index d0166754e5..ec0ff6627b 100644 --- a/api/src/main/java/api/events/ItemContainerChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.ItemContainer; +import net.runelite.api.ItemContainer; import lombok.Value; /** diff --git a/api/src/main/java/api/events/ItemDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java similarity index 94% rename from api/src/main/java/api/events/ItemDespawned.java rename to runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java index 9b3bd87f3b..aeb90ede92 100644 --- a/api/src/main/java/api/events/ItemDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Item; -import api.Tile; +import net.runelite.api.Item; +import net.runelite.api.Tile; import lombok.Value; /** diff --git a/api/src/main/java/api/events/ItemQuantityChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java similarity index 94% rename from api/src/main/java/api/events/ItemQuantityChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java index 125d9bda65..2cb1048f06 100644 --- a/api/src/main/java/api/events/ItemQuantityChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Item; -import api.Tile; +import net.runelite.api.Item; +import net.runelite.api.Tile; import lombok.Value; /** diff --git a/api/src/main/java/api/events/ItemSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java similarity index 94% rename from api/src/main/java/api/events/ItemSpawned.java rename to runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java index 5b53c2438a..eb41b3e530 100644 --- a/api/src/main/java/api/events/ItemSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Item; -import api.Tile; +import net.runelite.api.Item; +import net.runelite.api.Tile; import lombok.Value; /** diff --git a/api/src/main/java/api/events/LocalPlayerDeath.java b/runelite-api/src/main/java/net/runelite/api/events/LocalPlayerDeath.java similarity index 97% rename from api/src/main/java/api/events/LocalPlayerDeath.java rename to runelite-api/src/main/java/net/runelite/api/events/LocalPlayerDeath.java index 70b7a00405..e46b815f49 100644 --- a/api/src/main/java/api/events/LocalPlayerDeath.java +++ b/runelite-api/src/main/java/net/runelite/api/events/LocalPlayerDeath.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; /** * An event when the local player dies. diff --git a/api/src/main/java/api/events/MenuEntryAdded.java b/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java similarity index 70% rename from api/src/main/java/api/events/MenuEntryAdded.java rename to runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java index 10d96d8ed4..37f73ec792 100644 --- a/api/src/main/java/api/events/MenuEntryAdded.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java @@ -22,10 +22,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.AllArgsConstructor; import lombok.Data; +import net.runelite.api.MenuEntry; /** * An event when a new entry is added to a right-click menu. @@ -35,30 +36,42 @@ import lombok.Data; public class MenuEntryAdded { /** - * The option text added to the menu (ie. "Walk here", "Use"). + * The MenuEntry object that was actually added */ - private final String option; - /** - * The target of the action (ie. Item or Actor name). - *

    - * If the option does not apply to any target, this field - * will be set to empty string. - */ - private final String target; - /** - * The action type that will be triggered. - */ - private final int type; - /** - * An identifier value for the target of the action - */ - private final int identifier; - /** - * An additional parameter for the action. - */ - private final int actionParam0; - /** - * A second additional parameter for the action. - */ - private final int actionParam1; + private final MenuEntry menuEntry; + + public String getOption() + { + return menuEntry.getOption(); + } + + public String getTarget() + { + return menuEntry.getTarget(); + } + + public int getType() + { + return menuEntry.getType(); + } + + public int getIdentifier() + { + return menuEntry.getIdentifier(); + } + + public int getActionParam0() + { + return menuEntry.getParam0(); + } + + public int getActionParam1() + { + return menuEntry.getParam1(); + } + + public boolean isForceLeftClick() + { + return menuEntry.isForceLeftClick(); + } } diff --git a/api/src/main/java/api/events/MenuOpened.java b/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java similarity index 96% rename from api/src/main/java/api/events/MenuOpened.java rename to runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java index d0127adf73..3a7b04c287 100644 --- a/api/src/main/java/api/events/MenuOpened.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.MenuEntry; +import net.runelite.api.MenuEntry; import lombok.Data; /** diff --git a/api/src/main/java/api/events/MenuOptionClicked.java b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java similarity index 74% rename from api/src/main/java/api/events/MenuOptionClicked.java rename to runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java index ef1b899002..2180458228 100644 --- a/api/src/main/java/api/events/MenuOptionClicked.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java @@ -22,10 +22,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.MenuAction; import lombok.Data; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; /** * An event where a menu option has been clicked. @@ -41,32 +42,77 @@ import lombok.Data; @Data public class MenuOptionClicked { + public MenuOptionClicked(MenuEntry entry) + { + menuEntry = entry; + } + /** - * The action parameter used in the click. + * The actual MenuEntry object representing what was clicked */ - private int actionParam; + private MenuEntry menuEntry; + /** * The option text added to the menu. */ - private String menuOption; + public String getOption() + { + return menuEntry.getOption(); + } + /** * The target of the action. */ - private String menuTarget; + public String getTarget() + { + return menuEntry.getTarget(); + } + /** - * The action performed. + * MenuAction but int-ish */ - private MenuAction menuAction; + public int getType() + { + return menuEntry.getType(); + } + /** * The ID of the object, actor, or item that the interaction targets. */ - private int id; + public int getIdentifier() + { + return menuEntry.getIdentifier(); + } + /** - * The ID of the widget where the menu was clicked. - * - * @see api.WidgetID + * The action parameter used in the click. */ - private int widgetId; + public int getActionParam0() + { + return menuEntry.getParam0(); + } + + /** + * shit docs + */ + public int getActionParam1() + { + return menuEntry.getParam1(); + } + + public boolean isForceLeftClick() + { + return menuEntry.isForceLeftClick(); + } + + /** + * The action performed. + */ + public MenuAction getMenuAction() + { + return MenuAction.of(getType()); + } + /** * Whether or not the event has been consumed by a subscriber. */ diff --git a/api/src/main/java/api/events/MenuShouldLeftClick.java b/runelite-api/src/main/java/net/runelite/api/events/MenuShouldLeftClick.java similarity index 98% rename from api/src/main/java/api/events/MenuShouldLeftClick.java rename to runelite-api/src/main/java/net/runelite/api/events/MenuShouldLeftClick.java index 78e67e350a..c36372ff2c 100644 --- a/api/src/main/java/api/events/MenuShouldLeftClick.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuShouldLeftClick.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/NameableNameChanged.java b/runelite-api/src/main/java/net/runelite/api/events/NameableNameChanged.java similarity index 95% rename from api/src/main/java/api/events/NameableNameChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/NameableNameChanged.java index c943157f6a..afcc43973d 100644 --- a/api/src/main/java/api/events/NameableNameChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NameableNameChanged.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Nameable; +import net.runelite.api.Nameable; import lombok.Value; /** diff --git a/api/src/main/java/api/events/NpcActionChanged.java b/runelite-api/src/main/java/net/runelite/api/events/NpcActionChanged.java similarity index 95% rename from api/src/main/java/api/events/NpcActionChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/NpcActionChanged.java index f2b2bdf593..35838e067c 100644 --- a/api/src/main/java/api/events/NpcActionChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NpcActionChanged.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.NPCDefinition; import lombok.Data; +import net.runelite.api.NPCDefinition; /** * An event where an action of an {@link NPCDefinition} has changed. diff --git a/api/src/main/java/api/events/NpcDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/NpcDespawned.java similarity index 94% rename from api/src/main/java/api/events/NpcDespawned.java rename to runelite-api/src/main/java/net/runelite/api/events/NpcDespawned.java index 9fb85d9707..f1bc72344f 100644 --- a/api/src/main/java/api/events/NpcDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NpcDespawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Actor; -import api.NPC; +import net.runelite.api.Actor; +import net.runelite.api.NPC; import lombok.Value; /** diff --git a/api/src/main/java/api/events/NpcSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/NpcSpawned.java similarity index 94% rename from api/src/main/java/api/events/NpcSpawned.java rename to runelite-api/src/main/java/net/runelite/api/events/NpcSpawned.java index d0faab4afd..911d3780c1 100644 --- a/api/src/main/java/api/events/NpcSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NpcSpawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Actor; -import api.NPC; +import net.runelite.api.Actor; +import net.runelite.api.NPC; import lombok.Value; /** diff --git a/api/src/main/java/api/events/OverheadTextChanged.java b/runelite-api/src/main/java/net/runelite/api/events/OverheadTextChanged.java similarity index 67% rename from api/src/main/java/api/events/OverheadTextChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/OverheadTextChanged.java index 298ba82aee..a8a22730fd 100644 --- a/api/src/main/java/api/events/OverheadTextChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/OverheadTextChanged.java @@ -1,6 +1,6 @@ -package api.events; +package net.runelite.api.events; -import api.Actor; +import net.runelite.api.Actor; import lombok.Value; @Value diff --git a/api/src/main/java/api/events/PlayerDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/PlayerDespawned.java similarity index 94% rename from api/src/main/java/api/events/PlayerDespawned.java rename to runelite-api/src/main/java/net/runelite/api/events/PlayerDespawned.java index c038abe94f..7094f3bd1a 100644 --- a/api/src/main/java/api/events/PlayerDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PlayerDespawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Actor; -import api.Player; +import net.runelite.api.Actor; +import net.runelite.api.Player; import lombok.Value; /** diff --git a/api/src/main/java/api/events/PlayerMenuOptionClicked.java b/runelite-api/src/main/java/net/runelite/api/events/PlayerMenuOptionClicked.java similarity index 98% rename from api/src/main/java/api/events/PlayerMenuOptionClicked.java rename to runelite-api/src/main/java/net/runelite/api/events/PlayerMenuOptionClicked.java index 4480d14510..dcfb0421ca 100644 --- a/api/src/main/java/api/events/PlayerMenuOptionClicked.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PlayerMenuOptionClicked.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/PlayerMenuOptionsChanged.java b/runelite-api/src/main/java/net/runelite/api/events/PlayerMenuOptionsChanged.java similarity index 97% rename from api/src/main/java/api/events/PlayerMenuOptionsChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/PlayerMenuOptionsChanged.java index 1d2e97d60f..d33aa4d06c 100644 --- a/api/src/main/java/api/events/PlayerMenuOptionsChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PlayerMenuOptionsChanged.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/PlayerSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/PlayerSpawned.java similarity index 94% rename from api/src/main/java/api/events/PlayerSpawned.java rename to runelite-api/src/main/java/net/runelite/api/events/PlayerSpawned.java index 61d326db1b..31cc16a9c0 100644 --- a/api/src/main/java/api/events/PlayerSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PlayerSpawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Actor; -import api.Player; +import net.runelite.api.Actor; +import net.runelite.api.Player; import lombok.Value; /** diff --git a/api/src/main/java/api/events/PostHealthBar.java b/runelite-api/src/main/java/net/runelite/api/events/PostHealthBar.java similarity index 95% rename from api/src/main/java/api/events/PostHealthBar.java rename to runelite-api/src/main/java/net/runelite/api/events/PostHealthBar.java index 6d475ef24a..c8896ff945 100644 --- a/api/src/main/java/api/events/PostHealthBar.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PostHealthBar.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.HealthBar; +import net.runelite.api.HealthBar; import lombok.Data; @Data diff --git a/api/src/main/java/api/events/PostItemDefinition.java b/runelite-api/src/main/java/net/runelite/api/events/PostItemDefinition.java similarity index 95% rename from api/src/main/java/api/events/PostItemDefinition.java rename to runelite-api/src/main/java/net/runelite/api/events/PostItemDefinition.java index f7bf675912..35718b5ea9 100644 --- a/api/src/main/java/api/events/PostItemDefinition.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PostItemDefinition.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.ItemDefinition; import lombok.Data; +import net.runelite.api.ItemDefinition; /** * An event called after a new {@link ItemDefinition} is created and diff --git a/api/src/main/java/api/events/ProjectileMoved.java b/runelite-api/src/main/java/net/runelite/api/events/ProjectileMoved.java similarity index 94% rename from api/src/main/java/api/events/ProjectileMoved.java rename to runelite-api/src/main/java/net/runelite/api/events/ProjectileMoved.java index 67203f7949..70d73d7026 100644 --- a/api/src/main/java/api/events/ProjectileMoved.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ProjectileMoved.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Projectile; -import api.coords.LocalPoint; +import net.runelite.api.Projectile; +import net.runelite.api.coords.LocalPoint; import lombok.Data; /** diff --git a/runelite-api/src/main/java/net/runelite/api/events/ProjectileSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/ProjectileSpawned.java new file mode 100644 index 0000000000..f5ba810a5f --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/ProjectileSpawned.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.events; + +import net.runelite.api.Projectile; +import lombok.Data; + +/** + * An event called whenever a {@link Projectile} has spawned. + */ +@Data +public class ProjectileSpawned +{ + /** + * The spawned projectile. + */ + private Projectile projectile; +} diff --git a/api/src/main/java/api/events/RemovedFriend.java b/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java similarity index 97% rename from api/src/main/java/api/events/RemovedFriend.java rename to runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java index 40916a3de4..c60cd13c33 100644 --- a/api/src/main/java/api/events/RemovedFriend.java +++ b/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Value; diff --git a/api/src/main/java/api/events/ResizeableChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ResizeableChanged.java similarity index 97% rename from api/src/main/java/api/events/ResizeableChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/ResizeableChanged.java index e1fd504cfe..146f92ac38 100644 --- a/api/src/main/java/api/events/ResizeableChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ResizeableChanged.java @@ -24,7 +24,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/ScriptCallbackEvent.java b/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java similarity index 96% rename from api/src/main/java/api/events/ScriptCallbackEvent.java rename to runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java index d591ac4571..0c1bdd5ee9 100644 --- a/api/src/main/java/api/events/ScriptCallbackEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Script; +import net.runelite.api.Script; import lombok.Data; /** diff --git a/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java new file mode 100644 index 0000000000..127a9a2646 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, WooxSolo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.events; + +import lombok.Data; + +@Data +public class SoundEffectPlayed +{ + private int soundId; + private int delay; +} diff --git a/api/src/main/java/api/events/SpotAnimationChanged.java b/runelite-api/src/main/java/net/runelite/api/events/SpotAnimationChanged.java similarity index 83% rename from api/src/main/java/api/events/SpotAnimationChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/SpotAnimationChanged.java index 938ebc761b..79b8643d2c 100644 --- a/api/src/main/java/api/events/SpotAnimationChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/SpotAnimationChanged.java @@ -1,7 +1,7 @@ -package api.events; +package net.runelite.api.events; -import api.Actor; import lombok.Data; +import net.runelite.api.Actor; /** * An event where the graphic of an {@link Actor} has changed. @@ -16,7 +16,7 @@ import lombok.Data; *

  • Breaking a teleport tab
  • * * - * @see api.GraphicID + * @see net.runelite.api.GraphicID */ @Data public class SpotAnimationChanged diff --git a/api/src/main/java/api/events/UsernameChanged.java b/runelite-api/src/main/java/net/runelite/api/events/UsernameChanged.java similarity index 97% rename from api/src/main/java/api/events/UsernameChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/UsernameChanged.java index a9ef1f437e..91bed8a304 100644 --- a/api/src/main/java/api/events/UsernameChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/UsernameChanged.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; /** * An event where the username the client will log in with has changed. diff --git a/api/src/main/java/api/events/VarClientIntChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VarClientIntChanged.java similarity index 97% rename from api/src/main/java/api/events/VarClientIntChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/VarClientIntChanged.java index edff23d6fd..82c2c404d4 100644 --- a/api/src/main/java/api/events/VarClientIntChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/VarClientIntChanged.java @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Value; diff --git a/api/src/main/java/api/events/VarClientStrChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VarClientStrChanged.java similarity index 97% rename from api/src/main/java/api/events/VarClientStrChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/VarClientStrChanged.java index 1b6bf8ab75..e1d7da6ffa 100644 --- a/api/src/main/java/api/events/VarClientStrChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/VarClientStrChanged.java @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Value; diff --git a/api/src/main/java/api/events/VarbitChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VarbitChanged.java similarity index 97% rename from api/src/main/java/api/events/VarbitChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/VarbitChanged.java index 4ca53018c5..9680e54ac4 100644 --- a/api/src/main/java/api/events/VarbitChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/VarbitChanged.java @@ -24,7 +24,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; diff --git a/api/src/main/java/api/events/WallObjectChanged.java b/runelite-api/src/main/java/net/runelite/api/events/WallObjectChanged.java similarity index 94% rename from api/src/main/java/api/events/WallObjectChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/WallObjectChanged.java index 0abb6fb0e3..bea7686602 100644 --- a/api/src/main/java/api/events/WallObjectChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WallObjectChanged.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Tile; -import api.WallObject; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; import lombok.Data; /** diff --git a/api/src/main/java/api/events/WallObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/WallObjectDespawned.java similarity index 94% rename from api/src/main/java/api/events/WallObjectDespawned.java rename to runelite-api/src/main/java/net/runelite/api/events/WallObjectDespawned.java index 16ceed1d2e..6ac609a46f 100644 --- a/api/src/main/java/api/events/WallObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WallObjectDespawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Tile; -import api.WallObject; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; import lombok.Data; /** diff --git a/api/src/main/java/api/events/WallObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/WallObjectSpawned.java similarity index 94% rename from api/src/main/java/api/events/WallObjectSpawned.java rename to runelite-api/src/main/java/net/runelite/api/events/WallObjectSpawned.java index 5d20a23cac..dc22e07f7d 100644 --- a/api/src/main/java/api/events/WallObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WallObjectSpawned.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.Tile; -import api.WallObject; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; import lombok.Data; /** diff --git a/api/src/main/java/api/events/WidgetHiddenChanged.java b/runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java similarity index 95% rename from api/src/main/java/api/events/WidgetHiddenChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java index 8d8bc35d60..2cf434faa4 100644 --- a/api/src/main/java/api/events/WidgetHiddenChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.widgets.Widget; +import net.runelite.api.widgets.Widget; import lombok.Data; /** diff --git a/api/src/main/java/api/events/WidgetLoaded.java b/runelite-api/src/main/java/net/runelite/api/events/WidgetLoaded.java similarity index 93% rename from api/src/main/java/api/events/WidgetLoaded.java rename to runelite-api/src/main/java/net/runelite/api/events/WidgetLoaded.java index 2573028973..c71bc41634 100644 --- a/api/src/main/java/api/events/WidgetLoaded.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WidgetLoaded.java @@ -22,12 +22,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Data; /** - * An event where a {@link api.widgets.Widget} has been loaded. + * An event where a {@link net.runelite.api.widgets.Widget} has been loaded. */ @Data public class WidgetLoaded diff --git a/api/src/main/java/api/events/WidgetMenuOptionClicked.java b/runelite-api/src/main/java/net/runelite/api/events/WidgetMenuOptionClicked.java similarity index 90% rename from api/src/main/java/api/events/WidgetMenuOptionClicked.java rename to runelite-api/src/main/java/net/runelite/api/events/WidgetMenuOptionClicked.java index 3b111bc3b0..6945e88790 100644 --- a/api/src/main/java/api/events/WidgetMenuOptionClicked.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WidgetMenuOptionClicked.java @@ -22,13 +22,13 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetInfo; import lombok.Data; /** - * An event where an option has been clicked in a {@link api.widgets.Widget}s menu. + * An event where an option has been clicked in a {@link net.runelite.api.widgets.Widget}s menu. */ @Data public class WidgetMenuOptionClicked diff --git a/api/src/main/java/api/events/WidgetPositioned.java b/runelite-api/src/main/java/net/runelite/api/events/WidgetPositioned.java similarity index 93% rename from api/src/main/java/api/events/WidgetPositioned.java rename to runelite-api/src/main/java/net/runelite/api/events/WidgetPositioned.java index 6920efa03e..d5479e3485 100644 --- a/api/src/main/java/api/events/WidgetPositioned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WidgetPositioned.java @@ -22,12 +22,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; import lombok.Value; /** - * An event where the position of a {@link api.widgets.Widget} + * An event where the position of a {@link net.runelite.api.widgets.Widget} * relative to its parent has changed. */ @Value diff --git a/api/src/main/java/api/events/WorldListLoad.java b/runelite-api/src/main/java/net/runelite/api/events/WorldListLoad.java similarity index 96% rename from api/src/main/java/api/events/WorldListLoad.java rename to runelite-api/src/main/java/net/runelite/api/events/WorldListLoad.java index 892952aef1..67fa28797e 100644 --- a/api/src/main/java/api/events/WorldListLoad.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WorldListLoad.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.events; +package net.runelite.api.events; -import api.World; +import net.runelite.api.World; import lombok.Value; /** diff --git a/api/src/main/java/api/geometry/Geometry.java b/runelite-api/src/main/java/net/runelite/api/geometry/Geometry.java similarity index 99% rename from api/src/main/java/api/geometry/Geometry.java rename to runelite-api/src/main/java/net/runelite/api/geometry/Geometry.java index 7b042fbdf4..39efa74afa 100644 --- a/api/src/main/java/api/geometry/Geometry.java +++ b/runelite-api/src/main/java/net/runelite/api/geometry/Geometry.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.geometry; +package net.runelite.api.geometry; import java.awt.Shape; import java.awt.geom.AffineTransform; diff --git a/api/src/main/java/api/hooks/Callbacks.java b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java similarity index 97% rename from api/src/main/java/api/hooks/Callbacks.java rename to runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java index aa8e263579..bbbaa34dfd 100644 --- a/api/src/main/java/api/hooks/Callbacks.java +++ b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java @@ -22,10 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.hooks; +package net.runelite.api.hooks; -import api.MainBufferProvider; -import api.widgets.WidgetItem; +import net.runelite.api.MainBufferProvider; +import net.runelite.api.widgets.WidgetItem; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; diff --git a/api/src/main/java/api/hooks/DrawCallbacks.java b/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java similarity index 92% rename from api/src/main/java/api/hooks/DrawCallbacks.java rename to runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java index 46b6fdada7..b76caecd44 100644 --- a/api/src/main/java/api/hooks/DrawCallbacks.java +++ b/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java @@ -22,12 +22,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.hooks; +package net.runelite.api.hooks; -import api.Renderable; -import api.SceneTileModel; -import api.SceneTilePaint; -import api.Texture; +import net.runelite.api.Renderable; +import net.runelite.api.SceneTileModel; +import net.runelite.api.SceneTilePaint; +import net.runelite.api.Texture; public interface DrawCallbacks { diff --git a/api/src/main/java/api/kit/KitType.java b/runelite-api/src/main/java/net/runelite/api/kit/KitType.java similarity index 91% rename from api/src/main/java/api/kit/KitType.java rename to runelite-api/src/main/java/net/runelite/api/kit/KitType.java index e35167abba..57d09251b0 100644 --- a/api/src/main/java/api/kit/KitType.java +++ b/runelite-api/src/main/java/net/runelite/api/kit/KitType.java @@ -22,17 +22,17 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.kit; +package net.runelite.api.kit; -import api.PlayerAppearance; +import net.runelite.api.PlayerAppearance; /** * Represents an equipment slot in a players composition. *

    * These values are intended for use with {@link PlayerAppearance} equipment * slots. For obtaining information about equipment in the local players - * equipment {@link api.ItemContainer}, use - * {@link api.EquipmentInventorySlot}. + * equipment {@link net.runelite.api.ItemContainer}, use + * {@link net.runelite.api.EquipmentInventorySlot}. */ public enum KitType { diff --git a/api/src/main/java/api/model/Jarvis.java b/runelite-api/src/main/java/net/runelite/api/model/Jarvis.java similarity index 98% rename from api/src/main/java/api/model/Jarvis.java rename to runelite-api/src/main/java/net/runelite/api/model/Jarvis.java index 49ea7684ff..d71fe38b51 100644 --- a/api/src/main/java/api/model/Jarvis.java +++ b/runelite-api/src/main/java/net/runelite/api/model/Jarvis.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.model; +package net.runelite.api.model; -import api.Point; +import net.runelite.api.Point; import java.util.ArrayList; import java.util.List; diff --git a/api/src/main/java/api/model/Triangle.java b/runelite-api/src/main/java/net/runelite/api/model/Triangle.java similarity index 98% rename from api/src/main/java/api/model/Triangle.java rename to runelite-api/src/main/java/net/runelite/api/model/Triangle.java index 372135a878..daf59c2489 100644 --- a/api/src/main/java/api/model/Triangle.java +++ b/runelite-api/src/main/java/net/runelite/api/model/Triangle.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.model; +package net.runelite.api.model; import lombok.Value; diff --git a/api/src/main/java/api/model/Vertex.java b/runelite-api/src/main/java/net/runelite/api/model/Vertex.java similarity index 96% rename from api/src/main/java/api/model/Vertex.java rename to runelite-api/src/main/java/net/runelite/api/model/Vertex.java index 827f20ea61..dc8448713f 100644 --- a/api/src/main/java/api/model/Vertex.java +++ b/runelite-api/src/main/java/net/runelite/api/model/Vertex.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.model; +package net.runelite.api.model; -import api.Perspective; +import net.runelite.api.Perspective; import lombok.Value; /** diff --git a/api/src/main/java/api/overlay/OverlayIndex.java b/runelite-api/src/main/java/net/runelite/api/overlay/OverlayIndex.java similarity index 98% rename from api/src/main/java/api/overlay/OverlayIndex.java rename to runelite-api/src/main/java/net/runelite/api/overlay/OverlayIndex.java index b588aa0d33..6aec875181 100644 --- a/api/src/main/java/api/overlay/OverlayIndex.java +++ b/runelite-api/src/main/java/net/runelite/api/overlay/OverlayIndex.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.overlay; +package net.runelite.api.overlay; import java.io.DataInputStream; import java.io.IOException; diff --git a/runelite-api/src/main/java/net/runelite/api/vars/AccountType.java b/runelite-api/src/main/java/net/runelite/api/vars/AccountType.java new file mode 100644 index 0000000000..63c5e953f7 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/vars/AccountType.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.vars; + +/** + * An enumeration of possible account types. + */ +public enum AccountType +{ + /** + * Normal account type. + */ + NORMAL, + /** + * Ironman account type. + */ + IRONMAN, + /** + * Ultimate ironman account type. + */ + ULTIMATE_IRONMAN, + /** + * Hardcore ironman account type. + */ + HARDCORE_IRONMAN; + + /** + * Checks whether this type is an ironman. + * + * @return {@code true} if the type is any of the ironman types. + */ + public boolean isIronman() + { + return this.ordinal() >= IRONMAN.ordinal() && this.ordinal() <= HARDCORE_IRONMAN.ordinal(); + } + +} diff --git a/api/src/main/java/api/vars/Autoweed.java b/runelite-api/src/main/java/net/runelite/api/vars/Autoweed.java similarity index 98% rename from api/src/main/java/api/vars/Autoweed.java rename to runelite-api/src/main/java/net/runelite/api/vars/Autoweed.java index 276033ffd1..e4da031363 100644 --- a/api/src/main/java/api/vars/Autoweed.java +++ b/runelite-api/src/main/java/net/runelite/api/vars/Autoweed.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.vars; +package net.runelite.api.vars; /** * An enumeration of possible autoweed settings. diff --git a/api/src/main/java/api/vars/InputType.java b/runelite-api/src/main/java/net/runelite/api/vars/InputType.java similarity index 96% rename from api/src/main/java/api/vars/InputType.java rename to runelite-api/src/main/java/net/runelite/api/vars/InputType.java index ed5b48f731..020063a12c 100644 --- a/api/src/main/java/api/vars/InputType.java +++ b/runelite-api/src/main/java/net/runelite/api/vars/InputType.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.vars; +package net.runelite.api.vars; -import api.VarClientInt; +import net.runelite.api.VarClientInt; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/api/src/main/java/api/vars/SlayerUnlock.java b/runelite-api/src/main/java/net/runelite/api/vars/SlayerUnlock.java similarity index 94% rename from api/src/main/java/api/vars/SlayerUnlock.java rename to runelite-api/src/main/java/net/runelite/api/vars/SlayerUnlock.java index 7b8c4c9727..05081da7a2 100644 --- a/api/src/main/java/api/vars/SlayerUnlock.java +++ b/runelite-api/src/main/java/net/runelite/api/vars/SlayerUnlock.java @@ -22,11 +22,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.vars; +package net.runelite.api.vars; -import api.Client; -import api.VarPlayer; -import api.Varbits; +import net.runelite.api.Client; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; /** * Unlockables in the slayer interface @@ -56,7 +56,7 @@ public enum SlayerUnlock TZHARR_ENABLE(18), BOSS_ENABLE(19), BLOODVELD_EXTEND(20), - ABBERANT_SPECTRE_EXTEND(21), + ABERRANT_SPECTRE_EXTEND(21), AVIANSIES_EXTEND(22), MITHRIL_DRAGON_EXTEND(23), CAVE_HORROR_EXTEND(24), @@ -79,7 +79,7 @@ public enum SlayerUnlock RUNE_DRAGON_EXTEND(41), VORKATH_SLAYER_HELM(42), FOSSIL_ISLAND_WYVERN_DISABLE(43, Varbits.FOSSIL_ISLAND_WYVERN_DISABLE), - GROTESQUE_GARDIAN_DOUBLE_COUNT(44); + GROTESQUE_GUARDIAN_DOUBLE_COUNT(44); private Varbits toggleVarbit; diff --git a/api/src/main/java/api/widgets/ItemQuantityMode.java b/runelite-api/src/main/java/net/runelite/api/widgets/ItemQuantityMode.java similarity index 98% rename from api/src/main/java/api/widgets/ItemQuantityMode.java rename to runelite-api/src/main/java/net/runelite/api/widgets/ItemQuantityMode.java index 91523bb252..501da0671f 100644 --- a/api/src/main/java/api/widgets/ItemQuantityMode.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/ItemQuantityMode.java @@ -23,7 +23,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; /** * Utility class mapping Widget ItemQuantityMode values diff --git a/api/src/main/java/api/widgets/JavaScriptCallback.java b/runelite-api/src/main/java/net/runelite/api/widgets/JavaScriptCallback.java similarity index 95% rename from api/src/main/java/api/widgets/JavaScriptCallback.java rename to runelite-api/src/main/java/net/runelite/api/widgets/JavaScriptCallback.java index af4b2df640..01786beccf 100644 --- a/api/src/main/java/api/widgets/JavaScriptCallback.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/JavaScriptCallback.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; -import api.ScriptEvent; +import net.runelite.api.ScriptEvent; @FunctionalInterface public interface JavaScriptCallback diff --git a/api/src/main/java/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java similarity index 98% rename from api/src/main/java/api/widgets/Widget.java rename to runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index 71b76725bb..8a4633d38c 100644 --- a/api/src/main/java/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -22,14 +22,15 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; -import api.FontTypeFace; -import api.Point; -import api.SpriteID; import java.awt.Rectangle; import java.util.Collection; +import net.runelite.api.FontTypeFace; +import net.runelite.api.Point; +import net.runelite.api.SpriteID; + /** * Represents an on-screen UI element that is drawn on the canvas. *

    @@ -626,14 +627,14 @@ public interface Widget /** * Returns the archive id of the font used * - * @see api.FontID + * @see net.runelite.api.FontID */ int getFontId(); /** * Sets the archive id of the font * - * @see api.FontID + * @see net.runelite.api.FontID */ void setFontId(int id); @@ -681,12 +682,12 @@ public interface Widget void setDragDeadTime(int deadTime); /** - * Returns widget {@link api.widgets.ItemQuantityMode}. + * Returns widget {@link net.runelite.api.widgets.ItemQuantityMode}. */ int getItemQuantityMode(); /** - * Sets the widget {@link api.widgets.ItemQuantityMode} + * Sets the widget {@link net.runelite.api.widgets.ItemQuantityMode} */ void setItemQuantityMode(int itemQuantityMode); diff --git a/api/src/main/java/api/widgets/WidgetConfig.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetConfig.java similarity index 98% rename from api/src/main/java/api/widgets/WidgetConfig.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetConfig.java index 6768446983..96b60bd63d 100644 --- a/api/src/main/java/api/widgets/WidgetConfig.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetConfig.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; /** diff --git a/api/src/main/java/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java similarity index 96% rename from api/src/main/java/api/widgets/WidgetID.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 729c630f7a..931004b869 100644 --- a/api/src/main/java/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; /** * Utility class mapping widget IDs to global constants. @@ -57,7 +57,7 @@ public class WidgetID public static final int PEST_CONTROL_BOAT_GROUP_ID = 407; public static final int PEST_CONTROL_GROUP_ID = 408; public static final int PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID = 243; - public static final int PEST_CONTROL_DIALOG_GROUP_ID = 229; + public static final int DIALOG_MINIGAME_GROUP_ID = 229; public static final int CLAN_CHAT_GROUP_ID = 7; public static final int MINIMAP_GROUP_ID = 160; public static final int LOGIN_CLICK_TO_PLAY_GROUP_ID = 378; @@ -84,6 +84,7 @@ public class WidgetID public static final int BA_DEFENDER_GROUP_ID = 487; public static final int BA_HEALER_GROUP_ID = 488; public static final int BA_REWARD_GROUP_ID = 497; + public static final int BA_HORN_OF_GLORY = 484; public static final int LEVEL_UP_GROUP_ID = 233; public static final int DIALOG_SPRITE_GROUP_ID = 193; public static final int QUEST_COMPLETED_GROUP_ID = 277; @@ -91,6 +92,7 @@ public class WidgetID public static final int BARROWS_REWARD_GROUP_ID = 155; public static final int RAIDS_GROUP_ID = 513; public static final int MOTHERLODE_MINE_GROUP_ID = 382; + public static final int MOTHERLODE_MINE_FULL_INVENTORY_GROUP_ID = 229; public static final int EXPERIENCE_DROP_GROUP_ID = 122; public static final int PUZZLE_BOX_GROUP_ID = 306; public static final int LIGHT_BOX_GROUP_ID = 322; @@ -114,7 +116,7 @@ public class WidgetID public static final int VARROCK_MUSEUM_QUIZ_GROUP_ID = 533; public static final int KILL_LOGS_GROUP_ID = 549; public static final int DIARY_QUEST_GROUP_ID = 119; - public static final int THEATRE_OF_BLOOD_GROUP_ID = 23; + public static final int THEATRE_OF_BLOOD_GROUP_ID = 28; public static final int WORLD_SWITCHER_GROUP_ID = 69; public static final int DIALOG_OPTION_GROUP_ID = 219; public static final int DIALOG_PLAYER_GROUP_ID = 217; @@ -122,6 +124,8 @@ public class WidgetID public static final int MINIGAME_TAB_ID = 76; public static final int SPELLBOOK_GROUP_ID = 218; public static final int PVP_GROUP_ID = 90; + public static final int PERFORMERS_FOR_THE_THEATRE_GROUPS_GROUP_ID = 364; + public static final int PERFORMERS_FOR_THE_THEATRE_PLAYERS_GROUP_ID = 50; public static final int FISHING_TRAWLER_GROUP_ID = 366; public static final int ZEAH_MESS_HALL_GROUP_ID = 235; public static final int KOUREND_FAVOUR_GROUP_ID = 246; @@ -145,6 +149,8 @@ public class WidgetID public static final int BEGINNER_CLUE_MAP_DRAYNOR = 348; public static final int BEGINNER_CLUE_MAP_NORTH_OF_FALADOR = 351; public static final int BEGINNER_CLUE_MAP_WIZARDS_TOWER = 356; + public static final int SEED_BOX_GROUP_ID = 128; + public static final int ITEMS_KEPT_ON_DEATH_GROUP_ID = 4; static class WorldMap { @@ -192,7 +198,7 @@ public class WidgetID static final int CONFIRM_BUTTON = 6; } - static class PestControlDialog + static class MinigameDialog { static final int TEXT = 1; static final int CONTINUE = 2; @@ -589,7 +595,8 @@ public class WidgetID { static class ATK { - static final int LISTEN = 8; + static final int LISTEN_TOP = 7; + static final int LISTEN_BOTTOM = 8; static final int TO_CALL_WIDGET = 9; static final int TO_CALL = 10; static final int ROLE_SPRITE = 11; @@ -602,6 +609,13 @@ public class WidgetID static final int TEAMMATE3 = 26; static final int TEAMMATE4 = 30; } + static class HORN_GLORY + { + static final int ATTACKER = 5; + static final int DEFENDER = 6; + static final int COLLECTOR = 7; + static final int HEALER = 8; + } static class REWARD_VALUES { static final int RUNNERS_PASSED = 14; @@ -649,6 +663,12 @@ public class WidgetID static final int POINTS_INFOBOX = 6; } + static class TheatreOfBlood + { + static final int ORB_BOX = 10; + static final int BOSS_HEALTH_BAR = 35; + } + static class ExperienceDrop { static final int DROP_1 = 15; @@ -952,9 +972,9 @@ public class WidgetID static final int ATTACK_RANGE = 59; // OUTDATED? static final int BOUNTY_HUNTER_INFO = 19; static final int KILLDEATH_RATIO = 15; - static final int SKULL_CONTAINER = 62; - static final int SAFE_ZONE = 64; - static final int WILDERNESS_LEVEL = 67; // this can also be the Deadman Mode "Protection" text + static final int SKULL_CONTAINER = 61; + static final int SAFE_ZONE = 63; + static final int WILDERNESS_LEVEL = 66; // this can also be the Deadman Mode "Protection" text } static class KourendFavour @@ -1037,12 +1057,13 @@ public class WidgetID static class KeptOnDeath { static final int KEPT_ITEMS_CONTAINER = 18; + static final int KEPT_ITEMS_TEXT = 17; + static final int LOST_ITEMS_TEXT = 20; static final int LOST_ITEMS_CONTAINER = 21; static final int LOST_ITEMS_VALUE = 23; static final int INFORMATION_CONTAINER = 29; static final int MAX_ITEMS_KEPT_ON_DEATH = 30; static final int SAFE_ZONE_CONTAINER = 31; - static final int CUSTOM_TEXT_CONTAINER = 33; } diff --git a/api/src/main/java/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java similarity index 97% rename from api/src/main/java/api/widgets/WidgetInfo.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index e0f565a26d..99fa691985 100644 --- a/api/src/main/java/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -22,12 +22,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; /** * Represents a group-child {@link Widget} relationship. *

    - * For getting a specific widget from the client, see {@link api.Client#getWidget(WidgetInfo)}. + * For getting a specific widget from the client, see {@link net.runelite.api.Client#getWidget(WidgetInfo)}. */ public enum WidgetInfo { @@ -85,8 +85,8 @@ public enum WidgetInfo DIARY_QUEST_WIDGET_TITLE(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TITLE), DIARY_QUEST_WIDGET_TEXT(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TEXT), - PEST_CONTROL_DIALOG(WidgetID.PEST_CONTROL_DIALOG_GROUP_ID, 0), - PEST_CONTROL_DIALOG_TEXT(WidgetID.PEST_CONTROL_DIALOG_GROUP_ID, WidgetID.PestControlDialog.TEXT), + MINIGAME_DIALOG(WidgetID.DIALOG_MINIGAME_GROUP_ID, 0), + MINIGAME_DIALOG_TEXT(WidgetID.DIALOG_MINIGAME_GROUP_ID, WidgetID.MinigameDialog.TEXT), PEST_CONTROL_EXCHANGE_WINDOW(WidgetID.PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID, 0), PEST_CONTROL_EXCHANGE_WINDOW_POINTS(WidgetID.PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID, WidgetID.PestControlExchangeWindow.POINTS), PEST_CONTROL_BOAT_INFO(WidgetID.PEST_CONTROL_BOAT_GROUP_ID, WidgetID.PestControlBoat.INFO), @@ -310,6 +310,7 @@ public enum WidgetInfo QUICK_PRAYER_PRAYERS(WidgetID.QUICK_PRAYERS_GROUP_ID, WidgetID.QuickPrayer.PRAYERS), COMBAT_LEVEL(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.LEVEL), + COMBAT_WEAPON(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.WEAPON_NAME), COMBAT_STYLE_ONE(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_ONE), COMBAT_STYLE_TWO(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_TWO), COMBAT_STYLE_THREE(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_THREE), @@ -364,6 +365,7 @@ public enum WidgetInfo BA_HEAL_WAVE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_HEAL_CALL_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.TO_CALL), BA_HEAL_LISTEN_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.LISTEN), + BA_HEAL_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.HEALER), BA_HEAL_ROLE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE), BA_HEAL_ROLE_SPRITE(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), @@ -375,18 +377,22 @@ public enum WidgetInfo BA_COLL_WAVE_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_COLL_CALL_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.TO_CALL), BA_COLL_LISTEN_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.LISTEN), + BA_COLL_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.COLLECTOR), BA_COLL_ROLE_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.ROLE), BA_COLL_ROLE_SPRITE(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), BA_ATK_WAVE_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_ATK_CALL_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.TO_CALL), - BA_ATK_LISTEN_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.LISTEN), + BA_ATK_LISTEN_TOP_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.LISTEN_TOP), + BA_ATK_LISTEN_BOTTOM_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.LISTEN_BOTTOM), + BA_ATK_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.ATTACKER), BA_ATK_ROLE_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.ROLE), BA_ATK_ROLE_SPRITE(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.ROLE_SPRITE), BA_DEF_WAVE_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_DEF_CALL_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.TO_CALL), BA_DEF_LISTEN_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.LISTEN), + BA_DEF_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.DEFENDER), BA_DEF_ROLE_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.ROLE), BA_DEF_ROLE_SPRITE(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), @@ -436,6 +442,9 @@ public enum WidgetInfo RAIDS_POINTS_INFOBOX(WidgetID.RAIDS_GROUP_ID, WidgetID.Raids.POINTS_INFOBOX), + THEATRE_OF_BLOOD_HEALTH_ORBS(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.ORB_BOX), + THEATRE_OF_BLOOD_BOSS_HEALTH(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.BOSS_HEALTH_BAR), + BLAST_FURNACE_COFFER(WidgetID.BLAST_FURNACE_GROUP_ID, 2), PYRAMID_PLUNDER_DATA(WidgetID.PYRAMID_PLUNDER_GROUP_ID, 2), @@ -736,7 +745,10 @@ public enum WidgetInfo XP_DROP_4(WidgetID.EXPERIENCE_DROP_GROUP_ID, WidgetID.ExperienceDrop.DROP_4), XP_DROP_5(WidgetID.EXPERIENCE_DROP_GROUP_ID, WidgetID.ExperienceDrop.DROP_5), XP_DROP_6(WidgetID.EXPERIENCE_DROP_GROUP_ID, WidgetID.ExperienceDrop.DROP_6), - XP_DROP_7(WidgetID.EXPERIENCE_DROP_GROUP_ID, WidgetID.ExperienceDrop.DROP_7); + XP_DROP_7(WidgetID.EXPERIENCE_DROP_GROUP_ID, WidgetID.ExperienceDrop.DROP_7), + + ITEMS_KEPT_ON_DEATH_TEXT(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.KEPT_ITEMS_TEXT), + ITEMS_LOST_ON_DEATH_TEXT(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.LOST_ITEMS_TEXT); private final int groupId; private final int childId; diff --git a/api/src/main/java/api/widgets/WidgetItem.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetItem.java similarity index 96% rename from api/src/main/java/api/widgets/WidgetItem.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetItem.java index 359943d8e8..7cec838c98 100644 --- a/api/src/main/java/api/widgets/WidgetItem.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetItem.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; -import api.Point; +import net.runelite.api.Point; import java.awt.Rectangle; import lombok.AllArgsConstructor; import lombok.Getter; @@ -41,7 +41,7 @@ public class WidgetItem /** * The ID of the item represented. * - * @see api.ItemID + * @see net.runelite.api.ItemID */ private final int id; /** diff --git a/api/src/main/java/api/widgets/WidgetPositionMode.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetPositionMode.java similarity index 98% rename from api/src/main/java/api/widgets/WidgetPositionMode.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetPositionMode.java index 142162aefb..7ebfdf3c61 100644 --- a/api/src/main/java/api/widgets/WidgetPositionMode.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetPositionMode.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; public final class WidgetPositionMode { diff --git a/api/src/main/java/api/widgets/WidgetSizeMode.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetSizeMode.java similarity index 97% rename from api/src/main/java/api/widgets/WidgetSizeMode.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetSizeMode.java index 7ce7d6db11..f468491d81 100644 --- a/api/src/main/java/api/widgets/WidgetSizeMode.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetSizeMode.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; public final class WidgetSizeMode { diff --git a/api/src/main/java/api/widgets/WidgetTextAlignment.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetTextAlignment.java similarity index 97% rename from api/src/main/java/api/widgets/WidgetTextAlignment.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetTextAlignment.java index 68266014a4..1b47301f02 100644 --- a/api/src/main/java/api/widgets/WidgetTextAlignment.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetTextAlignment.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; public final class WidgetTextAlignment { diff --git a/api/src/main/java/api/widgets/WidgetType.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetType.java similarity index 98% rename from api/src/main/java/api/widgets/WidgetType.java rename to runelite-api/src/main/java/net/runelite/api/widgets/WidgetType.java index c039ed18bf..9d140c3cd0 100644 --- a/api/src/main/java/api/widgets/WidgetType.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetType.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api.widgets; +package net.runelite.api.widgets; public final class WidgetType { diff --git a/api/src/main/java/mapping/Export.java b/runelite-api/src/main/java/net/runelite/mapping/Export.java similarity index 100% rename from api/src/main/java/mapping/Export.java rename to runelite-api/src/main/java/net/runelite/mapping/Export.java diff --git a/api/src/main/java/mapping/Import.java b/runelite-api/src/main/java/net/runelite/mapping/Import.java similarity index 100% rename from api/src/main/java/mapping/Import.java rename to runelite-api/src/main/java/net/runelite/mapping/Import.java diff --git a/api/src/main/java/mapping/ObfuscatedGetter.java b/runelite-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java similarity index 100% rename from api/src/main/java/mapping/ObfuscatedGetter.java rename to runelite-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java diff --git a/api/src/main/java/mapping/ObfuscatedName.java b/runelite-api/src/main/java/net/runelite/mapping/ObfuscatedName.java similarity index 100% rename from api/src/main/java/mapping/ObfuscatedName.java rename to runelite-api/src/main/java/net/runelite/mapping/ObfuscatedName.java diff --git a/api/src/main/java/mapping/Protect.java b/runelite-api/src/main/java/net/runelite/mapping/Protect.java similarity index 100% rename from api/src/main/java/mapping/Protect.java rename to runelite-api/src/main/java/net/runelite/mapping/Protect.java diff --git a/runelite-api/src/test/java/net/runelite/api/ExperienceTest.java b/runelite-api/src/test/java/net/runelite/api/ExperienceTest.java new file mode 100644 index 0000000000..29920638bd --- /dev/null +++ b/runelite-api/src/test/java/net/runelite/api/ExperienceTest.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api;; + +import org.junit.Assert; +import org.junit.Test; + +public class ExperienceTest +{ + private static final int XP_FOR_99 = 13_034_431; + private static final int XP_FOR_126 = 188_884_740; + + @Test + public void testGetXpForLevel() + { + int xp = Experience.getXpForLevel(99); + Assert.assertEquals(XP_FOR_99, xp); + + xp = Experience.getXpForLevel(126); + Assert.assertEquals(XP_FOR_126, xp); + + xp = Experience.getXpForLevel(1); + Assert.assertEquals(0, xp); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetXpForHighLevel() + { + int xp = Experience.getXpForLevel(Integer.MAX_VALUE); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetXpForLowLevel() + { + int xp = Experience.getXpForLevel(0); + } + + @Test + public void testGetLevelForXp() + { + int level = Experience.getLevelForXp(XP_FOR_99); + Assert.assertEquals(99, level); + + level = Experience.getLevelForXp(XP_FOR_99 - 1); + Assert.assertEquals(98, level); + + level = Experience.getLevelForXp(XP_FOR_126); + Assert.assertEquals(126, level); + + level = Experience.getLevelForXp(XP_FOR_126 - 1); + Assert.assertEquals(125, level); + + level = Experience.getLevelForXp(Integer.MAX_VALUE); + Assert.assertEquals(126, level); + + level = Experience.getLevelForXp(0); + Assert.assertEquals(1, level); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetLevelForNegativeXP() + { + Experience.getLevelForXp(-1); + } + + @Test + public void testGetCombatLevel() + { + Assert.assertEquals(126, Experience.getCombatLevel(99, 99, 99, 99, 70, 42, 98)); + Assert.assertEquals(40, Experience.getCombatLevel(27, 22, 1, 36, 64, 45, 1)); + } +} diff --git a/runelite-api/src/test/java/net/runelite/api/coords/AngleTest.java b/runelite-api/src/test/java/net/runelite/api/coords/AngleTest.java new file mode 100644 index 0000000000..7f7a2f1548 --- /dev/null +++ b/runelite-api/src/test/java/net/runelite/api/coords/AngleTest.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.coords; + +import static net.runelite.api.coords.Direction.NORTH; +import static net.runelite.api.coords.Direction.WEST; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class AngleTest +{ + + @Test + public void getNearestDirection() + { + Angle angle = new Angle(512 + 10); + assertEquals(WEST, angle.getNearestDirection()); + + angle = new Angle(512 + 256 + 1); + assertEquals(NORTH, angle.getNearestDirection()); + } +} \ No newline at end of file diff --git a/runelite-api/src/test/java/net/runelite/api/model/JarvisTest.java b/runelite-api/src/test/java/net/runelite/api/model/JarvisTest.java new file mode 100644 index 0000000000..1a6f3f1aaa --- /dev/null +++ b/runelite-api/src/test/java/net/runelite/api/model/JarvisTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.model; + +import java.util.Arrays; +import java.util.List; +import net.runelite.api.Point; +import org.junit.Assert; +import org.junit.Test; + +public class JarvisTest +{ + @Test + public void test() + { + Point[] points = + { + new Point(0, 3), + new Point(1, 1), + new Point(2, 2), + new Point(4, 4), + new Point(0, 0), + new Point(1, 2), + new Point(3, 1), + new Point(3, 3) + }; + + List result = Jarvis.convexHull(Arrays.asList(points)); + Assert.assertEquals(4, result.size()); + Assert.assertEquals(new Point(0, 0), result.get(0)); + Assert.assertEquals(new Point(0, 3), result.get(1)); + Assert.assertEquals(new Point(4, 4), result.get(2)); + Assert.assertEquals(new Point(3, 1), result.get(3)); + } + + @Test + public void test2() + { + Point[] points = + { + new Point(0, 3), + new Point(4, 2), + new Point(3, 5), + new Point(5, 3), + new Point(3, 0), + new Point(1, 1), + new Point(1, 2), + new Point(2, 2) + }; + + List result = Jarvis.convexHull(Arrays.asList(points)); + Assert.assertEquals(5, result.size()); + Assert.assertEquals(new Point(0, 3), result.get(0)); + Assert.assertEquals(new Point(3, 5), result.get(1)); + Assert.assertEquals(new Point(5, 3), result.get(2)); + Assert.assertEquals(new Point(3, 0), result.get(3)); + Assert.assertEquals(new Point(1, 1), result.get(4)); + } + + @Test + public void testCollinear() + { + Point[] points = new Point[] + { + new Point(604, 76), + new Point(609, 81), + new Point(606, 78), + new Point(602, 74), + new Point(610, 74), + new Point(609, 77), + new Point(602, 72), + new Point(606, 77), + new Point(611, 77), + new Point(607, 72), + new Point(616, 74), + new Point(611, 70), + new Point(611, 71), + new Point(610, 73), + new Point(614, 82), + new Point(615, 79), + new Point(615, 77), + new Point(615, 76), + new Point(634, 71), + new Point(604, 76) + }; + Jarvis.convexHull(Arrays.asList(points)); + } +} diff --git a/RuneLitePlus/pom.xml b/runelite-client/pom.xml similarity index 85% rename from RuneLitePlus/pom.xml rename to runelite-client/pom.xml index e972136a57..70c5c83000 100644 --- a/RuneLitePlus/pom.xml +++ b/runelite-client/pom.xml @@ -27,9 +27,9 @@ 4.0.0 - com.runeswag - runeswag-parent - 1.0-SNAPSHOT + net.runelite + runelite-parent + 1.5.28-SNAPSHOT client @@ -66,126 +66,121 @@ org.slf4j slf4j-api - 1.8.0-beta4 ch.qos.logback logback-classic - 1.3.0-alpha4 net.sf.jopt-simple jopt-simple - 5.0.1 + ${jopt.version} com.google.guava guava - 27.1-jre com.google.inject guice - 4.2.2 + ${guice.version} no_aop com.google.code.gson gson - 2.8.5 net.runelite.pushingpixels substance - 8.0.02 + ${runelite.pushingpixels.substance.version} net.runelite.pushingpixels trident - 1.5.00 + ${runelite.pushingpixels.trident.version} runtime org.projectlombok lombok - 1.18.6 provided org.apache.commons commons-text - 1.6 + ${commons.text.version} org.jogamp.jogl jogl-all - 2.3.2 + ${jogl.version} org.jogamp.jogl jogl-all - 2.3.2 + ${jogl.version} natives-windows-amd64 runtime org.jogamp.jogl jogl-all - 2.3.2 + ${jogl.version} natives-windows-i586 runtime org.jogamp.jogl jogl-all - 2.3.2 + ${jogl.version} natives-linux-amd64 runtime org.jogamp.jogl jogl-all - 2.3.2 + ${jogl.version} natives-linux-i586 runtime org.jogamp.gluegen gluegen-rt - 2.3.2 + ${jogl.version} org.jogamp.gluegen gluegen-rt - 2.3.2 + ${jogl.version} natives-windows-amd64 runtime org.jogamp.gluegen gluegen-rt - 2.3.2 + ${jogl.version} natives-windows-i586 runtime org.jogamp.gluegen gluegen-rt - 2.3.2 + ${jogl.version} natives-linux-amd64 runtime org.jogamp.gluegen gluegen-rt - 2.3.2 + ${jogl.version} natives-linux-i586 runtime io.sigpipe jbsdiff - 1.0 + ${sigpipe.jbsdiff.version} org.tukaani @@ -197,72 +192,71 @@ net.java.dev.jna jna - 4.5.1 + ${java.dev.jna.version} net.java.dev.jna jna-platform - 4.5.1 + ${java.dev.jna.version} - com.runeswag - api - 1.0-SNAPSHOT + net.runelite + runelite-api + ${project.version} - net.runelit - client-patch - 1.5.26.2 + net.runelite.rs + runescape-api + ${project.version} + runtime + + + net.runelite + injected-client + ${project.version} runtime net.runelite http-api - 1.5.26-SNAPSHOT + ${project.version} net.runelite discord - 1.1 + ${runelite.discord.version} net.runelite orange-extensions - 1.0 + ${runelite.orange.extensions.version} provided - junit junit - 4.13-beta-3 org.mockito mockito-all - 2.0.2-beta org.hamcrest hamcrest-library - 2.1 + ${hamcrest.version} test com.google.inject.extensions guice-testlib - 4.2.2 + ${guice.version} test com.google.inject.extensions guice-grapher - 4.2.2 + ${guice.version} test @@ -290,12 +284,7 @@ asm-all 6.0_BETA - - io.sentry - sentry-logback - 1.7.16 - - + @@ -324,6 +313,7 @@ ttf png gif + wav @@ -345,15 +335,14 @@ - - net.runelite:api + + net.runelite:* ** - - net.runelit:client-patch + net.runelite.rs:runescape-api ** @@ -416,13 +405,17 @@ - true + ${jarsigner.skip} + ${jarsigner.keystore} + ${jarsigner.alias} + ${jarsigner.storepass} + ${jarsigner.keypass} net.runelite script-assembler-plugin - 1.5.26-SNAPSHOT + ${project.version} assemble diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ClientSessionManager.java b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ClientSessionManager.java rename to runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/Notifier.java b/runelite-client/src/main/java/net/runelite/client/Notifier.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/Notifier.java rename to runelite-client/src/main/java/net/runelite/client/Notifier.java index 6a697d8f66..43c833e6b4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/Notifier.java +++ b/runelite-client/src/main/java/net/runelite/client/Notifier.java @@ -24,9 +24,6 @@ */ package net.runelite.client; -import api.ChatMessageType; -import api.Client; -import api.GameState; import com.google.common.base.Strings; import com.google.common.escape.Escaper; import com.google.common.escape.Escapers; @@ -47,10 +44,15 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameState; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.QueuedMessage; +import net.runelite.client.config.FlashNotification; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.ui.ClientUI; import net.runelite.client.util.OSType; @@ -68,7 +70,8 @@ public class Notifier // Notifier properties private static final Color FLASH_COLOR = new Color(255, 0, 0, 70); - private static final int FLASH_DURATION = 2000; + private static final int MINIMUM_FLASH_DURATION_MILLIS = 2000; + private static final int MINIMUM_FLASH_DURATION_TICKS = MINIMUM_FLASH_DURATION_MILLIS / Constants.CLIENT_TICK_LENGTH; private final Client client; private final String appName; @@ -79,6 +82,7 @@ public class Notifier private final Path notifyIconPath; private final boolean terminalNotifierAvailable; private Instant flashStart; + private long mouseLastPressedMillis; @Inject private Notifier( @@ -146,9 +150,10 @@ public class Notifier .build()); } - if (runeLiteConfig.enableFlashNotification()) + if (runeLiteConfig.flashNotification() != FlashNotification.DISABLED) { flashStart = Instant.now(); + mouseLastPressedMillis = client.getMouseLastPressedMillis(); } log.debug(message); @@ -156,24 +161,48 @@ public class Notifier public void processFlash(final Graphics2D graphics) { - if (flashStart == null || client.getGameCycle() % 40 >= 20) - { - return; - } - else if (client.getGameState() != GameState.LOGGED_IN) + if (flashStart == null || client.getGameState() != GameState.LOGGED_IN) { flashStart = null; return; } + FlashNotification flashNotification = runeLiteConfig.flashNotification(); + + if (client.getGameCycle() % 40 >= 20 + // For solid colour, fall through every time. + && (flashNotification == FlashNotification.FLASH_TWO_SECONDS + || flashNotification == FlashNotification.FLASH_UNTIL_CANCELLED)) + { + return; + } + final Color color = graphics.getColor(); graphics.setColor(FLASH_COLOR); graphics.fill(new Rectangle(client.getCanvas().getSize())); graphics.setColor(color); - if (Instant.now().minusMillis(FLASH_DURATION).isAfter(flashStart)) + if (!Instant.now().minusMillis(MINIMUM_FLASH_DURATION_MILLIS).isAfter(flashStart)) { - flashStart = null; + return; + } + + switch (flashNotification) + { + case FLASH_TWO_SECONDS: + case SOLID_TWO_SECONDS: + flashStart = null; + break; + case SOLID_UNTIL_CANCELLED: + case FLASH_UNTIL_CANCELLED: + // Any interaction with the client since the notification started will cancel it after the minimum duration + if (client.getMouseIdleTicks() < MINIMUM_FLASH_DURATION_TICKS + || client.getKeyboardIdleTicks() < MINIMUM_FLASH_DURATION_TICKS + || client.getMouseLastPressedMillis() > mouseLastPressedMillis) + { + flashStart = null; + } + break; } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/RuneLite.java rename to runelite-client/src/main/java/net/runelite/client/RuneLite.java index dadafe7df3..f4626b10a0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -24,7 +24,6 @@ */ package net.runelite.client; -import api.Client; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import com.google.common.annotations.VisibleForTesting; @@ -46,6 +45,7 @@ import joptsimple.OptionSet; import joptsimple.util.EnumConverter; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; import net.runelite.client.account.SessionManager; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.CommandManager; @@ -61,6 +61,7 @@ import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginManager; +import net.runelite.client.rs.ClientLoader; import net.runelite.client.rs.ClientUpdateCheckMode; import net.runelite.client.task.Scheduler; import net.runelite.client.ui.ClientUI; @@ -82,7 +83,7 @@ import org.slf4j.LoggerFactory; @Slf4j public class RuneLite { - public static final String RUNELIT_VERSION = "0.1.2"; + public static final String RUNELIT_VERSION = "2.0.1-1"; public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite"); public static final File PROFILES_DIR = new File(RUNELITE_DIR, "profiles"); public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins"); @@ -183,6 +184,7 @@ public class RuneLite parser.accepts("developer-mode", "Enable developer tools"); parser.accepts("debug", "Show extra debugging output"); parser.accepts("no-splash", "Do not show the splash screen"); + parser.accepts("local-injected", "Use local injected-client"); final ArgumentAcceptingOptionSpec proxyInfo = parser .accepts("proxy") @@ -241,7 +243,7 @@ public class RuneLite System.exit(0); } - final boolean developerMode = true; + final boolean developerMode = options.has("developer-mode"); if (developerMode) { @@ -261,6 +263,11 @@ public class RuneLite logger.setLevel(Level.DEBUG); } + if (options.has("local-injected")) + { + ClientLoader.useLocalInjected = true; + } + Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { log.error("Uncaught exception:", throwable); @@ -283,7 +290,7 @@ public class RuneLite injector = Guice.createInjector(new RuneLiteModule( options.valueOf(updateMode), - developerMode)); + true)); injector.getInstance(RuneLite.class).start(); splashScreen.setProgress(1, 5); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/RuneLiteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/RuneLiteModule.java rename to runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java index 6ba633e1cf..af5e7e2631 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -24,8 +24,6 @@ */ package net.runelite.client; -import api.Client; -import api.hooks.Callbacks; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.name.Names; @@ -35,6 +33,8 @@ import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.hooks.Callbacks; import net.runelite.client.account.SessionManager; import net.runelite.client.callback.Hooks; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/RuneLiteProperties.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/RuneLiteProperties.java rename to runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java index f705a4f6d6..f5b5c56da0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/RuneLiteProperties.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java @@ -92,8 +92,8 @@ public class RuneLiteProperties } else { - return properties.getProperty(DISCORD_APP_ID); - } + return properties.getProperty(DISCORD_APP_ID); + } } public String getDiscordInvite() diff --git a/RuneLitePlus/src/main/java/net/runelite/client/SessionClient.java b/runelite-client/src/main/java/net/runelite/client/SessionClient.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/SessionClient.java rename to runelite-client/src/main/java/net/runelite/client/SessionClient.java index dd85b83aad..e88d558136 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/SessionClient.java +++ b/runelite-client/src/main/java/net/runelite/client/SessionClient.java @@ -39,7 +39,7 @@ class SessionClient { UUID open() throws IOException { - HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() + HttpUrl url = RuneLiteAPI.getRuneLitePlusSessionBase().newBuilder() .build(); Request request = new Request.Builder() @@ -61,7 +61,7 @@ class SessionClient void ping(UUID uuid) throws IOException { - HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() + HttpUrl url = RuneLiteAPI.getRuneLitePlusSessionBase().newBuilder() .addPathSegment("ping") .addQueryParameter("session", uuid.toString()) .build(); @@ -81,7 +81,7 @@ class SessionClient void delete(UUID uuid) throws IOException { - HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() + HttpUrl url = RuneLiteAPI.getRuneLitePlusSessionBase().newBuilder() .addQueryParameter("session", uuid.toString()) .build(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/account/AccountSession.java b/runelite-client/src/main/java/net/runelite/client/account/AccountSession.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/account/AccountSession.java rename to runelite-client/src/main/java/net/runelite/client/account/AccountSession.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/account/SessionManager.java b/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/account/SessionManager.java rename to runelite-client/src/main/java/net/runelite/client/account/SessionManager.java index 00af410588..4caef359c3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/account/SessionManager.java +++ b/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java @@ -94,7 +94,7 @@ public class SessionManager // Check if session is still valid AccountClient accountClient = new AccountClient(session.getUuid()); - if (!accountClient.sesssionCheck()) + if (!accountClient.sessionCheck()) { log.debug("Loaded session {} is invalid", session.getUuid()); return; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/callback/ClientThread.java b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/callback/ClientThread.java rename to runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java index fc2ef31057..a1e3880a39 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/callback/ClientThread.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java @@ -24,13 +24,13 @@ */ package net.runelite.client.callback; -import api.Client; import com.google.inject.Inject; import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.BooleanSupplier; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; @Singleton @Slf4j diff --git a/RuneLitePlus/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/callback/Hooks.java rename to runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index 0a5d177cf6..ca25fa84a8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -24,23 +24,6 @@ */ package net.runelite.client.callback; -import api.BufferProvider; -import api.Client; -import api.MainBufferProvider; -import api.NullItemID; -import api.Point; -import api.RenderOverview; -import api.Renderable; -import api.WorldMapManager; -import api.config.Constants; -import api.events.BeforeMenuRender; -import api.events.BeforeRender; -import api.events.GameTick; -import api.hooks.Callbacks; -import api.hooks.DrawCallbacks; -import api.widgets.Widget; -import static api.widgets.WidgetInfo.WORLD_MAP_VIEW; -import api.widgets.WidgetItem; import com.google.inject.Injector; import java.awt.Color; import java.awt.Dimension; @@ -57,6 +40,22 @@ import java.awt.image.VolatileImage; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.BufferProvider; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.MainBufferProvider; +import net.runelite.api.NullItemID; +import net.runelite.api.RenderOverview; +import net.runelite.api.Renderable; +import net.runelite.api.WorldMapManager; +import net.runelite.api.events.BeforeMenuRender; +import net.runelite.api.events.BeforeRender; +import net.runelite.api.events.GameTick; +import net.runelite.api.hooks.Callbacks; +import net.runelite.api.hooks.DrawCallbacks; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetInfo.WORLD_MAP_VIEW; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.Notifier; import net.runelite.client.RuneLite; import net.runelite.client.chat.ChatMessageManager; @@ -375,9 +374,6 @@ public class Hooks implements Callbacks /** * Copy an image - * - * @param src - * @return */ private static Image copy(Image src) { @@ -397,18 +393,6 @@ public class Hooks implements Callbacks BufferedImage image = (BufferedImage) bufferProvider.getImage(); Graphics2D graphics2d = image.createGraphics(); - // Update selected scene tile - if (!client.isMenuOpen()) - { - Point p = client.getMouseCanvasPosition(); - p = new Point( - p.getX() - client.getViewportXOffset(), - p.getY() - client.getViewportYOffset()); - - client.setCheckClick(true); - client.setMouseCanvasHoverPosition(p); - } - try { renderer.render(graphics2d, OverlayLayer.ABOVE_SCENE); @@ -515,7 +499,6 @@ public class Hooks implements Callbacks } } - @Override public void drawItem(int itemId, WidgetItem widgetItem) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatColor.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatColor.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/ChatColor.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatColor.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatColorType.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatColorType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/ChatColorType.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatColorType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatCommand.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommand.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/ChatCommand.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatCommand.java index ef2dcc20bd..6b4fb9eec2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatCommand.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommand.java @@ -24,11 +24,11 @@ */ package net.runelite.client.chat; -import api.events.ChatMessage; import java.util.function.BiConsumer; import java.util.function.BiPredicate; import lombok.AllArgsConstructor; import lombok.Getter; +import net.runelite.api.events.ChatMessage; import net.runelite.client.events.ChatInput; @AllArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatCommandManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/ChatCommandManager.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java index c2f0e47e94..b1aa9b3ac2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatCommandManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java @@ -24,9 +24,6 @@ */ package net.runelite.client.chat; -import api.Client; -import api.GameState; -import api.events.ChatMessage; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; @@ -35,6 +32,9 @@ import java.util.function.BiPredicate; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.ChatMessage; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ChatInput; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatMessageBuilder.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageBuilder.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/ChatMessageBuilder.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatMessageBuilder.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatMessageManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/ChatMessageManager.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java index 09ed1204da..da4c222fd6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatMessageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java @@ -24,17 +24,6 @@ */ package net.runelite.client.chat; -import api.ChatLineBuffer; -import api.ChatMessageType; -import api.Client; -import api.MessageNode; -import api.Player; -import api.Varbits; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.ResizeableChanged; -import api.events.ScriptCallbackEvent; -import api.events.VarbitChanged; import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.collect.HashMultimap; @@ -50,6 +39,17 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.ChatLineBuffer; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.MessageNode; +import net.runelite.api.Player; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ResizeableChanged; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ChatColorConfig; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/ChatboxInputListener.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatboxInputListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/ChatboxInputListener.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatboxInputListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/CommandManager.java b/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/CommandManager.java rename to runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java index 6e7a4df7b3..7529fc6d56 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/chat/CommandManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java @@ -25,17 +25,17 @@ */ package net.runelite.client.chat; -import api.Client; -import api.ScriptID; -import api.VarClientStr; -import api.events.CommandExecuted; -import api.events.ScriptCallbackEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientStr; +import net.runelite.api.events.CommandExecuted; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/chat/QueuedMessage.java b/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/chat/QueuedMessage.java rename to runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java index 6c8bceeae2..f89ce84b43 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/chat/QueuedMessage.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java @@ -24,10 +24,10 @@ */ package net.runelite.client.chat; -import api.ChatMessageType; import lombok.Builder; import lombok.Data; import lombok.NonNull; +import net.runelite.api.ChatMessageType; @Data @Builder diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/Alpha.java b/runelite-client/src/main/java/net/runelite/client/config/Alpha.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/Alpha.java rename to runelite-client/src/main/java/net/runelite/client/config/Alpha.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ChatColorConfig.java b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ChatColorConfig.java rename to runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java index 0bcf67341c..c9a3e40d3d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/config/ChatColorConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java @@ -451,7 +451,7 @@ public interface ChatColorConfig extends Config ) default Color transparentExamineHighlight() { - return Color.decode("#0000FF"); + return Color.GREEN; } @ConfigItem( diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/Config.java b/runelite-client/src/main/java/net/runelite/client/config/Config.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/Config.java rename to runelite-client/src/main/java/net/runelite/client/config/Config.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigDescriptor.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigDescriptor.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigDescriptor.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigDescriptor.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigGroup.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigGroup.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigGroup.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigGroup.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java similarity index 63% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java index 62cd38a8d1..330551c37f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java @@ -28,6 +28,8 @@ import java.lang.invoke.MethodHandles; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import lombok.extern.slf4j.Slf4j; @@ -36,26 +38,49 @@ class ConfigInvocationHandler implements InvocationHandler { private final ConfigManager manager; + // Caches for annotation values + private static final Map, String> groupValueCache = new HashMap<>(); + private static final Map methodKeyNameCache = new HashMap<>(); + public ConfigInvocationHandler(ConfigManager manager) { this.manager = manager; } + private static String groupValueFromProxy(Class proxyClass) + { + Class iface = proxyClass.getInterfaces()[0]; + ConfigGroup group = iface.getAnnotation(ConfigGroup.class); + + return group == null ? null : group.value(); + } + + private static String keyNameFromMethod(Method method) + { + ConfigItem item = method.getAnnotation(ConfigItem.class); + + return item == null ? null : item.keyName(); + } + @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - Class iface = proxy.getClass().getInterfaces()[0]; - - ConfigGroup group = iface.getAnnotation(ConfigGroup.class); - ConfigItem item = method.getAnnotation(ConfigItem.class); - - if (group == null) + String itemKeyName, groupValue; + try + { + groupValue = groupValueCache.computeIfAbsent(proxy.getClass(), ConfigInvocationHandler::groupValueFromProxy); + } + catch (NullPointerException e) { log.warn("Configuration proxy class {} has no @ConfigGroup!", proxy.getClass()); return null; } - if (item == null) + try + { + itemKeyName = methodKeyNameCache.computeIfAbsent(method, ConfigInvocationHandler::keyNameFromMethod); + } + catch (NullPointerException e) { log.warn("Configuration method {} has no @ConfigItem!", method); return null; @@ -64,38 +89,43 @@ class ConfigInvocationHandler implements InvocationHandler if (args == null) { // Getting configuration item - String value = manager.getConfiguration(group.value(), item.keyName()); - - if (value == null) + return manager.getConfigObjectFromCacheOrElse(groupValue, itemKeyName, (value) -> { - if (method.isDefault()) + try { - return callDefaultMethod(proxy, method, null); + value = manager.getConfiguration(value); + if (value == null) + { + if (method.isDefault()) + { + return callDefaultMethod(proxy, method, null); + } + return null; + } + + // Convert value to return type + Class returnType = method.getReturnType(); + + try + { + return ConfigManager.stringToObject(value, returnType); + } + catch (Exception e) + { + log.warn("Unable to unmarshal {}.{} ", groupValue, itemKeyName, e); + if (method.isDefault()) + { + return callDefaultMethod(proxy, method, null); + } + return null; + } } - - return null; - } - - // Convert value to return type - Class returnType = method.getReturnType(); - - try - { - return ConfigManager.stringToObject(value, returnType); - } - catch (Exception e) - { - log.warn("Unable to unmarshal {}.{} ", group.value(), item.keyName(), e); - if (method.isDefault()) + catch (Throwable throwable) { - Object defaultValue = callDefaultMethod(proxy, method, null); - - manager.setConfiguration(group.value(), item.keyName(), defaultValue); - - return defaultValue; + log.error("Unable to resolve configuration value {}.{}", groupValue, itemKeyName, throwable); + return null; } - return null; - } + }); } else { @@ -103,13 +133,13 @@ class ConfigInvocationHandler implements InvocationHandler if (args.length != 1) { - throw new RuntimeException("Invalid number of arguents to configuration method"); + throw new RuntimeException("Invalid number of arguments to configuration method"); } Object newValue = args[0]; Class type = method.getParameterTypes()[0]; - Object oldValue = manager.getConfiguration(group.value(), item.keyName(), type); + Object oldValue = manager.getConfiguration(groupValue, itemKeyName, type); if (Objects.equals(oldValue, newValue)) { @@ -124,19 +154,19 @@ class ConfigInvocationHandler implements InvocationHandler if (Objects.equals(newValue, defaultValue)) { // Just unset if it goes back to the default - manager.unsetConfiguration(group.value(), item.keyName()); + manager.unsetConfiguration(groupValue, itemKeyName); return null; } } if (newValue == null) { - manager.unsetConfiguration(group.value(), item.keyName()); + manager.unsetConfiguration(groupValue, itemKeyName); } else { String newValueStr = ConfigManager.objectToString(newValue); - manager.setConfiguration(group.value(), item.keyName(), newValueStr); + manager.setConfiguration(groupValue, itemKeyName, newValueStr); } return null; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigItem.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigItem.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java index bac268c761..031fd1fd34 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigItem.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java @@ -51,16 +51,24 @@ public @interface ConfigItem String unhide() default ""; + String unhideValue() default ""; + String hide() default ""; + String hideValue() default ""; + String parent() default ""; String enabledBy() default ""; + String enabledByValue() default ""; + String disabledBy() default ""; + String disabledByValue() default ""; + boolean parse() default false; Class clazz() default void.class; String method() default ""; -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigItemDescriptor.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigItemDescriptor.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigItemDescriptor.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigItemDescriptor.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigItemsGroup.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigItemsGroup.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigItemsGroup.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigItemsGroup.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigManager.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index ac5e8fd712..c81c25bd0e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -24,8 +24,6 @@ */ package net.runelite.client.config; -import api.coords.WorldPoint; -import api.events.ConfigChanged; import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableMap; @@ -57,10 +55,13 @@ import java.util.Objects; import java.util.Properties; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.RuneLite; import static net.runelite.client.RuneLite.PROFILES_DIR; import net.runelite.client.eventbus.EventBus; @@ -81,6 +82,7 @@ public class ConfigManager private final ScheduledExecutorService executor; private final ConfigInvocationHandler handler = new ConfigInvocationHandler(this); private final Properties properties = new Properties(); + private final Map configObjectCache = new HashMap<>(); private final Map pendingChanges = new HashMap<>(); @Inject @@ -220,6 +222,20 @@ public class ConfigManager } } + // Attempts to fetch the config value from the cache if present. Otherwise it calls the get value function and caches the result + Object getConfigObjectFromCacheOrElse(String groupName, String key, Function getValue) + { + String configItemKey = groupName + "." + key; + return configObjectCache.computeIfAbsent(configItemKey, getValue); + } + + // Posts the configchanged event to the event bus and remove the changed key from the cache + private void postConfigChanged(ConfigChanged configChanged) + { + configObjectCache.remove(configChanged.getGroup() + "." + configChanged.getKey()); + eventBus.post(configChanged); + } + public T getConfig(Class clazz) { if (!Modifier.isPublic(clazz.getModifiers())) @@ -245,6 +261,11 @@ public class ConfigManager return properties.getProperty(groupName + "." + key); } + public String getConfiguration(String propertyKey) + { + return properties.getProperty(propertyKey); + } + public T getConfiguration(String groupName, String key, Class clazz) { String value = getConfiguration(groupName, key); @@ -284,7 +305,7 @@ public class ConfigManager configChanged.setOldValue(oldValue); configChanged.setNewValue(value); - eventBus.post(configChanged); + postConfigChanged(configChanged); } public void setConfiguration(String groupName, String key, Object value) @@ -432,7 +453,10 @@ public class ConfigManager String current = getConfiguration(group.value(), item.keyName()); String valueString = objectToString(defaultValue); - if (Objects.equals(current, valueString)) + // null and the empty string are treated identically in sendConfig and treated as an unset + // If a config value defaults to "" and the current value is null, it will cause an extra + // unset to be sent, so treat them as equal + if (Objects.equals(current, valueString) || (Strings.isNullOrEmpty(current) && Strings.isNullOrEmpty(valueString))) { continue; // already set to the default value } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ConfigPanelItem.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigPanelItem.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ConfigPanelItem.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigPanelItem.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ExpandResizeType.java b/runelite-client/src/main/java/net/runelite/client/config/ExpandResizeType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ExpandResizeType.java rename to runelite-client/src/main/java/net/runelite/client/config/ExpandResizeType.java diff --git a/runelite-client/src/main/java/net/runelite/client/config/FlashNotification.java b/runelite-client/src/main/java/net/runelite/client/config/FlashNotification.java new file mode 100644 index 0000000000..f90ce26ad2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/config/FlashNotification.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2019, Twiglet1022 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.config; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum FlashNotification +{ + DISABLED("Off"), + FLASH_TWO_SECONDS("Flash for 2 seconds"), + SOLID_TWO_SECONDS("Solid for 2 seconds"), + FLASH_UNTIL_CANCELLED("Flash until cancelled"), + SOLID_UNTIL_CANCELLED("Solid until cancelled"); + + private final String type; + + @Override + public String toString() + { + return type; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/FontType.java b/runelite-client/src/main/java/net/runelite/client/config/FontType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/FontType.java rename to runelite-client/src/main/java/net/runelite/client/config/FontType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/Keybind.java b/runelite-client/src/main/java/net/runelite/client/config/Keybind.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/Keybind.java rename to runelite-client/src/main/java/net/runelite/client/config/Keybind.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/ModifierlessKeybind.java b/runelite-client/src/main/java/net/runelite/client/config/ModifierlessKeybind.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/ModifierlessKeybind.java rename to runelite-client/src/main/java/net/runelite/client/config/ModifierlessKeybind.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/Range.java b/runelite-client/src/main/java/net/runelite/client/config/Range.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/Range.java rename to runelite-client/src/main/java/net/runelite/client/config/Range.java diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java new file mode 100644 index 0000000000..fea5ab1734 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2017, Tyler + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.config; + +import java.awt.Dimension; +import net.runelite.api.Constants; + +@ConfigGroup("runelite") +public interface RuneLiteConfig extends Config +{ + @ConfigItem( + keyName = "gameSize", + name = "Game size", + description = "The game will resize to this resolution upon starting the client", + position = 10 + ) + default Dimension gameSize() + { + return Constants.GAME_FIXED_SIZE; + } + + @ConfigItem( + keyName = "automaticResizeType", + name = "Resize type", + description = "Choose how the window should resize when opening and closing panels", + position = 11 + ) + default ExpandResizeType automaticResizeType() + { + return ExpandResizeType.KEEP_GAME_SIZE; + } + + @ConfigItem( + keyName = "lockWindowSize", + name = "Lock window size", + description = "Determines if the window resizing is allowed or not", + position = 12 + ) + default boolean lockWindowSize() + { + return false; + } + + @ConfigItem( + keyName = "enablePlugins", + name = "Enable loading of external plugins", + description = "Enable loading of external plugins", + position = 10 + ) + default boolean enablePlugins() + { + return true; + } + + @ConfigItem( + keyName = "containInScreen", + name = "Contain in screen", + description = "Makes the client stay contained in the screen when attempted to move out of it.
    Note: Only works if custom chrome is enabled.", + position = 13 + ) + default boolean containInScreen() + { + return false; + } + + @ConfigItem( + keyName = "rememberScreenBounds", + name = "Remember client position", + description = "Save the position and size of the client after exiting", + position = 14 + ) + default boolean rememberScreenBounds() + { + return true; + } + + @ConfigItem( + keyName = "uiEnableCustomChrome", + name = "Enable custom window chrome", + description = "Use Runelite's custom window title and borders.", + warning = "Please restart your client after changing this setting", + position = 15 + ) + default boolean enableCustomChrome() + { + return true; + } + + @ConfigItem( + keyName = "gameAlwaysOnTop", + name = "Enable client always on top", + description = "The game will always be on the top of the screen", + position = 16 + ) + default boolean gameAlwaysOnTop() + { + return false; + } + + @ConfigItem( + keyName = "warningOnExit", + name = "Display warning on exit", + description = "Toggles a warning popup when trying to exit the client", + position = 17 + ) + default WarningOnExit warningOnExit() + { + return WarningOnExit.LOGGED_IN; + } + + @ConfigItem( + keyName = "usernameInTitle", + name = "Show display name in title", + description = "Toggles displaying of local player's display name in client title", + position = 18 + ) + default boolean usernameInTitle() + { + return true; + } + + @ConfigItem( + keyName = "notificationTray", + name = "Enable tray notifications", + description = "Enables tray notifications", + position = 20 + ) + default boolean enableTrayNotifications() + { + return true; + } + + @ConfigItem( + keyName = "notificationRequestFocus", + name = "Request focus on notification", + description = "Toggles window focus request", + position = 21 + ) + default boolean requestFocusOnNotification() + { + return true; + } + + @ConfigItem( + keyName = "notificationSound", + name = "Enable sound on notifications", + description = "Enables the playing of a beep sound when notifications are displayed", + position = 22 + ) + default boolean enableNotificationSound() + { + return true; + } + + @ConfigItem( + keyName = "notificationGameMessage", + name = "Enable game message notifications", + description = "Puts a notification message in the chatbox", + position = 23 + ) + default boolean enableGameMessageNotification() + { + return false; + } + + @ConfigItem( + keyName = "notificationFlash", + name = "Enable flash notification", + description = "Flashes the game frame as a notification", + position = 24 + ) + default FlashNotification flashNotification() + { + return FlashNotification.DISABLED; + } + + @ConfigItem( + keyName = "notificationFocused", + name = "Send notifications when focused", + description = "Toggles all notifications for when the client is focused", + position = 25 + ) + default boolean sendNotificationsWhenFocused() + { + return false; + } + + @ConfigItem( + keyName = "fontType", + name = "Dynamic Overlay Font", + description = "Configures what font type is used for in-game overlays such as player name, ground items, etc.", + position = 30 + ) + default FontType fontType() + { + return FontType.SMALL; + } + + @ConfigItem( + keyName = "tooltipFontType", + name = "Tooltip Font", + description = "Configures what font type is used for in-game tooltips such as food stats, NPC names, etc.", + position = 31 + ) + default FontType tooltipFontType() + { + return FontType.SMALL; + } + + @ConfigItem( + keyName = "interfaceFontType", + name = "Interface Overlay Font", + description = "Configures what font type is used for in-game interface overlays such as panels, opponent info, clue scrolls etc.", + position = 32 + ) + default FontType interfaceFontType() + { + return FontType.REGULAR; + } + + @ConfigItem( + keyName = "menuEntryShift", + name = "Require Shift for overlay menu", + description = "Overlay right-click menu will require shift to be added", + position = 33 + ) + default boolean menuEntryShift() + { + return true; + } + + @ConfigItem( + keyName = "infoBoxVertical", + name = "Display infoboxes vertically", + description = "Toggles the infoboxes to display vertically", + position = 40 + ) + default boolean infoBoxVertical() + { + return false; + } + + @ConfigItem( + keyName = "infoBoxWrap", + name = "Infobox wrap count", + description = "Configures the amount of infoboxes shown before wrapping", + position = 41 + ) + default int infoBoxWrap() + { + return 4; + } + + @ConfigItem( + keyName = "infoBoxSize", + name = "Infobox size (px)", + description = "Configures the size of each infobox in pixels", + position = 42 + ) + default int infoBoxSize() + { + return 35; + } + + @Range( max = 100, min = 0 ) + @ConfigItem( + keyName = "volume", + name = "Runelite Volume", + description = "Sets the volume of custom Runelite sounds (not the client sounds)", + position = 43 + ) + default int volume() + { + return 100; + } + +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/Stub.java b/runelite-client/src/main/java/net/runelite/client/config/Stub.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/Stub.java rename to runelite-client/src/main/java/net/runelite/client/config/Stub.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/config/WarningOnExit.java b/runelite-client/src/main/java/net/runelite/client/config/WarningOnExit.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/config/WarningOnExit.java rename to runelite-client/src/main/java/net/runelite/client/config/WarningOnExit.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/DiscordPresence.java b/runelite-client/src/main/java/net/runelite/client/discord/DiscordPresence.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/DiscordPresence.java rename to runelite-client/src/main/java/net/runelite/client/discord/DiscordPresence.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/DiscordReplyType.java b/runelite-client/src/main/java/net/runelite/client/discord/DiscordReplyType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/DiscordReplyType.java rename to runelite-client/src/main/java/net/runelite/client/discord/DiscordReplyType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/DiscordService.java b/runelite-client/src/main/java/net/runelite/client/discord/DiscordService.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/DiscordService.java rename to runelite-client/src/main/java/net/runelite/client/discord/DiscordService.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordDisconnected.java b/runelite-client/src/main/java/net/runelite/client/discord/events/DiscordDisconnected.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordDisconnected.java rename to runelite-client/src/main/java/net/runelite/client/discord/events/DiscordDisconnected.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordErrored.java b/runelite-client/src/main/java/net/runelite/client/discord/events/DiscordErrored.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordErrored.java rename to runelite-client/src/main/java/net/runelite/client/discord/events/DiscordErrored.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordJoinGame.java b/runelite-client/src/main/java/net/runelite/client/discord/events/DiscordJoinGame.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordJoinGame.java rename to runelite-client/src/main/java/net/runelite/client/discord/events/DiscordJoinGame.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordJoinRequest.java b/runelite-client/src/main/java/net/runelite/client/discord/events/DiscordJoinRequest.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordJoinRequest.java rename to runelite-client/src/main/java/net/runelite/client/discord/events/DiscordJoinRequest.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordReady.java b/runelite-client/src/main/java/net/runelite/client/discord/events/DiscordReady.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordReady.java rename to runelite-client/src/main/java/net/runelite/client/discord/events/DiscordReady.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordSpectateGame.java b/runelite-client/src/main/java/net/runelite/client/discord/events/DiscordSpectateGame.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/discord/events/DiscordSpectateGame.java rename to runelite-client/src/main/java/net/runelite/client/discord/events/DiscordSpectateGame.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/eventbus/EventBus.java b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/eventbus/EventBus.java rename to runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/eventbus/Subscribe.java b/runelite-client/src/main/java/net/runelite/client/eventbus/Subscribe.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/eventbus/Subscribe.java rename to runelite-client/src/main/java/net/runelite/client/eventbus/Subscribe.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/ChatInput.java b/runelite-client/src/main/java/net/runelite/client/events/ChatInput.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/ChatInput.java rename to runelite-client/src/main/java/net/runelite/client/events/ChatInput.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/ChatboxInput.java b/runelite-client/src/main/java/net/runelite/client/events/ChatboxInput.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/ChatboxInput.java rename to runelite-client/src/main/java/net/runelite/client/events/ChatboxInput.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/NavigationButtonAdded.java b/runelite-client/src/main/java/net/runelite/client/events/NavigationButtonAdded.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/NavigationButtonAdded.java rename to runelite-client/src/main/java/net/runelite/client/events/NavigationButtonAdded.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/NavigationButtonRemoved.java b/runelite-client/src/main/java/net/runelite/client/events/NavigationButtonRemoved.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/NavigationButtonRemoved.java rename to runelite-client/src/main/java/net/runelite/client/events/NavigationButtonRemoved.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/NpcLootReceived.java b/runelite-client/src/main/java/net/runelite/client/events/NpcLootReceived.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/events/NpcLootReceived.java rename to runelite-client/src/main/java/net/runelite/client/events/NpcLootReceived.java index 72fffacdd7..e3ef8a03da 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/events/NpcLootReceived.java +++ b/runelite-client/src/main/java/net/runelite/client/events/NpcLootReceived.java @@ -24,9 +24,9 @@ */ package net.runelite.client.events; -import api.NPC; import java.util.Collection; import lombok.Value; +import net.runelite.api.NPC; import net.runelite.client.game.ItemStack; @Value diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/OverlayMenuClicked.java b/runelite-client/src/main/java/net/runelite/client/events/OverlayMenuClicked.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/OverlayMenuClicked.java rename to runelite-client/src/main/java/net/runelite/client/events/OverlayMenuClicked.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/PartyChanged.java b/runelite-client/src/main/java/net/runelite/client/events/PartyChanged.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/PartyChanged.java rename to runelite-client/src/main/java/net/runelite/client/events/PartyChanged.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/PlayerLootReceived.java b/runelite-client/src/main/java/net/runelite/client/events/PlayerLootReceived.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/events/PlayerLootReceived.java rename to runelite-client/src/main/java/net/runelite/client/events/PlayerLootReceived.java index a6d89bd563..56eb722a83 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/events/PlayerLootReceived.java +++ b/runelite-client/src/main/java/net/runelite/client/events/PlayerLootReceived.java @@ -24,9 +24,9 @@ */ package net.runelite.client.events; -import api.Player; import java.util.Collection; import lombok.Value; +import net.runelite.api.Player; import net.runelite.client.game.ItemStack; @Value diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/PluginChanged.java b/runelite-client/src/main/java/net/runelite/client/events/PluginChanged.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/PluginChanged.java rename to runelite-client/src/main/java/net/runelite/client/events/PluginChanged.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/PrivateMessageInput.java b/runelite-client/src/main/java/net/runelite/client/events/PrivateMessageInput.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/PrivateMessageInput.java rename to runelite-client/src/main/java/net/runelite/client/events/PrivateMessageInput.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/SessionClose.java b/runelite-client/src/main/java/net/runelite/client/events/SessionClose.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/SessionClose.java rename to runelite-client/src/main/java/net/runelite/client/events/SessionClose.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/events/SessionOpen.java b/runelite-client/src/main/java/net/runelite/client/events/SessionOpen.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/events/SessionOpen.java rename to runelite-client/src/main/java/net/runelite/client/events/SessionOpen.java diff --git a/runelite-client/src/main/java/net/runelite/client/flexo/Flexo.java b/runelite-client/src/main/java/net/runelite/client/flexo/Flexo.java new file mode 100644 index 0000000000..0f7a02d3dc --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/flexo/Flexo.java @@ -0,0 +1,338 @@ +/* + * + * Copyright (c) 2019, Zeruth + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* +Modified java.awt.Robot for use with RuneLitePlus. Hopefully we can make it stand far apart. +Uses +https://github.com/JoonasVali/NaturalMouseMotion +for mouse motion. + */ + +package net.runelite.client.flexo; + +import com.github.joonasvali.naturalmouse.api.MouseMotionFactory; +import java.awt.AWTException; +import java.awt.Color; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Point; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.peer.RobotPeer; +import java.util.Random; +import java.util.logging.Logger; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.client.ui.ClientUI; +import sun.awt.ComponentFactory; + +public class Flexo extends Robot +{ + public ThreadGroup flexoThreads = new ThreadGroup("flexo"); + public static boolean isActive; + public static double scale; + public static Client client; + public static ClientUI clientUI; + public static final int fixedWidth = Constants.GAME_FIXED_WIDTH; + public static final int fixedHeight = Constants.GAME_FIXED_HEIGHT; + public static boolean isStretched; + public static int minDelay = 45; + public static MouseMotionFactory currentMouseMotionFactory; + public boolean pausedIndefinitely = false; + private RobotPeer peer; + + public Flexo() throws AWTException + { + if (GraphicsEnvironment.isHeadless()) + { + throw new AWTException("headless environment"); + } + init(GraphicsEnvironment.getLocalGraphicsEnvironment() + .getDefaultScreenDevice()); + } + + private void init(GraphicsDevice screen) throws AWTException + { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (toolkit instanceof ComponentFactory) + { + peer = ((ComponentFactory) toolkit).createRobot(this, screen); + RobotDisposer disposer = new RobotDisposer(peer); + sun.java2d.Disposer.addRecord(anchor, disposer); + } + } + + private transient Object anchor = new Object(); + + static class RobotDisposer implements sun.java2d.DisposerRecord + { + private final RobotPeer peer; + + private RobotDisposer(RobotPeer peer) + { + this.peer = peer; + } + + public void dispose() + { + if (peer != null) + { + peer.dispose(); + } + } + } + + private void pauseMS(int delayMS) + { + long initialMS = System.currentTimeMillis(); + while (System.currentTimeMillis() < initialMS + delayMS) + { + try + { + Thread.sleep(10); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + isActive = false; + } + + @Override + public synchronized void mouseMove(int x, int y) + { + try + { + //TODO: Must be better way to determine titlebar width + currentMouseMotionFactory.build(ClientUI.frame.getX() + x + determineHorizontalOffset(), ClientUI.frame.getY() + y + determineVerticalOffset()).move(); + this.delay(getMinDelay()); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + + public synchronized void mouseMove(Point p) + { + mouseMove((int) p.getX(), (int) p.getY()); + try + { + Thread.sleep(150); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + + @Override + public synchronized void mousePress(int buttonID) + { + if (buttonID < 1 || buttonID > 5) + { + Logger.getAnonymousLogger().warning("Invalid mouse button ID. please use 1-5."); + return; + } + peer.mousePress(InputEvent.getMaskForButton(buttonID)); + this.delay(getMinDelay()); + } + + public synchronized void mousePressAndRelease(int buttonID) + { + if (buttonID < 1 || buttonID > 5) + { + Logger.getAnonymousLogger().warning("Invalid mouse button ID. please use 1-5."); + return; + } + peer.mousePress(InputEvent.getMaskForButton(buttonID)); + this.delay(getMinDelay()); + peer.mouseRelease(InputEvent.getMaskForButton(buttonID)); + this.delay(getMinDelay()); + } + + //TODO: Symbols are nut supported at this time + public synchronized void typeMessage(String message) + { + + Random r = new Random(); + char[] charArray = message.toCharArray(); + for (char c : charArray) + { + keyPress(KeyEvent.getExtendedKeyCodeForChar(c)); + this.delay(93 + r.nextInt(getMinDelay())); + } + keyPress(KeyEvent.VK_ENTER); + this.delay(93 + r.nextInt(getMinDelay())); + ClientUI.allowInput = true; + } + + + @Override + public synchronized void mouseRelease(int buttonID) + { + if (buttonID < 1 || buttonID > 5) + { + Logger.getAnonymousLogger().warning("Invalid mouse button ID. please use 1-5."); + return; + } + peer.mouseRelease(InputEvent.getMaskForButton(buttonID)); + this.delay(getMinDelay()); + } + + private int getMinDelay() + { + Random random = new Random(); + int random1 = random.nextInt(minDelay); + if (random1 < minDelay / 2) + { + random1 = random.nextInt(minDelay / 2) + minDelay / 2 + random.nextInt(minDelay / 2); + } + return random1; + } + + private int getWheelDelay() + { + Random random = new Random(); + int random1 = random.nextInt(minDelay); + if (random1 < minDelay / 2) + { + random1 = random.nextInt(minDelay / 2) + minDelay / 2 + random.nextInt(minDelay / 2); + } + return random1; + } + + /** + * Rotates the scroll wheel on wheel-equipped mice. + * + * @param wheelAmt number of "notches" to move the mouse wheel + * Negative values indicate movement up/away from the user, + * positive values indicate movement down/towards the user. + * @since 1.4 + */ + @Override + public synchronized void mouseWheel(int wheelAmt) + { + for (int i : new int[wheelAmt]) + { + peer.mouseWheel(wheelAmt); + this.delay(getWheelDelay()); + } + } + + /** + * Presses a given key. The key should be released using the + * keyRelease method. + *

    + * Key codes that have more than one physical key associated with them + * (e.g. KeyEvent.VK_SHIFT could mean either the + * left or right shift key) will map to the left key. + * + * @param keycode Key to press (e.g. KeyEvent.VK_A) + * @throws IllegalArgumentException if keycode is not + * a valid key + * @see #keyRelease(int) + * @see java.awt.event.KeyEvent + */ + @Override + public synchronized void keyPress(int keycode) + { + peer.keyPress(keycode); + this.delay(getMinDelay()); + } + + @Override + public synchronized void keyRelease(int keycode) + { + peer.keyRelease(keycode); + this.delay(getMinDelay()); + } + + public synchronized void holdKey(int keycode, int timeMS) + { + new Thread(() -> + { + peer.keyPress(keycode); + long startTime = System.currentTimeMillis(); + while ((startTime + timeMS) > System.currentTimeMillis()) + { + } + peer.keyRelease(keycode); + this.delay(getMinDelay()); + }).start(); + } + + public synchronized void holdKeyIndefinitely(int keycode) + { + Thread holdKeyThread = new Thread(() -> + { + pausedIndefinitely = true; + peer.keyPress(keycode); + while (pausedIndefinitely) + { + try + { + Thread.sleep(10); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + peer.keyRelease(keycode); + this.delay(getMinDelay()); + }); + holdKeyThread.start(); + + } + + @Override + public Color getPixelColor(int x, int y) + { + return new Color(peer.getRGBPixel(x, y)); + } + + @Override + public void delay(int ms) + { + pauseMS(ms); + } + + public int determineHorizontalOffset() + { + return clientUI.getCanvasOffset().getX(); + } + + public int determineVerticalOffset() + { + return clientUI.getCanvasOffset().getY(); + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/flexo/FlexoMouse.java b/runelite-client/src/main/java/net/runelite/client/flexo/FlexoMouse.java new file mode 100644 index 0000000000..76e1545250 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/flexo/FlexoMouse.java @@ -0,0 +1,225 @@ + +/* + * + * Copyright (c) 2019, Zeruth + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.flexo; + +import java.awt.Point; +import java.awt.Rectangle; +import java.util.Random; +import java.util.logging.Logger; +import net.runelite.api.Constants; +import net.runelite.client.ui.ClientUI; + +public class FlexoMouse +{ + + /* + Should pass unstretched coords, handles all conversions here. + */ + public static Point getClickPoint(Rectangle rect) + { + if (rect != null) + { + Random r = new Random(); + int x = -1; + int y = -1; + x = rect.x + r.nextInt(rect.width); + y = rect.y + r.nextInt(rect.height); + + if (Flexo.isStretched) + { + double wScale; + double hScale; + + if (Flexo.client.isResized()) + { + wScale = (Flexo.client.getStretchedDimensions().width / (double) Flexo.client.getRealDimensions().width); + hScale = (Flexo.client.getStretchedDimensions().height / (double) Flexo.client.getRealDimensions().height); + int newX = (int) (x * wScale); + int newY = (int) (y * hScale); + if (newX > 0 && newX < ClientUI.frame.getWidth()) + { + if (newY > 0 && newY < ClientUI.frame.getHeight()) + { + return new Point(newX, newY); + } + } + Logger.getAnonymousLogger().warning("[RuneLit]Flexo - Off screen point attempted. Split the step, or rotate the screen."); + return null; + } + else + { + if (x > 0 && x < ClientUI.frame.getWidth()) + { + if (y > 0 && y < ClientUI.frame.getHeight()) + { + return new Point(x, y); + } + } + Logger.getAnonymousLogger().warning("[RuneLit]Flexo - Off screen point attempted. Split the step, or rotate the screen."); + return null; + } + + } + else if (!Flexo.client.isResized()) + { + final int fixedWidth = Constants.GAME_FIXED_WIDTH; + int widthDif = ClientUI.frame.getWidth(); + + if (ClientUI.pluginToolbar.isVisible()) + { + widthDif -= ClientUI.pluginToolbar.getWidth(); + } + if (ClientUI.pluginPanel != null) + { + widthDif -= ClientUI.pluginPanel.getWidth(); + } + + widthDif -= fixedWidth; + if (x + (widthDif / 2) > 0 && x + (widthDif / 2) < ClientUI.frame.getWidth()) + { + if (y > 0 && y < ClientUI.frame.getHeight()) + { + return new Point(x, y); + } + } + Logger.getAnonymousLogger().warning("[RuneLit]Flexo - Off screen point attempted. Split the step, or rotate the screen."); + return null; + } + else + { + if (x > 0 && x < ClientUI.frame.getWidth()) + { + if (y > 0 && y < ClientUI.frame.getHeight()) + { + return new Point(x, y); + } + } + Logger.getAnonymousLogger().warning("[RuneLit]Flexo - Off screen point attempted. Split the step, or rotate the screen."); + return null; + } + } + return null; + } + + public static Rectangle getClickArea(Rectangle rect) + { + if (Flexo.isStretched) + { + double wScale; + double hScale; + + if (Flexo.client.isResized()) + { + wScale = (Flexo.client.getStretchedDimensions().width / (double) Flexo.client.getRealDimensions().width); + hScale = (Flexo.client.getStretchedDimensions().height / (double) Flexo.client.getRealDimensions().height); + } + else + { + wScale = (Flexo.client.getStretchedDimensions().width) / (double) Flexo.fixedWidth; + hScale = (Flexo.client.getStretchedDimensions().height) / (double) Flexo.fixedHeight; + } + + int xPadding = (int) rect.getWidth() / 5; + int yPadding = (int) rect.getHeight() / 5; + Random r = new Random(); + Rectangle clickRect = new Rectangle(); + clickRect.width = rect.width - xPadding * 2; + clickRect.height = rect.height - yPadding * 2; + clickRect.x = rect.x + xPadding; + clickRect.y = rect.y + yPadding; + if (clickRect.width > 0 && clickRect.height > 0) + { + int x = clickRect.x + r.nextInt(clickRect.width); + int y = clickRect.y + r.nextInt(clickRect.height); + double tScale = 1 + (Flexo.scale / 100); + + if (Flexo.client.isResized()) + { + return new Rectangle((int) (clickRect.x * wScale), (int) (clickRect.y * wScale), (int) (clickRect.width * wScale), (int) (clickRect.getHeight() * hScale)); + } + else + { + return new Rectangle(clickRect.x, clickRect.y, clickRect.width, (int) (clickRect.getHeight())); + } + } + + } + //Fixed, not stretched + else if (!Flexo.client.isResized()) + { + int fixedWidth = 765; + int widthDif = ClientUI.frame.getWidth(); + + if (ClientUI.pluginToolbar.isVisible()) + { + widthDif -= ClientUI.pluginToolbar.getWidth(); + } + if (ClientUI.pluginPanel != null) + { + widthDif -= ClientUI.pluginPanel.getWidth(); + } + + widthDif -= fixedWidth; + int xPadding = (int) rect.getWidth() / 5; + int yPadding = (int) rect.getHeight() / 5; + Random r = new Random(); + Rectangle clickRect = new Rectangle(); + clickRect.width = rect.width - xPadding; + clickRect.height = rect.height - yPadding; + clickRect.x = rect.x + xPadding; + clickRect.y = rect.y + yPadding; + if (clickRect.height > 0 && clickRect.width > 0) + { + int x = clickRect.x + r.nextInt(clickRect.width); + int y = clickRect.y + r.nextInt(clickRect.height); + return new Rectangle(clickRect.x, clickRect.y, clickRect.width, (int) (clickRect.getHeight())); + } + } + //Resizable, not stretched + else + { + int xPadding = (int) rect.getWidth() / 5; + int yPadding = (int) rect.getHeight() / 5; + Random r = new Random(); + Rectangle clickRect = new Rectangle(); + clickRect.width = rect.width - xPadding * 2; + clickRect.height = rect.height - yPadding * 2; + clickRect.x = rect.x + xPadding; + clickRect.y = rect.y + yPadding; + if (clickRect.height > 0 && clickRect.width > 0) + { + int x = clickRect.x + r.nextInt(clickRect.width); + int y = clickRect.y + r.nextInt(clickRect.height); + return new Rectangle(clickRect.x, clickRect.y, clickRect.width, (int) (clickRect.getHeight())); + } + } + + return null; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/AgilityShortcut.java b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java similarity index 59% rename from RuneLitePlus/src/main/java/net/runelite/client/game/AgilityShortcut.java rename to runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java index abfe81e004..96a55f3e86 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/AgilityShortcut.java +++ b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java @@ -25,10 +25,214 @@ */ package net.runelite.client.game; -import static api.NullObjectID.*; -import static api.ObjectID.*; -import api.coords.WorldPoint; import lombok.Getter; +import static net.runelite.api.NullObjectID.NULL_25337; +import static net.runelite.api.NullObjectID.NULL_26371; +import static net.runelite.api.NullObjectID.NULL_26375; +import static net.runelite.api.NullObjectID.NULL_26884; +import static net.runelite.api.NullObjectID.NULL_26886; +import static net.runelite.api.NullObjectID.NULL_29868; +import static net.runelite.api.NullObjectID.NULL_29869; +import static net.runelite.api.NullObjectID.NULL_29870; +import static net.runelite.api.NullObjectID.NULL_31823; +import static net.runelite.api.NullObjectID.NULL_31849; +import static net.runelite.api.NullObjectID.NULL_33327; +import static net.runelite.api.NullObjectID.NULL_33328; +import static net.runelite.api.ObjectID.A_WOODEN_LOG; +import static net.runelite.api.ObjectID.BALANCING_LEDGE_23548; +import static net.runelite.api.ObjectID.BIG_WINDOW; +import static net.runelite.api.ObjectID.BOULDER_27990; +import static net.runelite.api.ObjectID.BROKEN_FENCE; +import static net.runelite.api.ObjectID.BROKEN_FENCE_2618; +import static net.runelite.api.ObjectID.BROKEN_RAFT; +import static net.runelite.api.ObjectID.BROKEN_WALL_33344; +import static net.runelite.api.ObjectID.CASTLE_WALL; +import static net.runelite.api.ObjectID.CLIMBING_ROCKS; +import static net.runelite.api.ObjectID.CLIMBING_ROCKS_11948; +import static net.runelite.api.ObjectID.CLIMBING_ROCKS_11949; +import static net.runelite.api.ObjectID.CREVICE_16465; +import static net.runelite.api.ObjectID.CREVICE_16539; +import static net.runelite.api.ObjectID.CREVICE_16543; +import static net.runelite.api.ObjectID.CREVICE_19043; +import static net.runelite.api.ObjectID.CREVICE_30198; +import static net.runelite.api.ObjectID.CREVICE_9739; +import static net.runelite.api.ObjectID.CREVICE_9740; +import static net.runelite.api.ObjectID.CROSSBOW_TREE_17062; +import static net.runelite.api.ObjectID.CRUMBLING_WALL_24222; +import static net.runelite.api.ObjectID.DARK_TUNNEL_10047; +import static net.runelite.api.ObjectID.DENSE_FOREST; +import static net.runelite.api.ObjectID.DENSE_FOREST_3938; +import static net.runelite.api.ObjectID.DENSE_FOREST_3939; +import static net.runelite.api.ObjectID.DENSE_FOREST_3998; +import static net.runelite.api.ObjectID.DENSE_FOREST_3999; +import static net.runelite.api.ObjectID.FALLEN_TREE_33192; +import static net.runelite.api.ObjectID.FENCE_16518; +import static net.runelite.api.ObjectID.GAP; +import static net.runelite.api.ObjectID.GAP_2831; +import static net.runelite.api.ObjectID.GAP_29326; +import static net.runelite.api.ObjectID.HOLE_16520; +import static net.runelite.api.ObjectID.HOLE_30966; +import static net.runelite.api.ObjectID.HOLE_31481; +import static net.runelite.api.ObjectID.HOLE_31482; +import static net.runelite.api.ObjectID.ICE_CHUNKS_31822; +import static net.runelite.api.ObjectID.ICE_CHUNKS_31990; +import static net.runelite.api.ObjectID.JUTTING_WALL_17002; +import static net.runelite.api.ObjectID.LADDER_30938; +import static net.runelite.api.ObjectID.LADDER_30939; +import static net.runelite.api.ObjectID.LADDER_30940; +import static net.runelite.api.ObjectID.LADDER_30941; +import static net.runelite.api.ObjectID.LEAVES; +import static net.runelite.api.ObjectID.LEAVES_3924; +import static net.runelite.api.ObjectID.LEAVES_3925; +import static net.runelite.api.ObjectID.LEDGE_33190; +import static net.runelite.api.ObjectID.LITTLE_BOULDER; +import static net.runelite.api.ObjectID.LOG_BALANCE_16540; +import static net.runelite.api.ObjectID.LOG_BALANCE_16541; +import static net.runelite.api.ObjectID.LOG_BALANCE_16542; +import static net.runelite.api.ObjectID.LOG_BALANCE_16546; +import static net.runelite.api.ObjectID.LOG_BALANCE_16547; +import static net.runelite.api.ObjectID.LOG_BALANCE_16548; +import static net.runelite.api.ObjectID.LOG_BALANCE_20882; +import static net.runelite.api.ObjectID.LOG_BALANCE_20884; +import static net.runelite.api.ObjectID.LOG_BALANCE_23274; +import static net.runelite.api.ObjectID.LOG_BALANCE_3929; +import static net.runelite.api.ObjectID.LOG_BALANCE_3930; +import static net.runelite.api.ObjectID.LOG_BALANCE_3931; +import static net.runelite.api.ObjectID.LOG_BALANCE_3932; +import static net.runelite.api.ObjectID.LOG_BALANCE_3933; +import static net.runelite.api.ObjectID.LOOSE_RAILING; +import static net.runelite.api.ObjectID.LOOSE_RAILING_2186; +import static net.runelite.api.ObjectID.LOOSE_RAILING_28849; +import static net.runelite.api.ObjectID.LOW_FENCE; +import static net.runelite.api.ObjectID.MONKEYBARS_23566; +import static net.runelite.api.ObjectID.MONKEYBARS_23567; +import static net.runelite.api.ObjectID.MYSTERIOUS_PIPE; +import static net.runelite.api.ObjectID.OBSTACLE; +import static net.runelite.api.ObjectID.OBSTACLE_30767; +import static net.runelite.api.ObjectID.OBSTACLE_30962; +import static net.runelite.api.ObjectID.OBSTACLE_30964; +import static net.runelite.api.ObjectID.OBSTACLE_PIPE_16509; +import static net.runelite.api.ObjectID.OBSTACLE_PIPE_16511; +import static net.runelite.api.ObjectID.OBSTACLE_PIPE_23140; +import static net.runelite.api.ObjectID.ORNATE_RAILING; +import static net.runelite.api.ObjectID.ORNATE_RAILING_17000; +import static net.runelite.api.ObjectID.PILE_OF_RUBBLE_23563; +import static net.runelite.api.ObjectID.PILE_OF_RUBBLE_23564; +import static net.runelite.api.ObjectID.PILLAR_31561; +import static net.runelite.api.ObjectID.PILLAR_31809; +import static net.runelite.api.ObjectID.PIPE_21727; +import static net.runelite.api.ObjectID.PIPE_21728; +import static net.runelite.api.ObjectID.ROCKS; +import static net.runelite.api.ObjectID.ROCKSLIDE_33184; +import static net.runelite.api.ObjectID.ROCKSLIDE_33185; +import static net.runelite.api.ObjectID.ROCKSLIDE_33191; +import static net.runelite.api.ObjectID.ROCKS_14106; +import static net.runelite.api.ObjectID.ROCKS_16464; +import static net.runelite.api.ObjectID.ROCKS_16514; +import static net.runelite.api.ObjectID.ROCKS_16515; +import static net.runelite.api.ObjectID.ROCKS_16521; +import static net.runelite.api.ObjectID.ROCKS_16522; +import static net.runelite.api.ObjectID.ROCKS_16523; +import static net.runelite.api.ObjectID.ROCKS_16524; +import static net.runelite.api.ObjectID.ROCKS_16534; +import static net.runelite.api.ObjectID.ROCKS_16535; +import static net.runelite.api.ObjectID.ROCKS_16545; +import static net.runelite.api.ObjectID.ROCKS_16549; +import static net.runelite.api.ObjectID.ROCKS_16550; +import static net.runelite.api.ObjectID.ROCKS_16998; +import static net.runelite.api.ObjectID.ROCKS_16999; +import static net.runelite.api.ObjectID.ROCKS_17042; +import static net.runelite.api.ObjectID.ROCKS_19849; +import static net.runelite.api.ObjectID.ROCKS_2231; +import static net.runelite.api.ObjectID.ROCKS_27984; +import static net.runelite.api.ObjectID.ROCKS_27985; +import static net.runelite.api.ObjectID.ROCKS_27987; +import static net.runelite.api.ObjectID.ROCKS_27988; +import static net.runelite.api.ObjectID.ROCKS_31757; +import static net.runelite.api.ObjectID.ROCKS_31758; +import static net.runelite.api.ObjectID.ROCKS_31759; +import static net.runelite.api.ObjectID.ROCKS_34396; +import static net.runelite.api.ObjectID.ROCKS_34397; +import static net.runelite.api.ObjectID.ROCKS_34741; +import static net.runelite.api.ObjectID.ROCKS_3748; +import static net.runelite.api.ObjectID.ROCKS_3790; +import static net.runelite.api.ObjectID.ROCKS_3791; +import static net.runelite.api.ObjectID.ROCKS_3803; +import static net.runelite.api.ObjectID.ROCKS_3804; +import static net.runelite.api.ObjectID.ROCKS_6673; +import static net.runelite.api.ObjectID.ROCKY_HANDHOLDS_26400; +import static net.runelite.api.ObjectID.ROCKY_HANDHOLDS_26401; +import static net.runelite.api.ObjectID.ROCKY_HANDHOLDS_26402; +import static net.runelite.api.ObjectID.ROCKY_HANDHOLDS_26404; +import static net.runelite.api.ObjectID.ROCKY_HANDHOLDS_26405; +import static net.runelite.api.ObjectID.ROCKY_HANDHOLDS_26406; +import static net.runelite.api.ObjectID.ROCK_16115; +import static net.runelite.api.ObjectID.ROPESWING_23568; +import static net.runelite.api.ObjectID.ROPESWING_23569; +import static net.runelite.api.ObjectID.ROPE_ANCHOR; +import static net.runelite.api.ObjectID.ROPE_ANCHOR_30917; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21306; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21307; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21308; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21309; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21310; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21311; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21312; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21313; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21314; +import static net.runelite.api.ObjectID.ROPE_BRIDGE_21315; +import static net.runelite.api.ObjectID.RUBBER_CAP_MUSHROOM; +import static net.runelite.api.ObjectID.SPIKEY_CHAIN; +import static net.runelite.api.ObjectID.SPIKEY_CHAIN_16538; +import static net.runelite.api.ObjectID.STAIRS_31485; +import static net.runelite.api.ObjectID.STEPPING_STONES; +import static net.runelite.api.ObjectID.STEPPING_STONES_23646; +import static net.runelite.api.ObjectID.STEPPING_STONES_23647; +import static net.runelite.api.ObjectID.STEPPING_STONE_10663; +import static net.runelite.api.ObjectID.STEPPING_STONE_11768; +import static net.runelite.api.ObjectID.STEPPING_STONE_13504; +import static net.runelite.api.ObjectID.STEPPING_STONE_14917; +import static net.runelite.api.ObjectID.STEPPING_STONE_14918; +import static net.runelite.api.ObjectID.STEPPING_STONE_16466; +import static net.runelite.api.ObjectID.STEPPING_STONE_16513; +import static net.runelite.api.ObjectID.STEPPING_STONE_16533; +import static net.runelite.api.ObjectID.STEPPING_STONE_19040; +import static net.runelite.api.ObjectID.STEPPING_STONE_19042; +import static net.runelite.api.ObjectID.STEPPING_STONE_21738; +import static net.runelite.api.ObjectID.STEPPING_STONE_21739; +import static net.runelite.api.ObjectID.STEPPING_STONE_29728; +import static net.runelite.api.ObjectID.STEPPING_STONE_29729; +import static net.runelite.api.ObjectID.STEPPING_STONE_29730; +import static net.runelite.api.ObjectID.STEPPING_STONE_5948; +import static net.runelite.api.ObjectID.STEPPING_STONE_5949; +import static net.runelite.api.ObjectID.STEPS; +import static net.runelite.api.ObjectID.STEPS_29993; +import static net.runelite.api.ObjectID.STICKS; +import static net.runelite.api.ObjectID.STILE; +import static net.runelite.api.ObjectID.STILE_12982; +import static net.runelite.api.ObjectID.STRANGE_FLOOR; +import static net.runelite.api.ObjectID.STRANGE_FLOOR_16544; +import static net.runelite.api.ObjectID.STRONG_TREE_17074; +import static net.runelite.api.ObjectID.TIGHTGAP; +import static net.runelite.api.ObjectID.TRELLIS_20056; +import static net.runelite.api.ObjectID.TRIPWIRE; +import static net.runelite.api.ObjectID.TUNNEL_30174; +import static net.runelite.api.ObjectID.TUNNEL_30175; +import static net.runelite.api.ObjectID.TUNNEL_30959; +import static net.runelite.api.ObjectID.UNDERWALL_TUNNEL; +import static net.runelite.api.ObjectID.UNDERWALL_TUNNEL_16528; +import static net.runelite.api.ObjectID.UNDERWALL_TUNNEL_16529; +import static net.runelite.api.ObjectID.UNDERWALL_TUNNEL_16530; +import static net.runelite.api.ObjectID.UNDERWALL_TUNNEL_19032; +import static net.runelite.api.ObjectID.UNDERWALL_TUNNEL_19036; +import static net.runelite.api.ObjectID.VINE_26880; +import static net.runelite.api.ObjectID.VINE_26882; +import static net.runelite.api.ObjectID.WALL_17047; +import static net.runelite.api.ObjectID.WALL_17049; +import static net.runelite.api.ObjectID.WALL_17050; +import static net.runelite.api.ObjectID.WEATHERED_WALL; +import static net.runelite.api.ObjectID.WEATHERED_WALL_16526; +import net.runelite.api.coords.WorldPoint; @Getter public enum AgilityShortcut @@ -121,7 +325,7 @@ public enum AgilityShortcut TROLLHEIM_MEDIUM_CLIFF_SCRAMBLE_NORTH(43, "Rocks", new WorldPoint(2886, 3684, 0), ROCKS_3803, ROCKS_3804, ROCKS_16522), TROLLHEIM_MEDIUM_CLIFF_SCRAMBLE_SOUTH(43, "Rocks", new WorldPoint(2876, 3666, 0), ROCKS_3803, ROCKS_3804, ROCKS_16522), TROLLHEIM_ADVANCED_CLIFF_SCRAMBLE(44, "Rocks", new WorldPoint(2907, 3686, 0), ROCKS_16523, ROCKS_3748), - KOUREND_RIVER_STEPPING_STONES(45, "Stepping Stones", new WorldPoint(1721, 3509, 0), STEPPING_STONE_29728), + KOUREND_RIVER_STEPPING_STONES(45, "Stepping Stones", new WorldPoint(1720, 3551, 0), STEPPING_STONE_29728), TIRANNWN_LOG_BALANCE(45, "Log Balance", null, LOG_BALANCE_3933, LOG_BALANCE_3931, LOG_BALANCE_3930, LOG_BALANCE_3929, LOG_BALANCE_3932), COSMIC_ALTAR_MEDIUM_WALKWAY(46, "Narrow Walkway", new WorldPoint(2399, 4403, 0), JUTTING_WALL_17002), DEEP_WILDERNESS_DUNGEON_CREVICE_NORTH(46, "Narrow Crevice", new WorldPoint(3047, 10335, 0), CREVICE_19043), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/AsyncBufferedImage.java b/runelite-client/src/main/java/net/runelite/client/game/AsyncBufferedImage.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/game/AsyncBufferedImage.java rename to runelite-client/src/main/java/net/runelite/client/game/AsyncBufferedImage.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/ClanManager.java b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/game/ClanManager.java rename to runelite-client/src/main/java/net/runelite/client/game/ClanManager.java index e27a0c0413..0b80bbc7e9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/ClanManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java @@ -24,14 +24,6 @@ */ package net.runelite.client.game; -import api.ClanMember; -import api.ClanMemberRank; -import api.Client; -import api.GameState; -import api.IndexedSprite; -import api.SpriteID; -import api.events.ClanChanged; -import api.events.GameStateChanged; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -44,6 +36,14 @@ import java.util.concurrent.TimeUnit; import javax.annotation.Nonnull; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.ClanMember; +import net.runelite.api.ClanMemberRank; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.IndexedSprite; +import net.runelite.api.SpriteID; +import net.runelite.api.events.ClanChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/HiscoreLoader.java b/runelite-client/src/main/java/net/runelite/client/game/HiscoreLoader.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/game/HiscoreLoader.java rename to runelite-client/src/main/java/net/runelite/client/game/HiscoreLoader.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/HiscoreManager.java b/runelite-client/src/main/java/net/runelite/client/game/HiscoreManager.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/game/HiscoreManager.java rename to runelite-client/src/main/java/net/runelite/client/game/HiscoreManager.java index c1fe27c747..060df7d785 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/HiscoreManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/HiscoreManager.java @@ -24,7 +24,6 @@ */ package net.runelite.client.game; -import api.Client; import com.google.common.cache.CacheBuilder; import com.google.common.cache.LoadingCache; import java.io.IOException; @@ -34,6 +33,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import lombok.AllArgsConstructor; import lombok.Data; +import net.runelite.api.Client; import net.runelite.client.callback.ClientThread; import net.runelite.http.api.hiscore.HiscoreClient; import net.runelite.http.api.hiscore.HiscoreEndpoint; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java similarity index 64% rename from RuneLitePlus/src/main/java/net/runelite/client/game/ItemManager.java rename to runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index 3a91391394..02f5a8785d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -24,16 +24,6 @@ */ package net.runelite.client.game; -import api.Client; -import static api.Constants.CLIENT_DEFAULT_ZOOM; -import static api.Constants.HIGH_ALCHEMY_CONSTANT; -import api.GameState; -import api.ItemDefinition; -import api.ItemID; -import static api.ItemID.*; -import api.Sprite; -import api.events.GameStateChanged; -import api.events.PostItemDefinition; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -53,6 +43,126 @@ import javax.inject.Inject; import javax.inject.Singleton; import lombok.Value; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import static net.runelite.api.Constants.CLIENT_DEFAULT_ZOOM; +import static net.runelite.api.Constants.HIGH_ALCHEMY_MULTIPLIER; +import net.runelite.api.GameState; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemID; +import static net.runelite.api.ItemID.AGILITY_CAPE; +import static net.runelite.api.ItemID.AGILITY_CAPET; +import static net.runelite.api.ItemID.AGILITY_CAPET_13341; +import static net.runelite.api.ItemID.AGILITY_CAPE_13340; +import static net.runelite.api.ItemID.BOOTS_OF_LIGHTNESS; +import static net.runelite.api.ItemID.BOOTS_OF_LIGHTNESS_89; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_11861; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13589; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13590; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13601; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13602; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13613; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13614; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13625; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13626; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13637; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13638; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13677; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13678; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_21076; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_21078; +import static net.runelite.api.ItemID.GRACEFUL_CAPE; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_11853; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13581; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13582; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13593; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13594; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13605; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13606; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13617; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13618; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13629; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13630; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13669; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13670; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_21064; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_21066; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_11859; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13587; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13588; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13599; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13600; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13611; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13612; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13623; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13624; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13635; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13636; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13675; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13676; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_21073; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_21075; +import static net.runelite.api.ItemID.GRACEFUL_HOOD; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_11851; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13579; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13580; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13591; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13592; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13603; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13604; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13615; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13616; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13627; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13628; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13667; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13668; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_21061; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_21063; +import static net.runelite.api.ItemID.GRACEFUL_LEGS; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_11857; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13585; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13586; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13597; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13598; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13609; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13610; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13621; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13622; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13633; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13634; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13673; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13674; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_21070; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_21072; +import static net.runelite.api.ItemID.GRACEFUL_TOP; +import static net.runelite.api.ItemID.GRACEFUL_TOP_11855; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13583; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13584; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13595; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13596; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13607; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13608; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13619; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13620; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13631; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13632; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13671; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13672; +import static net.runelite.api.ItemID.GRACEFUL_TOP_21067; +import static net.runelite.api.ItemID.GRACEFUL_TOP_21069; +import static net.runelite.api.ItemID.MAX_CAPE; +import static net.runelite.api.ItemID.MAX_CAPE_13342; +import static net.runelite.api.ItemID.PENANCE_GLOVES; +import static net.runelite.api.ItemID.PENANCE_GLOVES_10554; +import static net.runelite.api.ItemID.SPOTTED_CAPE; +import static net.runelite.api.ItemID.SPOTTED_CAPE_10073; +import static net.runelite.api.ItemID.SPOTTIER_CAPE; +import static net.runelite.api.ItemID.SPOTTIER_CAPE_10074; +import net.runelite.api.Sprite; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.PostItemDefinition; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.http.api.item.ItemClient; @@ -314,7 +424,7 @@ public class ItemManager return 1000; } - return (int) Math.max(1, composition.getPrice() * HIGH_ALCHEMY_CONSTANT); + return (int) Math.max(1, composition.getPrice() * HIGH_ALCHEMY_MULTIPLIER); } public int getAlchValue(int itemID) @@ -328,7 +438,7 @@ public class ItemManager return 1000; } - return (int) Math.max(1, getItemDefinition(itemID).getPrice() * HIGH_ALCHEMY_CONSTANT); + return (int) Math.max(1, getItemDefinition(itemID).getPrice() * HIGH_ALCHEMY_MULTIPLIER); } /** @@ -340,9 +450,9 @@ public class ItemManager @Nullable public ItemStats getItemStats(int itemId, boolean allowNote) { - ItemDefinition itemComposition = getItemDefinition(itemId); + ItemDefinition itemDefinition = getItemDefinition(itemId); - if (itemComposition == null || itemComposition.getName() == null || (!allowNote && itemComposition.getNote() != -1)) + if (itemDefinition == null || itemDefinition.getName() == null || (!allowNote && itemDefinition.getNote() != -1)) { return null; } @@ -389,16 +499,16 @@ public class ItemManager */ public int canonicalize(int itemID) { - ItemDefinition itemComposition = getItemDefinition(itemID); + ItemDefinition itemDefinition = getItemDefinition(itemID); - if (itemComposition.getNote() != -1) + if (itemDefinition.getNote() != -1) { - return itemComposition.getLinkedNoteId(); + return itemDefinition.getLinkedNoteId(); } - if (itemComposition.getPlaceholderTemplateId() != -1) + if (itemDefinition.getPlaceholderTemplateId() != -1) { - return itemComposition.getPlaceholderId(); + return itemDefinition.getPlaceholderId(); } return WORN_ITEMS.getOrDefault(itemID, itemID); @@ -412,7 +522,7 @@ public class ItemManager */ private AsyncBufferedImage loadImage(int itemId, int quantity, boolean stackable) { - AsyncBufferedImage img = new AsyncBufferedImage(36, 32, BufferedImage.TYPE_INT_ARGB); + AsyncBufferedImage img = new AsyncBufferedImage(Constants.ITEM_SPRITE_WIDTH, Constants.ITEM_SPRITE_HEIGHT, BufferedImage.TYPE_INT_ARGB); clientThread.invoke(() -> { if (client.getGameState().ordinal() < GameState.LOGIN_SCREEN.ordinal()) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/ItemMapping.java b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/game/ItemMapping.java rename to runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java index 046253bf6c..1c5d861649 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/ItemMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java @@ -25,11 +25,11 @@ */ package net.runelite.client.game; -import static api.ItemID.*; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import java.util.Collection; import java.util.Collections; +import static net.runelite.api.ItemID.*; /** * Converts untradeable items to it's tradeable counterparts @@ -144,10 +144,12 @@ public enum ItemMapping // Bounty hunter ITEM_GRANITE_MAUL(GRANITE_MAUL, GRANITE_MAUL_12848), ITEM_MAGIC_SHORTBOW(MAGIC_SHORTBOW, MAGIC_SHORTBOW_I), + ITEM_MAGIC_SHORTBOW_SCROLL(MAGIC_SHORTBOW_SCROLL, MAGIC_SHORTBOW_I), ITEM_SARADOMINS_BLESSED_SWORD(SARADOMINS_TEAR, SARADOMINS_BLESSED_SWORD), // Jewellery with charges ITEM_RING_OF_WEALTH(RING_OF_WEALTH, RING_OF_WEALTH_I, RING_OF_WEALTH_1, RING_OF_WEALTH_I1, RING_OF_WEALTH_2, RING_OF_WEALTH_I2, RING_OF_WEALTH_3, RING_OF_WEALTH_I3, RING_OF_WEALTH_4, RING_OF_WEALTH_I4, RING_OF_WEALTH_I5), + ITEM_RING_OF_WEALTH_SCROLL(RING_OF_WEALTH_SCROLL, RING_OF_WEALTH_I, RING_OF_WEALTH_I1, RING_OF_WEALTH_I2, RING_OF_WEALTH_I3, RING_OF_WEALTH_I4, RING_OF_WEALTH_I5), ITEM_AMULET_OF_GLORY(AMULET_OF_GLORY, AMULET_OF_GLORY1, AMULET_OF_GLORY2, AMULET_OF_GLORY3, AMULET_OF_GLORY5), ITEM_AMULET_OF_GLORY_T(AMULET_OF_GLORY_T, AMULET_OF_GLORY_T1, AMULET_OF_GLORY_T2, AMULET_OF_GLORY_T3, AMULET_OF_GLORY_T5), ITEM_SKILLS_NECKLACE(SKILLS_NECKLACE, SKILLS_NECKLACE1, SKILLS_NECKLACE2, SKILLS_NECKLACE3, SKILLS_NECKLACE5), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/ItemStack.java b/runelite-client/src/main/java/net/runelite/client/game/ItemStack.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/game/ItemStack.java rename to runelite-client/src/main/java/net/runelite/client/game/ItemStack.java index fdd6ca3e8d..0e708a5839 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/ItemStack.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemStack.java @@ -24,8 +24,8 @@ */ package net.runelite.client.game; -import api.coords.LocalPoint; import lombok.Value; +import net.runelite.api.coords.LocalPoint; @Value public class ItemStack diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/ItemVariationMapping.java b/runelite-client/src/main/java/net/runelite/client/game/ItemVariationMapping.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/game/ItemVariationMapping.java rename to runelite-client/src/main/java/net/runelite/client/game/ItemVariationMapping.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/LootManager.java b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/game/LootManager.java rename to runelite-client/src/main/java/net/runelite/client/game/LootManager.java index 77883776d1..e297e103c7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/LootManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java @@ -24,23 +24,6 @@ */ package net.runelite.client.game; -import api.AnimationID; -import api.Client; -import api.Item; -import api.ItemID; -import api.NPC; -import api.NpcID; -import api.Player; -import api.Tile; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.GameTick; -import api.events.ItemDespawned; -import api.events.ItemQuantityChanged; -import api.events.ItemSpawned; -import api.events.NpcDespawned; -import api.events.PlayerDespawned; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ListMultimap; @@ -53,6 +36,23 @@ import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.AnimationID; +import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.ItemID; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Player; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemDespawned; +import net.runelite.api.events.ItemQuantityChanged; +import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.PlayerDespawned; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.NpcLootReceived; @@ -109,7 +109,7 @@ public class LootManager case NpcID.LIZARD: case NpcID.ZYGOMITE: - case NpcID.ZYGOMITE_474: + case NpcID.ZYGOMITE_1024: case NpcID.ANCIENT_ZYGOMITE: // these monsters die with >0 hp, so we just look for coincident diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/NPCManager.java b/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/game/NPCManager.java rename to runelite-client/src/main/java/net/runelite/client/game/NPCManager.java index 03cc5af7eb..71255a4a63 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/NPCManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java @@ -59,6 +59,7 @@ public class NPCManager /** * Returns the {@link NPCStats} for target NPC id + * * @param npcId NPC id * @return the {@link NPCStats} or null if unknown */ @@ -70,23 +71,41 @@ public class NPCManager /** * Returns health for target NPC ID + * * @param npcId NPC id * @return health or null if unknown */ - @Nullable - public Integer getHealth(final int npcId) + public int getHealth(final int npcId) { final NPCStats s = statsMap.get(npcId); if (s == null || s.getHitpoints() == -1) { - return null; + return -1; } return s.getHitpoints(); } + /** + * Returns the attack speed for target NPC ID. + * + * @param npcId NPC id + * @return attack speed in game ticks for NPC ID. + */ + public int getAttackSpeed(final int npcId) + { + final NPCStats s = statsMap.get(npcId); + if (s == null || s.getAttackSpeed() == -1) + { + return -1; + } + + return s.getAttackSpeed(); + } + /** * Returns the exp modifier for target NPC ID based on its stats. + * * @param npcId NPC id * @return npcs exp modifier. Assumes default xp rate if npc stats are unknown (returns 1) */ diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/NPCStats.java b/runelite-client/src/main/java/net/runelite/client/game/NPCStats.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/game/NPCStats.java rename to runelite-client/src/main/java/net/runelite/client/game/NPCStats.java index e976f938ec..d324098226 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/NPCStats.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NPCStats.java @@ -34,6 +34,7 @@ public class NPCStats private final int hitpoints; private final int combatLevel; private final int slayerLevel; + private final int attackSpeed; private final int attackLevel; private final int strengthLevel; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/SkillIconManager.java b/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/game/SkillIconManager.java rename to runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java index bd1124108b..03c78617b1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/SkillIconManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java @@ -24,10 +24,10 @@ */ package net.runelite.client.game; -import api.Skill; import java.awt.image.BufferedImage; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Skill; import net.runelite.client.util.ImageUtil; @Singleton diff --git a/runelite-client/src/main/java/net/runelite/client/game/Sound.java b/runelite-client/src/main/java/net/runelite/client/game/Sound.java new file mode 100644 index 0000000000..aeeddd8b34 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/Sound.java @@ -0,0 +1,41 @@ +package net.runelite.client.game; + +public enum Sound +{ + FIFTEEN_SECONDS(1, "net/runelite/client/game/sounds/15seconds.wav"), + FIVE_SECONDS(2, "net/runelite/client/game/sounds/5seconds.wav"), + ATTACK_WITH_MAGIC(3, "net/runelite/client/game/sounds/attackmagic.wav"), + ATTACK_WITH_MELEE(4, "net/runelite/client/game/sounds/attackmelee.wav"), + ATTACK_WITH_RANGED(5, "net/runelite/client/game/sounds/attackranged.wav"), + INCOMING(6, "net/runelite/client/game/sounds/incoming.wav"), + MOVE(7, "net/runelite/client/game/sounds/move.wav"), + PRAY_MAGIC(8, "net/runelite/client/game/sounds/praymagic.wav"), + PRAY_MELEE(9, "net/runelite/client/game/sounds/praymelee.wav"), + PRAY_RANGED(10, "net/runelite/client/game/sounds/prayranged.wav"), + REENABLE_PRAYER(11, "net/runelite/client/game/sounds/reenableprayer.wav"), + RUNAWAY(12, "net/runelite/client/game/sounds/runaway.wav"), + LOW_HEATLH(13, "net/runelite/client/game/sounds/lowhealth.wav"), + LOW_PRAYER(14, "net/runelite/client/game/sounds/lowprayer.wav"), + OUT_OF_COMBAT(15, "net/runelite/client/game/sounds/outofcombat.wav"), + RESTORED_SPECIAL_ATTACK(16, "net/runelite/client/game/sounds/restorespec.wav"), + IDLE(17, "net/runelite/client/game/sounds/idle.wav"); + + private String filePath; + private int id; + + private Sound(int id, String filePath) + { + this.id = id; + this.filePath = filePath; + } + + public String getFilePath() + { + return this.filePath; + } + + public int getId() + { + return this.id; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/game/SoundManager.java b/runelite-client/src/main/java/net/runelite/client/game/SoundManager.java new file mode 100644 index 0000000000..2ea639918c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/SoundManager.java @@ -0,0 +1,95 @@ +package net.runelite.client.game; + +import com.google.inject.Inject; +import java.io.IOException; +import javax.inject.Singleton; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.BooleanControl; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.FloatControl; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.UnsupportedAudioFileException; +import net.runelite.client.config.RuneLiteConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Singleton +public class SoundManager +{ + private static final Logger log = LoggerFactory.getLogger(SoundManager.class); + private final RuneLiteConfig runeliteConfig; + + @Inject + private SoundManager(RuneLiteConfig runeLiteConfig) + { + this.runeliteConfig = runeLiteConfig; + } + + public void playSound(final Sound sound) + { + new Thread(new Runnable() + { + + @Override + public void run() + { + try + { + AudioInputStream in = AudioSystem.getAudioInputStream(this.getClass().getClassLoader().getResource(sound.getFilePath())); + AudioFormat outFormat = SoundManager.this.getOutFormat(in.getFormat()); + DataLine.Info info = new DataLine.Info(SourceDataLine.class, outFormat); + SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info); + if (line != null) + { + line.open(outFormat, 2200); + if (line.isControlSupported(FloatControl.Type.MASTER_GAIN)) + { + int volume = SoundManager.this.runeliteConfig.volume(); + FloatControl gainControl = (FloatControl)line.getControl(FloatControl.Type.MASTER_GAIN); + BooleanControl muteControl = (BooleanControl)line.getControl(BooleanControl.Type.MUTE); + if (volume == 0) + { + muteControl.setValue(true); + } + else + { + muteControl.setValue(false); + gainControl.setValue((float)(Math.log((double)volume / 100.0) / Math.log(10.0) * 20.0)); + } + } + line.start(); + SoundManager.this.stream(AudioSystem.getAudioInputStream(outFormat, in), line); + line.drain(); + line.stop(); + } + } + catch (IOException | LineUnavailableException | UnsupportedAudioFileException e) + { + throw new IllegalStateException(e); + } + } + }).start(); + } + + private AudioFormat getOutFormat(AudioFormat inFormat) + { + int ch = inFormat.getChannels(); + float rate = inFormat.getSampleRate(); + return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, rate, 16, ch, ch * 2, rate, false); + } + + private void stream(AudioInputStream in, SourceDataLine line) throws IOException + { + byte[] buffer = new byte[2200]; + int n = 0; + while (n != -1) + { + line.write(buffer, 0, n); + n = in.read(buffer, 0, buffer.length); + } + } + +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/SpriteManager.java b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/game/SpriteManager.java rename to runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java index 27b03d4767..3a4cc667e7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/SpriteManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java @@ -24,9 +24,6 @@ */ package net.runelite.client.game; -import api.Client; -import api.GameState; -import api.Sprite; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.inject.Inject; @@ -41,6 +38,9 @@ import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Sprite; import net.runelite.client.callback.ClientThread; import net.runelite.client.util.ImageUtil; @@ -146,7 +146,7 @@ public class SpriteManager for (SpriteOverride o : add) { BufferedImage image = ImageUtil.getResourceStreamFromClass(owner, o.getFileName()); - Sprite sp = ImageUtil.getImageSpritePixels(image, client); + Sprite sp = ImageUtil.getImageSprite(image, client); overrides.put(o.getSpriteId(), sp); } }); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/SpriteOverride.java b/runelite-client/src/main/java/net/runelite/client/game/SpriteOverride.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/game/SpriteOverride.java rename to runelite-client/src/main/java/net/runelite/client/game/SpriteOverride.java index c9001e5e78..a4f894d5c0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/SpriteOverride.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SpriteOverride.java @@ -24,13 +24,14 @@ */ package net.runelite.client.game; +import net.runelite.api.SpriteID; public interface SpriteOverride { /** * An ID for a sprite. Negative numbers are used by RuneLite specific sprites * - * @see api.SpriteID + * @see SpriteID */ int getSpriteId(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/UntradeableItemMapping.java b/runelite-client/src/main/java/net/runelite/client/game/UntradeableItemMapping.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/game/UntradeableItemMapping.java rename to runelite-client/src/main/java/net/runelite/client/game/UntradeableItemMapping.java index 3cf8f30001..1884a9ac7b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/UntradeableItemMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/game/UntradeableItemMapping.java @@ -24,10 +24,10 @@ */ package net.runelite.client.game; -import api.ItemID; import com.google.common.collect.ImmutableMap; import lombok.Getter; import lombok.RequiredArgsConstructor; +import net.runelite.api.ItemID; @Getter @RequiredArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxInput.java b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxInput.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxInput.java rename to runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxInput.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxPanelManager.java b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxPanelManager.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxPanelManager.java rename to runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxPanelManager.java index 07fea26727..3e70483d2f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxPanelManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxPanelManager.java @@ -24,21 +24,21 @@ */ package net.runelite.client.game.chatbox; -import api.Client; -import api.GameState; -import api.ScriptID; -import api.VarClientInt; -import api.events.GameStateChanged; -import api.events.ScriptCallbackEvent; -import api.vars.InputType; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetInfo; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientInt; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.vars.InputType; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java rename to runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java index a4ca218e52..79ca18a124 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java +++ b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java @@ -24,14 +24,6 @@ */ package net.runelite.client.game.chatbox; -import api.FontID; -import api.FontTypeFace; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetPositionMode; -import api.widgets.WidgetSizeMode; -import api.widgets.WidgetTextAlignment; -import api.widgets.WidgetType; import com.google.common.base.Strings; import com.google.inject.Inject; import java.awt.Point; @@ -54,6 +46,14 @@ import javax.swing.SwingUtilities; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.FontID; +import net.runelite.api.FontTypeFace; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetSizeMode; +import net.runelite.api.widgets.WidgetTextAlignment; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.input.KeyListener; import net.runelite.client.input.MouseListener; @@ -439,7 +439,7 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse y += h; } - api.Point ccl = container.getCanvasLocation(); + net.runelite.api.Point ccl = container.getCanvasLocation(); isInBounds = ev -> bounds.contains(new Point(ev.getX() - ccl.getX(), ev.getY() - ccl.getY())); getPointCharOffset = p -> diff --git a/RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxTextMenuInput.java b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextMenuInput.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxTextMenuInput.java rename to runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextMenuInput.java index 59570f9fcc..d1c7d8fd44 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/game/chatbox/ChatboxTextMenuInput.java +++ b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextMenuInput.java @@ -24,13 +24,6 @@ */ package net.runelite.client.game.chatbox; -import api.FontID; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetPositionMode; -import api.widgets.WidgetSizeMode; -import api.widgets.WidgetTextAlignment; -import api.widgets.WidgetType; import com.google.inject.Inject; import java.awt.event.KeyEvent; import java.util.ArrayList; @@ -39,6 +32,13 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.FontID; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetSizeMode; +import net.runelite.api.widgets.WidgetTextAlignment; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.input.KeyListener; @Slf4j diff --git a/RuneLitePlus/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java b/runelite-client/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java similarity index 83% rename from RuneLitePlus/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java rename to runelite-client/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java index 6bf8a6790c..203f16fdab 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java @@ -24,14 +24,6 @@ */ package net.runelite.client.graphics; -import api.Client; -import api.MainBufferProvider; -import api.Model; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.Player; -import api.coords.LocalPoint; import com.google.inject.Inject; import com.google.inject.Singleton; import java.awt.Color; @@ -41,6 +33,20 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import net.runelite.api.Client; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameObject; +import net.runelite.api.GroundObject; +import net.runelite.api.ItemLayer; +import net.runelite.api.MainBufferProvider; +import net.runelite.api.Model; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.TileObject; +import net.runelite.api.WallObject; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.task.Schedule; @Singleton @@ -278,8 +284,7 @@ public class ModelOutlineRenderer * @param x1 The starting x position * @param x2 The ending x position */ - private void simulateHorizontalLineRasterizationForOutline( - int pixelPos, int x1, int x2) + private void simulateHorizontalLineRasterizationForOutline(int pixelPos, int x1, int x2) { if (x2 > clipX2) { @@ -337,8 +342,7 @@ public class ModelOutlineRenderer * @param x3 The starting x position of the second line * @param x4 The ending x position of the second line */ - private void outlineAroundHorizontalLine( - int pixelPos, int x1, int x2, int x3, int x4) + private void outlineAroundHorizontalLine(int pixelPos, int x1, int x2, int x3, int x4) { if (x1 < clipX1) { @@ -420,8 +424,7 @@ public class ModelOutlineRenderer * @param x3 The x position of the third vertex in the triangle * @param y3 The y position of the third vertex in the triangle */ - private void simulateTriangleRasterizationForOutline( - int x1, int y1, int x2, int y2, int x3, int y3) + private void simulateTriangleRasterizationForOutline(int x1, int y1, int x2, int y2, int x3, int y3) { // Swap vertices so y1 <= y2 <= y3 using bubble sort if (y1 > y2) @@ -615,8 +618,7 @@ public class ModelOutlineRenderer * @param vertexOrientation The orientation of the vertices * @return Returns true if any of them are inside the clip area, otherwise false */ - private boolean projectVertices(Model model, - final int localX, final int localY, final int localZ, final int vertexOrientation) + private boolean projectVertices(Model model, final int localX, final int localY, final int localZ, final int vertexOrientation) { final int cameraX = client.getCameraX(); final int cameraY = client.getCameraY(); @@ -742,8 +744,7 @@ public class ModelOutlineRenderer * @param innerColor The color of the pixels of the outline closest to the model * @param outerColor The color of the pixels of the outline furthest away from the model */ - private void renderOutline(BufferedImage image, int outlineWidth, - Color innerColor, Color outerColor) + private void renderOutline(BufferedImage image, int outlineWidth, Color innerColor, Color outerColor) { int[] imageData = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); List ps = getPriorityList(outlineWidth); @@ -886,9 +887,7 @@ public class ModelOutlineRenderer * @param innerColor The color of the pixels of the outline closest to the model * @param outerColor The color of the pixels of the outline furthest away from the model */ - private void drawModelOutline(Model model, - int localX, int localY, int localZ, int orientation, - int outlineWidth, Color innerColor, Color outerColor) + private void drawModelOutline(Model model, int localX, int localY, int localZ, int orientation, int outlineWidth, Color innerColor, Color outerColor) { if (outlineWidth <= 0) { @@ -930,8 +929,7 @@ public class ModelOutlineRenderer drawOutline(npc, outlineWidth, color, color); } - public void drawOutline(NPC npc, int outlineWidth, - Color innerColor, Color outerColor) + public void drawOutline(NPC npc, int outlineWidth, Color innerColor, Color outerColor) { int size = 1; NPCDefinition composition = npc.getTransformedDefinition(); @@ -959,8 +957,7 @@ public class ModelOutlineRenderer drawOutline(player, outlineWidth, color, color); } - public void drawOutline(Player player, int outlineWidth, - Color innerColor, Color outerColor) + public void drawOutline(Player player, int outlineWidth, Color innerColor, Color outerColor) { LocalPoint lp = player.getLocalLocation(); if (lp != null) @@ -970,4 +967,136 @@ public class ModelOutlineRenderer player.getOrientation(), outlineWidth, innerColor, outerColor); } } + + private void drawOutline(GameObject gameObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = gameObject.getLocalLocation(); + if (lp != null) + { + drawModelOutline(gameObject.getModel(), lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, gameObject.getPlane()), + gameObject.getRsOrientation(), outlineWidth, innerColor, outerColor); + } + } + + private void drawOutline(GroundObject groundObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = groundObject.getLocalLocation(); + if (lp != null) + { + drawModelOutline(groundObject.getModel(), lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, client.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + } + + private void drawOutline(ItemLayer itemLayer, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = itemLayer.getLocalLocation(); + if (lp != null) + { + Model model = itemLayer.getModelBottom(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, itemLayer.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + + model = itemLayer.getModelMiddle(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, itemLayer.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + + model = itemLayer.getModelTop(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, itemLayer.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + } + } + + private void drawOutline(DecorativeObject decorativeObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = decorativeObject.getLocalLocation(); + if (lp != null) + { + Model model = decorativeObject.getModel1(); + if (model != null) + { + drawModelOutline(model, + lp.getX() + decorativeObject.getXOffset(), + lp.getY() + decorativeObject.getYOffset(), + Perspective.getTileHeight(client, lp, decorativeObject.getPlane()), + decorativeObject.getOrientation(), outlineWidth, innerColor, outerColor); + } + + model = decorativeObject.getModel2(); + if (model != null) + { + // Offset is not used for the second model + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, decorativeObject.getPlane()), + decorativeObject.getOrientation(), outlineWidth, innerColor, outerColor); + } + } + } + + private void drawOutline(WallObject wallObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = wallObject.getLocalLocation(); + if (lp != null) + { + Model model = wallObject.getModelA(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, wallObject.getPlane()), + wallObject.getOrientationA(), outlineWidth, innerColor, outerColor); + } + + model = wallObject.getModelB(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, wallObject.getPlane()), + wallObject.getOrientationB(), outlineWidth, innerColor, outerColor); + } + } + } + + public void drawOutline(TileObject tileObject, int outlineWidth, Color color) + { + drawOutline(tileObject, outlineWidth, color, color); + } + + public void drawOutline(TileObject tileObject, + int outlineWidth, Color innerColor, Color outerColor) + { + if (tileObject instanceof GameObject) + { + drawOutline((GameObject) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof GroundObject) + { + drawOutline((GroundObject) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof ItemLayer) + { + drawOutline((ItemLayer) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof DecorativeObject) + { + drawOutline((DecorativeObject) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof WallObject) + { + drawOutline((WallObject) tileObject, outlineWidth, innerColor, outerColor); + } + } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/graphics/PixelDistanceAlpha.java b/runelite-client/src/main/java/net/runelite/client/graphics/PixelDistanceAlpha.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/graphics/PixelDistanceAlpha.java rename to runelite-client/src/main/java/net/runelite/client/graphics/PixelDistanceAlpha.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/input/KeyListener.java b/runelite-client/src/main/java/net/runelite/client/input/KeyListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/input/KeyListener.java rename to runelite-client/src/main/java/net/runelite/client/input/KeyListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/input/KeyManager.java b/runelite-client/src/main/java/net/runelite/client/input/KeyManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/input/KeyManager.java rename to runelite-client/src/main/java/net/runelite/client/input/KeyManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/input/MouseAdapter.java b/runelite-client/src/main/java/net/runelite/client/input/MouseAdapter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/input/MouseAdapter.java rename to runelite-client/src/main/java/net/runelite/client/input/MouseAdapter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/input/MouseListener.java b/runelite-client/src/main/java/net/runelite/client/input/MouseListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/input/MouseListener.java rename to runelite-client/src/main/java/net/runelite/client/input/MouseListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/input/MouseManager.java b/runelite-client/src/main/java/net/runelite/client/input/MouseManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/input/MouseManager.java rename to runelite-client/src/main/java/net/runelite/client/input/MouseManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/input/MouseWheelListener.java b/runelite-client/src/main/java/net/runelite/client/input/MouseWheelListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/input/MouseWheelListener.java rename to runelite-client/src/main/java/net/runelite/client/input/MouseWheelListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/menus/ComparableEntry.java b/runelite-client/src/main/java/net/runelite/client/menus/ComparableEntry.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/menus/ComparableEntry.java rename to runelite-client/src/main/java/net/runelite/client/menus/ComparableEntry.java index cd2608788c..a5f0f57355 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/menus/ComparableEntry.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/ComparableEntry.java @@ -24,10 +24,10 @@ */ package net.runelite.client.menus; -import api.MenuEntry; import joptsimple.internal.Strings; import lombok.EqualsAndHashCode; import lombok.Getter; +import net.runelite.api.MenuEntry; import static net.runelite.client.menus.MenuManager.LEVEL_PATTERN; import net.runelite.client.util.Text; @@ -64,14 +64,24 @@ public class ComparableEntry public ComparableEntry(String option, String target, int id, int type, boolean strictOption, boolean strictTarget) { - this.option = option; - this.target = target; + this.option = Text.standardize(option); + this.target = Text.standardize(target); this.id = id; this.type = type; this.strictOption = strictOption; this.strictTarget = strictTarget; } + // This is only used for type checking, which is why it has everything but target + // target sometimes changes to option. + public ComparableEntry(MenuEntry e) + { + this.option = Text.standardize(e.getOption()); + this.id = e.getIdentifier(); + this.type = e.getType(); + this.strictOption = true; + } + boolean matches(MenuEntry entry) { String opt = Text.standardize(entry.getOption()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/menus/MenuManager.java b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java similarity index 62% rename from RuneLitePlus/src/main/java/net/runelite/client/menus/MenuManager.java rename to runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java index cad261a3cd..6c674c1d14 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/menus/MenuManager.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java @@ -25,23 +25,10 @@ */ package net.runelite.client.menus; -import api.Client; -import api.MenuAction; -import api.MenuEntry; -import api.NPCDefinition; -import api.ObjectDefinition; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.events.NpcActionChanged; -import api.events.PlayerMenuOptionClicked; -import api.events.PlayerMenuOptionsChanged; -import api.events.WidgetMenuOptionClicked; -import api.widgets.WidgetInfo; import com.google.common.base.Preconditions; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -52,8 +39,22 @@ import java.util.Set; import java.util.regex.Pattern; import javax.inject.Inject; import javax.inject.Singleton; -import joptsimple.internal.Strings; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import static net.runelite.api.MenuAction.GAME_OBJECT_FIRST_OPTION; +import static net.runelite.api.MenuAction.WIDGET_DEFAULT; +import net.runelite.api.MenuEntry; +import net.runelite.api.NPCDefinition; +import net.runelite.api.events.ClientTick; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.NpcActionChanged; +import net.runelite.api.events.PlayerMenuOptionClicked; +import net.runelite.api.events.PlayerMenuOptionsChanged; +import net.runelite.api.events.WidgetMenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.util.Text; @@ -93,10 +94,10 @@ public class MenuManager private final Set priorityEntries = new HashSet<>(); private final Set currentPriorityEntries = new HashSet<>(); + private final Set hiddenEntries = new HashSet<>(); private final Map swaps = new HashMap<>(); - private final Set originalTypes = new HashSet<>(); - private final Set leftClickObjects = new HashSet<>(); + private EntryTypeMapping originalType; @Inject private MenuManager(Client client, EventBus eventBus) @@ -149,14 +150,6 @@ public class MenuManager Collection options = managedMenuOptions.get(widgetId); MenuEntry[] menuEntries = client.getMenuEntries(); - if (menuEntries.length == 1) - { - // Menu entries reset, so priority entries should reset as well - currentPriorityEntries.clear(); - - originalTypes.clear(); - } - for (WidgetMenuOption currentMenu : options) { if (!menuContainsCustomMenu(currentMenu))//Don't add if we have already added it to this widget @@ -172,88 +165,116 @@ public class MenuManager client.setMenuEntries(menuEntries); } } + } - final MenuEntry newestEntry = menuEntries[menuEntries.length - 1]; + @Subscribe + private void onClientTick(ClientTick event) + { + originalType = null; + currentPriorityEntries.clear(); + client.sortMenuEntries(); - boolean isPrio = false; - for (ComparableEntry p : priorityEntries) + MenuEntry[] oldEntries = client.getMenuEntries(); + List newEntries = Lists.newArrayList(oldEntries); + + for (MenuEntry entry : oldEntries) { - if (p.matches(newestEntry)) + for (ComparableEntry p : priorityEntries) { - isPrio = true; - break; - } - } - - // If the last entry was a priority entry, keep track of it - if (isPrio) - { - currentPriorityEntries.add(newestEntry); - } - - // Make a copy of the menu entries, cause you can't remove from Arrays.asList() - List copy = new ArrayList<>(Arrays.asList(menuEntries)); - - // If there are entries we want to prioritize, we have to remove the rest - if (!currentPriorityEntries.isEmpty()) - { - copy.retainAll(currentPriorityEntries); - - copy.add(0, CANCEL()); - } - - // Find the current entry in the swaps map - ComparableEntry swapEntry = null; - for (ComparableEntry e : swaps.keySet()) - { - if (e.matches(newestEntry)) - { - swapEntry = e; - break; - } - } - - if (swapEntry != null) - { - ComparableEntry swapTarget = swaps.get(swapEntry); - - // Find the target for the swap in current menu entries - MenuEntry foundSwap = null; - for (MenuEntry entry : Lists.reverse(copy)) - { - if (swapTarget.matches(entry)) + if (p.matches(entry)) { - foundSwap = entry; + currentPriorityEntries.add(entry); + } + } + + // If there are entries we want to prioritize, we have to remove the rest + if (!currentPriorityEntries.isEmpty() && !client.isMenuOpen()) + { + newEntries.retainAll(currentPriorityEntries); + + // This is because players existing changes walk-here target + // so without this we lose track of em + if (newEntries.size() != currentPriorityEntries.size()) + { + for (MenuEntry e : currentPriorityEntries) + { + if (newEntries.contains(e)) + { + continue; + } + + for (MenuEntry e2 : client.getMenuEntries()) + { + if (e.getType() == e2.getType()) + { + e.setTarget(e2.getTarget()); + newEntries.add(e); + } + } + } + } + } + + boolean isHidden = false; + for (ComparableEntry p : hiddenEntries) + { + if (p.matches(entry)) + { + isHidden = true; break; } } - if (foundSwap != null) + if (isHidden) { - // This is the menu entry added last's type - final int otherType = foundSwap.getType(); - - // MenuActions with an id of over 1000 get shifted to the back of the menu entry array - // They have different id's in the packet buffer though, so we got to modify them back on click - // I couldn't get this to work with objects, so we're using modified objectcomposition for that - final boolean shouldModifyType = otherType == MenuAction.EXAMINE_ITEM_BANK_EQ.getId(); - - if (shouldModifyType) - { - foundSwap.setType(MenuAction.WIDGET_DEFAULT.getId()); - originalTypes.add(foundSwap); - } - - // Swap - int index = copy.indexOf(foundSwap); - int newIndex = copy.indexOf(newestEntry); - - copy.set(index, newestEntry); - copy.set(newIndex, foundSwap); + newEntries.remove(entry); } } - client.setMenuEntries(copy.toArray(new MenuEntry[0])); + if (!currentPriorityEntries.isEmpty() && !client.isMenuOpen()) + { + newEntries.add(0, CANCEL()); + } + + MenuEntry leftClickEntry = newEntries.get(newEntries.size() - 1); + + for (ComparableEntry src : swaps.keySet()) + { + if (!src.matches(leftClickEntry)) + { + continue; + } + + ComparableEntry tgt = swaps.get(src); + + for (int i = newEntries.size() - 2; i > 0; i--) + { + MenuEntry e = newEntries.get(i); + + if (tgt.matches(e)) + { + newEntries.set(newEntries.size() - 1, e); + newEntries.set(i, leftClickEntry); + + int type = e.getType(); + + if (type >= 1000) + { + int newType = getLeftClickType(type); + if (newType != -1 && newType != type) + { + MenuEntry original = MenuEntry.copy(e); + e.setType(newType); + originalType = new EntryTypeMapping(new ComparableEntry(leftClickEntry), original); + } + } + + break; + } + } + } + + client.setMenuEntries(newEntries.toArray(new MenuEntry[0])); } public void addPlayerMenuItem(String menuText) @@ -282,86 +303,6 @@ public class MenuManager } } - public boolean toggleLeftClick(String menuText, int objectID, boolean reset) - { - Preconditions.checkNotNull(menuText); - - if (client == null) - { - return false; - } - - ObjectDefinition oc = client.getObjectDefinition(objectID); - - if (oc == null) - { - return false; - } - - ObjectDefinition impostor = oc.getImpostorIds() != null ? oc.getImpostor() : null; - - if (impostor != null) - { - if (toggleLeftClick(menuText, impostor.getId(), reset)) - { - // Sorry about this - leftClickObjects.remove(impostor.getId()); - - if (reset) - { - leftClickObjects.remove(objectID); - } - else - { - leftClickObjects.add(objectID); - } - - return true; - } - } - - String[] options = oc.getActions(); - - if (options == null) - { - return false; - } - - boolean hasOption5 = !Strings.isNullOrEmpty(options[options.length - 1]); - boolean hasOption1 = !Strings.isNullOrEmpty(options[0]); - - if (hasOption5 || hasOption1) - { - String option1 = options[0]; - String option5 = options[options.length - 1]; - - if (reset && !hasOption1 // Won't have to reset anything cause - || reset && !menuText.equalsIgnoreCase(option1) // theres nothing to reset - || hasOption5 && !menuText.equalsIgnoreCase(option5)) - { - return false; - } - - options[0] = option5; - options[options.length - 1] = option1; - } - else - { - return false; - } - - if (reset) - { - leftClickObjects.remove(objectID); - } - else - { - leftClickObjects.add(objectID); - } - - return true; - } - @Subscribe public void onPlayerMenuOptionsChanged(PlayerMenuOptionsChanged event) { @@ -397,6 +338,24 @@ public class MenuManager } } + private int getLeftClickType(int oldType) + { + if (oldType > 2000) + { + oldType -= 2000; + } + + switch (MenuAction.of(oldType)) + { + case GAME_OBJECT_FIFTH_OPTION: + return GAME_OBJECT_FIRST_OPTION.getId(); + case EXAMINE_ITEM_BANK_EQ: + return WIDGET_DEFAULT.getId(); + default: + return oldType; + } + } + private void addNpcOption(NPCDefinition composition, String npcOption) { String[] actions = composition.getActions(); @@ -440,77 +399,21 @@ public class MenuManager @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (!event.getMenuTarget().equals("do not edit") && - !originalTypes.isEmpty() && - event.getMenuAction() == MenuAction.WIDGET_DEFAULT) + // Type is changed in check + if (originalType != null && originalType.check(event)) { - for (MenuEntry e : originalTypes) - { - // Honestly, I was about to write a huge ass rant about - // how I hate whoever wrote the menuoptionclicked class - // but I decided that that'd be un-nice to them, and they - // probably spent over 24 hours writing it. Not because - // it was that difficult to write, of course, but because - // they must have the fucking iq of a retarded, under developed, - // braindead, basically good-for-nothing, idiotic chimp. - // - // Just kidding, of course, that would be too big of an - // insult towards those poor chimps. It's not their fault - // some dumbass is the way they are, right? Why should they - // feel bad for something they can't do anything about? - // - // Whoever wrote that class though, should actually feel - // 100% terrible. If they aren't depressed, I really wish - // they become depressed very, very soon. What the fuck - // were they even thinking. - if (event.getMenuAction().getId() != e.getType() - || event.getId() != e.getIdentifier() - || !event.getMenuOption().equals(e.getOption())) - { - continue; - } -//todo once bytecodes work again, re-enable -/* event.consume(); - - client.invokeMenuAction( - event.getActionParam(), - event.getWidgetId(), - MenuAction.EXAMINE_ITEM_BANK_EQ.getId(), - event.getId(), - event.getMenuOption(), - "do not edit", - client.getMouseCanvasPosition().getX(), - client.getMouseCanvasPosition().getY() - );*/ - - break; - } - } - - if (!event.getMenuTarget().equals("do not edit") && - !leftClickObjects.isEmpty() && - event.getMenuAction() == MenuAction.GAME_OBJECT_FIRST_OPTION && - ( - leftClickObjects.contains(event.getId()) - || - client.getObjectDefinition(event.getId()) != null && - client.getObjectDefinition(event.getId()).getImpostorIds() != null && - client.getObjectDefinition(event.getId()).getImpostor() != null && - client.getObjectDefinition(event.getId()).getImpostor().getId() == event.getId())) - { -//todo once bytecodes work again, re-enable -/* event.consume(); + event.consume(); client.invokeMenuAction( - event.getActionParam(), - event.getWidgetId(), - MenuAction.GAME_OBJECT_FIFTH_OPTION.getId(), - event.getId(), - event.getMenuOption(), + event.getActionParam0(), + event.getActionParam1(), + event.getType(), + event.getIdentifier(), "do not edit", + event.getTarget(), client.getMouseCanvasPosition().getX(), client.getMouseCanvasPosition().getY() - );*/ + ); } if (event.getMenuAction() != MenuAction.RUNELITE) @@ -518,31 +421,31 @@ public class MenuManager return; // not a player menu } - int widgetId = event.getWidgetId(); + int widgetId = event.getActionParam1(); Collection options = managedMenuOptions.get(widgetId); for (WidgetMenuOption curMenuOption : options) { - if (curMenuOption.getMenuTarget().equals(event.getMenuTarget()) - && curMenuOption.getMenuOption().equals(event.getMenuOption())) + if (curMenuOption.getMenuTarget().equals(event.getTarget()) + && curMenuOption.getMenuOption().equals(event.getOption())) { WidgetMenuOptionClicked customMenu = new WidgetMenuOptionClicked(); - customMenu.setMenuOption(event.getMenuOption()); - customMenu.setMenuTarget(event.getMenuTarget()); + customMenu.setMenuOption(event.getOption()); + customMenu.setMenuTarget(event.getTarget()); customMenu.setWidget(curMenuOption.getWidget()); eventBus.post(customMenu); return; // don't continue because it's not a player option } } - String target = event.getMenuTarget(); + String target = event.getTarget(); // removes tags and level from player names for example: // username (level-42) or username String username = Text.removeTags(target).split("[(]")[0].trim(); PlayerMenuOptionClicked playerMenuOptionClicked = new PlayerMenuOptionClicked(); - playerMenuOptionClicked.setMenuOption(event.getMenuOption()); + playerMenuOptionClicked.setMenuOption(event.getOption()); playerMenuOptionClicked.setMenuTarget(username); eventBus.post(playerMenuOptionClicked); @@ -599,19 +502,7 @@ public class MenuManager ComparableEntry entry = new ComparableEntry(option, target); - Set toRemove = new HashSet<>(); - for (ComparableEntry priorityEntry : priorityEntries) - { - if (entry.equals(priorityEntry)) - { - toRemove.add(entry); - } - } - - for (ComparableEntry e : toRemove) - { - priorityEntries.remove(e); - } + priorityEntries.removeIf(entry::equals); } @@ -634,19 +525,7 @@ public class MenuManager ComparableEntry entry = new ComparableEntry(option, "", false); - Set toRemove = new HashSet<>(); - for (ComparableEntry priorityEntry : priorityEntries) - { - if (entry.equals(priorityEntry)) - { - toRemove.add(entry); - } - } - - for (ComparableEntry e : toRemove) - { - priorityEntries.remove(e); - } + priorityEntries.removeIf(entry::equals); } /** @@ -657,6 +536,11 @@ public class MenuManager addSwap(option, target, option2, target, true, false); } + public void removeSwap(String option, String target, String option2) + { + removeSwap(option, target, option2, target, true, false); + } + /** * Adds to the map of swaps. */ @@ -709,7 +593,7 @@ public class MenuManager } /** - * Adds to the map of swaps - Pre-baked Abstract entry + * Adds to the map of swaps - Pre-baked entry */ public void addSwap(ComparableEntry swapFrom, ComparableEntry swapTo) { @@ -757,36 +641,12 @@ public class MenuManager ComparableEntry swapFrom = new ComparableEntry(option, target, id, type, false, false); ComparableEntry swapTo = new ComparableEntry(option2, target2, id2, type2, false, false); - Set toRemove = new HashSet<>(); - for (Map.Entry e : swaps.entrySet()) - { - if (e.getKey().equals(swapFrom) && e.getValue().equals(swapTo)) - { - toRemove.add(e.getKey()); - } - } - - for (ComparableEntry entry : toRemove) - { - swaps.remove(entry); - } + swaps.entrySet().removeIf(e -> e.getKey().equals(swapFrom) && e.getValue().equals(swapTo)); } public void removeSwap(ComparableEntry swapFrom, ComparableEntry swapTo) { - Set toRemove = new HashSet<>(); - for (Map.Entry e : swaps.entrySet()) - { - if (e.getKey().equals(swapFrom) && e.getValue().equals(swapTo)) - { - toRemove.add(e.getKey()); - } - } - - for (ComparableEntry entry : toRemove) - { - swaps.remove(entry); - } + swaps.entrySet().removeIf(e -> e.getKey().equals(swapFrom) && e.getValue().equals(swapTo)); } /** @@ -794,21 +654,109 @@ public class MenuManager */ public void removeSwaps(String withTarget) { - withTarget = Text.standardize(withTarget); + final String target = Text.standardize(withTarget); - Set toRemove = new HashSet<>(); + swaps.keySet().removeIf(e -> e.getTarget().equals(target)); + } - for (ComparableEntry e : swaps.keySet()) + /** + * Adds to the set of menu entries which when present, will be hidden from the menu + */ + public void addHiddenEntry(String option, String target) + { + option = Text.standardize(option); + target = Text.standardize(target); + + ComparableEntry entry = new ComparableEntry(option, target); + + hiddenEntries.add(entry); + } + + public void removeHiddenEntry(String option, String target) + { + option = Text.standardize(option); + target = Text.standardize(target); + + ComparableEntry entry = new ComparableEntry(option, target); + + hiddenEntries.removeIf(entry::equals); + } + + /** + * Adds to the set of menu entries which when present, will be hidden from the menu + * This method will add one with strict option, but not-strict target (contains for target, equals for option) + */ + public void addHiddenEntry(String option) + { + option = Text.standardize(option); + + ComparableEntry entry = new ComparableEntry(option, "", false); + + hiddenEntries.add(entry); + } + + public void removeHiddenEntry(String option) + { + option = Text.standardize(option); + + ComparableEntry entry = new ComparableEntry(option, "", false); + + hiddenEntries.removeIf(entry::equals); + } + + /** + * Adds to the set of hidden entries. + */ + public void addHiddenEntry(String option, String target, boolean strictOption, boolean strictTarget) + { + option = Text.standardize(option); + target = Text.standardize(target); + + ComparableEntry entry = new ComparableEntry(option, target, -1, -1, strictOption, strictTarget); + + hiddenEntries.add(entry); + } + + public void removeHiddenEntry(String option, String target, boolean strictOption, boolean strictTarget) + { + option = Text.standardize(option); + target = Text.standardize(target); + + ComparableEntry entry = new ComparableEntry(option, target, -1, -1, strictOption, strictTarget); + + hiddenEntries.remove(entry); + } + + /** + * Adds to the set of hidden entries - Pre-baked Comparable entry + */ + public void addHiddenEntry(ComparableEntry entry) + { + hiddenEntries.add(entry); + } + + public void removeHiddenEntry(ComparableEntry entry) + { + hiddenEntries.remove(entry); + } + + @AllArgsConstructor + private class EntryTypeMapping + { + private final ComparableEntry comparable; + private final MenuEntry target; + + private boolean check(MenuOptionClicked event) { - if (e.getTarget().equals(withTarget)) + MenuEntry entry = event.getMenuEntry(); + + if (event.getTarget().equals("do not edit") || !comparable.matches(entry)) { - toRemove.add(e); + return false; } - } - for (ComparableEntry entry : toRemove) - { - swaps.remove(entry); + event.setMenuEntry(target); + return true; } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/menus/WidgetMenuOption.java b/runelite-client/src/main/java/net/runelite/client/menus/WidgetMenuOption.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/menus/WidgetMenuOption.java rename to runelite-client/src/main/java/net/runelite/client/menus/WidgetMenuOption.java index 1e5f50295b..1b630a235c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/menus/WidgetMenuOption.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/WidgetMenuOption.java @@ -24,23 +24,23 @@ */ package net.runelite.client.menus; -import api.widgets.WidgetInfo; import java.awt.Color; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.JagexColors; import net.runelite.client.util.ColorUtil; public final class WidgetMenuOption { /** - * The left hand text to be displayed on the menu option. Ex. the menuOption of "Drop Bones" is "Drop" + * The left hand text to be displayed on the menu option. Ex. the option of "Drop Bones" is "Drop" */ private String menuOption; /** - * The right hand text to be displayed on the menu option Ex. the menuTarget of "Drop Bones" is "Bones" + * The right hand text to be displayed on the menu option Ex. the target of "Drop Bones" is "Bones" */ private String menuTarget; /** - * The color that the menuTarget should be. Defaults to the brownish color that most menu options have. + * The color that the target should be. Defaults to the brownish color that most menu options have. */ private Color color = JagexColors.MENU_TARGET; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/Plugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/Plugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginClassLoader.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginClassLoader.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginClassLoader.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginClassLoader.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginDependencies.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDependencies.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginDependencies.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginDependencies.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginDependency.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDependency.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginDependency.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginDependency.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginDescriptor.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginInstantiationException.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginInstantiationException.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginInstantiationException.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginInstantiationException.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginManager.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginType.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginWatcher.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/PluginWatcher.java rename to runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/CombatLevelRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/CombatLevelRequirement.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/CombatLevelRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/CombatLevelRequirement.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java index 6958d668ec..ee77f19ecc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java @@ -33,15 +33,15 @@ import java.util.Map; import java.util.regex.Pattern; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.FontTypeFace; -import api.QuestState; -import api.ScriptID; -import api.VarPlayer; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.FontTypeFace; +import net.runelite.api.QuestState; +import net.runelite.api.ScriptID; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java index 6f61685ad8..575faa0e75 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.achievementdiary; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.Favour; +import net.runelite.api.Favour; @RequiredArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/OrRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/OrRequirement.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/OrRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/OrRequirement.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/QuestPointRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/QuestPointRequirement.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/QuestPointRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/QuestPointRequirement.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/QuestRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/QuestRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/QuestRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/QuestRequirement.java index f73a7475e0..cbc471651f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/QuestRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/QuestRequirement.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.achievementdiary; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.Quest; +import net.runelite.api.Quest; @Getter @RequiredArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java index 43b064a602..1a711f91ac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.achievementdiary; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.Skill; +import net.runelite.api.Skill; @RequiredArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java index e9913137fd..fbb7bbfa78 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; import net.runelite.client.plugins.achievementdiary.SkillRequirement; @@ -79,6 +79,10 @@ public class ArdougneDiaryRequirement extends GenericDiaryRequirement new QuestRequirement(Quest.FAIRYTALE_II__CURE_A_QUEEN, true)); // HARD + // When the task is completed "the Totem" changes to "Totem" - so we add + // both variations. + add("Recharge some Jewellery at the Totem in the Legends Guild.", + new QuestRequirement(Quest.LEGENDS_QUEST)); add("Recharge some Jewellery at Totem in the Legends Guild.", new QuestRequirement(Quest.LEGENDS_QUEST)); add("Enter the Magic Guild.", diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java index 3a952fec1d..4de2c0a4d3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; import net.runelite.client.plugins.achievementdiary.SkillRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java index f8de5c9982..30f7843199 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; import net.runelite.client.plugins.achievementdiary.SkillRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java index 34d0c567e8..46c708efbb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; import net.runelite.client.plugins.achievementdiary.SkillRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java index bba4df1ae0..ef9df50ce2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; import net.runelite.client.plugins.achievementdiary.SkillRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java index 7c89e7df4a..f6523bc667 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.CombatLevelRequirement; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.OrRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java index 8d8b59953a..fa568cfe2e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java @@ -24,9 +24,9 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Favour; -import api.Quest; -import api.Skill; +import net.runelite.api.Favour; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.FavourRequirement; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java index ae596bfd81..7238e18a55 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.CombatLevelRequirement; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java index b0e3aacaa1..826b1a8410 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.CombatLevelRequirement; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.OrRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java index 7bf6473cf6..bff800b4c2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.CombatLevelRequirement; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestPointRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java index 26fa898f0a..b136f889fe 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.CombatLevelRequirement; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java index 7218a47959..0a059a1785 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java @@ -25,8 +25,8 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import api.Quest; -import api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.Skill; import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; import net.runelite.client.plugins.achievementdiary.OrRequirement; import net.runelite.client.plugins.achievementdiary.QuestRequirement; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java index 56ed2c3b1e..aa88396038 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java @@ -32,10 +32,10 @@ import java.awt.Polygon; import java.awt.geom.Area; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.Point; -import api.Tile; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.game.AgilityShortcut; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java index 9482b5feab..abe18393d8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java @@ -34,38 +34,38 @@ import java.util.Map; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Item; -import api.ItemID; -import static api.ItemID.AGILITY_ARENA_TICKET; -import api.MenuAction; -import api.MenuEntry; -import api.Player; -import api.Skill; -import static api.Skill.AGILITY; -import api.Tile; -import api.TileObject; -import api.coords.WorldPoint; -import api.events.BoostedLevelChanged; -import api.events.ConfigChanged; -import api.events.DecorativeObjectChanged; -import api.events.DecorativeObjectDespawned; -import api.events.DecorativeObjectSpawned; -import api.events.ExperienceChanged; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.GroundObjectChanged; -import api.events.GroundObjectDespawned; -import api.events.GroundObjectSpawned; -import api.events.ItemDespawned; -import api.events.ItemSpawned; -import api.events.MenuEntryAdded; -import api.events.WallObjectChanged; -import api.events.WallObjectDespawned; -import api.events.WallObjectSpawned; +import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.ItemID; +import static net.runelite.api.ItemID.AGILITY_ARENA_TICKET; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Player; +import net.runelite.api.Skill; +import static net.runelite.api.Skill.AGILITY; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.BoostedLevelChanged; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.DecorativeObjectChanged; +import net.runelite.api.events.DecorativeObjectDespawned; +import net.runelite.api.events.DecorativeObjectSpawned; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.ItemDespawned; +import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.WallObjectChanged; +import net.runelite.api.events.WallObjectDespawned; +import net.runelite.api.events.WallObjectSpawned; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java index f8b19469c0..72e9a0dd07 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java @@ -27,10 +27,10 @@ package net.runelite.client.plugins.agility; import java.time.Instant; import lombok.Getter; import lombok.Setter; -import api.Client; -import api.Experience; -import api.Skill; -import api.VarPlayer; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; @Getter @Setter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Courses.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Courses.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Courses.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/Courses.java index e5141f43d0..cc732561c0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Courses.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Courses.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.agility; import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; enum Courses { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java similarity index 82% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java index 23f71694bf..04c60d4430 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java @@ -29,14 +29,15 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class LapCounterOverlay extends Overlay { @@ -80,27 +81,22 @@ class LapCounterOverlay extends Overlay } panelComponent.getChildren().clear(); - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Laps:") - .right(Integer.toString(session.getTotalLaps())) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Total Laps:", Integer.toString(session.getTotalLaps())); if (config.lapsToLevel() && session.getLapsTillLevel() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Laps until level:") - .right(Integer.toString(session.getLapsTillLevel())) - .build()); + tableComponent.addRow("Laps until level:", Integer.toString(session.getLapsTillLevel())); } if (config.lapsToGoal() && session.getLapsTillGoal() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Laps until goal:") - .right(Integer.toString(session.getLapsTillGoal())) - .build()); + tableComponent.addRow("Laps until goal:", Integer.toString(session.getLapsTillGoal())); } + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Obstacle.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacle.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Obstacle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacle.java index ee8ff8f7d7..6038de468b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Obstacle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacle.java @@ -28,7 +28,7 @@ package net.runelite.client.plugins.agility; import javax.annotation.Nullable; import lombok.AllArgsConstructor; import lombok.Value; -import api.Tile; +import net.runelite.api.Tile; import net.runelite.client.game.AgilityShortcut; @Value diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Obstacles.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Obstacles.java rename to runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java index f621f5dda0..004eddf9fb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/agility/Obstacles.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java @@ -30,8 +30,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import java.util.List; import java.util.Set; -import static api.NullObjectID.*; -import static api.ObjectID.*; +import static net.runelite.api.NullObjectID.*; +import static net.runelite.api.ObjectID.*; import net.runelite.client.game.AgilityShortcut; class Obstacles @@ -46,7 +46,7 @@ class Obstacles // Draynor ROUGH_WALL, TIGHTROPE, TIGHTROPE_11406, NARROW_WALL, WALL_11630, GAP_11631, CRATE_11632, STILE_7527, // Al-Kharid - ROUGH_WALL_11633, TIGHTROPE_14398, CABLE, ZIP_LINE, TROPICAL_TREE_14404, ROOF_TOP_BEAMS, + ROUGH_WALL_11633, TIGHTROPE_14398, CABLE, ZIP_LINE_14403, TROPICAL_TREE_14404, ROOF_TOP_BEAMS, TIGHTROPE_14409, GAP_14399, // Pyramid STAIRS_10857, LOW_WALL_10865, LEDGE_10860, PLANK_10868, GAP_10882, LEDGE_10886, STAIRS_10857, GAP_10884, @@ -65,7 +65,7 @@ class Obstacles STEPPING_STONE_15412, TROPICAL_TREE_15414, MONKEYBARS_15417, SKULL_SLOPE_15483, ROPE_15487, TROPICAL_TREE_16062, // Falador ROUGH_WALL_14898, TIGHTROPE_14899, HAND_HOLDS_14901, GAP_14903, GAP_14904, TIGHTROPE_14905, - TIGHTROPE_14911, GAP_14919, LEDGE_14920, LEDGE_14921, LEDGE_14922, LEDGE_14924, EDGE_14925, + TIGHTROPE_14911, GAP_14919, LEDGE_14920, LEDGE_14921, LEDGE_14922, LEDGE_14923, LEDGE_14924, EDGE_14925, // Wilderness OBSTACLE_PIPE_23137, ROPESWING_23132, STEPPING_STONE_23556, LOG_BALANCE_23542, ROCKS_23640, // Seers diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java new file mode 100644 index 0000000000..3b332f3589 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2019, Lucas + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.alchemicalhydra; + +import java.awt.image.BufferedImage; +import javax.inject.Singleton; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import net.runelite.api.NPC; +import net.runelite.api.Prayer; +import net.runelite.api.ProjectileID; +import net.runelite.api.SpriteID; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.util.ImageUtil; + +@Getter(AccessLevel.PACKAGE) +@RequiredArgsConstructor +@Singleton +class Hydra +{ + @Getter(AccessLevel.PACKAGE) + @RequiredArgsConstructor + enum AttackStyle + { + MAGIC(ProjectileID.HYDRA_MAGIC, Prayer.PROTECT_FROM_MAGIC, SpriteID.PRAYER_PROTECT_FROM_MAGIC), + RANGED(ProjectileID.HYDRA_RANGED, Prayer.PROTECT_FROM_MISSILES, SpriteID.PRAYER_PROTECT_FROM_MISSILES); + + private final int projectileID; + private final Prayer prayer; + private final int spriteID; + + @Getter(AccessLevel.NONE) + private BufferedImage image; + + BufferedImage getImage(SpriteManager spriteManager) + { + if (image == null) + { + BufferedImage tmp = spriteManager.getSprite(spriteID, 0); + image = tmp == null ? null : ImageUtil.resizeImage(tmp, HydraOverlay.IMGSIZE, HydraOverlay.IMGSIZE); + } + + return image; + } + } + + private final NPC npc; + + private HydraPhase phase = HydraPhase.ONE; + + private int attackCount = 0; + private int nextSwitch = phase.getAttacksPerSwitch(); + + @Setter(AccessLevel.PACKAGE) + private int nextSpecial = 3; + + private AttackStyle nextAttack = AttackStyle.MAGIC; + private AttackStyle lastAttack = AttackStyle.MAGIC; + + @Setter(AccessLevel.PACKAGE) + private boolean weakened = false; + + void changePhase(HydraPhase newPhase) + { + phase = newPhase; + nextSpecial = 3; + attackCount = 0; + weakened = false; + + if (newPhase == HydraPhase.FOUR) + { + weakened = true; + switchStyles(); + nextSwitch = phase.getAttacksPerSwitch(); + } + } + + private void switchStyles() + { + nextAttack = lastAttack == Hydra.AttackStyle.MAGIC + ? Hydra.AttackStyle.RANGED + : Hydra.AttackStyle.MAGIC; + } + + void handleAttack(int id) + { + if (id != nextAttack.getProjectileID()) + { + if (id == lastAttack.getProjectileID()) + { + // If the current attack isn't what was expected and we accidentally counted 1 too much + return; + } + + // If the current attack isn't what was expected and we should have switched prayers + switchStyles(); + nextSwitch = phase.getAttacksPerSwitch() - 1; + } + else + { + nextSwitch--; + } + + lastAttack = nextAttack; + attackCount++; + + if (nextSwitch <= 0) + { + switchStyles(); + nextSwitch = phase.getAttacksPerSwitch(); + } + } + + int getNextSpecialRelative() + { + return nextSpecial - attackCount; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java similarity index 65% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java index e540d0c95e..e5860abcd0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java @@ -26,16 +26,12 @@ package net.runelite.client.plugins.alchemicalhydra; import java.awt.Color; import java.awt.Dimension; -import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Image; import java.awt.Rectangle; -import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import api.Prayer; -import api.SpriteID; +import net.runelite.api.Client; +import net.runelite.api.Prayer; import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; @@ -46,13 +42,16 @@ import net.runelite.client.ui.overlay.components.PanelComponent; @Singleton class HydraOverlay extends Overlay { + + private static final Color RED_BG_COL = new Color(156, 0, 0, 156); + private static final Color YEL_BG_COL = new Color(200, 156, 0, 156); + private static final Color GRN_BG_COL = new Color(0, 156, 0, 156); + static final int IMGSIZE = 36; + private final HydraPlugin plugin; private final Client client; private final SpriteManager spriteManager; private final PanelComponent panelComponent = new PanelComponent(); - private static final Color redBgCol = new Color(156, 0, 0, 156); - private static final Color yelBgCol = new Color(200, 156, 0, 156); - private static final Color grnBgCol = new Color(0, 156, 0, 156); @Inject HydraOverlay(HydraPlugin plugin, Client client, SpriteManager spriteManager) @@ -76,9 +75,8 @@ class HydraOverlay extends Overlay } //Add spec overlay first, to keep it above pray - HydraPhase phase = hydra.getPhase(); - int attackCount = hydra.getAttackCount(); - int nextSpec = hydra.getNextSpecial() - attackCount; + final HydraPhase phase = hydra.getPhase(); + final int nextSpec = hydra.getNextSpecialRelative(); if (nextSpec <= 3) { @@ -86,37 +84,34 @@ class HydraOverlay extends Overlay if (nextSpec == 0) { - specComponent.setBackgroundColor(redBgCol); + specComponent.setBackgroundColor(RED_BG_COL); } else if (nextSpec == 1) { - specComponent.setBackgroundColor(yelBgCol); + specComponent.setBackgroundColor(YEL_BG_COL); } - Image specImg = scaleImg(spriteManager.getSprite(phase.getSpecImage(), 0)); - specComponent.setImage(specImg); + specComponent.setImage(phase.getSpecImage(spriteManager)); specComponent.setText(" " + (nextSpec)); //hacky way to not have to figure out how to move text specComponent.setPreferredSize(new Dimension(40, 40)); panelComponent.getChildren().add(specComponent); } - - Prayer nextPrayer = hydra.getNextAttack().getPrayer(); - Image prayImg = scaleImg(getPrayerImage(hydra.getNextAttack().getPrayer())); - int nextSwitch = hydra.getNextSwitch(); + final Prayer nextPrayer = hydra.getNextAttack().getPrayer(); + final int nextSwitch = hydra.getNextSwitch(); InfoBoxComponent prayComponent = new InfoBoxComponent(); if (nextSwitch == 1) { - prayComponent.setBackgroundColor(client.isPrayerActive(nextPrayer) ? yelBgCol : redBgCol); + prayComponent.setBackgroundColor(client.isPrayerActive(nextPrayer) ? YEL_BG_COL : RED_BG_COL); } else { - prayComponent.setBackgroundColor(client.isPrayerActive(nextPrayer) ? grnBgCol : redBgCol); + prayComponent.setBackgroundColor(client.isPrayerActive(nextPrayer) ? GRN_BG_COL : RED_BG_COL); } - prayComponent.setImage(prayImg); + prayComponent.setImage(hydra.getNextAttack().getImage(spriteManager)); prayComponent.setText(" " + nextSwitch); prayComponent.setColor(Color.white); prayComponent.setPreferredSize(new Dimension(40, 40)); @@ -126,32 +121,4 @@ class HydraOverlay extends Overlay panelComponent.setBorder(new Rectangle(0, 0, 0, 0)); return panelComponent.render(graphics2D); } - - private BufferedImage getPrayerImage(Prayer pray) - { - return pray == Prayer.PROTECT_FROM_MAGIC - ? spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MAGIC, 0) - : spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MISSILES, 0); - } - - private Image scaleImg(final Image img) - { - if (img == null) - { - return null; - } - final double width = img.getWidth(null); - final double height = img.getHeight(null); - final double size = 36; // Limit size to 2 as that is minimum size not causing breakage - final double scalex = size / width; - final double scaley = size / height; - final double scale = Math.min(scalex, scaley); - final int newWidth = (int) (width * scale); - final int newHeight = (int) (height * scale); - final BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); - final Graphics g = scaledImage.createGraphics(); - g.drawImage(img, 0, 0, newWidth, newHeight, null); - g.dispose(); - return scaledImage; - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java similarity index 53% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java index 4225f774dd..4fa739e6d8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java @@ -24,80 +24,46 @@ */ package net.runelite.client.plugins.alchemicalhydra; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; +import java.awt.image.BufferedImage; +import lombok.AccessLevel; import lombok.Getter; -import api.AnimationID; -import api.NpcID; -import api.ProjectileID; -import api.SpriteID; -import api.coords.WorldPoint; +import lombok.RequiredArgsConstructor; +import net.runelite.api.AnimationID; +import net.runelite.api.ProjectileID; +import net.runelite.api.SpriteID; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.util.ImageUtil; +@Getter(AccessLevel.PACKAGE) +@RequiredArgsConstructor enum HydraPhase -{ // Sorry for the autism - ONE(3, AnimationID.HYDRA_1_1, AnimationID.HYDRA_1_2, ProjectileID.HYDRA_POISON, 0, SpriteID.BIG_ASS_GUTHIX_SPELL, new WorldPoint(1371, 10263, 0), NpcID.ALCHEMICAL_HYDRA), - TWO(3, AnimationID.HYDRA_2_1, AnimationID.HYDRA_2_2, ProjectileID.HYDRA_LIGHTNING, AnimationID.HYDRA_LIGHTNING, SpriteID.BIG_SPEC_TRANSFER, new WorldPoint(1371, 10272, 0), NpcID.ALCHEMICAL_HYDRA_8619), - THREE(3, AnimationID.HYDRA_3_1, AnimationID.HYDRA_3_2, 0, AnimationID.HYDRA_FIRE, SpriteID.BIG_SUPERHEAT, new WorldPoint(1362, 10272, 0), NpcID.ALCHEMICAL_HYDRA_8620), - FOUR(1, AnimationID.HYDRA_4_1, AnimationID.HYDRA_4_2, ProjectileID.HYDRA_POISON, 0, SpriteID.BIG_ASS_GUTHIX_SPELL, null, NpcID.ALCHEMICAL_HYDRA_8621); +{ + ONE(3, AnimationID.HYDRA_1_1, AnimationID.HYDRA_1_2, ProjectileID.HYDRA_POISON, 0, SpriteID.BIG_ASS_GUTHIX_SPELL, new WorldPoint(1371, 10263, 0)), + TWO(3, AnimationID.HYDRA_2_1, AnimationID.HYDRA_2_2, 0, AnimationID.HYDRA_LIGHTNING, SpriteID.BIG_SPEC_TRANSFER, new WorldPoint(1371, 10272, 0)), + THREE(3, AnimationID.HYDRA_3_1, AnimationID.HYDRA_3_2, 0, AnimationID.HYDRA_FIRE, SpriteID.BIG_SUPERHEAT, new WorldPoint(1362, 10272, 0)), + FOUR(1, AnimationID.HYDRA_4_1, AnimationID.HYDRA_4_2, ProjectileID.HYDRA_POISON, 0, SpriteID.BIG_ASS_GUTHIX_SPELL, null); - @Getter private final int attacksPerSwitch; - - @Getter private final int deathAnim1; - - @Getter private final int deathAnim2; - - @Getter private final int specProjectileId; - - @Getter private final int specAnimationId; - @Getter - private final int specImage; + @Getter(AccessLevel.NONE) + private final int specImageID; + private final WorldPoint fountain; - @Getter - private WorldPoint fountain; + private BufferedImage specImage; - @Getter - private int npcID; - - @Getter - private static final ImmutableSet idSet; - - private static final ImmutableMap idMap; - - static + BufferedImage getSpecImage(SpriteManager spriteManager) { - ImmutableMap.Builder mapBuilder = new ImmutableMap.Builder<>(); - ImmutableSet.Builder setBuilder = new ImmutableSet.Builder<>(); - - for (HydraPhase p : values()) + if (specImage == null) { - mapBuilder.put(p.getNpcID(), p); - setBuilder.add(p.getNpcID()); + BufferedImage tmp = spriteManager.getSprite(specImageID, 0); + specImage = tmp == null ? null : ImageUtil.resizeImage(tmp, HydraOverlay.IMGSIZE, HydraOverlay.IMGSIZE); } - idMap = mapBuilder.build(); - idSet = setBuilder.build(); - } - - HydraPhase(int attacksPerSwitch, int deathAnim1, int deathAnim2, int specProjectileId, int specAnimationId, int specImage, WorldPoint fountain, int npcID) - { - this.attacksPerSwitch = attacksPerSwitch; - this.deathAnim1 = deathAnim1; - this.deathAnim2 = deathAnim2; - this.specProjectileId = specProjectileId; - this.specAnimationId = specAnimationId; - this.specImage = specImage; - this.fountain = fountain; - this.npcID = npcID; - } - - static HydraPhase getFromId(int ID) - { - return idMap.get(ID); + return specImage; } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java similarity index 61% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java index 08db69fb97..b92b6f3875 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java @@ -30,22 +30,21 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.inject.Inject; +import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.Client; -import api.GameState; -import api.NPC; -import api.NpcID; -import api.Projectile; -import api.ProjectileID; -import api.coords.LocalPoint; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcSpawned; -import api.events.ProjectileMoved; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Projectile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.ProjectileMoved; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -56,15 +55,16 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Alchemical Hydra", description = "Show what to pray against hydra", tags = {"Hydra", "Lazy", "4 headed asshole"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) @Slf4j public class HydraPlugin extends Plugin { - @Getter + @Getter(AccessLevel.PACKAGE) private Map poisonProjectiles = new HashMap<>(); - @Getter + @Getter(AccessLevel.PACKAGE) private Hydra hydra; private boolean inHydraInstance; @@ -85,7 +85,7 @@ public class HydraPlugin extends Plugin private HydraOverlay overlay; @Inject - private HydraPoisonOverlay poisonOverlay; + private HydraSceneOverlay poisonOverlay; @Override protected void startUp() @@ -105,57 +105,6 @@ public class HydraPlugin extends Plugin lastAttackTick = -1; } - @Subscribe - private void onGameTick(GameTick event) - { - if (!inHydraInstance || hydra == null) - { - return; - } - - NPC hydraNpc = hydra.getNpc(); - - for (NPC npc : client.getNpcs()) - { - if (!HydraPhase.getIdSet().contains(npc.getId())) - { - continue; - } - - HydraPhase phase = HydraPhase.getFromId(npc.getId()); - - if (hydra.getPhase() != phase) - { - log.debug("Hydra phase changed!"); - changePhase(phase); - } - - if (hydraNpc != npc) - { - log.debug("Hydra npc changed!"); - hydra.setNpc(npc); - } - - return; - } - - if (!poisonProjectiles.isEmpty()) - { - Set exPoisonProjectiles = new HashSet<>(); - for (Map.Entry entry : poisonProjectiles.entrySet()) - { - if (entry.getValue().getEndCycle() < client.getGameCycle()) - { - exPoisonProjectiles.add(entry.getKey()); - } - } - for (LocalPoint toRemove : exPoisonProjectiles) - { - poisonProjectiles.remove(toRemove); - } - } - } - @Subscribe private void onGameStateChanged(GameStateChanged state) { @@ -176,18 +125,16 @@ public class HydraPlugin extends Plugin } return; } - NPC hydraNpc = null; for (NPC npc : client.getNpcs()) { if (npc.getId() == NpcID.ALCHEMICAL_HYDRA) { - hydraNpc = npc; + hydra = new Hydra(npc); break; } } - hydra = new Hydra(hydraNpc); addOverlays(); } @@ -199,7 +146,6 @@ public class HydraPlugin extends Plugin return; } - log.debug("Hydra spawned"); hydra = new Hydra(event.getNpc()); addOverlays(); } @@ -214,7 +160,6 @@ public class HydraPlugin extends Plugin return; } - log.debug("Animation changed: {}, {}", actor.getName(), actor.getAnimation()); HydraPhase phase = hydra.getPhase(); if (actor.getAnimation() == phase.getDeathAnim2() && @@ -225,13 +170,13 @@ public class HydraPlugin extends Plugin switch (phase) { case ONE: - changePhase(HydraPhase.TWO); + hydra.changePhase(HydraPhase.TWO); return; case TWO: - changePhase(HydraPhase.THREE); + hydra.changePhase(HydraPhase.THREE); return; case THREE: - changePhase(HydraPhase.FOUR); + hydra.changePhase(HydraPhase.FOUR); return; case FOUR: hydra = null; @@ -248,6 +193,24 @@ public class HydraPlugin extends Plugin { hydra.setNextSpecial(hydra.getNextSpecial() + 9); } + + if (poisonProjectiles.isEmpty()) + { + return; + } + + Set exPoisonProjectiles = new HashSet<>(); + for (Map.Entry entry : poisonProjectiles.entrySet()) + { + if (entry.getValue().getEndCycle() < client.getGameCycle()) + { + exPoisonProjectiles.add(entry.getKey()); + } + } + for (LocalPoint toRemove : exPoisonProjectiles) + { + poisonProjectiles.remove(toRemove); + } } @Subscribe @@ -270,15 +233,12 @@ public class HydraPlugin extends Plugin hydra.setNextSpecial(hydra.getNextSpecial() + 9); } - if (id == ProjectileID.HYDRA_POISON) - { - poisonProjectiles.put(event.getPosition(), projectile); - } + poisonProjectiles.put(event.getPosition(), projectile); } else if (client.getTickCount() != lastAttackTick - && (id == Hydra.AttackStyle.MAGIC.getProjId() || id == Hydra.AttackStyle.RANGED.getProjId())) + && (id == Hydra.AttackStyle.MAGIC.getProjectileID() || id == Hydra.AttackStyle.RANGED.getProjectileID())) { - handleAttack(id); + hydra.handleAttack(id); lastAttackTick = client.getTickCount(); } } @@ -286,16 +246,12 @@ public class HydraPlugin extends Plugin @Subscribe public void onChatMessage(ChatMessage event) { - if (event.getMessage().equals("The chemicals neutralise the Alchemical Hydra's defences!")) + if (!event.getMessage().equals("The chemicals neutralise the Alchemical Hydra's defences!")) { - hydra.setWeakened(true); - } - else if (event.getMessage().startsWith("Your Alchemical Hydra kill count is")) - { - hydra = null; - poisonProjectiles.clear(); - removeOverlays(); + return; } + + hydra.setWeakened(true); } private boolean checkArea() @@ -314,52 +270,4 @@ public class HydraPlugin extends Plugin overlayManager.remove(overlay); overlayManager.remove(poisonOverlay); } - - private void changePhase(HydraPhase newPhase) - { - hydra.setPhase(newPhase); - hydra.setNextSpecial(3); - hydra.setAttackCount(0); - hydra.setWeakened(newPhase != HydraPhase.FOUR); - - if (newPhase == HydraPhase.FOUR) - { - switchStyles(); - hydra.setNextSwitch(newPhase.getAttacksPerSwitch()); - } - } - - private void switchStyles() - { - hydra.setNextAttack(hydra.getLastAttack() == Hydra.AttackStyle.MAGIC - ? Hydra.AttackStyle.RANGED - : Hydra.AttackStyle.MAGIC); - } - - private void handleAttack(int id) - { - if (id != hydra.getNextAttack().getProjId() && id != hydra.getLastAttack().getProjId()) - { // If the current attack isn't what was expected and we should have switched prayers - switchStyles(); - hydra.setNextSwitch(hydra.getPhase().getAttacksPerSwitch() - 1); - hydra.setLastAttack(hydra.getNextAttack()); - } - else if (id != hydra.getNextAttack().getProjId() && id == hydra.getLastAttack().getProjId()) - { // If the current attack isn't what was expected and we accidentally counted 1 too much - return; - } - else - { - hydra.setNextSwitch(hydra.getNextSwitch() - 1); - hydra.setLastAttack(hydra.getNextAttack()); - } - - hydra.setAttackCount(hydra.getAttackCount() + 1); - - if (hydra.getNextSwitch() <= 0) - { - switchStyles(); - hydra.setNextSwitch(hydra.getPhase().getAttacksPerSwitch()); - } - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPoisonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraSceneOverlay.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPoisonOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraSceneOverlay.java index 554fce11f1..52e02fadca 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPoisonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraSceneOverlay.java @@ -34,24 +34,28 @@ import java.util.Collection; import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import static api.Perspective.getCanvasTileAreaPoly; -import api.Projectile; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import static net.runelite.api.Perspective.getCanvasTileAreaPoly; +import net.runelite.api.Projectile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @Singleton -class HydraPoisonOverlay extends Overlay +class HydraSceneOverlay extends Overlay { + private static final Color GREEN = new Color(0, 255, 0, 100); + private static final Color RED = new Color(255, 0, 0, 100); + private static final Color REDFILL = new Color(255, 0, 0, 50); + private final HydraPlugin plugin; private final Client client; @Inject - public HydraPoisonOverlay(Client client, HydraPlugin plugin) + public HydraSceneOverlay(Client client, HydraPlugin plugin) { setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.UNDER_WIDGETS); @@ -99,9 +103,9 @@ class HydraPoisonOverlay extends Overlay } graphics.setPaintMode(); - graphics.setColor(new Color(255, 0, 0, 100)); + graphics.setColor(RED); graphics.draw(poisonTiles); - graphics.setColor(new Color(255, 0, 0, 50)); + graphics.setColor(REDFILL); graphics.fill(poisonTiles); } @@ -133,11 +137,15 @@ class HydraPoisonOverlay extends Overlay return; } - Color color = new Color(255, 0, 0, 100); // like + Color color; // like if (hydra.getNpc().getWorldArea().intersectsWith(new WorldArea(wp, 1, 1))) // coords { // WHICH FUCKING RETARD DID X, Y, dX, dY, Z???? IT'S XYZdXdY REEEEEEEEEE - color = new Color(0, 255, 0, 100); + color = GREEN; + } + else + { + color = RED; } graphics.setColor(color); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/ammo/AmmoCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/ammo/AmmoCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/ammo/AmmoCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/ammo/AmmoCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/ammo/AmmoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/ammo/AmmoPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/ammo/AmmoPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/ammo/AmmoPlugin.java index 104eead08d..5336fccd66 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/ammo/AmmoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ammo/AmmoPlugin.java @@ -26,13 +26,13 @@ package net.runelite.client.plugins.ammo; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.EquipmentInventorySlot; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.events.ItemContainerChanged; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java index 66c583990e..40cc9fc1b9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.animsmoothing; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.events.ConfigChanged; +import net.runelite.api.Client; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java similarity index 67% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java index 1e4a09a2d6..69a54cc971 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.antidrag; import java.awt.Color; import java.awt.event.KeyEvent; -import api.Constants; +import net.runelite.api.Constants; import net.runelite.client.config.Alpha; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; @@ -37,33 +37,66 @@ import net.runelite.client.config.ModifierlessKeybind; @ConfigGroup("antiDrag") public interface AntiDragConfig extends Config { + @ConfigItem( - keyName = "dragDelay", - name = "Drag Delay", - description = "Configures the inventory drag delay in client ticks (20ms)", - position = 1 + position = 0, + keyName = "alwaysOn", + name = "Always On", + description = "Makes the anti-drag always active and disables the hotkey toggle", + disabledBy = "keybind", + hide = "keybind" ) - default int dragDelay() + default boolean alwaysOn() { - return Constants.GAME_TICK_LENGTH / Constants.CLIENT_TICK_LENGTH; // one game tick + return false; } @ConfigItem( + position = 1, keyName = "keybind", - name = "keybind", + name = "Toggle with Keybind", + description = "Toggle anti drag on and off, rather than always on.", + disabledBy = "alwaysOn", + hide = "alwaysOn" + ) + default boolean keybind() + { + return false; + } + + @ConfigItem( + keyName = "key", + name = "Keybind", description = "The keybind you want to use for antidrag", - position = 2 + position = 2, + hidden = true, + unhide = "keybind" ) default Keybind key() { return new ModifierlessKeybind(KeyEvent.VK_SHIFT, 0); } + @ConfigItem( + keyName = "dragDelay", + name = "Drag Delay", + description = "Configures the inventory drag delay in client ticks (20ms)", + position = 3, + hidden = true, + unhide = "keybind" + ) + default int dragDelay() + { + return Constants.GAME_TICK_LENGTH / Constants.CLIENT_TICK_LENGTH; // one game tick + } + @ConfigItem( keyName = "reqfocus", name = "Reset on focus loss", description = "Disable antidrag when losing focus (like alt tabbing)", - position = 3 + position = 4, + hidden = true, + unhide = "keybind" ) default boolean reqfocus() { @@ -74,11 +107,13 @@ public interface AntiDragConfig extends Config keyName = "overlay", name = "Enable overlay", description = "Do you really need a description?", - position = 4 + position = 5, + hidden = true, + unhide = "keybind" ) default boolean overlay() { - return true; + return false; } @Alpha @@ -86,10 +121,38 @@ public interface AntiDragConfig extends Config keyName = "color", name = "Overlay color", description = "Change the overlay color, duh", - position = 5 + hidden = true, + unhide = "keybind", + position = 6 ) default Color color() { return new Color(255, 0, 0, 30); } + + @ConfigItem( + keyName = "changeCursor", + name = "Change Cursor", + description = "Change cursor when you have anti-drag enabled.", + position = 7, + hidden = true, + unhide = "keybind" + ) + default boolean changeCursor() + { + return false; + } + + @ConfigItem( + keyName = "cursorStyle", + name = "Cursor", + description = "Select which cursor you wish to use", + hidden = true, + unhide = "keybind", + position = 8 + ) + default CustomCursor selectedCursor() + { + return CustomCursor.DRAGON_SCIMITAR; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java index a3eb4de417..c35d9ac0b9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java @@ -31,7 +31,7 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -61,7 +61,7 @@ public class AntiDragOverlay extends Overlay final Color color = config.color(); g.setColor(color); - final api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); + final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); final Point mousePosition = new Point(mouseCanvasPosition.getX() - RADIUS, mouseCanvasPosition.getY() - RADIUS); final Rectangle bounds = new Rectangle(mousePosition.x, mousePosition.y, 2 * RADIUS, 2 * RADIUS); g.fillOval(bounds.x, bounds.y, bounds.width, bounds.height); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java similarity index 62% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java index 262e86316b..687ee9bc20 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, DennisDeV + * Copyright (c) 2019, ganom * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,14 +27,17 @@ package net.runelite.client.plugins.antidrag; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.events.FocusChanged; +import net.runelite.api.Client; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; +import net.runelite.client.plugins.customcursor.CustomCursorConfig; +import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.HotkeyListener; @@ -44,14 +48,19 @@ import net.runelite.client.util.HotkeyListener; type = PluginType.UTILITY, enabledByDefault = false ) + public class AntiDragPlugin extends Plugin { private static final int DEFAULT_DELAY = 5; + private boolean toggleDrag; @Inject private Client client; + @Inject + private ClientUI clientUI; + @Inject private AntiDragConfig config; @@ -61,6 +70,9 @@ public class AntiDragPlugin extends Plugin @Inject private OverlayManager overlayManager; + @Inject + private ConfigManager configManager; + @Inject private KeyManager keyManager; @@ -73,9 +85,11 @@ public class AntiDragPlugin extends Plugin @Override protected void startUp() throws Exception { - keyManager.registerKeyListener(hotkeyListener); - toggleDrag = false; - + if (config.keybind()) + { + keyManager.registerKeyListener(hotkeyListener); + } + client.setInventoryDragDelay(config.alwaysOn() ? config.dragDelay() : DEFAULT_DELAY); } @Override @@ -87,36 +101,75 @@ public class AntiDragPlugin extends Plugin overlayManager.remove(overlay); } + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (event.getGroup().equals("antiDrag")) + { + if (event.getKey().equals("keybind")) + { + if (config.keybind()) + { + keyManager.registerKeyListener(hotkeyListener); + } + else + { + keyManager.unregisterKeyListener(hotkeyListener); + } + } + if (event.getKey().equals("alwaysOn")) + { + client.setInventoryDragDelay(config.alwaysOn() ? config.dragDelay() : DEFAULT_DELAY); + } + } + } + + @Subscribe + public void onFocusChanged(FocusChanged focusChanged) + { + if (!config.alwaysOn()) + { + if (!focusChanged.isFocused() && config.reqfocus()) + { + client.setInventoryDragDelay(DEFAULT_DELAY); + overlayManager.remove(overlay); + } + } + } + private final HotkeyListener hotkeyListener = new HotkeyListener(() -> config.key()) { @Override public void hotkeyPressed() { - toggleDrag = !toggleDrag; - if (toggleDrag) + if (!config.alwaysOn()) { - if (config.overlay()) + toggleDrag = !toggleDrag; + if (toggleDrag) { - overlayManager.add(overlay); - } + if (config.overlay()) + { + overlayManager.add(overlay); + } + if (config.changeCursor()) + { + CustomCursor selectedCursor = config.selectedCursor(); + clientUI.setCursor(selectedCursor.getCursorImage(), selectedCursor.toString()); + } - client.setInventoryDragDelay(config.dragDelay()); - } - else - { - overlayManager.remove(overlay); - client.setInventoryDragDelay(DEFAULT_DELAY); + client.setInventoryDragDelay(config.dragDelay()); + } + else + { + overlayManager.remove(overlay); + client.setInventoryDragDelay(DEFAULT_DELAY); + if (config.changeCursor()) + { + net.runelite.client.plugins.customcursor.CustomCursor selectedCursor = configManager.getConfig(CustomCursorConfig.class).selectedCursor(); + clientUI.setCursor(selectedCursor.getCursorImage(), selectedCursor.toString()); + } + } } } }; - - @Subscribe - public void onFocusChanged(FocusChanged focusChanged) - { - if (!focusChanged.isFocused() && config.reqfocus()) - { - client.setInventoryDragDelay(DEFAULT_DELAY); - overlayManager.remove(overlay); - } - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/CustomCursor.java similarity index 56% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java rename to runelite-client/src/main/java/net/runelite/client/plugins/antidrag/CustomCursor.java index 9ac1a0bd99..27b3706c78 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/CustomCursor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Kruithne * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,41 +22,39 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.barbarianassault; +package net.runelite.client.plugins.antidrag; +import java.awt.image.BufferedImage; import lombok.Getter; -import api.widgets.WidgetInfo; +import net.runelite.client.plugins.customcursor.CustomCursorPlugin; +import net.runelite.client.util.ImageUtil; -enum Role +public enum CustomCursor { - ATTACKER(WidgetInfo.BA_ATK_LISTEN_TEXT, WidgetInfo.BA_ATK_CALL_TEXT, WidgetInfo.BA_ATK_ROLE_TEXT, WidgetInfo.BA_ATK_ROLE_SPRITE), - DEFENDER(WidgetInfo.BA_DEF_LISTEN_TEXT, WidgetInfo.BA_DEF_CALL_TEXT, WidgetInfo.BA_DEF_ROLE_TEXT, WidgetInfo.BA_DEF_ROLE_SPRITE), - COLLECTOR(WidgetInfo.BA_COLL_LISTEN_TEXT, WidgetInfo.BA_COLL_CALL_TEXT, WidgetInfo.BA_COLL_ROLE_TEXT, WidgetInfo.BA_COLL_ROLE_SPRITE), - HEALER(WidgetInfo.BA_HEAL_LISTEN_TEXT, WidgetInfo.BA_HEAL_CALL_TEXT, WidgetInfo.BA_HEAL_ROLE_TEXT, WidgetInfo.BA_HEAL_ROLE_SPRITE); + RS3_GOLD("RS3 Gold", "cursor-rs3-gold.png"), + RS3_SILVER("RS3 Silver", "cursor-rs3-silver.png"), + DRAGON_DAGGER("Dragon Dagger", "cursor-dragon-dagger.png"), + TROUT("Trout", "cursor-trout.png"), + DRAGON_SCIMITAR("Dragon Scimitar", "cursor-dragon-scimitar.png"), + ARMADYL_GODSWORD("Armadyl Godsword", "cursor-armadyl-godsword.png"), + BANDOS_GODSWORD("Bandos Godsword", "cursor-bandos-godsword.png"), + MOUSE("Mouse", "cursor-mouse.png"), + SARADOMIN_GODSWORD("Saradomin Godsword", "cursor-saradomin-godsword.png"), + ZAMORAK_GODSWORD("Zamorak Godsword", "cursor-zamorak-godsword.png"); + private final String name; @Getter - private final WidgetInfo listen; + private final BufferedImage cursorImage; - @Getter - private final WidgetInfo call; - - @Getter - private final WidgetInfo roleText; - - @Getter - private final WidgetInfo roleSprite; - - Role(WidgetInfo listen, WidgetInfo call, WidgetInfo role, WidgetInfo roleSprite) + CustomCursor(String name, String icon) { - this.listen = listen; - this.call = call; - this.roleText = role; - this.roleSprite = roleSprite; + this.name = name; + this.cursorImage = ImageUtil.getResourceStreamFromClass(CustomCursorPlugin.class, icon); } @Override public String toString() { - return name(); + return name; } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectile.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectile.java new file mode 100644 index 0000000000..a00d79e403 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectile.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * + * Modified by farhan1666 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.aoewarnings; + +import java.time.Instant; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.coords.LocalPoint; + +@Getter +@AllArgsConstructor +class AoeProjectile +{ + private final Instant startTime; + private final LocalPoint targetPoint; + private final AoeProjectileInfo aoeProjectileInfo; + private final int projectileLifetime; + private final int finalTick; +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectileInfo.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectileInfo.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectileInfo.java rename to runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectileInfo.java index a97212a5fe..7fcf46c32d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectileInfo.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeProjectileInfo.java @@ -29,7 +29,7 @@ package net.runelite.client.plugins.aoewarnings; import java.util.HashMap; import java.util.Map; -import api.ProjectileID; +import net.runelite.api.ProjectileID; public enum AoeProjectileInfo @@ -37,10 +37,12 @@ public enum AoeProjectileInfo LIZARDMAN_SHAMAN_AOE(ProjectileID.LIZARDMAN_SHAMAN_AOE, 5), CRAZY_ARCHAEOLOGIST_AOE(ProjectileID.CRAZY_ARCHAEOLOGIST_AOE, 3), ICE_DEMON_RANGED_AOE(ProjectileID.ICE_DEMON_RANGED_AOE, 3), + /** * When you don't have pray range on ice demon does an ice barrage */ ICE_DEMON_ICE_BARRAGE_AOE(ProjectileID.ICE_DEMON_ICE_BARRAGE_AOE, 3), + /** * The AOE when vasa first starts */ @@ -61,7 +63,10 @@ public enum AoeProjectileInfo */ GALVEK_MINE(ProjectileID.GALVEK_MINE, 3), GALVEK_BOMB(ProjectileID.GALVEK_BOMB, 3), - + + /** + * the AOEs of Grotesque Guardians + */ DAWN_FREEZE(ProjectileID.DAWN_FREEZE, 3), DUSK_CEILING(ProjectileID.DUSK_CEILING, 3), @@ -78,7 +83,6 @@ public enum AoeProjectileInfo /** * the AOE of the Corporeal Beast */ - CORPOREAL_BEAST(ProjectileID.CORPOREAL_BEAST_AOE, 1), CORPOREAL_BEAST_DARK_CORE(ProjectileID.CORPOREAL_BEAST_DARK_CORE_AOE, 3), @@ -114,7 +118,12 @@ public enum AoeProjectileInfo /** * Cerbs fire */ - CERB_FIRE(ProjectileID.CERB_FIRE, 2); + CERB_FIRE(ProjectileID.CERB_FIRE, 2), + + /** + * Demonic gorilla + */ + DEMONIC_GORILLA_BOULDER(ProjectileID.DEMONIC_GORILLA_BOULDER, 1); private static final Map map = new HashMap<>(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningConfig.java new file mode 100644 index 0000000000..38d0798ab7 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningConfig.java @@ -0,0 +1,951 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Modified by farhan1666 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.aoewarnings; + +import java.awt.Color; +import java.awt.Font; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Range; +import net.runelite.client.config.Stub; + +@ConfigGroup("aoe") +public interface AoeWarningConfig extends Config +{ + @Getter + @AllArgsConstructor + public enum FontStyle + { + BOLD("Bold", Font.BOLD), + ITALIC("Italic", Font.ITALIC), + PLAIN("Plain", Font.PLAIN); + + private String name; + private int font; + + @Override + public String toString() + { + return getName(); + } + } + + @ConfigItem( + keyName = "aoeNotifyAll", + name = "Notify for all AoE warnings", + description = "Configures whether or not AoE Projectile Warnings should trigger a notification", + position = 0 + ) + default boolean aoeNotifyAll() + { + return false; + } + + @ConfigItem( + keyName = "overlayStub", + name = "Overlay", + description = "", + position = 1 + ) + default Stub overlayStub() + { + return new Stub(); + } + + @ConfigItem( + position = 2, + keyName = "overlayColor", + name = "Overlay Color", + description = "Configures the color of the AoE Projectile Warnings overlay", + parent = "overlayStub" + ) + default Color overlayColor() + { + return new Color(0, 150, 200); + } + + @ConfigItem( + keyName = "outline", + name = "Display Outline", + description = "Configures whether or not AoE Projectile Warnings have an outline", + parent = "overlayStub", + position = 3 + ) + default boolean isOutlineEnabled() + { + return true; + } + + @ConfigItem( + keyName = "delay", + name = "Fade Delay", + description = "Configures the amount of time in milliseconds that the warning lingers for after the projectile has touched the ground", + parent = "overlayStub", + position = 4 + ) + default int delay() + { + return 300; + } + + @ConfigItem( + keyName = "fade", + name = "Fade Warnings", + description = "Configures whether or not AoE Projectile Warnings fade over time", + parent = "overlayStub", + position = 5 + ) + default boolean isFadeEnabled() + { + return true; + } + + @ConfigItem( + keyName = "tickTimers", + name = "Tick Timers", + description = "Configures whether or not AoE Projectile Warnings has tick timers overlaid as well.", + parent = "overlayStub", + position = 6 + ) + default boolean tickTimers() + { + return true; + } + + @ConfigItem( + position = 7, + keyName = "text", + name = "Text", + description = "", + hidden = true, + unhide = "tickTimers" + ) + default Stub text() + { + return new Stub(); + } + + @ConfigItem( + position = 8, + keyName = "fontStyle", + name = "Font Style", + description = "Bold/Italics/Plain", + parent = "text", + hidden = true, + unhide = "tickTimers" + ) + default FontStyle fontStyle() + { + return FontStyle.BOLD; + } + + @Range( + min = 20, + max = 40 + ) + @ConfigItem( + position = 9, + keyName = "textSize", + name = "Text Size", + description = "Text Size for Timers.", + parent = "text", + hidden = true, + unhide = "tickTimers" + ) + default int textSize() + { + return 32; + } + + @ConfigItem( + position = 10, + keyName = "shadows", + name = "Shadows", + description = "Adds Shadows to text.", + parent = "text", + hidden = true, + unhide = "tickTimers" + ) + default boolean shadows() + { + return true; + } + + @ConfigItem( + keyName = "npcStub", + name = "NPC's", + description = "", + position = 11 + ) + default Stub npcStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "lizardmanaoeStub", + name = "Lizardman Shamans", + description = "", + position = 12, + parent = "npcStub" + ) + default Stub lizardmanaoeStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "lizardmanaoe", + name = "Lizardman Shamans", + description = "Configures whether or not AoE Projectile Warnings for Lizardman Shamans is displayed", + parent = "lizardmanaoeStub", + position = 13 + ) + default boolean isShamansEnabled() + { + return true; + } + + @ConfigItem( + keyName = "lizardmanaoenotify", + name = "Lizardman Shamans Notify", + description = "Configures whether or not AoE Projectile Warnings for Lizardman Shamans should trigger a notification", + parent = "lizardmanaoeStub", + position = 14, + hide = "aoeNotifyAll" + ) + default boolean isShamansNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "archaeologistaoeStub", + name = "Crazy Archaeologist", + description = "", + position = 15, + parent = "npcStub" + ) + default Stub archaeologistaoeStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "archaeologistaoe", + name = "Crazy Archaeologist", + description = "Configures whether or not AoE Projectile Warnings for Archaeologist is displayed", + parent = "archaeologistaoeStub", + position = 16 + ) + default boolean isArchaeologistEnabled() + { + return true; + } + + @ConfigItem( + keyName = "archaeologistaoenotify", + name = "Crazy Archaeologist Notify", + description = "Configures whether or not AoE Projectile Warnings for Crazy Archaeologist should trigger a notification", + parent = "archaeologistaoeStub", + position = 17, + hide = "aoeNotifyAll" + ) + default boolean isArchaeologistNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "icedemonStub", + name = "Ice Demon", + description = "", + position = 18, + parent = "npcStub" + ) + default Stub icedemonStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "icedemon", + name = "Ice Demon", + description = "Configures whether or not AoE Projectile Warnings for Ice Demon is displayed", + parent = "icedemonStub", + position = 19 + ) + default boolean isIceDemonEnabled() + { + return true; + } + + @ConfigItem( + keyName = "icedemonnotify", + name = "Ice Demon Notify", + description = "Configures whether or not AoE Projectile Warnings for Ice Demon should trigger a notification", + parent = "icedemonStub", + position = 20, + hide = "aoeNotifyAll" + ) + default boolean isIceDemonNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "vasaStub", + name = "Vasa", + description = "", + position = 21, + parent = "npcStub" + ) + default Stub vasaStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "vasa", + name = "Vasa", + description = "Configures whether or not AoE Projectile Warnings for Vasa is displayed", + parent = "vasaStub", + position = 22 + ) + default boolean isVasaEnabled() + { + return true; + } + + @ConfigItem( + keyName = "vasanotify", + name = "Vasa Notify", + description = "Configures whether or not AoE Projectile Warnings for Vasa should trigger a notification", + parent = "vasaStub", + position = 23, + hide = "aoeNotifyAll" + ) + default boolean isVasaNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "tektonStub", + name = "Tekton", + description = "", + position = 24, + parent = "npcStub" + ) + default Stub tektonStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "tekton", + name = "Tekton", + description = "Configures whether or not AoE Projectile Warnings for Tekton is displayed", + parent = "tektonStub", + position = 25 + ) + default boolean isTektonEnabled() + { + return true; + } + + @ConfigItem( + keyName = "tektonnotify", + name = "Tekton Notify", + description = "Configures whether or not AoE Projectile Warnings for Tekton should trigger a notification", + parent = "tektonStub", + position = 26, + hide = "aoeNotifyAll" + ) + default boolean isTektonNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "vorkathStub", + name = "Vorkath", + description = "", + position = 27, + parent = "npcStub" + ) + default Stub vorkathStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "vorkath", + name = "Vorkath", + description = "Configures whether or not AoE Projectile Warnings for Vorkath are displayed", + parent = "vorkathStub", + position = 28 + ) + default boolean isVorkathEnabled() + { + return true; + } + + @ConfigItem( + keyName = "vorkathotify", + name = "Vorkath Notify", + description = "Configures whether or not AoE Projectile Warnings for Vorkath should trigger a notification", + parent = "vorkathStub", + position = 29, + hide = "aoeNotifyAll" + ) + default boolean isVorkathNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "galvekStub", + name = "Galvek", + description = "", + position = 30, + parent = "npcStub" + ) + default Stub galvekStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "galvek", + name = "Galvek", + description = "Configures whether or not AoE Projectile Warnings for Galvek are displayed", + parent = "galvekStub", + position = 31 + ) + default boolean isGalvekEnabled() + { + return true; + } + + @ConfigItem( + keyName = "galveknotify", + name = "Galvek Notify", + description = "Configures whether or not AoE Projectile Warnings for Galvek should trigger a notification", + parent = "galvekStub", + position = 32, + hide = "aoeNotifyAll" + ) + default boolean isGalvekNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "gargbossStub", + name = "Gargoyle Boss", + description = "", + position = 33, + parent = "npcStub" + ) + default Stub gargbossStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "gargboss", + name = "Gargoyle Boss", + description = "Configs whether or not AoE Projectile Warnings for Dawn/Dusk are displayed", + parent = "gargbossStub", + position = 34 + ) + default boolean isGargBossEnabled() + { + return true; + } + + @ConfigItem( + keyName = "gargbossnotify", + name = "Gargoyle Boss Notify", + description = "Configures whether or not AoE Projectile Warnings for Gargoyle Bosses should trigger a notification", + parent = "gargbossStub", + position = 35, + hide = "aoeNotifyAll" + ) + default boolean isGargBossNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "vetionStub", + name = "Vet'ion", + description = "", + position = 36, + parent = "npcStub" + ) + default Stub vetionStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "vetion", + name = "Vet'ion", + description = "Configures whether or not AoE Projectile Warnings for Vet'ion are displayed", + parent = "vetionStub", + position = 37 + ) + default boolean isVetionEnabled() + { + return true; + } + + @ConfigItem( + keyName = "vetionnotify", + name = "Vet'ion Notify", + description = "Configures whether or not AoE Projectile Warnings for Vet'ion should trigger a notification", + parent = "vetionStub", + position = 38, + hide = "aoeNotifyAll" + ) + default boolean isVetionNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "chaosfanaticStub", + name = "Chaos Fanatic", + description = "", + position = 39, + parent = "npcStub" + ) + default Stub chaosfanaticStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "chaosfanatic", + name = "Chaos Fanatic", + description = "Configures whether or not AoE Projectile Warnings for Chaos Fanatic are displayed", + parent = "chaosfanaticStub", + position = 40 + ) + default boolean isChaosFanaticEnabled() + { + return true; + } + + @ConfigItem( + keyName = "chaosfanaticnotify", + name = "Chaos Fanatic Notify", + description = "Configures whether or not AoE Projectile Warnings for Chaos Fanatic should trigger a notification", + parent = "chaosfanaticStub", + position = 41, + hide = "aoeNotifyAll" + ) + default boolean isChaosFanaticNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "olmStub", + name = "Olm", + description = "", + position = 42, + parent = "npcStub" + ) + default Stub olmStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "olm", + name = "Olm", + description = "Configures whether or not AoE Projectile Warnings for The Great Olm are displayed", + parent = "olmStub", + position = 43 + ) + default boolean isOlmEnabled() + { + return true; + } + + @ConfigItem( + keyName = "olmnotify", + name = "Olm Notify", + description = "Configures whether or not AoE Projectile Warnings for Olm should trigger a notification", + parent = "olmStub", + position = 44, + hide = "aoeNotifyAll" + ) + default boolean isOlmNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "olmBombStub", + name = "Bombs", + description = "", + position = 45, + parent = "olmStub" + ) + default Stub olmBombsStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "bombDisplay", + name = "Olm Bombs", + description = "Display a timer and colour-coded AoE for Olm's crystal-phase bombs.", + parent = "olmBombStub", + position = 46 + ) + default boolean bombDisplay() + { + return true; + } + + @ConfigItem( + keyName = "bombDisplaynotify", + name = "Olm Bombs Notify", + description = "Configures whether or not AoE Projectile Warnings for Olm Bombs should trigger a notification", + parent = "olmBombStub", + position = 47, + hide = "aoeNotifyAll" + ) + default boolean bombDisplayNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "olmlightningStub", + name = "Lightning Trails", + description = "", + position = 48, + parent = "olmStub" + ) + default Stub olmlightningStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "lightning", + name = "Olm Lightning Trails", + description = "Show Lightning Trails", + parent = "olmlightningStub", + position = 49 + ) + default boolean LightningTrail() + { + return true; + } + + @ConfigItem( + keyName = "lightningnotify", + name = "Olm Lightning Trails Notify", + description = "Configures whether or not AoE Projectile Warnings for Olm Lightning Trails should trigger a notification", + parent = "olmlightningStub", + position = 50, + hide = "aoeNotifyAll" + ) + default boolean LightningTrailNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "corpStub", + name = "Corporeal Beast", + description = "", + position = 51, + parent = "npcStub" + ) + default Stub corpStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "corp", + name = "Corporeal Beast", + description = "Configures whether or not AoE Projectile Warnings for the Corporeal Beast are displayed", + parent = "corpStub", + position = 52 + ) + default boolean isCorpEnabled() + { + return true; + } + + @ConfigItem( + keyName = "corpnotify", + name = "Corporeal Beast Notify", + description = "Configures whether or not AoE Projectile Warnings for Corporeal Beast should trigger a notification", + parent = "corpStub", + position = 53, + hide = "aoeNotifyAll" + ) + default boolean isCorpNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "wintertodtStub", + name = "Wintertodt", + description = "", + position = 54, + parent = "npcStub" + ) + default Stub wintertodtStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "wintertodt", + name = "Wintertodt Snow Fall", + description = "Configures whether or not AOE Projectile Warnings for the Wintertodt snow fall are displayed", + parent = "wintertodtStub", + position = 55 + ) + default boolean isWintertodtEnabled() + { + return true; + } + + @ConfigItem( + keyName = "wintertodtnotify", + name = "Wintertodt Snow Fall Notify", + description = "Configures whether or not AoE Projectile Warnings for Wintertodt Snow Fall Notify should trigger a notification", + parent = "wintertodtStub", + position = 56, + hide = "aoeNotifyAll" + ) + default boolean isWintertodtNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "xarpusStub", + name = "Xarpus", + description = "", + position = 57, + parent = "npcStub" + ) + default Stub xarpusStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "isXarpusEnabled", + name = "Xarpus", + description = "Configures whether or not AOE Projectile Warnings for Xarpus are displayed", + parent = "xarpusStub", + position = 58 + ) + default boolean isXarpusEnabled() + { + return true; + } + + @ConfigItem( + keyName = "isXarpusEnablednotify", + name = "Xarpus Notify", + description = "Configures whether or not AoE Projectile Warnings for Xarpus should trigger a notification", + parent = "xarpusStub", + position = 59, + hide = "aoeNotifyAll" + ) + default boolean isXarpusNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "addyDragsStub", + name = "Addy Drags", + description = "", + position = 60, + parent = "npcStub" + ) + default Stub addyDragsStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "addyDrags", + name = "Addy Drags", + description = "Show Bad Areas", + parent = "addyDragsStub", + position = 61 + ) + default boolean addyDrags() + { + return true; + } + + @ConfigItem( + keyName = "addyDragsnotify", + name = "Addy Drags Notify", + description = "Configures whether or not AoE Projectile Warnings for Addy Dragons should trigger a notification", + parent = "addyDragsStub", + position = 62, + hide = "aoeNotifyAll" + ) + default boolean addyDragsNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "drakeStub", + name = "Drakes", + description = "", + position = 63, + parent = "npcStub" + ) + default Stub drakeStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "drake", + name = "Drakes Breath", + description = "Configures if Drakes Breath tile markers are displayed", + parent = "drakeStub", + position = 64 + ) + default boolean isDrakeEnabled() + { + return true; + } + + @ConfigItem( + keyName = "drakenotify", + name = "Drakes Breath Notify", + description = "Configures whether or not AoE Projectile Warnings for Drakes Breath should trigger a notification", + parent = "drakeStub", + position = 65, + hide = "aoeNotifyAll" + ) + default boolean isDrakeNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "cerberusStub", + name = "Cerberus", + description = "", + position = 66, + parent = "npcStub" + ) + default Stub cerberusStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "cerbFire", + name = "Cerberus Fire", + description = "Configures if Cerberus fire tile markers are displayed", + parent = "cerberusStub", + position = 67 + ) + default boolean isCerbFireEnabled() + { + return true; + } + + @ConfigItem( + keyName = "cerbFirenotify", + name = "Cerberus Fire Notify", + description = "Configures whether or not AoE Projectile Warnings for Cerberus his fire should trigger a notification", + parent = "cerberusStub", + position = 68, + hide = "aoeNotifyAll" + ) + default boolean isCerbFireNotifyEnabled() + { + return false; + } + + @ConfigItem( + keyName = "demonicGorillaStub", + name = "Demonic Gorilla", + description = "", + position = 69, + parent = "npcStub" + ) + default Stub demonicGorillaStub() + { + return new Stub(); + } + + @ConfigItem( + keyName = "demonicGorilla", + name = "Demonic Gorilla", + description = "Configures if Demonic Gorilla boulder tile markers are displayed", + parent = "demonicGorillaStub", + position = 70 + ) + default boolean isDemonicGorillaEnabled() + { + return true; + } + + @ConfigItem( + keyName = "demonicGorillaNotify", + name = "Demonic Gorilla Notify", + description = "Configures whether or not AoE Projectile Warnings for Demonic Gorilla boulders should trigger a notification", + parent = "demonicGorillaStub", + position = 71, + hide = "aoeNotifyAll" + ) + default boolean isDemonicGorillaNotifyEnabled() + { + return false; + } +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java similarity index 74% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java index 84b5aed4ea..48491da688 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java @@ -27,25 +27,25 @@ */ package net.runelite.client.plugins.aoewarnings; -import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; +import java.awt.Rectangle; import java.time.Duration; import java.time.Instant; import java.util.Iterator; import java.util.Map; -import javax.annotation.Nullable; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Projectile; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Projectile; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayUtil; import static net.runelite.client.util.ColorUtil.setAlphaComponent; public class AoeWarningOverlay extends Overlay @@ -58,7 +58,7 @@ public class AoeWarningOverlay extends Overlay private final AoeWarningConfig config; @Inject - public AoeWarningOverlay(@Nullable Client client, AoeWarningPlugin plugin, AoeWarningConfig config) + public AoeWarningOverlay(Client client, AoeWarningPlugin plugin, AoeWarningConfig config) { setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.UNDER_WIDGETS); @@ -70,17 +70,25 @@ public class AoeWarningOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { + WorldPoint lp = client.getLocalPlayer().getWorldLocation(); for (WorldPoint point : plugin.getLightningTrail()) { - drawTile(graphics, point, new Color(0, 150, 200), 2, 150, 50); + OverlayUtil.drawTile(graphics, client, point, lp, new Color(0, 150, 200), 2, 150, 50); } + for (WorldPoint point : plugin.getAcidTrail()) { - drawTile(graphics, point, new Color(69, 241, 44), 2, 150, 50); + OverlayUtil.drawTile(graphics, client, point, lp, new Color(69, 241, 44), 2, 150, 50); } + for (WorldPoint point : plugin.getCrystalSpike()) { - drawTile(graphics, point, new Color(255, 0, 84), 2, 150, 50); + OverlayUtil.drawTile(graphics, client, point, lp, new Color(255, 0, 84), 2, 150, 50); + } + + for (WorldPoint point : plugin.getWintertodtSnowFall()) + { + OverlayUtil.drawTile(graphics, client, point, lp, new Color(255, 0, 84), 2, 150, 50); } Instant now = Instant.now(); @@ -88,7 +96,7 @@ public class AoeWarningOverlay extends Overlay for (Iterator it = projectiles.values().iterator(); it.hasNext(); ) { AoeProjectile aoeProjectile = it.next(); - + Color color; if (now.isAfter(aoeProjectile.getStartTime().plus(Duration.ofMillis(aoeProjectile.getProjectileLifetime())))) { it.remove(); @@ -104,6 +112,8 @@ public class AoeWarningOverlay extends Overlay // how far through the projectiles lifetime between 0-1. double progress = (System.currentTimeMillis() - aoeProjectile.getStartTime().toEpochMilli()) / (double) aoeProjectile.getProjectileLifetime(); + int tickProgress = aoeProjectile.getFinalTick() - client.getTickCount(); + int fillAlpha, outlineAlpha; if (config.isFadeEnabled()) { @@ -115,6 +125,14 @@ public class AoeWarningOverlay extends Overlay fillAlpha = FILL_START_ALPHA; outlineAlpha = OUTLINE_START_ALPHA; } + if (tickProgress == 0) + { + color = Color.RED; + } + else + { + color = Color.WHITE; + } if (fillAlpha < 0) { @@ -131,7 +149,7 @@ public class AoeWarningOverlay extends Overlay } if (outlineAlpha > 255) { - outlineAlpha = 255;//Make sure we don't pass in an invalid alpha + outlineAlpha = 255; } if (config.isOutlineEnabled()) @@ -139,36 +157,24 @@ public class AoeWarningOverlay extends Overlay graphics.setColor(new Color(setAlphaComponent(config.overlayColor().getRGB(), outlineAlpha), true)); graphics.drawPolygon(tilePoly); } - + if (config.tickTimers()) + { + if (tickProgress >= 0) + { + OverlayUtil.renderTextLocation(graphics, Integer.toString(tickProgress), plugin.getTextSize(), + plugin.getFontStyle(), color, centerPoint(tilePoly.getBounds()), plugin.isShadows(), 0); + } + } graphics.setColor(new Color(setAlphaComponent(config.overlayColor().getRGB(), fillAlpha), true)); graphics.fillPolygon(tilePoly); } return null; } - private void drawTile(Graphics2D graphics, WorldPoint point, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) + private Point centerPoint(Rectangle rect) { - WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); - if (point.distanceTo(playerLocation) >= 32) - { - return; - } - LocalPoint lp = LocalPoint.fromWorld(client, point); - if (lp == null) - { - return; - } - - Polygon poly = Perspective.getCanvasTilePoly(client, lp); - if (poly == null) - { - return; - } - //OverlayUtil.renderPolygon(graphics, poly, color); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); - graphics.setStroke(new BasicStroke(strokeWidth)); - graphics.draw(poly); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); - graphics.fill(poly); + int x = (int) (rect.getX() + rect.getWidth() / 2); + int y = (int) (rect.getY() + rect.getHeight() / 2); + return new Point(x, y); } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningPlugin.java similarity index 57% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningPlugin.java index adb33f6171..00ed024a44 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningPlugin.java @@ -38,20 +38,24 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameObject; -import api.GameState; -import api.GraphicsObject; -import api.ObjectID; -import api.Projectile; -import api.Tile; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.ProjectileMoved; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.GraphicID; +import net.runelite.api.GraphicsObject; +import net.runelite.api.NullObjectID; +import net.runelite.api.ObjectID; +import net.runelite.api.Projectile; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ProjectileMoved; +import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -63,40 +67,42 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "AoE Warnings", description = "Shows the final destination for AoE Attack projectiles", tags = {"bosses", "combat", "pve", "overlay"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) @Slf4j public class AoeWarningPlugin extends Plugin { - @Getter private final Map bombs = new HashMap<>(); private final Map projectiles = new HashMap<>(); - @Inject public AoeWarningConfig config; - + @Inject + private Notifier notifier; @Inject private OverlayManager overlayManager; - @Inject private AoeWarningOverlay coreOverlay; - @Inject private BombOverlay bombOverlay; - @Inject private Client client; - @Getter(AccessLevel.PACKAGE) private List LightningTrail = new ArrayList<>(); - @Getter(AccessLevel.PACKAGE) private List AcidTrail = new ArrayList<>(); - @Getter(AccessLevel.PACKAGE) private List CrystalSpike = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private List WintertodtSnowFall = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private boolean shadows; + @Getter(AccessLevel.PACKAGE) + private int textSize; + @Getter(AccessLevel.PACKAGE) + private int fontStyle; @Provides AoeWarningConfig getConfig(ConfigManager configManager) @@ -114,9 +120,7 @@ public class AoeWarningPlugin extends Plugin { overlayManager.add(coreOverlay); overlayManager.add(bombOverlay); - LightningTrail.clear(); - AcidTrail.clear(); - CrystalSpike.clear(); + reset(true); } @Override @@ -124,9 +128,29 @@ public class AoeWarningPlugin extends Plugin { overlayManager.remove(coreOverlay); overlayManager.remove(bombOverlay); - LightningTrail.clear(); - AcidTrail.clear(); - CrystalSpike.clear(); + reset(false); + } + + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (!event.getGroup().equals("aoe")) + { + return; + } + + switch (event.getKey()) + { + case "fontStyle": + fontStyle = config.fontStyle().getFont(); + break; + case "textSize": + textSize = config.textSize(); + break; + case "shadows": + shadows = config.shadows(); + break; + } } @Subscribe @@ -136,12 +160,24 @@ public class AoeWarningPlugin extends Plugin int projectileId = projectile.getId(); int projectileLifetime = config.delay() + (projectile.getRemainingCycles() * 20); + int ticksRemaining = projectile.getRemainingCycles() / 30; + if (!isTickTimersEnabledForProjectileID(projectileId)) + { + ticksRemaining = 0; + } + int tickCycle = client.getTickCount() + ticksRemaining; AoeProjectileInfo aoeProjectileInfo = AoeProjectileInfo.getById(projectileId); - if (aoeProjectileInfo != null && isConfigEnabledForProjectileId(projectileId)) + if (aoeProjectileInfo != null + && isConfigEnabledForProjectileId(projectileId, false)) { LocalPoint targetPoint = event.getPosition(); - AoeProjectile aoeProjectile = new AoeProjectile(Instant.now(), targetPoint, aoeProjectileInfo, projectileLifetime); + AoeProjectile aoeProjectile = new AoeProjectile(Instant.now(), targetPoint, aoeProjectileInfo, projectileLifetime, tickCycle); projectiles.put(projectile, aoeProjectile); + + if (config.aoeNotifyAll() || isConfigEnabledForProjectileId(projectileId, true)) + { + notifier.notify("AoE attack detected!"); + } } } @@ -149,19 +185,35 @@ public class AoeWarningPlugin extends Plugin public void onGameObjectSpawned(GameObjectSpawned event) { final GameObject gameObject = event.getGameObject(); - final WorldPoint bombLocation = gameObject.getWorldLocation(); + final WorldPoint wp = gameObject.getWorldLocation(); switch (gameObject.getId()) { case ObjectID.CRYSTAL_BOMB: - bombs.put(bombLocation, new CrystalBomb(gameObject, client.getTickCount())); + bombs.put(wp, new CrystalBomb(gameObject, client.getTickCount())); + + if (config.aoeNotifyAll() || config.bombDisplayNotifyEnabled()) + { + notifier.notify("Bomb!"); + } break; case ObjectID.ACID_POOL: - AcidTrail.add(bombLocation); + AcidTrail.add(wp); break; case ObjectID.SMALL_CRYSTALS: - //todo - CrystalSpike.add(bombLocation); + CrystalSpike.add(wp); + break; + case NullObjectID.NULL_26690: + //Wintertodt Snowfall + if (config.isWintertodtEnabled()) + { + WintertodtSnowFall.add(wp); + + if (config.aoeNotifyAll() || config.isWintertodtNotifyEnabled()) + { + notifier.notify("Snow Fall!"); + } + } break; } } @@ -170,19 +222,24 @@ public class AoeWarningPlugin extends Plugin public void onGameObjectDespawned(GameObjectDespawned event) { GameObject gameObject = event.getGameObject(); - WorldPoint bombLocation = gameObject.getWorldLocation(); + WorldPoint wp = gameObject.getWorldLocation(); switch (gameObject.getId()) { case ObjectID.CRYSTAL_BOMB: - //might as well check the ObjectID to save some time. purgeBombs(bombs); break; case ObjectID.ACID_POOL: - AcidTrail.remove(bombLocation); + AcidTrail.remove(wp); break; case ObjectID.SMALL_CRYSTALS: - //todo - CrystalSpike.remove(bombLocation); + CrystalSpike.remove(wp); + break; + case NullObjectID.NULL_26690: + //Wintertodt Snowfall + if (config.isWintertodtEnabled()) + { + WintertodtSnowFall.remove(wp); + } break; } } @@ -204,9 +261,14 @@ public class AoeWarningPlugin extends Plugin LightningTrail.clear(); for (GraphicsObject o : client.getGraphicsObjects()) { - if (o.getId() == 1356) + if (o.getId() == GraphicID.OLM_LIGHTNING) { LightningTrail.add(WorldPoint.fromLocal(client, o.getLocation())); + + if (config.aoeNotifyAll() || config.LightningTrailNotifyEnabled()) + { + notifier.notify("Lightning!"); + } } } } @@ -229,6 +291,12 @@ public class AoeWarningPlugin extends Plugin Map.Entry entry = it.next(); WorldPoint world = entry.getKey(); LocalPoint local = LocalPoint.fromWorld(client, world); + + if (local == null) + { + return; + } + Tile tile = tiles[world.getPlane()][local.getSceneX()][local.getSceneY()]; GameObject[] objects = tile.getGameObjects(); boolean containsObjects = false; @@ -249,65 +317,110 @@ public class AoeWarningPlugin extends Plugin } } - private boolean isConfigEnabledForProjectileId(int projectileId) + private boolean isTickTimersEnabledForProjectileID(int projectileId) { AoeProjectileInfo projectileInfo = AoeProjectileInfo.getById(projectileId); + if (projectileInfo == null) { return false; } + switch (projectileInfo) + { + case VASA_RANGED_AOE: + case VORKATH_POISON_POOL: + case VORKATH_SPAWN: + case VORKATH_TICK_FIRE: + case OLM_BURNING: + case OLM_FALLING_CRYSTAL_TRAIL: + case OLM_ACID_TRAIL: + case OLM_FIRE_LINE: + return false; + } + + return true; + } + + private boolean isConfigEnabledForProjectileId(int projectileId, boolean notify) + { + AoeProjectileInfo projectileInfo = AoeProjectileInfo.getById(projectileId); + if (projectileInfo == null) + { + return false; + } + + if (notify && config.aoeNotifyAll()) + { + return true; + } + switch (projectileInfo) { case LIZARDMAN_SHAMAN_AOE: - return config.isShamansEnabled(); + return notify ? config.isShamansNotifyEnabled() : config.isShamansEnabled(); case CRAZY_ARCHAEOLOGIST_AOE: - return config.isArchaeologistEnabled(); + return notify ? config.isArchaeologistNotifyEnabled() : config.isArchaeologistEnabled(); case ICE_DEMON_RANGED_AOE: case ICE_DEMON_ICE_BARRAGE_AOE: - return config.isIceDemonEnabled(); + return notify ? config.isIceDemonNotifyEnabled() : config.isIceDemonEnabled(); case VASA_AWAKEN_AOE: case VASA_RANGED_AOE: - return config.isVasaEnabled(); + return notify ? config.isVasaNotifyEnabled() : config.isVasaEnabled(); case TEKTON_METEOR_AOE: - return config.isTektonEnabled(); + return notify ? config.isTektonNotifyEnabled() : config.isTektonEnabled(); case VORKATH_BOMB: case VORKATH_POISON_POOL: case VORKATH_SPAWN: case VORKATH_TICK_FIRE: - return config.isVorkathEnabled(); + return notify ? config.isVorkathNotifyEnabled() : config.isVorkathEnabled(); case VETION_LIGHTNING: - return config.isVetionEnabled(); + return notify ? config.isVetionNotifyEnabled() : config.isVetionEnabled(); case CHAOS_FANATIC: - return config.isChaosFanaticEnabled(); + return notify ? config.isChaosFanaticNotifyEnabled() : config.isChaosFanaticEnabled(); case GALVEK_BOMB: case GALVEK_MINE: - return config.isGalvekEnabled(); + return notify ? config.isGalvekNotifyEnabled() : config.isGalvekEnabled(); case DAWN_FREEZE: case DUSK_CEILING: - return config.isGargBossEnabled(); + return notify ? config.isGargBossNotifyEnabled() : config.isGargBossEnabled(); case OLM_FALLING_CRYSTAL: case OLM_BURNING: case OLM_FALLING_CRYSTAL_TRAIL: case OLM_ACID_TRAIL: case OLM_FIRE_LINE: - return config.isOlmEnabled(); + return notify ? config.isOlmNotifyEnabled() : config.isOlmEnabled(); case CORPOREAL_BEAST: case CORPOREAL_BEAST_DARK_CORE: - return config.isCorpEnabled(); - case WINTERTODT_SNOW_FALL: - return config.isWintertodtEnabled(); + return notify ? config.isCorpNotifyEnabled() : config.isCorpEnabled(); case XARPUS_POISON_AOE: - return config.isXarpusEnabled(); + return notify ? config.isXarpusNotifyEnabled() : config.isXarpusEnabled(); case ADDY_DRAG_POISON: - return config.addyDrags(); + return notify ? config.addyDragsNotifyEnabled() : config.addyDrags(); case DRAKE_BREATH: - return config.isDrakeEnabled(); + return notify ? config.isDrakeNotifyEnabled() : config.isDrakeEnabled(); case CERB_FIRE: - return config.isCerbFireEnabled(); + return notify ? config.isCerbFireNotifyEnabled() : config.isCerbFireEnabled(); + case DEMONIC_GORILLA_BOULDER: + return notify ? config.isDemonicGorillaNotifyEnabled() : config.isDemonicGorillaEnabled(); } return false; } -} + private void reset(boolean setConfig) + { + LightningTrail.clear(); + AcidTrail.clear(); + CrystalSpike.clear(); + WintertodtSnowFall.clear(); + bombs.clear(); + projectiles.clear(); + if (setConfig) + { + fontStyle = config.fontStyle().getFont(); + textSize = config.textSize(); + shadows = config.shadows(); + } + } +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/BombOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/BombOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/BombOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/BombOverlay.java index 184233c6c9..317f5ad04b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/BombOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/BombOverlay.java @@ -37,12 +37,12 @@ import java.util.Locale; import java.util.Map; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Perspective; -import api.Player; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -121,6 +121,10 @@ public class BombOverlay extends Overlay { final Player localPlayer = client.getLocalPlayer(); LocalPoint localLoc = LocalPoint.fromWorld(client, bomb.getWorldLocation()); + if (localLoc == null) + { + return; + } double distance_x = Math.abs(bomb.getWorldLocation().getX() - localPlayer.getWorldLocation().getX()); double distance_y = Math.abs(bomb.getWorldLocation().getY() - localPlayer.getWorldLocation().getY()); Color color_code = Color.decode(SAFE); @@ -142,7 +146,7 @@ public class BombOverlay extends Overlay { color_code = Color.decode(CAUTION); } - LocalPoint CenterPoint = new LocalPoint(localLoc.getX() + 0, localLoc.getY() + 0); + LocalPoint CenterPoint = new LocalPoint(localLoc.getX(), localLoc.getY()); Polygon poly = Perspective.getCanvasTileAreaPoly(client, CenterPoint, BOMB_AOE); if (poly != null) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/CrystalBomb.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/CrystalBomb.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/CrystalBomb.java rename to runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/CrystalBomb.java index 02b6f99490..5e871dca12 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/aoewarnings/CrystalBomb.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/CrystalBomb.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.aoewarnings; import java.time.Instant; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.GameObject; -import api.coords.WorldPoint; +import net.runelite.api.GameObject; +import net.runelite.api.coords.WorldPoint; @Slf4j class CrystalBomb diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStyle.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStyle.java index 261485de7d..c32ba11af3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStyle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStyle.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.attackstyles; -import api.Skill; +import net.runelite.api.Skill; public enum AttackStyle { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java index c8d12af1f3..0660c1e659 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java @@ -28,7 +28,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java index ab1e703029..db7a9ed751 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java @@ -31,20 +31,20 @@ import com.google.inject.Provides; import java.util.HashSet; import java.util.Set; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.Skill; -import api.VarPlayer; -import api.Varbits; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.VarbitChanged; -import api.events.WidgetHiddenChanged; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import static api.widgets.WidgetID.COMBAT_GROUP_ID; -import api.widgets.WidgetInfo; -import static api.widgets.WidgetInfo.TO_GROUP; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetID.COMBAT_GROUP_ID; +import net.runelite.api.widgets.WidgetInfo; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankCalculation.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankCalculation.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankCalculation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/bank/BankCalculation.java index ca41421487..13398e22f7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankCalculation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankCalculation.java @@ -33,14 +33,14 @@ import java.util.Map; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; -import static api.ItemID.COINS_995; -import static api.ItemID.PLATINUM_TOKEN; -import api.Varbits; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import static net.runelite.api.ItemID.COINS_995; +import static net.runelite.api.ItemID.PLATINUM_TOKEN; +import net.runelite.api.Varbits; import net.runelite.client.game.ItemManager; @Slf4j diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java index 25b1638095..f30ba0115f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java @@ -28,11 +28,11 @@ package net.runelite.client.plugins.bank; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.MenuEntry; -import api.events.MenuEntryAdded; -import api.events.MenuShouldLeftClick; -import api.events.ScriptCallbackEvent; +import net.runelite.api.Client; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuShouldLeftClick; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java index d107f2599e..d593b9f0aa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java @@ -36,27 +36,27 @@ import java.util.Collection; import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.inject.Inject; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.MenuAction; -import api.MenuEntry; -import api.VarClientInt; -import api.VarClientStr; -import api.events.ConfigChanged; -import api.events.DraggingWidgetChanged; -import api.events.FocusChanged; -import api.events.GameTick; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.events.ScriptCallbackEvent; -import api.events.WidgetLoaded; -import api.vars.InputType; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.DraggingWidgetChanged; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.vars.InputType; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -321,12 +321,12 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener, KeyLis @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (event.getWidgetId() == WidgetInfo.BANK_ITEM_CONTAINER.getId() + if (event.getActionParam1() == WidgetInfo.BANK_ITEM_CONTAINER.getId() && event.getMenuAction() == MenuAction.RUNELITE - && event.getMenuOption().startsWith(EDIT_TAGS_MENU_OPTION)) + && event.getOption().startsWith(EDIT_TAGS_MENU_OPTION)) { event.consume(); - int inventoryIndex = event.getActionParam(); + int inventoryIndex = event.getActionParam0(); ItemContainer bankContainer = client.getItemContainer(InventoryID.BANK); if (bankContainer == null) { @@ -344,8 +344,8 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener, KeyLis } int itemId = item.getId(); - ItemDefinition itemComposition = itemManager.getItemDefinition(itemId); - String name = itemComposition.getName(); + ItemDefinition itemDefinition = itemManager.getItemDefinition(itemId); + String name = itemDefinition.getName(); // Get both tags and vartags and append * to end of vartags name Collection tags = tagManager.getTags(itemId, false); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/TagManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/TagManager.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/TagManager.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/TagManager.java index 3cbf8e9b86..c1d5ff8c11 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/TagManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/TagManager.java @@ -32,7 +32,7 @@ import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; -import api.ItemID; +import net.runelite.api.ItemID; import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemVariationMapping; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java index 423be16e9f..4aed474dae 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java @@ -26,13 +26,13 @@ package net.runelite.client.plugins.banktags.tabs; import com.google.inject.Inject; -import api.Client; -import api.ScriptID; -import api.VarClientInt; -import api.VarClientStr; -import api.vars.InputType; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; +import net.runelite.api.vars.InputType; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; public class BankSearch diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/MenuIndexes.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/MenuIndexes.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/MenuIndexes.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/MenuIndexes.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java index 7033bc8452..d2f7a4af52 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java @@ -49,31 +49,32 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.MenuAction; -import api.MenuEntry; -import api.Point; -import api.ScriptEvent; -import api.ScriptID; -import api.SoundEffectID; -import api.SpriteID; -import api.VarClientInt; -import api.VarClientStr; -import api.Varbits; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.vars.InputType; -import api.widgets.ItemQuantityMode; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetConfig; -import api.widgets.WidgetInfo; -import api.widgets.WidgetSizeMode; -import api.widgets.WidgetType; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Point; +import net.runelite.api.ScriptEvent; +import net.runelite.api.ScriptID; +import net.runelite.api.SoundEffectID; +import net.runelite.api.SpriteID; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.vars.InputType; +import net.runelite.api.widgets.ItemQuantityMode; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetConfig; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetSizeMode; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; import net.runelite.client.game.ItemManager; @@ -230,9 +231,9 @@ public class TabInterface .filter(id -> id != -1) .collect(Collectors.toList()); - if (!Strings.isNullOrEmpty(event.getMenuTarget())) + if (!Strings.isNullOrEmpty(event.getTarget())) { - if (activeTab != null && Text.removeTags(event.getMenuTarget()).equals(activeTab.getTag())) + if (activeTab != null && Text.removeTags(event.getTarget()).equals(activeTab.getTag())) { for (Integer item : items) { @@ -564,9 +565,9 @@ public class TabInterface return; } - if (event.getWidgetId() == WidgetInfo.BANK_ITEM_CONTAINER.getId() + if (event.getActionParam1() == WidgetInfo.BANK_ITEM_CONTAINER.getId() && event.getMenuAction() == MenuAction.EXAMINE_ITEM_BANK_EQ - && event.getMenuOption().equalsIgnoreCase("withdraw-x")) + && event.getOption().equalsIgnoreCase("withdraw-x")) { waitSearchTick = true; rememberedSearch = client.getVar(VarClientStr.INPUT_TEXT); @@ -575,9 +576,9 @@ public class TabInterface if (iconToSet != null) { - if (event.getMenuOption().startsWith(CHANGE_ICON + " (")) + if (event.getOption().startsWith(CHANGE_ICON + " (")) { - ItemDefinition item = getItem(event.getActionParam()); + ItemDefinition item = getItem(event.getActionParam0()); int itemId = itemManager.canonicalize(item.getId()); iconToSet.setIconItemId(itemId); iconToSet.getIcon().setItemId(itemId); @@ -590,7 +591,7 @@ public class TabInterface } if (activeTab != null - && event.getMenuOption().equals("Search") + && event.getOption().equals("Search") && client.getWidget(WidgetInfo.BANK_SEARCH_BUTTON_BACKGROUND).getSpriteId() != SpriteID.EQUIPMENT_SLOT_SELECTED) { activateTab(null); @@ -600,27 +601,27 @@ public class TabInterface client.setVar(VarClientInt.INPUT_TYPE, 0); } else if (activeTab != null - && event.getMenuOption().startsWith("View tab")) + && event.getOption().startsWith("View tab")) { activateTab(null); } else if (activeTab != null - && event.getWidgetId() == WidgetInfo.BANK_ITEM_CONTAINER.getId() + && event.getActionParam1() == WidgetInfo.BANK_ITEM_CONTAINER.getId() && event.getMenuAction() == MenuAction.RUNELITE - && event.getMenuOption().startsWith(REMOVE_TAG)) + && event.getOption().startsWith(REMOVE_TAG)) { // Add "remove" menu entry to all items in bank while tab is selected event.consume(); - final ItemDefinition item = getItem(event.getActionParam()); + final ItemDefinition item = getItem(event.getActionParam0()); final int itemId = item.getId(); tagManager.removeTag(itemId, activeTab.getTag()); bankSearch.search(InputType.SEARCH, TAG_SEARCH + activeTab.getTag(), true); } else if (event.getMenuAction() == MenuAction.RUNELITE - && ((event.getWidgetId() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId() && event.getMenuOption().equals(TAG_INVENTORY)) - || (event.getWidgetId() == WidgetInfo.BANK_DEPOSIT_EQUIPMENT.getId() && event.getMenuOption().equals(TAG_GEAR)))) + && ((event.getActionParam1() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId() && event.getOption().equals(TAG_INVENTORY)) + || (event.getActionParam1() == WidgetInfo.BANK_DEPOSIT_EQUIPMENT.getId() && event.getOption().equals(TAG_GEAR)))) { - handleDeposit(event, event.getWidgetId() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId()); + handleDeposit(event, event.getActionParam1() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId()); } } @@ -730,7 +731,13 @@ public class TabInterface if (tagTab.getIcon() == null) { - Widget icon = createGraphic(ColorUtil.wrapWithColorTag(tagTab.getTag(), HILIGHT_COLOR), -1, tagTab.getIconItemId(), 36, 32, bounds.x + 3, 1, false); + Widget icon = createGraphic( + ColorUtil.wrapWithColorTag(tagTab.getTag(), HILIGHT_COLOR), + -1, + tagTab.getIconItemId(), + Constants.ITEM_SPRITE_WIDTH, Constants.ITEM_SPRITE_HEIGHT, + bounds.x + 3, 1, + false); int clickmask = icon.getClickMask(); clickmask |= WidgetConfig.DRAG; clickmask |= WidgetConfig.DRAG_ON; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabManager.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabManager.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabManager.java index 5105fc37af..e1995a5095 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabManager.java @@ -34,7 +34,7 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; import net.runelite.client.config.ConfigManager; import static net.runelite.client.plugins.banktags.BankTagsPlugin.CONFIG_GROUP; import static net.runelite.client.plugins.banktags.BankTagsPlugin.ICON_SEARCH; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabSprites.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabSprites.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TabSprites.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabSprites.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java index 8a566a2ac9..004e5f45ed 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.banktags.tabs; import lombok.Data; import lombok.EqualsAndHashCode; -import api.widgets.Widget; +import net.runelite.api.widgets.Widget; @Data @EqualsAndHashCode(of = "tag") diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/BanListConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/banlist/BanListConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/BanListConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banlist/BanListConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/BanListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/banlist/BanListPlugin.java similarity index 63% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/BanListPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banlist/BanListPlugin.java index e02b760b1a..92371331cc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/BanListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banlist/BanListPlugin.java @@ -32,16 +32,16 @@ import java.util.ArrayList; import java.util.Arrays; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.ClanMember; -import api.Client; -import api.GameState; -import api.events.ClanMemberJoined; -import api.events.ConfigChanged; -import api.events.WidgetHiddenChanged; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.ClanMember; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.ClanMemberJoined; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; @@ -60,12 +60,14 @@ import okhttp3.Request; import okhttp3.Response; @PluginDescriptor( - name = "Ban List", - description = "Displays warning in chat when you join a" + - "clan chat/new member join your clan chat and he is in a WDR/RuneWatch/Manual List", - tags = {"PVM", "WDR", "RuneWatch"}, - type = PluginType.UTILITY + name = "Ban List", + description = "Displays warning in chat when you join a" + + "clan chat/new member join your clan chat and he is in a WDR/RuneWatch/Manual List", + tags = {"PVM", "WDR", "RuneWatch"}, + type = PluginType.UTILITY, + enabledByDefault = false ) + @Slf4j public class BanListPlugin extends Plugin { @@ -81,7 +83,8 @@ public class BanListPlugin extends Plugin @Inject private ChatMessageManager chatMessageManager; - private ArrayList wdrArrayList = new ArrayList<>(); + private ArrayList wdrScamArrayList = new ArrayList<>(); + private ArrayList wdrToxicArrayList = new ArrayList<>(); private ArrayList runeWatchArrayList = new ArrayList<>(); private ArrayList manualBans = new ArrayList<>(); @@ -101,7 +104,8 @@ public class BanListPlugin extends Plugin @Override protected void shutDown() throws Exception { - wdrArrayList.clear(); + wdrScamArrayList.clear(); + wdrToxicArrayList.clear(); runeWatchArrayList.clear(); manualBans.clear(); } @@ -133,6 +137,7 @@ public class BanListPlugin extends Plugin if (client.getGameState() != GameState.LOGGED_IN || client.getWidget(WidgetInfo.LOGIN_CLICK_TO_PLAY_SCREEN) != null || client.getViewportWidget() == null + || client.getWidget(WidgetInfo.CLAN_CHAT) == null || !config.highlightInClan()) { return; @@ -148,15 +153,25 @@ public class BanListPlugin extends Plugin } - @Subscribe public void onClanMemberJoined(ClanMemberJoined event) { ClanMember member = event.getMember(); - ListType listType = checkBanList(Text.standardize(member.getUsername())); - if (listType != null) + ListType scamList = checkScamList(Text.standardize(member.getUsername())); + ListType toxicList = checkToxicList(Text.standardize(member.getUsername())); + + if (scamList != null) { - sendWarning(Text.standardize(member.getUsername()), listType); + sendWarning(Text.standardize(member.getUsername()), scamList); + if (config.highlightInClan()) + { + highlightRedInCC(); + } + } + + if (toxicList != null) + { + sendWarning(Text.standardize(member.getUsername()), toxicList); if (config.highlightInClan()) { highlightRedInCC(); @@ -178,10 +193,14 @@ public class BanListPlugin extends Plugin { Widget tradingWith = client.getWidget(335, 31); String name = tradingWith.getText().replaceAll("Trading With: ", ""); - if (checkBanList(name) != null) + if (checkScamList(name) != null) { tradingWith.setText(tradingWith.getText().replaceAll(name, "" + name + " (Scammer)" + "")); } + if (checkToxicList(name) != null) + { + tradingWith.setText(tradingWith.getText().replaceAll(name, "" + name + " (Toxic)" + "")); + } }); } } @@ -190,13 +209,13 @@ public class BanListPlugin extends Plugin /** * Compares player name to everything in the ban lists */ - private ListType checkBanList(String nameToBeChecked) + private ListType checkScamList(String nameToBeChecked) { - if (wdrArrayList.size() > 0 && config.enableWDR()) + if (wdrScamArrayList.size() > 0 && config.enableWDR()) { - if (wdrArrayList.stream().anyMatch(nameToBeChecked::equalsIgnoreCase)) + if (wdrScamArrayList.stream().anyMatch(nameToBeChecked::equalsIgnoreCase)) { - return ListType.WEDORAIDS_LIST; + return ListType.WEDORAIDSSCAM_LIST; } } @@ -219,6 +238,20 @@ public class BanListPlugin extends Plugin return null; } + private ListType checkToxicList(String nameToBeChecked) + { + + if (wdrToxicArrayList.size() > 0 && config.enableWDR()) + { + if (wdrToxicArrayList.stream().anyMatch(nameToBeChecked::equalsIgnoreCase)) + { + return ListType.WEDORAIDSTOXIC_LIST; + } + } + + return null; + } + /** * Sends a warning to our player, notifying them that a player is on a ban list */ @@ -226,41 +259,55 @@ public class BanListPlugin extends Plugin { switch (listType) { - case WEDORAIDS_LIST: - final String wdr_message = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append("Warning! " + playerName + " is on WeDoRaids\' scammer list!") - .build(); + case WEDORAIDSSCAM_LIST: + final String wdr__scam_message = new ChatMessageBuilder() + .append(ChatColorType.HIGHLIGHT) + .append("Warning! " + playerName + " is on WeDoRaids\' scammer list!") + .build(); chatMessageManager.queue( - QueuedMessage.builder() - .type(ChatMessageType.CONSOLE) - .runeLiteFormattedMessage(wdr_message) - .build()); + QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(wdr__scam_message) + .build()); break; + + case WEDORAIDSTOXIC_LIST: + final String wdr__toxic_message = new ChatMessageBuilder() + .append(ChatColorType.HIGHLIGHT) + .append("Warning! " + playerName + " is on WeDoRaids\' toxic list!") + .build(); + + chatMessageManager.queue( + QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(wdr__toxic_message) + .build()); + break; + case RUNEWATCH_LIST: final String rw_message = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append("Warning! " + playerName + " is on the Runewatch\'s scammer list!") - .build(); + .append(ChatColorType.HIGHLIGHT) + .append("Warning! " + playerName + " is on the Runewatch\'s scammer list!") + .build(); chatMessageManager.queue( - QueuedMessage.builder() - .type(ChatMessageType.CONSOLE) - .runeLiteFormattedMessage(rw_message) - .build()); + QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(rw_message) + .build()); break; case MANUAL_LIST: final String manual_message = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append("Warning! " + playerName + " is on your manual scammer list!") - .build(); + .append(ChatColorType.HIGHLIGHT) + .append("Warning! " + playerName + " is on your manual scammer list!") + .build(); chatMessageManager.queue( - QueuedMessage.builder() - .type(ChatMessageType.CONSOLE) - .runeLiteFormattedMessage(manual_message) - .build()); + QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(manual_message) + .build()); break; } } @@ -271,8 +318,8 @@ public class BanListPlugin extends Plugin private void fetchFromWebsites() { Request request = new Request.Builder() - .url("https://wdrdev.github.io/index") - .build(); + .url("https://wdrdev.github.io/index") + .build(); RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() { @Override @@ -293,14 +340,14 @@ public class BanListPlugin extends Plugin ArrayList wdrList2 = new ArrayList<>(); wdrList.forEach((name) -> wdrList2.add(Text.standardize(name))); - wdrArrayList.addAll(wdrList2); + wdrScamArrayList.addAll(wdrList2); } }); Request secondRequest = new Request.Builder() - .url("https://runewatch.com/incident-index-page/") - .build(); + .url("https://runewatch.com/incident-index-page/") + .build(); RuneLiteAPI.CLIENT.newCall(secondRequest).enqueue(new Callback() { @Override @@ -326,6 +373,33 @@ public class BanListPlugin extends Plugin } } }); + + Request thirdRequest = new Request.Builder() + .url("https://wdrdev.github.io/toxic") + .build(); + RuneLiteAPI.CLIENT.newCall(thirdRequest).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + log.debug("error retrieving names from wdr"); + } + + @Override + public void onResponse(Call call, Response response) throws IOException + { + String text = response.body().string(); + text = text.substring(text.indexOf("

    ") + 3, text.indexOf("

    ")); + text = text.replace("/", ","); + text = text.replace(", $", ""); + + ArrayList wdrToxicList = new ArrayList<>(Arrays.asList(text.split(","))); + ArrayList wdrToxicList2 = new ArrayList<>(); + wdrToxicList.forEach((name) -> wdrToxicList2.add(Text.standardize(name))); + + wdrToxicArrayList.addAll(wdrToxicList2); + } + }); } /** @@ -338,13 +412,18 @@ public class BanListPlugin extends Plugin Widget widget = client.getWidget(WidgetInfo.CLAN_CHAT_LIST); for (Widget widgetChild : widget.getDynamicChildren()) { - ListType listType = checkBanList(widgetChild.getText()); + ListType scamList = checkScamList(widgetChild.getText()); + ListType toxicList = checkToxicList(widgetChild.getText()); - if (listType != null) + if (scamList != null) { widgetChild.setText("" + widgetChild.getText() + ""); } + else if (toxicList != null) + { + widgetChild.setText("" + widgetChild.getText() + ""); + } } }); } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/ListType.java b/runelite-client/src/main/java/net/runelite/client/plugins/banlist/ListType.java similarity index 70% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/ListType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/banlist/ListType.java index ed0f786d19..5349662734 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/banlist/ListType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banlist/ListType.java @@ -2,7 +2,8 @@ package net.runelite.client.plugins.banlist; public enum ListType { - WEDORAIDS_LIST, + WEDORAIDSSCAM_LIST, + WEDORAIDSTOXIC_LIST, RUNEWATCH_LIST, MANUAL_LIST } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveSceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveSceneOverlay.java new file mode 100644 index 0000000000..ecfb8251ce --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveSceneOverlay.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import com.google.common.collect.ImmutableMap; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayUtil; + +import javax.inject.Inject; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Stroke; +import java.awt.BasicStroke; +import java.util.Map; + + +class AboveSceneOverlay extends Overlay +{ + private static final int HEALTH_BAR_HEIGHT = 20; + private static final int HEALTH_BAR_WIDTH = 115; + private static final int CENTER_OFFSET = Perspective.LOCAL_HALF_TILE_SIZE / 8; + private static final int EGG_DIAMETER = Perspective.LOCAL_HALF_TILE_SIZE / 4; + private static final Color HEALTH_BAR_COLOR = new Color(225, 35, 0, 125); + private static final ImmutableMap TEAMMATES = ImmutableMap.of( + WidgetInfo.BA_HEAL_TEAMMATE1, new Point(28, 2), + WidgetInfo.BA_HEAL_TEAMMATE2, new Point(26, 2), + WidgetInfo.BA_HEAL_TEAMMATE3, new Point(26, 2), + WidgetInfo.BA_HEAL_TEAMMATE4, new Point(25, 2)); + + private final Client client; + private final BarbarianAssaultPlugin game; + private final BarbarianAssaultConfig config; + + + @Inject + private AboveSceneOverlay(Client client, BarbarianAssaultPlugin game, BarbarianAssaultConfig config) + { + super(game); + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_SCENE); + this.client = client; + this.game = game; + this.config = config; + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!game.isInGame() || game.getRole() == null || game.isUsingGloryHorn()) + { + return null; + } + + switch (game.getRole()) + { + + case HEALER: + if (config.showTeammateHealthbars()) + { + renderHealthBars(graphics); + } + if (config.healerCodes()) + { + renderHealerCodes(graphics); + } + break; + + + case COLLECTOR: + if (config.highlightCollectorEggs()) + { + renderEggs(graphics); + } + break; + } + return null; + } + + //TODO add poison color change or low health color change + private void renderHealthBars(Graphics2D graphics) + { + for (Map.Entry teammate : TEAMMATES.entrySet()) + { + Widget widget = client.getWidget(teammate.getKey()); + if (widget == null) + { + continue; + } + + // This will give us two elements, the first will be current health, and the second will be max health + String[] teammateHealth = widget.getText().split(" / "); + + graphics.setColor(HEALTH_BAR_COLOR); + graphics.fillRect((widget.getCanvasLocation().getX() - teammate.getValue().getX()), + (widget.getCanvasLocation().getY() - teammate.getValue().getY()), + getBarWidth(Integer.parseInt(teammateHealth[1]), Integer.parseInt(teammateHealth[0])), + HEALTH_BAR_HEIGHT); + } + } + + private int getBarWidth(int base, int current) + { + final double ratio = (double) current / base; + + if (ratio >= 1) + { + return HEALTH_BAR_WIDTH; + } + + return (int) Math.round(ratio * HEALTH_BAR_WIDTH); + } + + private void renderHealerCodes(Graphics2D graphics) + { + for (Healer healer : game.getHealers().values()) + { + Color color = Color.GREEN; + int timeLeft = 0; + + if (game.getWave() != null) + { + timeLeft = healer.getLastFoodTime() - (int) game.getWave().getWaveTimer().getElapsedTime(); + } + + timeLeft = timeLeft < 1 ? 0 : timeLeft; + + if (timeLeft > 0) + { + color = Color.RED; + } + + String text = String.format("%d %d", healer.getFoodRemaining(), timeLeft); + + OverlayUtil.renderActorOverlay(graphics, healer.getNpc(), text, color); + } + } + + private void renderEggs(Graphics2D graphics) + { + final Color color = graphics.getColor(); + final Stroke originalStroke = graphics.getStroke(); + String listen = game.getLastListenText(); + if (listen != null && !listen.equals("- - -")) + { + graphics.setStroke(new BasicStroke(2)); + //TODO Render quantity text as well + //TODO add config options for overlay colors + switch (listen) + { + case "Red eggs": + graphics.setColor(new Color(Color.RED.getRed(), Color.RED.getGreen(), Color.RED.getBlue(), 150)); + game.getRedEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + break; + case "Green eggs": + graphics.setColor(new Color(Color.GREEN.getRed(), Color.GREEN.getGreen(), Color.GREEN.getBlue(), 150)); + game.getGreenEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + break; + case "Blue eggs": + graphics.setColor(new Color(Color.BLUE.getRed(), Color.BLUE.getGreen(), Color.BLUE.getBlue(), 150)); + game.getBlueEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + break; + } + } + graphics.setColor(new Color(Color.YELLOW.getRed(), Color.YELLOW.getGreen(), Color.YELLOW.getBlue(), 150)); + game.getYellowEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + graphics.setColor(color); + graphics.setStroke(originalStroke); + } + + private void drawCircle(Graphics2D graphics, LocalPoint point) + { + if (point == null) + { + return; + } + + Point canvasPoint = Perspective.localToCanvas(client, point, 0); + if (canvasPoint == null) + { + return; + } + + //TODO rendering a model would be better / more accurate + graphics.fillOval(canvasPoint.getX() - CENTER_OFFSET, canvasPoint.getY() - CENTER_OFFSET, EGG_DIAMETER, EGG_DIAMETER); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveWidgetsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveWidgetsOverlay.java new file mode 100644 index 0000000000..6c140ef4b3 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveWidgetsOverlay.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import javax.inject.Inject; + +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.util.ImageUtil; + + +class AboveWidgetsOverlay extends Overlay +{ + private static final int OFFSET_X_TEXT_QUANTITY = 0; + private static final int OFFSET_Y_TEXT_QUANTITY = 10; + + private final Client client; + private final BarbarianAssaultPlugin game; + private final BarbarianAssaultConfig config; + + + @Inject + private AboveWidgetsOverlay(Client client, BarbarianAssaultPlugin game, BarbarianAssaultConfig config) + { + super(game); + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + this.client = client; + this.game = game; + this.config = config; + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!game.isInGame() || game.getRole() == null || game.isUsingGloryHorn()) + { + return null; + } + + Role role = game.getRole(); + + if (config.showTimer()) + { + renderTimer(graphics, role); + } + + switch (role) + { + case ATTACKER: + if (config.highlightArrows()) + { + renderInventoryHighlights(graphics, game.getRole().getListenItem(game.getLastListenText()), config.highlightArrowColor()); + } + break; + + case DEFENDER: + if (config.highlightBait()) + { + renderInventoryHighlights(graphics, game.getRole().getListenItem(game.getLastListenText()), config.highlightBaitColor()); + } + break; + + case HEALER: + if (config.highlightPoison()) + { + renderInventoryHighlights(graphics, game.getRole().getListenItem(game.getLastListenText()), config.highlightPoisonColor()); + } + } + return null; + } + + private void renderTimer(Graphics2D graphics, Role role) + { + Widget roleText = client.getWidget(role.getRoleText()); + Widget roleSprite = client.getWidget(role.getRoleSprite()); + + if (roleText == null || roleSprite == null) + { + return; + } + + if (role == Role.COLLECTOR && config.showEggCountOverlay() && game.getWave() != null) + { + roleText.setText("(" + game.getWave().getCollectedEggCount() + ") " + formatClock()); + } + else if (role == Role.HEALER && config.showHpCountOverlay() && game.getWave() != null) + { + roleText.setText("(" + game.getWave().getHpHealed() + ") " + formatClock()); + } + else + { + roleText.setText(formatClock()); + } + + Rectangle spriteBounds = roleSprite.getBounds(); + graphics.drawImage(game.getClockImage(), spriteBounds.x, spriteBounds.y, null); + roleSprite.setHidden(true); + } + + private void renderInventoryHighlights(Graphics2D graphics, int itemID, Color color) + { + Widget inventory = client.getWidget(WidgetInfo.INVENTORY); + + if (inventory == null || inventory.isHidden() || itemID == -1) + { + return; + } + + Color highlight = new Color(color.getRed(), color.getGreen(), color.getBlue(), 150); + BufferedImage image = ImageUtil.fillImage(client.createItemSprite(itemID, 300, 2, 0, 0, true, 710).toBufferedImage(), highlight); + for (WidgetItem item : inventory.getWidgetItems()) + { + if (item.getId() == itemID) + { + OverlayUtil.renderImageLocation(graphics, item.getCanvasLocation(), image); + //The item's text quantity is rendered after the sprite's image is rendered so that the text appears on top + if (item.getQuantity() > 1) + { + OverlayUtil.renderTextLocation(graphics, + new Point(item.getCanvasLocation().getX() + OFFSET_X_TEXT_QUANTITY, item.getCanvasLocation().getY() + OFFSET_Y_TEXT_QUANTITY), + String.valueOf(item.getQuantity()), Color.YELLOW); + } + } + } + } + + private String formatClock() + { + if (game.getCallTimer() == null) + { + return "- - -"; + } + else + { + long timeLeft = game.getTimeToChange(); + if (timeLeft < 0) + { + return "00:00"; + } + else + { + return String.format("00:%02d", timeLeft); + } + } + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java new file mode 100644 index 0000000000..9c439eb966 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java @@ -0,0 +1,470 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import java.awt.Color; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Range; + +@ConfigGroup("barbarianAssault") +public interface BarbarianAssaultConfig extends Config +{ + @ConfigItem( + keyName = "swapLadder", + name = "Swap quick-start", + description = "Enables swapping of 'Climb-down' and 'Quick-start' in the wave lobby", + position = 0 + ) + default boolean swapLadder() + { + return true; + } + @ConfigItem( + keyName = "showTimer", + name = "Show call change timer", + description = "Shows time to next call change", + position = 1 + ) + default boolean showTimer() + { + return true; + } + + @ConfigItem( + keyName = "removeIncorrectCalls", + name = "Remove incorrect calls", + description = "Removes incorrect 'Tell' menu options from horn", + position = 2 + ) + default boolean removeIncorrectCalls() + { + return true; + } + + @ConfigItem( + keyName = "removeUnusedMenus", + name = "Remove unused menus", + description = "Removes unnecessary menu options" + + "
    Example: Attack options are removed when not attacker", + position = 3 + ) + default boolean removeUnusedMenus() + { + return true; + } + + @ConfigItem( + keyName = "prayerMetronome", + name = "Enable prayer metronome", + description = "Turns on a metronome sync'd to the game's tick rate when any prayer is active", + position = 4 + ) + default boolean prayerMetronome() + { + return false; + } + + @Range( + min = 1, + max = 50 + ) + @ConfigItem( + keyName = "prayerMetronomeVolume", + name = "Metronome volume", + description = "Adjusts the metronome's volume", + position = 5, + hidden = true, + unhide = "prayerMetronome" + ) + default int prayerMetronomeVolume() + { + return 10; + } + + @ConfigItem( + keyName = "showDeathTimes", + name = "Show death times", + description = "Shows the time all penance monsters of a certain type are killed in the chat box, an info box, or both", + position = 6 + ) + default boolean showDeathTimes() + { + return true; + } + + @ConfigItem( + keyName = "showDeathTimesMode", + name = "Mode", + description = "", + position = 7, + hidden = true, + unhide = "showDeathTimes" + ) + default DeathTimesMode showDeathTimesMode() + { + return DeathTimesMode.BOTH; + } + + @ConfigItem( + keyName = "waveTimes", + name = "Show wave and game duration", + description = "Displays wave duration after each wave and total game time after wave 10", + position = 8 + ) + default boolean waveTimes() + { + return true; + } + + @ConfigItem( + keyName = "showTotalRewards", + name = "Summarize total reward points", + description = "Gives summary of advanced points breakdown in chat log", + position = 9 + ) + default boolean showTotalRewards() + { + return true; + } + + + /*///************///*/ + /*/// Attacker ///*/ + /*///************///*/ + + @ConfigItem( + keyName = "highlightArrows", + name = "Highlight called arrows", + description = "Highlights arrows called by your teammate", + position = 0, + group = "Attacker" + ) + default boolean highlightArrows() + { + return true; + } + + @ConfigItem( + keyName = "highlightArrowColor", + name = "Arrow color", + description = "Configures the color to highlight the called arrows", + position = 1, + group = "Attacker", + hidden = true, + unhide = "highlightArrows" + ) + default Color highlightArrowColor() + { + return Color.GREEN; + } + + @ConfigItem( + keyName = "removeIncorrectAttackStyles", + name = "Remove incorrect attack styles", + description = "Hides wrong attack styles for dragon claws and crystal halberd", + position = 2, + group = "Attacker" + ) + default boolean removeIncorrectAttackStyles() + { + return false; + } + + @ConfigItem( + keyName = "tagging", + name = "Enable tagging", + description = "Highlights the menu entry of an attacker/ranger that has not been tagged.", + position = 3, + group = "Attacker" + ) + default boolean tagging() + { + return false; + } + + + /*///************///*/ + /*/// Defender ///*/ + /*///************///*/ + + @ConfigItem( + keyName = "highlightBait", + name = "Highlight called bait", + description = "Highlights bait called by your teammate", + position = 0, + group = "Defender" + ) + default boolean highlightBait() + { + return true; + } + + @ConfigItem( + keyName = "highlightBaitColor", + name = "Bait color", + description = "Configures the color to highlight the called bait", + position = 1, + group = "Defender", + hidden = true, + unhide = "highlightBait" + ) + default Color highlightBaitColor() + { + return Color.GREEN; + } + + @ConfigItem( + keyName = "showDefTimer", + name = "Show defender tick timer", + description = "Shows the current cycle tick of runners", + position = 2, + group = "Defender" + ) + default boolean showDefTimer() + { + return true; + } + + @ConfigItem( + keyName = "deprioritizeBait", + name = "Deprioritize bait", + description = "Moves 'Take' menu option for all bait below 'Walk Here'", + position = 3, + group = "Defender" + ) + default boolean deprioritizeBait() + { + return true; + } + + @ConfigItem( + keyName = "removePenanceCave", + name = "Remove penance cave", + description = "Removes 'Block' menu option from penance cave", + position = 4, + group = "Defender" + ) + default boolean removePenanceCave() + { + return true; + } + + + /*///**********///*/ + /*/// Healer ///*/ + /*///**********///*/ + + @ConfigItem( + keyName = "highlightPoison", + name = "Highlight called poison", + description = "Highlights poison called by your teammate", + position = 0, + group = "Healer" + ) + default boolean highlightPoison() + { + return true; + } + + @ConfigItem( + keyName = "highlightPoisonColor", + name = "Poison color", + description = "Configures the color to highlight the called poison", + position = 1, + group = "Healer", + hidden = true, + unhide = "highlightPoison" + ) + default Color highlightPoisonColor() + { + return Color.GREEN; + } + + @ConfigItem( + keyName = "highlightNotification", + name = "Highlight incorrect notification", + description = "Highlights incorrect poison chat notification", + position = 2, + group = "Healer" + ) + default boolean highlightNotification() + { + return true; + } + + @ConfigItem( + keyName = "highlightNotificationColor", + name = "Notification color", + description = "Configures the color to highlight the notification text", + position = 3, + group = "Healer", + hidden = true, + unhide = "highlightNotification" + ) + default Color highlightNotificationColor() + { + return Color.RED; + } + + @ConfigItem( + keyName = "showHpCountOverlay", + name = "Show number of hitpoints healed", + description = "Displays current number of hitpoints healed", + position = 4, + group = "Healer" + ) + default boolean showHpCountOverlay() + { + return true; + } + + @ConfigItem( + keyName = "showTeammateHealthbars", + name = "Show health bars", + description = "Displays a health bar where a teammate's remaining health is located", + position = 5, + group = "Healer" + ) + default boolean showTeammateHealthbars() + { + return true; + } + + @ConfigItem( + keyName = "healerCodes", + name = "Show healer codes", + description = "Overlay to show healer codes", + position = 6, + group = "Healer" + ) + default boolean healerCodes() + { + return false; + } + + @ConfigItem( + keyName = "healerMenuOption", + name = "Show healer menu options", + description = "Shows tick count in healer menu options", + position = 7, + group = "Healer" + ) + default boolean healerMenuOption() + { + return false; + } + + @ConfigItem( + keyName = "shiftOverstock", + name = "Enable shift overstock", + description = "Enables overstocking by pressing shift", + position = 8, + group = "Healer" + ) + default boolean shiftOverstock() + { + return true; + } + + @ConfigItem( + keyName = "controlHealer", + name = "Control Healer", + description = "Hold ctrl to put last healer clicked on top", + position = 9, + group = "Healer" + ) + default boolean controlHealer() + { + return true; + } + + + /*///*************///*/ + /*/// Collector ///*/ + /*///*************///*/ + + @ConfigItem( + keyName = "swapCollectorBag", + name = "Swap empty", + description = "Enables swapping of 'Look-in' and 'Empty' on the collector's bag", + position = 0, + group = "Collector" + ) + default boolean swapCollectorBag() + { + return true; + } + + @ConfigItem( + keyName = "swapDestroyEggs", + name = "Swap destroy", + description = "Enables swapping of 'Use' and 'Destroy' on collector eggs; this does not affect yellow/omega eggs", + position = 1, + group = "Collector" + ) + default boolean swapDestroyEggs() + { + return true; + } + + @ConfigItem( + keyName = "highlightCollectorEggs", + name = "Highlight collector eggs", + description = "Highlight called egg colors", + position = 2, + group = "Collector" + ) + default boolean highlightCollectorEggs() + { + return true; + } + + @ConfigItem( + keyName = "deprioritizeIncorrectEggs", + name = "Deprioritize incorrect eggs", + description = "Moves 'Take' menu option for incorrect eggs below 'Walk Here'", + position = 3, + group = "Collector" + ) + default boolean deprioritizeIncorrectEggs() + { + return true; + } + + @ConfigItem( + keyName = "showEggCountOverlay", + name = "Show number of eggs collected", + description = "Displays current number of eggs collected", + position = 4, + group = "Collector" + ) + default boolean showEggCountOverlay() + { + return true; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultMenu.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultMenu.java new file mode 100644 index 0000000000..8f852846e4 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultMenu.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import com.google.common.collect.Sets; +import lombok.Getter; +import lombok.Setter; +import net.runelite.client.menus.ComparableEntry; +import net.runelite.client.menus.MenuManager; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; + +class BarbarianAssaultMenu +{ + private final MenuManager menuManager; + private final BarbarianAssaultPlugin game; + private final BarbarianAssaultConfig config; + private final ArrayList tracker = new ArrayList<>(); + @Getter @Setter + private boolean hornUpdated = false; + @Getter @Setter + private boolean rebuildForced = false; + + @Inject + BarbarianAssaultMenu(MenuManager menuManager, BarbarianAssaultPlugin game, BarbarianAssaultConfig config) + { + this.menuManager = menuManager; + this.game = game; + this.config = config; + } + + private boolean isHornOptionHidden(String option) + { + if (game.isInGame() && game.getRole() != null && game.getRole().getTell(game.getLastCallText()).toLowerCase().equals(option)) + { + // This will force the menu to be rebuilt after the correct tell is found + // medic will be added to the menu if it wasn't there before + if (!hornUpdated) + { + rebuildForced = true; + } + hornUpdated = true; + return false; + } + return true; + } + + void clearHiddenMenus() + { + // Clears menus from MenuManager and tracker + for (Iterator iterator = tracker.iterator(); iterator.hasNext();) + { + menuManager.removeHiddenEntry(iterator.next()); + iterator.remove(); + } + } + + //TODO add omega egg use on? + void validateHiddenMenus(Role role) + { + clearHiddenMenus(); + + HashSet hiddenMenus = Sets.newHashSet(Menus.getMenus()); + HashSet conditionalMenus = Sets.newHashSet(Menus.getMenus()); + + // Any option left in this set will not be hidden + // Checking each option for the correct role prevents MenuManager from + // iterating over off role menu entry options that are not possible + conditionalMenus.removeIf(entry -> + { + switch (entry) + { + // Attacker role options + case TELL_BLUE_ATTACKER_HORN: + case TELL_GREEN_ATTACKER_HORN: + case TELL_RED_ATTACKER_HORN: + return ((role == Role.ATTACKER && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case ATTACK_PENANCE_FIGHTER: + case ATTACK_PENANCE_RANGER: + case GET_SPIKES_PETRIFIED_MUSHROOM: + case TAKE_ATTACKER_ITEM_MACHINE: + return (role != Role.ATTACKER && role != null) && config.removeUnusedMenus(); + + + // Defender role Options + case TELL_MEAT_DEFENDER_HORN: + case TELL_TOFU_DEFENDER_HORN: + case TELL_WORMS_DEFENDER_HORN: + return ((role == Role.DEFENDER && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case BLOCK_PENANCE_CAVE: + return ((role != Role.DEFENDER && role != null) && config.removeUnusedMenus()) + || (role == Role.DEFENDER && config.removePenanceCave()); + + case DUNK_LAVA_CRATER: + case FIX: + case STOCK_UP_DEFENDER_ITEM_MACHINE: + case TAKE_DEFENDER_ITEM_MACHINE: + case TAKE_HAMMER: + case TAKE_LOGS: + return (role != Role.DEFENDER && role != null) && config.removeUnusedMenus(); + + + // Collector role options + case TELL_ACCURATE_COLLECTOR_HORN: + case TELL_AGGRESSIVE_COLLECTOR_HORN: + case TELL_CONTROLLED_COLLECTOR_HORN: + case TELL_DEFENSIVE_COLLECTOR_HORN: + return ((role == Role.COLLECTOR && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case CONVERT_COLLECTOR_CONVERTER: + case LOAD_EGG_HOPPER: + case TAKE_BLUE_EGG: + case TAKE_GREEN_EGG: + case TAKE_RED_EGG: + case TAKE_YELLOW_EGG: + return (role != Role.COLLECTOR && role != null) && config.removeUnusedMenus(); + + + // Healer role options + case TELL_CRACKERS_HEALER_HORN: + case TELL_TOFU_HEALER_HORN: + case TELL_WORMS_HEALER_HORN: + return ((role == Role.HEALER && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case DUNK_POISON_CRATER: + case STOCK_UP_HEALER_ITEM_MACHINE: + case TAKE_HEALER_ITEM_MACHINE: + case TAKE_FROM_HEALER_SPRING: + case DRINK_FROM_HEALER_SPRING: + return (role != Role.HEALER && role != null) && config.removeUnusedMenus(); + + case USE_VIAL_GROUND: + case USE_VIAL_ITEM: + case USE_VIAL_NPC: + case USE_VIAL_WIDGET: + return role == Role.HEALER && config.removeUnusedMenus(); + + + // Any role options + case DROP_HORN: + case EXAMINE_HORN: + case USE_HORN: + return config.removeIncorrectCalls(); + + case MEDIC_HORN: + return config.removeIncorrectCalls() && !hornUpdated; + + default: + return config.removeUnusedMenus(); + } + }); + + hiddenMenus.removeAll(conditionalMenus); + + for (Menus entry : hiddenMenus) + { + menuManager.addHiddenEntry(entry.getEntry()); + tracker.add(entry.getEntry()); + } + } + + void enableSwaps() + { + if (config.swapLadder()) + { + menuManager.addSwap("climb-down", "ladder", "quick-start", "ladder"); + } + if (config.swapCollectorBag()) + { + menuManager.addSwap("look-in", "collection bag", "empty", "collection bag"); + } + if (config.swapDestroyEggs()) + { + menuManager.addSwap("use", "blue egg", "destroy", "blue egg"); + menuManager.addSwap("use", "green egg", "destroy", "green egg"); + menuManager.addSwap("use", "red egg", "destroy", "red egg"); + } + } + + void disableSwaps(boolean force) + { + if (!config.swapLadder() || force) + { + menuManager.removeSwap("climb-down", "ladder", "quick-start", "ladder"); + } + + if (!config.swapCollectorBag() || force) + { + menuManager.removeSwap("look-in", "collection bag", "empty", "collection bag"); + } + + if (!config.swapDestroyEggs() || force) + { + menuManager.removeSwap("use", "blue egg", "destroy", "blue egg"); + menuManager.removeSwap("use", "green egg", "destroy", "green egg"); + menuManager.removeSwap("use", "red egg", "destroy", "red egg"); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java new file mode 100644 index 0000000000..be97a5755c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java @@ -0,0 +1,1547 @@ +/* + * Copyright (c) 2018, Cameron + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import com.google.common.collect.ImmutableList; +import com.google.inject.Provides; + +import java.awt.Font; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import javax.inject.Inject; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import net.runelite.api.MenuEntry; +import net.runelite.api.MessageNode; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Prayer; +import net.runelite.api.Projectile; +import net.runelite.api.SoundEffectID; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.BeforeRender; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.ItemDespawned; +import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.ProjectileSpawned; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.chat.ChatColorType; +import net.runelite.client.chat.ChatMessageBuilder; +import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.chat.QueuedMessage; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.ItemManager; +import net.runelite.client.input.KeyListener; +import net.runelite.client.input.KeyManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.plugins.attackstyles.AttackStyle; +import net.runelite.client.plugins.attackstyles.WeaponType; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.infobox.InfoBox; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.ColorUtil; +import net.runelite.client.util.ImageUtil; +import net.runelite.client.util.Text; +import org.apache.commons.lang3.StringUtils; + + +@Slf4j +@PluginDescriptor( + name = "Barbarian Assault", + description = "Custom barbarian assault plugin, use along with BA Tools", + tags = {"minigame", "overlay", "timer"}, + type = PluginType.PVM // don't remove this, added this because our barbarian assault plugin is big time modified +) +public class BarbarianAssaultPlugin extends Plugin implements KeyListener +{ + private static final String ENDGAME_REWARD_NEEDLE_TEXT = "
    5"; + + private static final int COLOR_CALL_UPDATED = 16316664; + + private static final int COLOR_CALL_CALLED = 16291864; + + private static final int BA_WAVE_NUM_INDEX = 2; + + private static final ImmutableList attackStyles = ImmutableList.of(WidgetInfo.COMBAT_STYLE_ONE, + WidgetInfo.COMBAT_STYLE_TWO, WidgetInfo.COMBAT_STYLE_THREE, WidgetInfo.COMBAT_STYLE_FOUR); + + @Inject + private Client client; + + @Inject + private ClientThread clientThread; + + @Inject + private ChatMessageManager chatMessageManager; + + @Inject + private OverlayManager overlayManager; + + @Inject + private BarbarianAssaultConfig config; + + @Inject + private AboveWidgetsOverlay widgetsOverlay; + + @Inject + private AboveSceneOverlay sceneOverlay; + + @Inject + private BarbarianAssaultMenu menu; + + @Inject + private ItemManager itemManager; + + @Inject + private InfoBoxManager infoBoxManager; + + @Inject + private KeyManager keyManager; + + @Getter + private boolean inGame = false; + + @Getter + private Wave wave = null; + + @Getter + private Role role = null; + + @Getter + private Scorecard scorecard = null; + + @Getter + private Timer gameTimer = null; + + @Getter + private Timer callTimer = null; + + @Getter + private int stage = -1; + + @Getter + private BufferedImage clockImage; + + @Getter + private Font font = null; + + @Getter + private final HashMap redEggs = new HashMap<>(); + + @Getter + private final HashMap greenEggs = new HashMap<>(); + + @Getter + private final HashMap blueEggs = new HashMap<>(); + + @Getter + private final HashMap yellowEggs = new HashMap<>(); + + @Getter + private final Map healers = new HashMap<>(); + + @Getter + private String lastCallText = null; + + @Getter + private String lastListenText = null; + + private String lastClickedTell = null; + + private int lastCallColor = -1; + + private int lastInteracted = -1; + + private int lastHealerPoisoned = -1; + + private int tickNum = 0; + + private int gameTick = -1; + + private int inGameBit = 0; + + private boolean syncd = true; + + private boolean tickReset = false; + + private boolean hornCalled = false; + + private boolean hornListened = false; + + @Getter + private boolean usingGloryHorn = false; + + private boolean shiftDown = false; + + private boolean controlDown = false; + + private BufferedImage torsoImage, fighterImage, healerImage, rangerImage, runnerImage; + + private ArrayList deathTimes = new ArrayList<>(); + + private HashMap projectiles = new HashMap<>(); + + private TimerBox tickCounter; + + private String poisonUsed = null; + + + @Provides + BarbarianAssaultConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(BarbarianAssaultConfig.class); + } + + @Override + protected void startUp() throws Exception + { + font = FontManager.getRunescapeFont().deriveFont(Font.BOLD, 24); + torsoImage = itemManager.getImage(ItemID.FIGHTER_TORSO); + clockImage = ImageUtil.getResourceStreamFromClass(getClass(), "clock.png"); + fighterImage = ImageUtil.getResourceStreamFromClass(getClass(), "fighter.png"); + healerImage = ImageUtil.getResourceStreamFromClass(getClass(), "healer.png"); + rangerImage = ImageUtil.getResourceStreamFromClass(getClass(), "ranger.png"); + runnerImage = ImageUtil.getResourceStreamFromClass(getClass(), "runner.png"); + overlayManager.add(widgetsOverlay); + overlayManager.add(sceneOverlay); + keyManager.registerKeyListener(this); + clientThread.invoke(this::validateGame); + } + + @Override + protected void shutDown() throws Exception + { + overlayManager.remove(widgetsOverlay); + overlayManager.remove(sceneOverlay); + keyManager.unregisterKeyListener(this); + showRoleSprite(); + font = null; + torsoImage = null; + clockImage = null; + fighterImage = null; + healerImage = null; + rangerImage = null; + runnerImage = null; + shiftDown = false; + controlDown = false; + resetWave(); + wave = null; + gameTick = client.getTickCount(); + menu.disableSwaps(true); + menu.clearHiddenMenus(); + } + + @Override + public void keyTyped(KeyEvent e) + { + } + + @Override + public void keyPressed(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_SHIFT) + { + shiftDown = true; + } + + if (e.getKeyCode() == KeyEvent.VK_CONTROL) + { + controlDown = true; + } + } + + @Override + public void keyReleased(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_SHIFT) + { + shiftDown = false; + } + + if (e.getKeyCode() == KeyEvent.VK_CONTROL) + { + controlDown = false; + } + } + + @Subscribe + public void onConfigChanged(ConfigChanged configChanged) + { + //not client thread be careful + if (!configChanged.getGroup().equals("barbarianAssault")) + { + return; + } + + switch (configChanged.getKey()) + { + case "showTimer": + if (!config.showTimer()) + { + showRoleSprite(); + } + break; + + case "swapLadder": + case "swapCollectorBag": + case "swapDestroyEggs": + if (Boolean.valueOf(configChanged.getNewValue())) + { + menu.enableSwaps(); + } + else + { + menu.disableSwaps(false); + } + break; + + case "showDefTimer": + if (config.showDefTimer() && getRole() == Role.DEFENDER) + { + addTickTimer(); + } + else + { + removeTickTimer(); + } + break; + + case "showDeathTimes": + case "showDeathTimesMode": + if (config.showDeathTimes() + && (config.showDeathTimesMode() == DeathTimesMode.INFO_BOX + || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + addAllDeathTimes(); + } + else + { + removeAllDeathTimes(false); + } + break; + + case "removePenanceCave": + case "removeUnusedMenus": + case "removeWrongPoison": + clientThread.invoke(() -> menu.validateHiddenMenus(getRole())); + break; + + case "removeIncorrectAttackStyles": + if (!config.removeIncorrectAttackStyles()) + { + clientThread.invoke(this::showAllStyles); + } + break; + } + } + + @Subscribe + public void onWidgetLoaded(WidgetLoaded event) + { + switch (event.getGroupId()) + { + case WidgetID.BA_REWARD_GROUP_ID: + announceWaveTime(); + + Widget rewardWidget = client.getWidget(WidgetInfo.BA_REWARD_TEXT); + if (rewardWidget == null) + { + break; + } + + Widget pointsWidget = client.getWidget(WidgetInfo.BA_REWARD_TEXT); + if (!rewardWidget.getText().contains(ENDGAME_REWARD_NEEDLE_TEXT)) + { + if (config.showTotalRewards() && pointsWidget != null) + { + // The wave will be null if the plugin is disabled mid game, but + // the wave points will still be accurate if it is re-enabled + if (wave == null) + { + wave = new Wave(client); + } + + wave.setAmounts(); + wave.setPoints(); + + announce(wave.getSummary()); + + // The scorecard will be null if the client is restart mid game + if (scorecard != null) + { + scorecard.addWave(wave); + } + } + } + else + { + announceGameTime(); + + if (config.showTotalRewards() && scorecard != null && scorecard.getNumberOfWaves() == 9) + { + announce(scorecard.getGameSummary()); + } + } + break; + + case WidgetID.BA_ATTACKER_GROUP_ID: + startWave(Role.ATTACKER); + menu.validateHiddenMenus(Role.ATTACKER); + break; + + case WidgetID.BA_DEFENDER_GROUP_ID: + startWave(Role.DEFENDER); + menu.validateHiddenMenus(Role.DEFENDER); + break; + + case WidgetID.BA_HEALER_GROUP_ID: + startWave(Role.HEALER); + menu.validateHiddenMenus(Role.HEALER); + break; + + case WidgetID.BA_COLLECTOR_GROUP_ID: + startWave(Role.COLLECTOR); + menu.validateHiddenMenus(Role.COLLECTOR); + break; + } + } + + @Subscribe + public void onChatMessage(ChatMessage chatMessage) + { + if (!chatMessage.getType().equals(ChatMessageType.GAMEMESSAGE)) + { + return; + } + + final String message = chatMessage.getMessage(); + if (message.startsWith("---- Wave:")) + { + stage = Integer.parseInt(message.split(" ")[BA_WAVE_NUM_INDEX]); + if (stage == 1) + { + scorecard = new Scorecard(this); + gameTimer = new Timer(); + } + } + else if (isInGame()) + { + if (message.contains("exploded") && wave != null) + { + wave.setWrongEggs(wave.getWrongEggs() + 1); + wave.setPositiveEggCount(wave.getPositiveEggCount() - 1); + } + else if (message.contains("You healed") && wave != null) + { + String[] tokens = message.split(" "); + if (Integer.parseInt(tokens[2]) > 0) + { + int health = Integer.parseInt(tokens[2]); + wave.setHpHealed(wave.getHpHealed() + health); + } + } + else if (message.contains("the wrong type of poisoned food to use") && config.highlightNotification()) + { + final MessageNode messageNode = chatMessage.getMessageNode(); + final String nodeValue = Text.removeTags(messageNode.getValue()); + messageNode.setValue(ColorUtil.wrapWithColorTag(nodeValue, config.highlightNotificationColor())); + chatMessageManager.update(messageNode); + } + else if (message.startsWith("All of the Penance")) + { + String[] tokens = message.split(" "); + + int time = wave == null ? -1 : (int)wave.getWaveTimer().getElapsedTime(); + + switch (tokens[4]) + { + case "Fighters": + addDeathTimes(new TimerBox(fighterImage, this, time)); + break; + + case "Healers": + addDeathTimes(new TimerBox(healerImage, this, time)); + break; + + case "Rangers": + addDeathTimes(new TimerBox(rangerImage, this, time)); + break; + + case "Runners": + addDeathTimes(new TimerBox(runnerImage, this, time)); + break; + } + + if (config.showDeathTimes() && wave != null + && (config.showDeathTimesMode() == DeathTimesMode.CHAT_BOX + || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + final MessageNode node = chatMessage.getMessageNode(); + final String nodeValue = Text.removeTags(node.getValue()); + node.setValue(nodeValue + " (" + wave.getWaveTimer().getElapsedTime() + "s)"); + chatMessageManager.update(node); + } + } + } + } + + @Subscribe + public void onItemSpawned(ItemSpawned itemSpawned) + { + if (!isInGame()) + { + return; + } + + HashMap eggMap = getEggMap(itemSpawned.getItem().getId()); + if (eggMap != null) + { + WorldPoint worldPoint = itemSpawned.getTile().getWorldLocation(); + Integer existingQuantity = eggMap.putIfAbsent(worldPoint, 1); + if (existingQuantity != null) + { + eggMap.put(worldPoint, existingQuantity + 1); + } + } + } + + @Subscribe + public void onItemDespawned(ItemDespawned itemDespawned) + { + if (!isInGame()) + { + return; + } + + int itemId = itemDespawned.getItem().getId(); + + if (!isItemEgg(itemId)) + { + return; + } + + // If an egg despawns due to time and the collector is standing over it, + // a point will added as if the player picked it up + HashMap eggMap = getEggMap(itemId); + if (eggMap != null) + { + WorldPoint worldPoint = itemDespawned.getTile().getWorldLocation(); + if (eggMap.containsKey(worldPoint)) + { + int quantity = eggMap.get(worldPoint); + + if (quantity > 1) + { + eggMap.put(worldPoint, quantity - 1); + } + else + { + eggMap.remove(worldPoint); + } + } + } + + if (getRole() == Role.COLLECTOR + && wave != null + && itemDespawned.getTile().getWorldLocation().equals(client.getLocalPlayer().getWorldLocation())) + { + wave.setPositiveEggCount(wave.getPositiveEggCount() + 1); + + if (wave.getPositiveEggCount() > 60) + { + wave.setPositiveEggCount(60); + } + + wave.setCollectedEggCount(wave.getPositiveEggCount() - wave.getWrongEggs()); + } + } + + @Subscribe + public void onGameTick(GameTick event) + { + // Keep in mind isInGame is delayed by a tick when a wave ends + if (!isInGame() || getRole() == null) + { + return; + } + + tickNum++; + + if (tickNum > 9 || tickReset) + { + tickNum = 0; + tickReset = false; + projectiles.entrySet().removeIf(projectile -> projectile.getValue().getRemainingCycles() < 1); + } + + if (tickCounter != null) + { + tickCounter.setCount(tickNum); + } + + if (config.prayerMetronome() && isAnyPrayerActive()) + { + for (int i = 0; i < config.prayerMetronomeVolume(); i++) + { + client.playSoundEffect(SoundEffectID.GE_INCREMENT_PLOP); + } + } + } + + @Subscribe + public void onNpcSpawned(NpcSpawned event) + { + if (!isInGame()) + { + return; + } + + NPC npc = event.getNpc(); + + if (npc == null) + { + return; + } + + String name = event.getNpc().getName(); + + if (name.equals("Penance Healer")) + { + if (!healers.containsKey(npc.getIndex())) + { + healers.put(npc.getIndex(), new Healer(npc, healers.size(), stage)); + } + } + } + + @Subscribe + public void onNpcDespawned(NpcDespawned event) + { + if (!isInGame()) + { + return; + } + + healers.remove(event.getNpc().getIndex()); + } + + + // So this is a mess, but it works and the horn of glory doesn't mess up anything. + // This was almost certainly a waste of time to get working, because almost nobody + // actually uses the horn of glory. At least now there shouldn't be anyone complaining + // about the horn of glory breaking anything and everything that should never break. + @Subscribe + public void onBeforeRender(BeforeRender event) + { + if (!isInGame()) + { + return; + } + + boolean rebuild = false; + + Widget callWidget = getRole() == null ? null : client.getWidget(getRole().getGloryCall()); + if (callWidget == null) + { + callWidget = getRole() == null ? null : client.getWidget(getRole().getCall()); + } + + String newCallText = getRole() == null ? lastCallText : getRole().getCall(client); + int newCallColor = callWidget == null ? lastCallColor : callWidget.getTextColor(); + + Widget listenWidget = getRole() == null ? null : client.getWidget(getRole().getGloryListen()); + if (listenWidget == null) + { + listenWidget = getRole() == null ? null : client.getWidget(getRole().getListen()); + usingGloryHorn = false; + } + else + { + usingGloryHorn = true; + } + + String newListenText = getRole() == null ? lastListenText : getRole().getListen(client); + + if (!Objects.equals(newCallText, lastCallText)) + { + rebuild = true; + lastCallText = newCallText; + callTimer = new Timer(); + tickReset = true; + hornCalled = false; + hornListened = false; + menu.setHornUpdated(false); + syncd = true; + + if (tickCounter != null) + { + tickCounter.setInSync(true); + } + } + + if (!Objects.equals(newListenText, lastListenText)) + { + if (newListenText != null && !newListenText.equals("- - -")) + { + hornListened = true; + rebuild = true; + } + else if (hornListened) + { + newListenText = lastListenText; + + // If the player uses the horn of glory, the listen text will be taken from there and set to the + // normal widget when the player exits the interface + if (listenWidget != null && !usingGloryHorn) + { + // Attacker has two widgets for it's listen text, the top widget is the one that is kept track of + if (getRole() == Role.ATTACKER) + { + listenWidget.setText(newListenText); + client.getWidget(WidgetInfo.BA_ATK_LISTEN_BOTTOM_TEXT).setText(Role.getMissingListen(newListenText)); + } + else + { + listenWidget.setText(newListenText); + } + + } + } + + lastListenText = newListenText; + } + + // Disabled for now, will need to also check either chat or verify a busy animation is not happening + /*if (newCallColor == COLOR_CALL_CALLED && !Objects.equals(lastClickedTell, lastCallText)) + { + hornCalled = false; + rebuild = true; + + if (callWidget != null) + { + callWidget.setTextColor(COLOR_CALL_UPDATED); + lastCallColor = COLOR_CALL_UPDATED; + } + } + + else if (newCallColor == COLOR_CALL_UPDATED && Objects.equals(lastClickedTell, lastCallText)) + { + hornCalled = true; + rebuild = true; + + if (callWidget != null) + { + callWidget.setTextColor(COLOR_CALL_CALLED); + lastCallColor = COLOR_CALL_CALLED; + } + }*/ + + // Horn of glory will switch text back to white color before call change + if (newCallColor != lastCallColor) + { + if (newCallColor == COLOR_CALL_CALLED) + { + hornCalled = true; + rebuild = true; + } + else if (hornCalled) + { + newCallColor = COLOR_CALL_CALLED; + if (callWidget != null) + { + callWidget.setTextColor(newCallColor); + } + } + + lastCallColor = newCallColor; + } + + if (rebuild || menu.isRebuildForced()) + { + menu.setRebuildForced(false); + menu.validateHiddenMenus(role); + } + + // This doesn't have to be done in BeforeRender. And although it is + // inefficient, it's only being done while in the instance. Will + // likely be changed in the future + if (getRole() == Role.ATTACKER && config.removeIncorrectAttackStyles()) + { + Widget weapon = client.getWidget(WidgetInfo.COMBAT_WEAPON); + + if (weapon != null) + { + if ((StringUtils.contains(weapon.getText(), "Crystal halberd") || StringUtils.contains(weapon.getText(), "Dragon claws")) + && newListenText != null && !newListenText.equals("- - -")) + { + int i = 0; + for (AttackStyle style : getAttackStyles()) + { + Widget attackStyle = client.getWidget(attackStyles.get(i)); + if (attackStyle != null && style != null) + { + if (StringUtils.startsWith(newListenText, style.getName())) + { + attackStyle.setHidden(false); + } + else + { + attackStyle.setHidden(true); + } + } + + i++; + } + } + else + { + showAllStyles(); + } + } + } + } + + // onMenuEntryAdded is being used for conditional entry changes that are not + // easily achievable using MenuManager, all other changes use MenuManager in + // the BarbarianAssaultMenu/Menus classes + @Subscribe + public void onMenuEntryAdded(MenuEntryAdded event) + { + if (!isInGame()) + { + return; + } + + final List menu = new ArrayList<>(); + final List selected = new ArrayList<>(); + final List priority = new ArrayList<>(); + MenuEntry walk = null; + boolean prioritizeWalk = false; + + String listen = lastListenText != null ? StringUtils.remove(lastListenText, "Pois. ").toLowerCase() : ""; + + for (MenuEntry entry : client.getMenuEntries()) + { + String option = Text.removeTags(entry.getOption()).toLowerCase(); + String target = Text.removeTags(entry.getTarget()).toLowerCase(); + int identifier = entry.getIdentifier(); + + if (option.equals("walk here")) + { + walk = entry; + } + else + { + switch (getRole()) + { + case ATTACKER: + if (config.tagging() && option.equals("attack") && (target.startsWith("penance fighter") || target.startsWith("penance ranger"))) + { + String tag = StringUtils.substringBefore(entry.getTarget(), ")"); + + NPC[] npcs = client.getCachedNPCs(); + + if (identifier >= 0 && identifier < npcs.length) + { + NPC npc = npcs[identifier]; + if (npc != null) + { + Projectile projectile = projectiles.get(identifier); + if (npc.getInteracting() == null && projectile == null) + { + entry.setTarget((tag + ") (" + (10 - (tickNum + 1)) + ")").replace("", "")); + selected.add(entry); + continue; + } + // TODO add check to see if other attacker is attacking fighter/ranger + // Possibly just add it to a list when the projectile is spawned + // Also maybe add order by health option + else if (npc.getInteracting() == client.getLocalPlayer() || (projectile != null && projectile.getInteracting() == npc)) + { + entry.setTarget((tag + ") (" + (10 - (tickNum)) + ")").replace("", "")); + } + else + { + entry.setTarget((tag + ") (" + (10 - (tickNum)) + ")").replace("", "")); + } + } + } + } + break; + + case COLLECTOR: + // Take option for yellow eggs should always be the first option + if (option.equals("take") && target.equals("yellow egg")) + { + priority.add(entry); + continue; + } + else if (config.deprioritizeIncorrectEggs() + && option.equals("take") + && (target.equals("blue egg") || target.equals("green egg") || target.equals("red egg"))) + { + prioritizeWalk = true; + + if (listen.startsWith(target)) + { + selected.add(entry); + continue; + } + } + break; + + case DEFENDER: + // Take option for logs and hammer should always be the first option + if (option.equals("take") + && (target.equals("logs") || target.equals("hammer"))) + { + priority.add(entry); + continue; + } + else if (config.deprioritizeBait() + && option.equals("take") + && (target.equals("tofu") || target.equals("crackers") || target.equals("worms"))) + { + prioritizeWalk = true; + } + break; + + case HEALER: + if (config.healerMenuOption() && target.contains("penance healer") && healers.containsKey(identifier)) + { + String tag = StringUtils.substringBefore(entry.getTarget(), " ("); + int time = healers.get(identifier).timeToPoison(); + + if (time != -1) + { + entry.setTarget(tag + " (" + (healers.get(identifier).timeToPoison()) + ")"); + target = Text.removeTags(entry.getTarget()).toLowerCase(); + } + } + + if ((target.startsWith("poisoned meat ->") || target.startsWith("poisoned tofu ->") || target.startsWith("poisoned worms ->"))) + { + // Poison should only be used on healers + if (config.removeUnusedMenus() && !target.contains("penance healer")) + { + continue; + } + else if (config.controlHealer() && controlDown && identifier == lastHealerPoisoned && target.contains("penance healer")) + { + selected.add(entry); + continue; + } + } + else if (config.shiftOverstock() && target.equals("healer item machine") && shiftDown) + { + if (option.contains(listen)) + { + selected.add(entry); + continue; + } + } + else if (config.removeUnusedMenus()) + { + // Vials that are empty should only be used on spring + if (target.startsWith("healing vial ->") && !target.endsWith("healer spring")) + { + continue; + } + // Vials that are full should only be used on players + else if (target.startsWith("healing vial(4) ->")) + { + Player[] players = client.getCachedPlayers(); + + if (!(identifier >= 0 && identifier < players.length && players[identifier] != null)) + { + continue; + } + } + // Vials that are not full or empty can be used on either players or spring + else if (target.startsWith("healing vial(") && target.contains("->")) + { + Player[] players = client.getCachedPlayers(); + + if ((!(identifier >= 0 && identifier < players.length && players[identifier] != null)) + && !target.endsWith("healer spring")) + { + continue; + } + } + } + break; + } + } + + menu.add(entry); + } + + if (prioritizeWalk && walk != null) + { + menu.remove(walk); + menu.add(walk); + } + + if (!selected.isEmpty()) + { + menu.addAll(selected); + } + + if (!priority.isEmpty()) + { + menu.addAll(priority); + } + + client.setMenuEntries(menu.toArray(new MenuEntry[0])); + } + + @Subscribe + public void onMenuOptionClicked(MenuOptionClicked event) + { + if (!isInGame() && getRole() != null) + { + return; + } + + String target = Text.removeTags(event.getTarget()).toLowerCase(); + + if (getRole() == Role.HEALER) + { + if (target.startsWith("poisoned meat -> penance healer") + || target.startsWith("poisoned tofu -> penance healer") + || target.startsWith("poisoned worms -> penance healer")) + { + lastHealerPoisoned = event.getIdentifier(); + poisonUsed = StringUtils.substringBefore(target.replace("oned", "."), " ->"); + return; + } + } + + // INW + /* + String option = Text.removeTags(event.getMenuOption()); + if (option.startsWith("Tell-")) + { + lastClickedTell = getRole().getCallFromTell(option); + } + else if (usingGloryHorn && option.equals("Call")) + { + + } + */ + } + + // Interacting changed has a slight delay until after the hitsplat is applied + @Subscribe + public void onInteractingChanged(InteractingChanged event) + { + if (!isInGame() || getRole() != Role.HEALER) + { + return; + } + + Actor source = event.getSource(); + + if (source != client.getLocalPlayer()) + { + return; + } + + Actor opponent = event.getTarget(); + + if (opponent == null) + { + if (lastInteracted != -1) + { + if (StringUtils.equalsIgnoreCase(poisonUsed, getRole().getListen(client)) && healers.containsKey(lastInteracted)) + { + Healer healer = healers.get(lastInteracted); + healer.setFoodRemaining(healer.getFoodRemaining() - 1); + healer.setTimeLastPoisoned(Instant.now()); + } + } + + lastInteracted = -1; + poisonUsed = null; + } + else if (StringUtils.equals(opponent.getName(), "Penance Healer")) + { + lastInteracted = ((NPC)opponent).getIndex(); + } + + } + + @Subscribe + public void onProjectileSpawned(ProjectileSpawned event) + { + if (!isInGame()) + { + return; + } + + Actor target = event.getProjectile().getInteracting(); + if (target == null) + { + return; + } + + String name = target.getName(); + if ("Penance Fighter".equals(name) || "Penance Ranger".equals(name)) + { + projectiles.put(((NPC)target).getIndex(), event.getProjectile()); + } + } + + @Subscribe + public void onVarbitChanged(VarbitChanged event) + { + int newInGameBit = client.getVar(Varbits.IN_GAME_BA); + + if (inGameBit != newInGameBit) + { + if (newInGameBit == 0) + { + resetWave(); + callTimer = null; + hornCalled = false; + hornListened = false; + lastListenText = null; + lastCallText = null; + lastCallColor = -1; + lastClickedTell = null; + } + else + { + wave = new Wave(client); + } + + inGameBit = newInGameBit; + } + } + + private void resetWave() + { + inGame = false; + menu.setHornUpdated(false); + menu.setRebuildForced(false); + removeTickTimer(); + removeAllDeathTimes(true); + projectiles.clear(); + clearAllEggMaps(); + healers.clear(); + role = null; + lastInteracted = -1; + poisonUsed = null; + lastHealerPoisoned = -1; + tickNum = 0; + showAllStyles(); + usingGloryHorn = false; + menu.validateHiddenMenus(null); + } + + private void startWave(Role role) + { + inGame = true; + this.role = role; + + validateWidgets(); + } + + // Role widgets are not accurate if a player is using horn of glory + private void validateGame() + { + Role role = null; + + Widget inventory = client.getWidget(WidgetInfo.INVENTORY); + + if (inventory != null) + { + Collection items = inventory.getWidgetItems(); + + for (WidgetItem item : items) + { + int id = item.getId(); + if (id == ItemID.COLLECTOR_HORN) + { + role = Role.COLLECTOR; + } + else if (id == ItemID.DEFENDER_HORN) + { + role = Role.DEFENDER; + } + else if (id == ItemID.ATTACKER_HORN || id == ItemID.ATTACKER_HORN_10517 || id == ItemID.ATTACKER_HORN_10518 + || id == ItemID.ATTACKER_HORN_10519 || id == ItemID.ATTACKER_HORN_10520) + { + role = Role.ATTACKER; + } + else if (id == ItemID.HEALER_HORN || id == ItemID.HEALER_HORN_10527 || id == ItemID.HEALER_HORN_10528 + || id == ItemID.HEALER_HORN_10529 || id == ItemID.HEALER_HORN_10530) + { + role = Role.HEALER; + } + } + } + + if (role != null) + { + inGame = true; + this.role = role; + + inGameBit = 1; + + usingGloryHorn = client.getWidget(role.getGloryListen()) != null; + + Widget stage = client.getWidget(role.getWave()); + + if (stage != null) + { + this.stage = Integer.parseInt(StringUtils.substringAfter(stage.getText(), " ")); + } + + lastCallText = role.getCall(client); + lastListenText = role.getListen(client); + + if (callTimer != null && callTimer.getElapsedTime() > 30) + { + callTimer = null; + + } + + // TODO getTickCount() does not work as expected + // tickNum = (client.getTickCount() - gameTick) % 10; + + syncd = false; + + if (tickCounter != null) + { + tickCounter.setInSync(false); + } + + // If the horn is currently called, or if the call timer is still in sync + // the text will be updated to the last called color + Widget callWidget = getRole() == null ? null : client.getWidget(getRole().getGloryCall()); + if (callWidget == null) + { + callWidget = getRole() == null ? null : client.getWidget(getRole().getCall()); + } + + int newCallColor = callWidget == null ? lastCallColor : callWidget.getTextColor(); + + if (newCallColor == COLOR_CALL_CALLED) + { + lastCallColor = COLOR_CALL_CALLED; + lastClickedTell = lastCallText; + } + else if (callTimer == null) + { + lastCallColor = COLOR_CALL_UPDATED; + lastClickedTell = null; + } + + if (callWidget != null) + { + callWidget.setTextColor(lastCallColor); + } + } + else + { + inGameBit = 0; + } + + validateWidgets(); + + menu.enableSwaps(); + menu.validateHiddenMenus(getRole()); + } + + private void validateWidgets() + { + if (!config.showTimer()) + { + showRoleSprite(); + } + + if (config.showDefTimer() && getRole() == Role.DEFENDER) + { + addTickTimer(); + } + else + { + removeTickTimer(); + } + + if (config.showDeathTimes() + && (config.showDeathTimesMode() == DeathTimesMode.INFO_BOX + || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + addAllDeathTimes(); + } + else + { + removeAllDeathTimes(false); + } + } + + private void showAllStyles() + { + for (WidgetInfo info : attackStyles) + { + Widget style = client.getWidget(info); + if (style != null) + { + style.setHidden(false); + } + } + } + + private void addTickTimer() + { + if (!isInGame() || tickCounter != null) + { + return; + } + + tickCounter = new TimerBox(torsoImage, this, tickNum); + + tickCounter.setInSync(syncd); + + tickCounter.setTooltipEnabled(true); + + removeAllDeathTimes(false); + + infoBoxManager.addInfoBox(tickCounter); + + addAllDeathTimes(); + } + + private void removeTickTimer() + { + if (tickCounter != null) + { + infoBoxManager.removeInfoBox(tickCounter); + tickCounter = null; + } + } + + private void addDeathTimes(TimerBox box) + { + if (!isInGame()) + { + return; + } + + deathTimes.add(box); + + if (config.showDeathTimes() && (config.showDeathTimesMode() == DeathTimesMode.INFO_BOX || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + infoBoxManager.addInfoBox(box); + } + } + + private void addAllDeathTimes() + { + if (!isInGame()) + { + return; + } + + List boxes = infoBoxManager.getInfoBoxes(); + + for (TimerBox box : deathTimes) + { + if (!boxes.contains(box)) + { + infoBoxManager.addInfoBox(box); + } + } + } + + private void removeAllDeathTimes(boolean clear) + { + for (InfoBox box : infoBoxManager.getInfoBoxes().toArray(new InfoBox[0])) + { + if (box instanceof TimerBox && box.getImage() != torsoImage) + { + infoBoxManager.removeInfoBox(box); + } + } + if (clear) + { + deathTimes.clear(); + } + } + + private void showRoleSprite() + { + if (getRole() == null || !isInGame()) + { + return; + } + + Widget roleText = client.getWidget(role.getRoleText()); + Widget roleSprite = client.getWidget(role.getRoleSprite()); + + if (roleSprite != null) + { + roleSprite.setHidden(false); + } + if (roleText != null) + { + roleText.setText(getRole().name()); + } + } + + private AttackStyle[] getAttackStyles() + { + return WeaponType.getWeaponType(client.getVar(Varbits.EQUIPPED_WEAPON_TYPE)).getAttackStyles(); + } + + private void announceWaveTime() + { + if (config.waveTimes() && wave != null) + { + announceTime("Wave " + getStage() + " duration: ", wave.getWaveTimer().getElapsedTimeFormatted()); + } + } + + private void announceGameTime() + { + if (config.waveTimes() && gameTimer != null) + { + announceTime("Game finished, duration: ", gameTimer.getElapsedTimeFormatted()); + } + } + + private void announceTime(String preText, String time) + { + final String chatMessage = new ChatMessageBuilder() + .append(ChatColorType.NORMAL) + .append(preText) + .append(ChatColorType.HIGHLIGHT) + .append(time) + .build(); + + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(chatMessage) + .build()); + } + + private void announce(final ChatMessageBuilder chatMessage) + { + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(chatMessage.build()) + .build()); + } + + long getTimeToChange() + { + return 30 - callTimer.getElapsedTime(); + } + + private void clearAllEggMaps() + { + redEggs.clear(); + greenEggs.clear(); + blueEggs.clear(); + yellowEggs.clear(); + } + + private HashMap getEggMap(int itemID) + { + switch (itemID) + { + case ItemID.RED_EGG: + return redEggs; + + case ItemID.GREEN_EGG: + return greenEggs; + + case ItemID.BLUE_EGG: + return blueEggs; + + case ItemID.YELLOW_EGG: + return yellowEggs; + } + + return null; + } + + private boolean isItemEgg(int itemId) + { + return itemId == ItemID.RED_EGG || + itemId == ItemID.GREEN_EGG || + itemId == ItemID.BLUE_EGG || + itemId == ItemID.YELLOW_EGG; + } + + private boolean isAnyPrayerActive() + { + for (Prayer pray : Prayer.values()) + { + if (client.isPrayerActive(pray)) + { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/DeathTimesMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/DeathTimesMode.java new file mode 100644 index 0000000000..4083ce8ba4 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/DeathTimesMode.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + + +public enum DeathTimesMode +{ + BOTH("Both"), + CHAT_BOX("Chat Box"), + INFO_BOX("Info Box"); + + private final String name; + + DeathTimesMode(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return name; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Healer.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Healer.java new file mode 100644 index 0000000000..8a2154889c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Healer.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import com.google.common.collect.ImmutableList; +import lombok.AccessLevel; +import lombok.Data; +import lombok.Getter; +import net.runelite.api.NPC; + +import java.time.Duration; +import java.time.Instant; +import java.util.List; + + +@Data +class Healer +{ + @Getter(AccessLevel.NONE) + private static final List> CODES = ImmutableList.of( + // ImmutableList.of(firstCallFood, secondCallFood, lastFoodTime), + ImmutableList.of(new int[]{1, 1}, new int[]{0, 0}, new int[]{0, 0}), + ImmutableList.of(new int[]{1, 1, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 21}), + ImmutableList.of(new int[]{1, 6, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 0}), + ImmutableList.of(new int[]{2, 5, 2, 0}, new int[]{0, 0, 7, 10}, new int[]{0, 0, 0, 0}), + ImmutableList.of(new int[]{2, 5, 2, 3, 0}, new int[]{0, 0, 0, 0, 7}, new int[]{0, 0, 21, 30, 0}), + ImmutableList.of(new int[]{3, 5, 2, 2, 0, 0}, new int[]{0, 0, 0, 2, 9, 10}, new int[]{12, 18, 21, 0, 0, 0}), + ImmutableList.of(new int[]{3, 7, 1, 1, 0, 0, 0}, new int[]{2, 0, 1, 1, 2, 4, 10}, new int[]{0, 21, 0, 0, 30, 45, 0}), + ImmutableList.of(new int[]{1, 9, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 2, 10}, new int[]{0, 0, 0, 0, 33, 42, 0}), + ImmutableList.of(new int[]{2, 8, 1, 1, 0, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 1, 1, 10}, new int[]{0, 21, 0, 0, 0, 0, 0, 0, 0}), + ImmutableList.of(new int[]{2, 5, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 4, 4, 8}, new int[]{21, 33, 0, 33, 30, 45, 0})); + + private final NPC npc; + + private int wave; + + private int spawnNumber; + + private int foodRemaining; + + private int lastFoodTime; + + private int firstCallFood; + + private int secondCallFood; + + private Instant timeLastPoisoned = null; + + Healer(NPC npc, int spawnNumber, int wave) + { + this.npc = npc; + this.wave = wave; + this.spawnNumber = spawnNumber; + List code = CODES.get(wave - 1); + this.firstCallFood = code.get(0)[spawnNumber]; + this.secondCallFood = code.get(1)[spawnNumber]; + this.lastFoodTime = code.get(2)[spawnNumber]; + this.foodRemaining = firstCallFood + secondCallFood; + } + + int timeToPoison() + { + if (timeLastPoisoned == null) + { + return -1; + } + else + { + long time = Duration.between(timeLastPoisoned, Instant.now()).getSeconds(); + return time > 20 ? 0 : (int)(20 - time); + } + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Menus.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Menus.java new file mode 100644 index 0000000000..4f18e25578 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Menus.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import com.google.common.collect.ImmutableSet; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.MenuAction; +import net.runelite.client.menus.ComparableEntry; + +@AllArgsConstructor +public enum Menus +{ + ATTACK_PENANCE_FIGHTER(Role.ATTACKER, new ComparableEntry("attack", "penance fighter", -1, -1, true, false)), + ATTACK_PENANCE_RANGER(Role.ATTACKER, new ComparableEntry("attack", "penance ranger", -1, -1, true, false)), + GET_SPIKES_PETRIFIED_MUSHROOM(Role.ATTACKER, new ComparableEntry("get-spikes", "petrified mushroom", -1, -1, true, true)), + TAKE_ATTACKER_ITEM_MACHINE(Role.ATTACKER, new ComparableEntry("take", "attacker item machine", -1, -1, false, true)), + TELL_RED_ATTACKER_HORN(Role.ATTACKER, new ComparableEntry("tell-red", "attacker horn", -1, -1, true, true)), + TELL_GREEN_ATTACKER_HORN(Role.ATTACKER, new ComparableEntry("tell-green", "attacker horn", -1, -1, true, true)), + TELL_BLUE_ATTACKER_HORN(Role.ATTACKER, new ComparableEntry("tell-blue", "attacker horn", -1, -1, true, true)), + + BLOCK_PENANCE_CAVE(Role.DEFENDER, new ComparableEntry("block", "penance cave", -1, -1, true, true)), + DUNK_LAVA_CRATER(Role.DEFENDER, new ComparableEntry("dunk", "lava crater", -1, -1, true, true)), + FIX(Role.DEFENDER, new ComparableEntry("fix", "", -1, -1, true, false)), + STOCK_UP_DEFENDER_ITEM_MACHINE(Role.DEFENDER, new ComparableEntry("stock-up", "defender item machine", -1, -1, true, true)), + TAKE_DEFENDER_ITEM_MACHINE(Role.DEFENDER, new ComparableEntry("take", "defender item machine", -1, -1, false, true)), + TAKE_HAMMER(Role.DEFENDER, new ComparableEntry("take", "hammer", -1, -1, true, true)), + TAKE_LOGS(Role.DEFENDER, new ComparableEntry("take", "logs", -1, -1, true, true)), + TELL_WORMS_DEFENDER_HORN(Role.DEFENDER, new ComparableEntry("tell-worms", "defender horn", -1, -1, true, true)), + TELL_TOFU_DEFENDER_HORN(Role.DEFENDER, new ComparableEntry("tell-tofu", "defender horn", -1, -1, true, true)), + TELL_MEAT_DEFENDER_HORN(Role.DEFENDER, new ComparableEntry("tell-meat", "defender horn", -1, -1, true, true)), + + DRINK_FROM_HEALER_SPRING(Role.HEALER, new ComparableEntry("drink-from", "healer spring", -1, -1, true, true)), + DUNK_POISON_CRATER(Role.HEALER, new ComparableEntry("dunk", "poison crater", -1, -1, true, true)), + STOCK_UP_HEALER_ITEM_MACHINE(Role.HEALER, new ComparableEntry("stock-up", "healer item machine", -1, -1, true, true)), + TAKE_HEALER_ITEM_MACHINE(Role.HEALER, new ComparableEntry("take", "healer item machine", -1, -1, false, true)), + TAKE_FROM_HEALER_SPRING(Role.HEALER, new ComparableEntry("take-from", "healer spring", -1, -1, true, true)), + TELL_TOFU_HEALER_HORN(Role.HEALER, new ComparableEntry("tell-tofu", "healer horn", -1, -1, true, true)), + TELL_CRACKERS_HEALER_HORN(Role.HEALER, new ComparableEntry("tell-crackers", "healer horn", -1, -1, true, true)), + TELL_WORMS_HEALER_HORN(Role.HEALER, new ComparableEntry("tell-worms", "healer horn", -1, -1, true, true)), + USE_VIAL_GROUND(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_GROUND_ITEM.getId(), true, false)), + USE_VIAL_ITEM(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_WIDGET_ITEM.getId(), true, false)), + USE_VIAL_NPC(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_NPC.getId(), true, false)), + USE_VIAL_WIDGET(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_WIDGET.getId(), true, false)), + + CONVERT_COLLECTOR_CONVERTER(Role.COLLECTOR, new ComparableEntry("convert", "collector converter", -1, -1, true, true)), + LOAD_EGG_HOPPER(Role.COLLECTOR, new ComparableEntry("load", "egg hopper", -1, -1, true, true)), + TAKE_BLUE_EGG(Role.COLLECTOR, new ComparableEntry("take", "blue egg", -1, -1, true, true)), + TAKE_GREEN_EGG(Role.COLLECTOR, new ComparableEntry("take", "green egg", -1, -1, true, true)), + TAKE_RED_EGG(Role.COLLECTOR, new ComparableEntry("take", "red egg", -1, -1, true, true)), + TAKE_YELLOW_EGG(Role.COLLECTOR, new ComparableEntry("take", "yellow egg", -1, -1, true, true)), + TELL_CONTROLLED_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-controlled", "collector horn", -1, -1, true, true)), + TELL_ACCURATE_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-accurate", "collector horn", -1, -1, true, true)), + TELL_AGGRESSIVE_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-aggressive", "collector horn", -1, -1, true, true)), + TELL_DEFENSIVE_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-defensive", "collector horn", -1, -1, true, true)), + + ATTACK_PENANCE_QUEEN(null, new ComparableEntry("attack", "penance queen", -1, -1, true, false)), + ATTACK_QUEEN_SPAWN(null, new ComparableEntry("attack", "queen spawn", -1, -1, true, false)), + DROP_HORN(null, new ComparableEntry("drop", "horn", -1, -1, true, false)), + EXAMINE_HORN(null, new ComparableEntry("examine", "horn", -1, -1, true, false)), + LIGHT_LOGS(null, new ComparableEntry("light", "logs", -1, -1, true, true)), + MEDIC_HORN(null, new ComparableEntry("medic", "horn", -1, -1, true, false)), + USE_HORN(null, new ComparableEntry("use", "horn", -1, -1, true, false)); + + @Getter + private final Role role; + + @Getter + private final ComparableEntry entry; + + private static final ImmutableSet ALL = ImmutableSet.copyOf(Menus.values()); + + public String getOption() + { + return entry.getOption(); + } + + public String getTarget() + { + return entry.getTarget(); + } + + public int getId() + { + return entry.getId(); + } + + public int getType() + { + return entry.getType(); + } + + public boolean isStrictOption() + { + return entry.isStrictOption(); + } + + public boolean isStrictTarget() + { + return entry.isStrictTarget(); + } + + public static ImmutableSet getMenus() + { + return ALL; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java new file mode 100644 index 0000000000..3b3260f559 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2018, Cameron + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; + + +@AllArgsConstructor +enum Role +{ + ATTACKER(WidgetInfo.BA_ATK_WAVE_TEXT, WidgetInfo.BA_ATK_LISTEN_TOP_TEXT, WidgetInfo.BA_ATK_HORN_LISTEN_TEXT, + WidgetInfo.BA_ATK_CALL_TEXT, WidgetInfo.BA_COLL_HORN_LISTEN_TEXT, WidgetInfo.BA_ATK_ROLE_TEXT, + WidgetInfo.BA_ATK_ROLE_SPRITE), + DEFENDER(WidgetInfo.BA_DEF_WAVE_TEXT, WidgetInfo.BA_DEF_LISTEN_TEXT, WidgetInfo.BA_DEF_HORN_LISTEN_TEXT, + WidgetInfo.BA_DEF_CALL_TEXT, WidgetInfo.BA_HEAL_HORN_LISTEN_TEXT, WidgetInfo.BA_DEF_ROLE_TEXT, + WidgetInfo.BA_DEF_ROLE_SPRITE), + COLLECTOR(WidgetInfo.BA_COLL_WAVE_TEXT, WidgetInfo.BA_COLL_LISTEN_TEXT, WidgetInfo.BA_COLL_HORN_LISTEN_TEXT, + WidgetInfo.BA_COLL_CALL_TEXT, WidgetInfo.BA_ATK_HORN_LISTEN_TEXT, WidgetInfo.BA_COLL_ROLE_TEXT, + WidgetInfo.BA_COLL_ROLE_SPRITE), + HEALER(WidgetInfo.BA_HEAL_WAVE_TEXT, WidgetInfo.BA_HEAL_LISTEN_TEXT, WidgetInfo.BA_DEF_HORN_LISTEN_TEXT, + WidgetInfo.BA_HEAL_CALL_TEXT, WidgetInfo.BA_DEF_HORN_LISTEN_TEXT, WidgetInfo.BA_HEAL_ROLE_TEXT, + WidgetInfo.BA_HEAL_ROLE_SPRITE); + + @Getter + private final WidgetInfo wave; + @Getter + private final WidgetInfo listen; + @Getter + private final WidgetInfo gloryListen; + @Getter + private final WidgetInfo call; + @Getter + private final WidgetInfo gloryCall; + @Getter + private final WidgetInfo roleText; + @Getter + private final WidgetInfo roleSprite; + + // Duplicate* entries are to catch instances where the horn of glory has + // text different than the normal horn + private static final ImmutableMap TELLS = ImmutableMap.builder() + .put("Red egg", "Tell-red") + .put("Green egg", "Tell-green") + .put("Blue egg", "Tell-blue") + .put("Controlled/Bullet/Wind", "Tell-controlled") + .put("Accurate/Field/Water", "Tell-accurate") + .put("Aggressive/Blunt/Earth", "Tell-aggressive") + .put("Defensive/Barbed/Fire", "Tell-defensive") + .put("Tofu", "Tell-tofu") + .put("Crackers", "Tell-crackers") + .put("Worms", "Tell-worms") + .put("Poison Worms", "Tell-worms") + .put("Pois. Worms", "Tell-worms") + .put("Poison Tofu", "Tell-tofu") + .put("Pois. Tofu", "Tell-tofu") + .put("Poison Meat", "Tell-meat") + .put("Pois. Meat", "Tell-meat") + .build(); + private static final ImmutableMap GLORY_CALLS = ImmutableMap.builder() + .put("Controlled/Bullet/Wind", "Controlled/") + .put("Accurate/Field/Water", "Accurate/") + .put("Aggressive/Blunt/Earth", "Aggressive/") + .put("Defensive/Barbed/Fire", "Defensive/") + .put("Tofu", "Tofu") + .put("Crackers", "Crackers") + .put("Worms", "Worms") + .put("Poison worms", "Pois. Worms") + .put("Poison tofu", "Pois. Tofu") + .put("Poison meat", "Pois. Meat") + .put("Red egg", "Red egg") + .put("Green egg", "Green egg") + .put("Blue egg", "Blue egg") + .build(); + private static final ImmutableMap ITEMS = ImmutableMap.builder() + .put("Tofu", ItemID.TOFU) + .put("Crackers", ItemID.CRACKERS) + .put("Worms", ItemID.WORMS) + .put("Pois. Worms", ItemID.POISONED_WORMS) + .put("Pois. Tofu", ItemID.POISONED_TOFU) + .put("Pois. Meat", ItemID.POISONED_MEAT) + .put("Defensive/", ItemID.BARBED_ARROW) + .put("Aggressive/", ItemID.BLUNT_ARROW) + .put("Accurate/", ItemID.FIELD_ARROW) + .put("Controlled/", ItemID.BULLET_ARROW) + .build(); + private static final ImmutableMap SPLIT_LISTENS = ImmutableMap.builder() + .put("Controlled/", "Bullet/Wind") + .put("Bullet/Wind", "Controlled/") + .put("Accurate/", "Field/Water") + .put("Field/Water", "Accurate/") + .put("Aggressive/", "Blunt/Earth") + .put("Blunt/Earth", "Aggressive/") + .put("Defensive/", "Barbed/Fire") + .put("Barbed/Fire", "Defensive/") + .build(); + + + int getListenItem(String listen) + { + return ITEMS.getOrDefault(listen, -1); + } + + String getTell(String call) + { + return TELLS.getOrDefault(call, ""); + } + + String getCall(Client client) + { + // Do not reverse these if statements to be more efficient + // The normal widgets are no longer null/hidden after you + // click one time in the horn, and the values are incorrect + Widget callWidget = client.getWidget(getGloryCall()); + if (callWidget != null) + { + return GLORY_CALLS.get(callWidget.getText()); + } + + callWidget = client.getWidget(getCall()); + if (callWidget != null) + { + return callWidget.getText(); + } + + return null; + } + + String getListen(Client client) + { + // See the comment in getCall(Client client), before editing + Widget listenWidget = client.getWidget(getGloryListen()); + if (listenWidget != null) + { + return GLORY_CALLS.get(listenWidget.getText()); + } + + listenWidget = client.getWidget(getListen()); + if (listenWidget != null) + { + return listenWidget.getText(); + } + + return null; + } + + static String getMissingListen(String listen) + { + return SPLIT_LISTENS.getOrDefault(listen, "- - -"); + } + + // I call it "Switchception" :wutwedoin: + // Should probably switch to using an interface instead of an enum at this point + String getCallFromTell(String listen) + { + switch (this) + { + case COLLECTOR: + switch (listen) + { + case "Tell-controlled": + return "Controlled/"; + case "Tell-accurate": + return "Accurate/"; + case "Tell-aggressive": + return "Aggressive/"; + case "Tell-defensive": + return "Defensive/"; + } + break; + case ATTACKER: + switch (listen) + { + case "Tell-red": + return "Red egg"; + case "Tell-green": + return "Green egg"; + case "Tell-blue": + return "Blue egg"; + } + break; + case HEALER: + switch (listen) + { + case "Tell-tofu": + return "Tofu"; + case "Tell-crackers": + return "Crackers"; + case "Tell-worms": + return "Worms"; + } + break; + case DEFENDER: + switch (listen) + { + case "Tell-meat": + return "Pois. Meat"; + case "Tell-tofu": + return "Pois. Tofu"; + case "Tell-worms": + return "Pois. Worms"; + } + break; + } + return null; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Game.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Scorecard.java similarity index 81% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Game.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Scorecard.java index 7e730a9fee..e33c798a83 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Game.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Scorecard.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,17 +27,20 @@ package net.runelite.client.plugins.barbarianassault; import java.awt.Color; import java.util.ArrayList; + +import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.events.ChatMessage; +import net.runelite.api.events.ChatMessage; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.eventbus.Subscribe; + @Getter -public class Game +public class Scorecard { - private Client client; - private String currentWave; + private BarbarianAssaultPlugin game; + + @Getter(AccessLevel.NONE) private ArrayList waves = new ArrayList<>(); private String[] totalDescriptions = { "A: ", @@ -55,46 +59,46 @@ public class Game private int[] totalAmounts = new int[6]; private int[] otherRolesPoints = new int[4]; - Game(Client client) + Scorecard(BarbarianAssaultPlugin game) { - this.client = client; - } - - Game(Client client, ArrayList waves) - { - this.client = client; - this.waves = waves; + this.game = game; } @Subscribe public void onChatMessage(ChatMessage chatMessage) { - if (chatMessage.getMessage().startsWith("---- Wave:")) + if (chatMessage.getMessage().startsWith("---- Points:")) { - String[] tempMessage = chatMessage.getMessage().split(" "); - currentWave = tempMessage[2]; - String[] temp = currentWave.split(" "); - } - if (currentWave.equals("1")) - { - waves = null; - totalPoints = new int[6]; - totalAmounts = new int[6]; + if (game.getStage() == 1) + { + totalPoints = new int[6]; + totalAmounts = new int[6]; + } } } + void addWave(Wave wave) + { + this.waves.add(wave); + } + + int getNumberOfWaves() + { + return waves.size(); + } + ChatMessageBuilder getGameSummary() { int[] amountsList; int[] pointsList; int[] otherRolesPointsList; ChatMessageBuilder message = new ChatMessageBuilder(); - message.append("Round points: "); - for (Wave w : waves) + message.append("Game points: "); + for (Wave wave : waves) { - amountsList = w.getWaveAmounts(); - pointsList = w.getWavePoints(); - otherRolesPointsList = w.getOtherRolesPointsList(); + amountsList = wave.getAmounts(); + pointsList = wave.getPoints(); + otherRolesPointsList = wave.getOtherRolesPointsList(); for (int j = 0; j < totalAmounts.length; j++) { totalAmounts[j] += amountsList[j]; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/GameTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Timer.java similarity index 76% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/GameTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Timer.java index 8708a123cb..69347915a6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/GameTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Timer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,37 +24,31 @@ */ package net.runelite.client.plugins.barbarianassault; +import lombok.Getter; + import java.time.Duration; import java.time.Instant; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import api.Constants; -class GameTimer +class Timer { - final private Instant startTime = Instant.now(); - private Instant prevWave = startTime; + @Getter + private final Instant startTime; - String getTime(boolean waveTime) + Timer() { - final Instant now = Instant.now(); - final Duration elapsed; - - if (waveTime) - { - elapsed = Duration.between(prevWave, now); - } - else - { - elapsed = Duration.between(startTime, now).minusMillis(Constants.GAME_TICK_LENGTH); - } - - return formatTime(LocalTime.ofSecondOfDay(elapsed.getSeconds())); + this.startTime = Instant.now(); } - void setWaveStartTime() + long getElapsedTime() { - prevWave = Instant.now(); + return Duration.between(startTime, Instant.now()).getSeconds(); + } + + String getElapsedTimeFormatted() + { + return formatTime(LocalTime.ofSecondOfDay(getElapsedTime())); } private static String formatTime(LocalTime time) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/TimerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/TimerBox.java new file mode 100644 index 0000000000..8efa4fe917 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/TimerBox.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.barbarianassault; + +import lombok.Data; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.overlay.infobox.InfoBox; + +import java.awt.Color; +import java.awt.image.BufferedImage; + +@Data +public class TimerBox extends InfoBox +{ + private int count; + + private boolean inSync = true; + + private boolean tooltipEnabled = false; + + TimerBox(BufferedImage image, Plugin plugin, int count) + { + super(image, plugin); + this.count = count; + } + + @Override + public String getText() + { + if (count == -1) + { + return ""; + } + return Integer.toString(getCount()); + } + + @Override + public Color getTextColor() + { + if (inSync) + { + return Color.WHITE; + } + else + { + return Color.RED; + } + } + + @Override + public String getTooltip() + { + if (!tooltipEnabled) + { + return ""; + } + else if (inSync) + { + return "Valid"; + } + else + { + return "Invalid"; + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java similarity index 56% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java index edc762cf36..a392312b75 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java @@ -1,5 +1,7 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,90 +27,105 @@ package net.runelite.client.plugins.barbarianassault; import com.google.common.collect.ImmutableList; -import java.awt.Color; +import lombok.AccessLevel; +import lombok.Data; import lombok.Getter; -import api.Client; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.chat.ChatMessageBuilder; -@Getter -class Wave -{ - private Client client; - private final ImmutableList WIDGETS = ImmutableList.of( - WidgetInfo.BA_FAILED_ATTACKER_ATTACKS, - WidgetInfo.BA_RUNNERS_PASSED, - WidgetInfo.BA_EGGS_COLLECTED, - WidgetInfo.BA_HITPOINTS_REPLENISHED, - WidgetInfo.BA_WRONG_POISON_PACKS, - WidgetInfo.BA_HONOUR_POINTS_REWARD - ); - private final ImmutableList POINTSWIDGETS = ImmutableList.of( -//base - WidgetInfo.BA_BASE_POINTS, -//att - WidgetInfo.BA_FAILED_ATTACKER_ATTACKS_POINTS, - WidgetInfo.BA_RANGERS_KILLED, - WidgetInfo.BA_FIGHTERS_KILLED, -//def - WidgetInfo.BA_RUNNERS_PASSED_POINTS, - WidgetInfo.BA_RUNNERS_KILLED, -//coll - WidgetInfo.BA_EGGS_COLLECTED_POINTS, -//heal - WidgetInfo.BA_HEALERS_KILLED, - WidgetInfo.BA_HITPOINTS_REPLENISHED_POINTS, - WidgetInfo.BA_WRONG_POISON_PACKS_POINTS - ); - private int[] waveAmounts = new int[6]; - private int[] allPointsList = new int[10]; - private int[] wavePoints = new int[6]; - private int[] otherRolesPointsList = new int[4]; - private String[] descriptions = { - " A: ", - "; D: ", - "; C: ", - "; Vial: ", - "; H packs: ", - "; Total: "}; +import java.awt.Color; - private String[] otherPointsDescriptions = { - " A: ", - " D: ", - " C: ", - " H: " - }; + +@Data +public class Wave +{ + @Getter(AccessLevel.NONE) + private static final ImmutableList WIDGETS = ImmutableList.of( + WidgetInfo.BA_FAILED_ATTACKER_ATTACKS, + WidgetInfo.BA_RUNNERS_PASSED, + WidgetInfo.BA_EGGS_COLLECTED, + WidgetInfo.BA_HITPOINTS_REPLENISHED, + WidgetInfo.BA_WRONG_POISON_PACKS, + WidgetInfo.BA_HONOUR_POINTS_REWARD + ); + + @Getter(AccessLevel.NONE) + private static final ImmutableList POINTSWIDGETS = ImmutableList.of( + //Base + WidgetInfo.BA_BASE_POINTS, + //Attacker + WidgetInfo.BA_FAILED_ATTACKER_ATTACKS_POINTS, + WidgetInfo.BA_RANGERS_KILLED, + WidgetInfo.BA_FIGHTERS_KILLED, + //Defender + WidgetInfo.BA_RUNNERS_PASSED_POINTS, + WidgetInfo.BA_RUNNERS_KILLED, + //Collector + WidgetInfo.BA_EGGS_COLLECTED_POINTS, + //Healer + WidgetInfo.BA_HEALERS_KILLED, + WidgetInfo.BA_HITPOINTS_REPLENISHED_POINTS, + WidgetInfo.BA_WRONG_POISON_PACKS_POINTS + ); + + @Getter(AccessLevel.NONE) + private final Client client; + + private final Timer waveTimer; + + private boolean runnersKilled; + + private boolean rangersKilled; + + private boolean healersKilled; + + private boolean fightersKilled; + + private int collectedEggCount = 0; + + private int positiveEggCount = 0; + + private int wrongEggs = 0; + + private int hpHealed = 0; + + private int totalCollectedEggCount = 0; + + private int totalHpHealed = 0; + + private int[] amounts = new int[6]; + + private int[] allPointsList = new int[10]; + + private int[] points = new int[6]; + + private int[] otherRolesPointsList = new int[4]; + + private String[] descriptions = {" A: ", "; D: ", "; C: ", "; Vial: ", "; H packs: ", "; Total: "}; + + private String[] otherPointsDescriptions = {" A: ", " D: ", " C: ", " H: "}; Wave(Client client) { this.client = client; + this.waveTimer = new Timer(); } - void setWaveAmounts(int[] amounts) - { - System.arraycopy(amounts, 0, waveAmounts, 0, amounts.length); - } - - void setWavePoints(int[] points, int[] otherRolesPoints) - { - System.arraycopy(points, 0, wavePoints, 0, points.length); - System.arraycopy(otherRolesPoints, 0, otherRolesPointsList, 0, otherRolesPoints.length); - } - - void setWaveAmounts() + void setAmounts() { for (int i = 0; i < WIDGETS.size(); i++) { Widget w = client.getWidget(WIDGETS.get(i)); if (w != null) { - waveAmounts[i] = Integer.parseInt(w.getText()); + amounts[i] = Integer.parseInt(w.getText()); } } } - void setWavePoints() + void setPoints() { for (int i = 0; i < POINTSWIDGETS.size(); i++) { @@ -117,26 +134,26 @@ class Wave switch (i) { case 1: - wavePoints[0] += allPointsList[i]; + points[0] += allPointsList[i]; break; case 4: - wavePoints[1] += allPointsList[i]; + points[1] += allPointsList[i]; break; case 6: - wavePoints[2] += allPointsList[i]; + points[2] += allPointsList[i]; break; case 8: case 9: - wavePoints[3] += allPointsList[i]; + points[3] += allPointsList[i]; break; default: break; } } - wavePoints[5] = 0; - for (int i = 0; i < wavePoints.length - 1; i++) + points[5] = 0; + for (int i = 0; i < points.length - 1; i++) { - wavePoints[5] += wavePoints[i]; + points[5] += points[i]; } for (int i = 0; i < POINTSWIDGETS.size(); i++) { @@ -166,37 +183,35 @@ class Wave case 9: otherRolesPointsList[3] += Integer.parseInt(w.getText()); break; - default: - break; } } } - ChatMessageBuilder getWaveSummary() + ChatMessageBuilder getSummary() { ChatMessageBuilder message = new ChatMessageBuilder(); message.append("Wave points:"); for (int i = 0; i < descriptions.length; i++) { - if (i != 4) + message.append(descriptions[i]); + if (i != 5) { - message.append(descriptions[i]); - message.append(String.valueOf(waveAmounts[i])); - message.append("("); - if (wavePoints[i] < 0) - { - message.append(Color.RED, String.valueOf(wavePoints[i])); - } - else if (wavePoints[i] > 0) - { - message.append(Color.BLUE, String.valueOf(wavePoints[i])); - } - else - { - message.append(String.valueOf(wavePoints[i])); - } - message.append(")"); + message.append(String.valueOf(amounts[i])); } + message.append("("); + if (points[i] < 0) + { + message.append(Color.RED, String.valueOf(points[i])); + } + else if (points[i] > 0) + { + message.append(Color.BLUE, String.valueOf(points[i])); + } + else + { + message.append(String.valueOf(points[i])); + } + message.append(")"); } message.append(System.getProperty("line.separator")); message.append("All roles points this wave: "); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java similarity index 77% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java index af124c6b4f..58760d7c96 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java @@ -28,18 +28,20 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Varbits; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; public class BarrowsBrotherSlainOverlay extends Overlay { @@ -75,24 +77,20 @@ public class BarrowsBrotherSlainOverlay extends Overlay } panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); for (BarrowsBrothers brother : BarrowsBrothers.values()) { final boolean brotherSlain = client.getVar(brother.getKilledVarbit()) > 0; String slain = brotherSlain ? "\u2713" : "\u2717"; - panelComponent.getChildren().add(LineComponent.builder() - .left(brother.getName()) - .right(slain) - .rightColor(brotherSlain ? Color.GREEN : Color.RED) - .build()); + tableComponent.addRow(brother.getName(), ColorUtil.prependColorTag(slain, brotherSlain ? Color.RED : Color.GREEN)); } float rewardPercent = client.getVar(Varbits.BARROWS_REWARD_POTENTIAL) / 10.0f; - panelComponent.getChildren().add(LineComponent.builder() - .left("Potential") - .right(rewardPercent != 0 ? rewardPercent + "%" : "0%") - .rightColor(rewardPercent >= 73.0f && rewardPercent <= 88.0f ? Color.GREEN : rewardPercent < 65.6f ? Color.WHITE : Color.YELLOW) - .build()); + tableComponent.addRow("Potential", ColorUtil.prependColorTag(rewardPercent != 0 ? rewardPercent + "%" : "0%", rewardPercent >= 73.0f && rewardPercent <= 88.0f ? Color.GREEN : rewardPercent < 65.6f ? Color.WHITE : Color.YELLOW)); + + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrothers.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrothers.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrothers.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrothers.java index db44c167f5..6b2f3edab4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrothers.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrothers.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.barrows; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.Varbits; -import api.coords.WorldPoint; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; @RequiredArgsConstructor public enum BarrowsBrothers diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java index 3c27007447..8e668d1697 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java @@ -30,16 +30,16 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.GameObject; -import api.NPC; -import api.NPCDefinition; -import api.ObjectDefinition; -import api.Perspective; -import api.Player; -import api.WallObject; -import api.coords.LocalPoint; -import api.widgets.Widget; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.ObjectDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.WallObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.widgets.Widget; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -85,7 +85,7 @@ class BarrowsOverlay extends Overlay continue; } - api.Point minimapLocation = npc.getMinimapLocation(); + net.runelite.api.Point minimapLocation = npc.getMinimapLocation(); if (minimapLocation != null) { graphics.fillOval(minimapLocation.getX(), minimapLocation.getY(), 4, 4); @@ -103,7 +103,7 @@ class BarrowsOverlay extends Overlay continue; } - api.Point minimapLocation = player.getMinimapLocation(); + net.runelite.api.Point minimapLocation = player.getMinimapLocation(); if (minimapLocation != null) { graphics.fillOval(minimapLocation.getX(), minimapLocation.getY(), 4, 4); @@ -156,7 +156,7 @@ class BarrowsOverlay extends Overlay private void renderWalls(Graphics2D graphics, WallObject wall) { - api.Point minimapLocation = wall.getMinimapLocation(); + net.runelite.api.Point minimapLocation = wall.getMinimapLocation(); if (minimapLocation == null) { @@ -192,7 +192,7 @@ class BarrowsOverlay extends Overlay private void renderLadders(Graphics2D graphics, GameObject ladder) { - api.Point minimapLocation = ladder.getMinimapLocation(); + net.runelite.api.Point minimapLocation = ladder.getMinimapLocation(); if (minimapLocation == null) { @@ -220,7 +220,7 @@ class BarrowsOverlay extends Overlay } String brotherLetter = Character.toString(brother.getName().charAt(0)); - api.Point minimapText = Perspective.getCanvasTextMiniMapLocation(client, graphics, + net.runelite.api.Point minimapText = Perspective.getCanvasTextMiniMapLocation(client, graphics, localLocation, brotherLetter); if (minimapText != null) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java index fe795adee9..2b5c044f82 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java @@ -33,29 +33,29 @@ import java.util.Set; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.GameObject; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.NullObjectID; -import api.ObjectID; -import api.SpriteID; -import api.WallObject; -import api.events.ConfigChanged; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.WallObjectChanged; -import api.events.WallObjectDespawned; -import api.events.WallObjectSpawned; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.NullObjectID; +import net.runelite.api.ObjectID; +import net.runelite.api.SpriteID; +import net.runelite.api.WallObject; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.WallObjectChanged; +import net.runelite.api.events.WallObjectDespawned; +import net.runelite.api.events.WallObjectSpawned; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/test/TestConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/blackjack/BlackjackConfig.java similarity index 78% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/test/TestConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blackjack/BlackjackConfig.java index f7bc35b3e7..803d19a662 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/test/TestConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blackjack/BlackjackConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Cas + * Copyright (c) 2019, gazivodag * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,7 +10,6 @@ * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -22,26 +21,23 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.test; +package net.runelite.client.plugins.blackjack; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; -import java.awt.*; - -@ConfigGroup("test") -public interface TestConfig extends Config +@ConfigGroup("blackjack") +public interface BlackjackConfig extends Config { @ConfigItem( - keyName = "Testing 1", - name = "Test option", - description = "Enable/disable nothing", - position = 1 + keyName = "pickpocketOnAggro", + name = "Pickpocket when aggro\'d", + description = "Switches to \"Pickpocket\" when bandit is aggro\'d. Saves food at the cost of slight xp/h." ) - default boolean tested() + default boolean pickpocketOnAggro() { - return true; + return false; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blackjack/BlackjackPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/blackjack/BlackjackPlugin.java new file mode 100644 index 0000000000..b5d6c2f635 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blackjack/BlackjackPlugin.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018 gazivodag + * Copyright (c) 2019 lucwousin + * Copyright (c) 2019 infinitay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.blackjack; + +import com.google.inject.Provides; +import javax.inject.Inject; +import javax.inject.Singleton; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.menus.MenuManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.util.MenuUtil; +import net.runelite.client.util.Text; +import org.apache.commons.lang3.RandomUtils; + +/** + * Authors gazivodag longstreet + */ +@PluginDescriptor( + name = "Blackjack", + description = "Allows for one-click blackjacking, both knocking out and pickpocketing", + tags = {"blackjack", "thieving"}, + type = PluginType.SKILLING, + enabledByDefault = false +) + +@Singleton +@Slf4j +public class BlackjackPlugin extends Plugin +{ + private static final String SUCCESS_BLACKJACK = "You smack the bandit over the head and render them unconscious."; + private static final String FAILED_BLACKJACK = "Your blow only glances off the bandit's head."; + private static final int POLLNIVNEACH_REGION = 13358; + private long nextKnockOutTick = 0; + @Inject + private Client client; + @Inject + private MenuManager menuManager; + @Inject + private BlackjackConfig config; + + + @Provides + BlackjackConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(BlackjackConfig.class); + } + + + @Subscribe + public void onMenuEntryAdded(MenuEntryAdded event) + { + if (client.getGameState() != GameState.LOGGED_IN || + client.getVar(Varbits.QUEST_THE_FEUD) < 13 || + client.getLocalPlayer().getWorldLocation().getRegionID() != POLLNIVNEACH_REGION) + { + return; + } + + String option = Text.removeTags(event.getOption().toLowerCase()); + String target = Text.removeTags(event.getTarget().toLowerCase()); + if (nextKnockOutTick >= client.getTickCount()) + { + MenuUtil.swap(client, "pickpocket", option, target); + } + else + { + MenuUtil.swap(client, "knock-out", option, target); + } + } + + @Subscribe + public void onChatMessage(ChatMessage event) + { + if (event.getType() == ChatMessageType.SPAM) + { + if (event.getMessage().equals(SUCCESS_BLACKJACK) ^ (event.getMessage().equals(FAILED_BLACKJACK) && config.pickpocketOnAggro())) + { + nextKnockOutTick = client.getTickCount() + RandomUtils.nextInt(3, 4); + } + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BarsOres.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BarsOres.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BarsOres.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BarsOres.java index 76925b8e45..52a295afd3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BarsOres.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BarsOres.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.blastfurnace; import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; -import api.ItemID; -import api.Varbits; +import net.runelite.api.ItemID; +import net.runelite.api.Varbits; public enum BarsOres { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java index d2bbbc3bc6..9dba17df30 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java @@ -29,16 +29,16 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.Area; import javax.inject.Inject; -import api.Client; -import api.EquipmentInventorySlot; -import api.GameObject; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; -import api.Point; -import api.Varbits; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.GameObject; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.Point; +import net.runelite.api.Varbits; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java similarity index 78% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java index ed8b9ca521..49242d63a8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java @@ -27,17 +27,18 @@ package net.runelite.client.plugins.blastfurnace; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import static api.Varbits.BLAST_FURNACE_COFFER; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import static net.runelite.api.Varbits.BLAST_FURNACE_COFFER; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; import net.runelite.client.util.StackFormatter; class BlastFurnaceCofferOverlay extends Overlay @@ -64,6 +65,9 @@ class BlastFurnaceCofferOverlay extends Overlay return null; } + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + Widget sack = client.getWidget(WidgetInfo.BLAST_FURNACE_COFFER); panelComponent.getChildren().clear(); @@ -72,10 +76,12 @@ class BlastFurnaceCofferOverlay extends Overlay { sack.setHidden(true); - panelComponent.getChildren().add(LineComponent.builder() - .left("Coffer:") - .right(StackFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp") - .build()); + tableComponent.addRow("Coffer:", StackFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp"); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } return panelComponent.render(graphics); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java index 45d63feecd..0d17c94bb7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java @@ -28,8 +28,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnacePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnacePlugin.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnacePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnacePlugin.java index f34703c382..15d602a324 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnacePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnacePlugin.java @@ -31,18 +31,18 @@ import java.time.Instant; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.GameObject; -import api.GameState; -import static api.NullObjectID.NULL_9092; -import static api.ObjectID.CONVEYOR_BELT; -import api.Skill; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import static net.runelite.api.NullObjectID.NULL_9092; +import static net.runelite.api.ObjectID.CONVEYOR_BELT; +import net.runelite.api.Skill; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/ForemanTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/ForemanTimer.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/ForemanTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/ForemanTimer.java index 5ce8230228..0a246b690c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastfurnace/ForemanTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/ForemanTimer.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.blastfurnace; import java.time.temporal.ChronoUnit; -import api.ItemID; +import net.runelite.api.ItemID; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.infobox.Timer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java index 67cece7207..8cff73bd55 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java @@ -28,12 +28,12 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.ItemID; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Varbits; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePlugin.java index bbdd5b77df..7ddc7e8a80 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePlugin.java @@ -29,15 +29,15 @@ import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.GameObject; -import api.GameState; -import api.coords.WorldPoint; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePluginConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePluginConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMinePluginConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRock.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRock.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRock.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRock.java index 126f4c2545..1f1cec4fb5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRock.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRock.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.blastmine; import java.time.Duration; import java.time.Instant; import lombok.Getter; -import api.GameObject; +import net.runelite.api.GameObject; class BlastMineRock { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockOverlay.java index 28eba0260d..92fbdfe221 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockOverlay.java @@ -32,17 +32,17 @@ import java.awt.Polygon; import java.awt.image.BufferedImage; import java.util.Map; import javax.inject.Inject; -import api.Client; -import api.GameObject; -import api.ItemID; -import api.NullObjectID; -import api.ObjectID; -import api.Perspective; -import api.Point; -import api.Tile; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.widgets.Widget; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.ItemID; +import net.runelite.api.NullObjectID; +import net.runelite.api.ObjectID; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockType.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockType.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockType.java index 47e32fcd3c..20e1d37f58 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineRockType.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.blastmine; import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; -import api.ObjectID; +import net.runelite.api.ObjectID; public enum BlastMineRockType { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostIndicator.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostIndicator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostIndicator.java index e42fc1f0b0..00a0a97561 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostIndicator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostIndicator.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.boosts; import java.awt.Color; import java.awt.image.BufferedImage; import lombok.Getter; -import api.Client; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.Skill; import net.runelite.client.ui.overlay.infobox.InfoBox; import net.runelite.client.ui.overlay.infobox.InfoBoxPriority; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java index d5d7cadba8..8443994243 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java @@ -82,11 +82,22 @@ public interface BoostsConfig extends Config return false; } + @ConfigItem( + keyName = "boldIconFont", + name = "Bold Font for Icons", + description = "", + position = 5 + ) + default boolean boldIconFont() + { + return false; + } + @ConfigItem( keyName = "displayNextBuffChange", name = "Display next buff change", description = "Configures whether or not to display when the next buffed stat change will be", - position = 5 + position = 6 ) default DisplayChangeMode displayNextBuffChange() { @@ -97,7 +108,7 @@ public interface BoostsConfig extends Config keyName = "displayNextDebuffChange", name = "Display next debuff change", description = "Configures whether or not to display when the next debuffed stat change will be", - position = 6 + position = 7 ) default DisplayChangeMode displayNextDebuffChange() { @@ -108,7 +119,7 @@ public interface BoostsConfig extends Config keyName = "boostThreshold", name = "Boost Amount Threshold", description = "The amount of levels boosted to send a notification at. A value of 0 will disable notification.", - position = 7 + position = 8 ) default int boostThreshold() { @@ -119,7 +130,7 @@ public interface BoostsConfig extends Config keyName = "groupNotifications", name = "Group Notifications", description = "Configures whether or not to group notifications for multiple skills into a single notification", - position = 8 + position = 9 ) default boolean groupNotifications() { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java index b5f537134f..54a4f62b8f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java @@ -28,16 +28,17 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Skill; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; import net.runelite.client.util.ColorUtil; class BoostsOverlay extends Overlay @@ -69,24 +70,21 @@ class BoostsOverlay extends Overlay panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + int nextChange = plugin.getChangeDownTicks(); if (nextChange != -1) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Next + restore in") - .right(String.valueOf(plugin.getChangeTime(nextChange))) - .build()); + tableComponent.addRow("Next + restore:", String.valueOf(plugin.getChangeTime(nextChange))); } nextChange = plugin.getChangeUpTicks(); if (nextChange != -1) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Next - restore in") - .right(String.valueOf(plugin.getChangeTime(nextChange))) - .build()); + tableComponent.addRow("Next - restore:", String.valueOf(plugin.getChangeTime(nextChange))); } if (plugin.canShowBoosts()) @@ -119,14 +117,12 @@ class BoostsOverlay extends Overlay + ColorUtil.prependColorTag("/" + base, Color.WHITE); } - panelComponent.getChildren().add(LineComponent.builder() - .left(skill.getName()) - .right(str) - .rightColor(strColor) - .build()); + tableComponent.addRow(skill.getName() + ":", str); } } + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java index 37202920f1..5dabff0736 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java @@ -34,14 +34,14 @@ import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; -import api.Client; -import api.Constants; -import api.Prayer; -import api.Skill; -import api.events.BoostedLevelChanged; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.GameTick; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.Prayer; +import net.runelite.api.Skill; +import net.runelite.api.events.BoostedLevelChanged; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java index 61f707d332..2e4c9c5ab9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java @@ -6,9 +6,9 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Skill; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; @@ -19,6 +19,7 @@ import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.FontManager; import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ImageUtil; @@ -50,7 +51,12 @@ class CombatIconsOverlay extends Overlay { return null; } - + + if (config.boldIconFont()) + { + graphics.setFont(FontManager.getRunescapeBoldFont()); + } + panelComponent.getChildren().clear(); panelComponent.setPreferredSize(new Dimension(28, 0)); panelComponent.setWrapping(2); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/StatChangeIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/StatChangeIndicator.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/boosts/StatChangeIndicator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/boosts/StatChangeIndicator.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java b/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java rename to runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java index bf1beb89de..f315956a1b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java @@ -29,8 +29,8 @@ import com.google.common.collect.ImmutableMap; import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Map; -import api.ItemID; -import api.NpcID; +import net.runelite.api.ItemID; +import net.runelite.api.NpcID; enum Boss { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/BossTimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/BossTimersPlugin.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/BossTimersPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/BossTimersPlugin.java index 12639c3af2..0e6b98c907 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/BossTimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/BossTimersPlugin.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.bosstimer; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.NPC; -import api.events.NpcDespawned; +import net.runelite.api.NPC; +import net.runelite.api.events.NpcDespawned; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/RespawnTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/RespawnTimer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/bosstimer/RespawnTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/RespawnTimer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java index b91924d3bf..06d0500155 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java @@ -29,11 +29,11 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import static api.Perspective.LOCAL_TILE_SIZE; -import api.Point; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import static net.runelite.api.Perspective.LOCAL_TILE_SIZE; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java index 74ee48875e..6b82e45aca 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java @@ -34,24 +34,24 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; import lombok.Getter; -import api.AnimationID; -import api.ChatMessageType; -import api.Client; -import api.GameObject; -import api.InventoryID; -import api.ItemID; -import static api.ObjectID.CANNON_BASE; -import api.Player; -import api.Projectile; -import static api.ProjectileID.CANNONBALL; -import static api.ProjectileID.GRANITE_CANNONBALL; -import api.coords.WorldPoint; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameObjectSpawned; -import api.events.GameTick; -import api.events.ItemContainerChanged; -import api.events.ProjectileMoved; +import net.runelite.api.AnimationID; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.InventoryID; +import net.runelite.api.ItemID; +import static net.runelite.api.ObjectID.CANNON_BASE; +import net.runelite.api.Player; +import net.runelite.api.Projectile; +import static net.runelite.api.ProjectileID.CANNONBALL; +import static net.runelite.api.ProjectileID.GRANITE_CANNONBALL; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.ProjectileMoved; import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java index 60e93fd2be..01c3eff871 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java @@ -32,12 +32,12 @@ import java.awt.image.BufferedImage; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Setter; -import api.Client; -import static api.ItemID.CANNONBALL; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import static net.runelite.api.ItemID.CANNONBALL; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java index 8ae99573ff..ea145942ac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java @@ -28,14 +28,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; public enum CannonSpots { BLOODVELDS(new WorldPoint(2439, 9821, 0), new WorldPoint(2448, 9821, 0), new WorldPoint(2472, 9833, 0), new WorldPoint(2453, 9817, 0)), FIRE_GIANTS(new WorldPoint(2393, 9782, 0), new WorldPoint(2412, 9776, 0), new WorldPoint(2401, 9780, 0)), - ABBERANT_SPECTRES(new WorldPoint(2456, 9791, 0)), + ABERRANT_SPECTRES(new WorldPoint(2456, 9791, 0)), HELLHOUNDS(new WorldPoint(2431, 9776, 0), new WorldPoint(2413, 9786, 0), new WorldPoint(2783, 9686, 0), new WorldPoint(3198, 10071, 0)), BLACK_DEMONS(new WorldPoint(2859, 9778, 0), new WorldPoint(2841, 9791, 0)), ELVES(new WorldPoint(2044, 4635, 0)), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java index d081e54611..354dd0edf4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java @@ -29,9 +29,9 @@ import java.util.Map; import java.util.Optional; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.NPC; -import api.NpcID; -import api.Skill; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Skill; @Getter @RequiredArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java index aa946505eb..47f1adbec4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java @@ -31,12 +31,12 @@ import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; -import api.GameState; -import api.NPC; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java index 49bcde6f12..4cc810847f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java @@ -25,13 +25,13 @@ package net.runelite.client.plugins.chatboxperformance; import javax.inject.Inject; -import api.Client; -import api.events.WidgetPositioned; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetPositionMode; -import api.widgets.WidgetSizeMode; -import api.widgets.WidgetType; +import net.runelite.api.Client; +import net.runelite.api.events.WidgetPositioned; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetSizeMode; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java index 92987467d0..835ccec71e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java @@ -110,6 +110,17 @@ public interface ChatCommandsConfig extends Config @ConfigItem( position = 7, + keyName = "duels", + name = "Duels Command", + description = "Configures whether the duel arena command is enabled
    !duels" + ) + default boolean duels() + { + return true; + } + + @ConfigItem( + position = 8, keyName = "clearShortcuts", name = "Clear shortcuts", description = "Enable shortcuts (ctrl+w and backspace) for clearing the chatbox" @@ -118,4 +129,4 @@ public interface ChatCommandsConfig extends Config { return true; } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java similarity index 86% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 210eaf5012..079f1cdba6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -25,6 +25,7 @@ */ package net.runelite.client.plugins.chatcommands; +import net.runelite.api.vars.AccountType; import com.google.inject.Provides; import java.io.IOException; import java.util.List; @@ -34,22 +35,21 @@ import java.util.regex.Pattern; import javax.inject.Inject; import lombok.Value; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.Experience; -import api.IconID; -import api.ItemDefinition; -import api.MessageNode; -import api.VarPlayer; -import api.Varbits; -import api.events.ChatMessage; -import api.events.GameTick; -import api.events.VarbitChanged; -import api.events.WidgetLoaded; -import api.vars.AccountType; -import api.widgets.Widget; -import static api.widgets.WidgetID.KILL_LOGS_GROUP_ID; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.IconID; +import net.runelite.api.ItemDefinition; +import net.runelite.api.MessageNode; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetID.KILL_LOGS_GROUP_ID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatCommandManager; import net.runelite.client.chat.ChatMessageBuilder; @@ -64,6 +64,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.util.StackFormatter; import static net.runelite.client.util.Text.sanitize; import net.runelite.http.api.chat.ChatClient; +import net.runelite.http.api.chat.Duels; import net.runelite.http.api.hiscore.HiscoreClient; import net.runelite.http.api.hiscore.HiscoreEndpoint; import net.runelite.http.api.hiscore.HiscoreResult; @@ -89,6 +90,8 @@ public class ChatCommandsPlugin extends Plugin private static final Pattern BARROWS_PATTERN = Pattern.compile("Your Barrows chest count is: (\\d+)"); private static final Pattern KILL_DURATION_PATTERN = Pattern.compile("Fight duration: [0-9:]+. Personal best: ([0-9:]+)"); private static final Pattern NEW_PB_PATTERN = Pattern.compile("Fight duration: ([0-9:]+) \\(new personal best\\)"); + private static final Pattern DUEL_ARENA_WINS_PATTERN = Pattern.compile("You (were defeated|won)! You have(?: now)? won (\\d+) duels?"); + private static final Pattern DUEL_ARENA_LOSSES_PATTERN = Pattern.compile("You have(?: now)? lost (\\d+) duels?"); private static final String TOTAL_LEVEL_COMMAND_STRING = "!total"; private static final String PRICE_COMMAND_STRING = "!price"; private static final String LEVEL_COMMAND_STRING = "!lvl"; @@ -98,6 +101,7 @@ public class ChatCommandsPlugin extends Plugin private static final String QP_COMMAND_STRING = "!qp"; private static final String GC_COMMAND_STRING = "!gc"; private static final String PB_COMMAND = "!pb"; + private static final String DUEL_ARENA_COMMAND = "!duels"; private final HiscoreClient hiscoreClient = new HiscoreClient(); private final ChatClient chatClient = new ChatClient(); @@ -148,6 +152,7 @@ public class ChatCommandsPlugin extends Plugin chatCommandManager.registerCommandAsync(QP_COMMAND_STRING, this::questPointsLookup, this::questPointsSubmit); chatCommandManager.registerCommandAsync(GC_COMMAND_STRING, this::gambleCountLookup, this::gambleCountSubmit); chatCommandManager.registerCommandAsync(PB_COMMAND, this::personalBestLookup, this::personalBestSubmit); + chatCommandManager.registerCommandAsync(DUEL_ARENA_COMMAND, this::duelArenaLookup, this::duelArenaSubmit); } @Override @@ -166,6 +171,7 @@ public class ChatCommandsPlugin extends Plugin chatCommandManager.unregisterCommand(QP_COMMAND_STRING); chatCommandManager.unregisterCommand(PB_COMMAND); chatCommandManager.unregisterCommand(GC_COMMAND_STRING); + chatCommandManager.unregisterCommand(DUEL_ARENA_COMMAND); } @Provides @@ -203,7 +209,9 @@ public class ChatCommandsPlugin extends Plugin @Subscribe public void onChatMessage(ChatMessage chatMessage) { - if (chatMessage.getType() != ChatMessageType.GAMEMESSAGE && chatMessage.getType() != ChatMessageType.SPAM) + if (chatMessage.getType() != ChatMessageType.TRADE + && chatMessage.getType() != ChatMessageType.GAMEMESSAGE + && chatMessage.getType() != ChatMessageType.SPAM) { return; } @@ -239,6 +247,43 @@ public class ChatCommandsPlugin extends Plugin return; } + matcher = DUEL_ARENA_WINS_PATTERN.matcher(message); + if (matcher.find()) + { + final int oldWins = getKc("Duel Arena Wins"); + final int wins = Integer.parseInt(matcher.group(2)); + final String result = matcher.group(1); + int winningStreak = getKc("Duel Arena Win Streak"); + int losingStreak = getKc("Duel Arena Lose Streak"); + + if (result.equals("won") && wins > oldWins) + { + losingStreak = 0; + winningStreak += 1; + } + else if (result.equals("were defeated")) + { + losingStreak += 1; + winningStreak = 0; + } + else + { + log.warn("unrecognized duel streak chat message: {}", message); + } + + setKc("Duel Arena Wins", wins); + setKc("Duel Arena Win Streak", winningStreak); + setKc("Duel Arena Lose Streak", losingStreak); + } + + matcher = DUEL_ARENA_LOSSES_PATTERN.matcher(message); + if (matcher.find()) + { + int losses = Integer.parseInt(matcher.group(1)); + + setKc("Duel Arena Losses", losses); + } + matcher = BARROWS_PATTERN.matcher(message); if (matcher.find()) { @@ -419,6 +464,96 @@ public class ChatCommandsPlugin extends Plugin client.refreshChat(); } + private boolean duelArenaSubmit(ChatInput chatInput, String value) + { + final int wins = getKc("Duel Arena Wins"); + final int losses = getKc("Duel Arena Losses"); + final int winningStreak = getKc("Duel Arena Win Streak"); + final int losingStreak = getKc("Duel Arena Lose Streak"); + + if (wins <= 0 && losses <= 0 && winningStreak <= 0 && losingStreak <= 0) + { + return false; + } + + final String playerName = client.getLocalPlayer().getName(); + + executor.execute(() -> + { + try + { + chatClient.submitDuels(playerName, wins, losses, winningStreak, losingStreak); + } + catch (Exception ex) + { + log.warn("unable to submit duels", ex); + } + finally + { + chatInput.resume(); + } + }); + + return true; + } + + private void duelArenaLookup(ChatMessage chatMessage, String message) + { + if (!config.duels()) + { + return; + } + + ChatMessageType type = chatMessage.getType(); + + final String player; + if (type == ChatMessageType.PRIVATECHATOUT) + { + player = client.getLocalPlayer().getName(); + } + else + { + player = sanitize(chatMessage.getName()); + } + + Duels duels; + try + { + duels = chatClient.getDuels(player); + } + catch (IOException ex) + { + log.debug("unable to lookup duels", ex); + return; + } + + final int wins = duels.getWins(); + final int losses = duels.getLosses(); + final int winningStreak = duels.getWinningStreak(); + final int losingStreak = duels.getLosingStreak(); + + String response = new ChatMessageBuilder() + .append(ChatColorType.NORMAL) + .append("Duel Arena wins: ") + .append(ChatColorType.HIGHLIGHT) + .append(Integer.toString(wins)) + .append(ChatColorType.NORMAL) + .append(" losses: ") + .append(ChatColorType.HIGHLIGHT) + .append(Integer.toString(losses)) + .append(ChatColorType.NORMAL) + .append(" streak: ") + .append(ChatColorType.HIGHLIGHT) + .append(Integer.toString((winningStreak != 0 ? winningStreak : -losingStreak))) + .build(); + + log.debug("Setting response {}", response); + final MessageNode messageNode = chatMessage.getMessageNode(); + messageNode.setRuneLiteFormatMessage(response); + chatMessageManager.update(messageNode); + client.refreshChat(); + } + private void questPointsLookup(ChatMessage chatMessage, String message) { if (!config.qp()) @@ -507,23 +642,23 @@ public class ChatCommandsPlugin extends Plugin } int gc; -// try + try { -// TODO gc = chatClient.getGc(player); + gc = chatClient.getGc(player); log.info("gc lookup"); } -// catch (IOException ex) + catch (IOException ex) { -// log.debug("unable to lookup gamble count", ex); + log.debug("unable to lookup gamble count", ex); log.info("gc lookup error"); -// return; + return; } String response = new ChatMessageBuilder() .append(ChatColorType.NORMAL) .append("Barbarian Assault High-level gambles: ") .append(ChatColorType.HIGHLIGHT) - // .append(Integer.toString(gc)) + .append(Integer.toString(gc)) .build(); log.debug("Setting response {}", response); @@ -542,7 +677,7 @@ public class ChatCommandsPlugin extends Plugin { try { - // chatClient.submitGc(playerName, gc); + chatClient.submitGc(playerName, gc); } catch (Exception ex) { @@ -1231,4 +1366,4 @@ public class ChatCommandsPlugin extends Plugin return WordUtils.capitalize(boss); } } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java index e2cef2bceb..dc9c1fffe1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java @@ -27,9 +27,9 @@ package net.runelite.client.plugins.chatcommands; import java.awt.event.KeyEvent; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import api.ScriptID; -import api.VarClientStr; +import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientStr; import net.runelite.client.callback.ClientThread; import net.runelite.client.input.KeyListener; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/SkillAbbreviations.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/SkillAbbreviations.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/SkillAbbreviations.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/SkillAbbreviations.java index bc7baa40ff..754c2f869e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatcommands/SkillAbbreviations.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/SkillAbbreviations.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.chatcommands; import com.google.common.collect.ImmutableMap; import java.util.Map; -import api.Skill; +import net.runelite.api.Skill; class SkillAbbreviations { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java index dfb42ba7c3..8413b0e67a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java @@ -34,13 +34,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import javax.inject.Inject; -import api.ChatMessageType; -import api.Client; -import api.MessageNode; -import api.Player; -import api.events.ConfigChanged; -import api.events.OverheadTextChanged; -import api.events.ScriptCallbackEvent; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.MessageNode; +import net.runelite.api.Player; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.OverheadTextChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -113,14 +113,17 @@ public class ChatFilterPlugin extends Plugin case PRIVATECHAT: case MODPRIVATECHAT: case FRIENDSCHAT: + case GAMEMESSAGE: break; default: return; } MessageNode messageNode = (MessageNode) client.getMessages().get(messageId); - String name = messageNode.getName(); - if (!shouldFilterPlayerMessage(name)) + + if (client.getLocalPlayer().getName().equals(messageNode.getName()) || + !config.filterFriends() && messageNode.isFromFriend() || + !config.filterClan() && messageNode.isFromClanMate()) { return; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterType.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java index aba6eabac3..d6ed9d888d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java @@ -32,14 +32,14 @@ import java.util.Deque; import java.util.Iterator; import java.util.Queue; import javax.inject.Inject; -import api.ChatMessageType; -import api.Client; -import api.ScriptID; -import api.VarClientInt; -import api.VarClientStr; -import api.events.ChatMessage; -import api.events.MenuOptionClicked; -import api.vars.InputType; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.vars.InputType; import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.QueuedMessage; @@ -168,7 +168,7 @@ public class ChatHistoryPlugin extends Plugin implements KeyListener @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - String menuOption = event.getMenuOption(); + String menuOption = event.getOption(); if (menuOption.contains(CLEAR_HISTORY)) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsConfig.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsConfig.java index ff1c45e2e9..929c7caa03 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsConfig.java @@ -97,4 +97,15 @@ public interface ChatNotificationsConfig extends Config { return false; } + + @ConfigItem( + position = 6, + keyName = "notifyOnPm", + name = "Notify on private messsage", + description = "Notifies you whenever a private message was received" + ) + default boolean notifyOnPm() + { + return false; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java similarity index 83% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java index 74554b5db1..0f9f000b28 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java @@ -27,17 +27,20 @@ package net.runelite.client.plugins.chatnotifications; import com.google.common.base.Strings; import com.google.inject.Provides; + +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import static java.util.regex.Pattern.quote; import java.util.stream.Collectors; import javax.inject.Inject; -import api.Client; -import api.MessageNode; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.MessageNode; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.Notifier; import net.runelite.client.RuneLiteProperties; import net.runelite.client.chat.ChatColorType; @@ -76,6 +79,9 @@ public class ChatNotificationsPlugin extends Plugin private String usernameReplacer = ""; private Pattern highlightMatcher = null; + // Private message cache used to avoid duplicate notifications from ChatHistory. + private Set privateMessageHashes = new HashSet<>(); + @Provides ChatNotificationsConfig provideConfig(ConfigManager configManager) { @@ -88,6 +94,12 @@ public class ChatNotificationsPlugin extends Plugin updateHighlights(); } + @Override + public void shutDown() + { + this.privateMessageHashes.clear(); + } + @Subscribe public void onGameStateChanged(GameStateChanged event) { @@ -117,9 +129,12 @@ public class ChatNotificationsPlugin extends Plugin { List items = Text.fromCSV(config.highlightWordsString()); String joined = items.stream() + .map(Text::escapeJagex) // we compare these strings to the raw Jagex ones .map(Pattern::quote) .collect(Collectors.joining("|")); - highlightMatcher = Pattern.compile("\\b(" + joined + ")\\b", Pattern.CASE_INSENSITIVE); + // To match \b doesn't work due to <> not being in \w, + // so match \b or \s + highlightMatcher = Pattern.compile("(?:\\b|(?<=\\s))(" + joined + ")(?:\\b|(?=\\s))", Pattern.CASE_INSENSITIVE); } } @@ -127,7 +142,6 @@ public class ChatNotificationsPlugin extends Plugin public void onChatMessage(ChatMessage chatMessage) { MessageNode messageNode = chatMessage.getMessageNode(); - String nodeValue = Text.removeTags(messageNode.getValue()); boolean update = false; switch (chatMessage.getType()) @@ -151,6 +165,19 @@ public class ChatNotificationsPlugin extends Plugin return; } break; + case PRIVATECHAT: + case MODPRIVATECHAT: + if (config.notifyOnPm()) + { + int messageHash = this.buildMessageHash(chatMessage); + if (this.privateMessageHashes.contains(messageHash)) + { + return; + } + this.privateMessageHashes.add(messageHash); + notifier.notify("Private message received from " + chatMessage.getName()); + } + break; } if (usernameMatcher == null && client.getLocalPlayer() != null && client.getLocalPlayer().getName() != null) @@ -177,6 +204,7 @@ public class ChatNotificationsPlugin extends Plugin if (highlightMatcher != null) { + String nodeValue = messageNode.getValue(); Matcher matcher = highlightMatcher.matcher(nodeValue); boolean found = false; StringBuffer stringBuffer = new StringBuffer(); @@ -208,6 +236,11 @@ public class ChatNotificationsPlugin extends Plugin } } + private int buildMessageHash(ChatMessage message) + { + return (message.getName() + message.getMessage()).hashCode(); + } + private void sendNotification(ChatMessage message) { String name = Text.removeTags(message.getName()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanActivityType.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanActivityType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanActivityType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanActivityType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java index a1f8d80871..12476cc675 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.clanchat; -import api.ClanMemberRank; +import net.runelite.api.ClanMemberRank; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; @@ -137,4 +137,15 @@ public interface ClanChatConfig extends Config { return false; } + + @ConfigItem( + position = 9, + keyName = "clanname", + name = "Default Clan Name", + description = "Clan name to always remember" + ) + default String clanname() + { + return ""; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatIndicator.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatIndicator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatIndicator.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index a856aaa343..8e053922dd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -40,34 +40,35 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Inject; -import api.ChatLineBuffer; -import api.ChatMessageType; -import api.ClanMember; -import api.ClanMemberRank; -import api.Client; -import api.GameState; -import api.MessageNode; -import api.Player; -import api.ScriptID; -import api.SpriteID; -import api.VarClientStr; -import api.Varbits; -import api.events.ChatMessage; -import api.events.ClanChanged; -import api.events.ClanMemberJoined; -import api.events.ClanMemberLeft; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.PlayerDespawned; -import api.events.PlayerSpawned; -import api.events.ScriptCallbackEvent; -import api.events.VarClientStrChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetType; +import net.runelite.api.ChatLineBuffer; +import net.runelite.api.ChatMessageType; +import net.runelite.api.ClanMember; +import net.runelite.api.ClanMemberRank; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.MessageNode; +import net.runelite.api.Player; +import net.runelite.api.ScriptID; +import net.runelite.api.SpriteID; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ClanChanged; +import net.runelite.api.events.ClanMemberJoined; +import net.runelite.api.events.ClanMemberLeft; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.PlayerDespawned; +import net.runelite.api.events.PlayerSpawned; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.VarClientStrChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatMessageBuilder; +import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ClanManager; @@ -111,6 +112,9 @@ public class ClanChatPlugin extends Plugin @Inject private ClientThread clientThread; + + @Inject + private ChatMessageManager chatMessageManager; private List chats = new ArrayList<>(); @@ -267,6 +271,8 @@ public class ClanChatPlugin extends Plugin return; } + client.setVar(VarClientStr.RECENT_CLAN_CHAT, config.clanname()); + Widget clanChatTitleWidget = client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); if (clanChatTitleWidget != null) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanJoinMessage.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanJoinMessage.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanJoinMessage.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanJoinMessage.java index fa114d7e14..8ac0b0069b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanJoinMessage.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanJoinMessage.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.clanchat; import lombok.Value; -import api.MessageNode; +import net.runelite.api.MessageNode; @Value class ClanJoinMessage diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanMemberActivity.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanMemberActivity.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanMemberActivity.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanMemberActivity.java index 2af5f17d7d..1cea036a95 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanchat/ClanMemberActivity.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanMemberActivity.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.clanchat; import lombok.AllArgsConstructor; import lombok.Value; -import api.ClanMember; +import net.runelite.api.ClanMember; @Value @AllArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeMinimapOverlay.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeMinimapOverlay.java index 020371fb47..be94ee06f3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeMinimapOverlay.java @@ -5,7 +5,7 @@ import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; import javax.inject.Singleton; -import api.Player; +import net.runelite.api.Player; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -41,7 +41,7 @@ public class ClanManModeMinimapOverlay extends Overlay if (config.drawMinimapNames()) { - final api.Point minimapLocation = actor.getMinimapLocation(); + final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); if (minimapLocation != null) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeOverlay.java index 832d1efe95..4cfc1cd6ad 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModeOverlay.java @@ -5,8 +5,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; import javax.inject.Singleton; -import api.Player; -import api.Point; +import net.runelite.api.Player; +import net.runelite.api.Point; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModePlugin.java similarity index 69% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModePlugin.java index e230b3ec82..65f6bbe8a2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanmanmode/ClanManModePlugin.java @@ -4,27 +4,21 @@ import com.google.inject.Provides; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.MenuEntry; -import api.Player; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.MenuEntryAdded; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.game.ClanManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.overlay.OverlayManager; -import net.runelite.client.util.Text; -import org.apache.commons.lang3.ArrayUtils; @PluginDescriptor( name = "Clan Man Mode", @@ -33,6 +27,7 @@ import org.apache.commons.lang3.ArrayUtils; type = PluginType.PVP, enabledByDefault = false ) + public class ClanManModePlugin extends Plugin { @Inject @@ -53,9 +48,6 @@ public class ClanManModePlugin extends Plugin @Inject private Client client; - @Inject - private ClanManager clanManager; - @Provides ClanManModeConfig provideConfig(ConfigManager configManager) { @@ -75,6 +67,7 @@ public class ClanManModePlugin extends Plugin overlayManager.add(ClanManModeOverlay); overlayManager.add(ClanManModeTileOverlay); overlayManager.add(ClanManModeMinimapOverlay); + client.setHideFriendAttackOptions(config.hideAtkOpt()); } @Override @@ -83,6 +76,7 @@ public class ClanManModePlugin extends Plugin overlayManager.remove(ClanManModeOverlay); overlayManager.remove(ClanManModeTileOverlay); overlayManager.remove(ClanManModeMinimapOverlay); + client.setHideFriendAttackOptions(false); clan.clear(); ticks = 0; wildernessLevel = 0; @@ -91,6 +85,17 @@ public class ClanManModePlugin extends Plugin inwildy = 0; } + @Subscribe + private void onConfigChanged(ConfigChanged event) + { + if (!"clanmanmode".equals(event.getGroup())) + { + return; + } + + client.setHideFriendAttackOptions(config.hideAtkOpt()); + } + @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { @@ -120,39 +125,4 @@ public class ClanManModePlugin extends Plugin clanmax = Collections.max(clan.values()); } } - - @Subscribe - public void onMenuEntryAdded(MenuEntryAdded event) - { - if (!config.hideAtkOpt()) - { - return; - } - if (client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - final String option = Text.removeTags(event.getOption()).toLowerCase(); - - if (option.equals("attack")) - { - final Pattern ppattern = Pattern.compile("(.+?) 0) { Client client = plugin.getClient(); - client.runScript(ScriptID.WATSON_STASH_UNIT_CHECK, stashUnit.getObjectId(), 0, 0, 0); - int[] intStack = client.getIntStack(); - boolean stashUnitBuilt = intStack[0] == 1; - panelComponent.getChildren().add(LineComponent.builder() - .left("STASH Unit:") - .right(stashUnitBuilt ? UNICODE_CHECK_MARK : UNICODE_BALLOT_X) - .rightColor(stashUnitBuilt ? Color.GREEN : Color.RED) - .build()); + if (stashUnit != null) + { + client.runScript(ScriptID.WATSON_STASH_UNIT_CHECK, stashUnit.getObjectId(), 0, 0, 0); + int[] intStack = client.getIntStack(); + boolean stashUnitBuilt = intStack[0] == 1; + + panelComponent.getChildren().add(LineComponent.builder() + .left("STASH Unit:") + .right(stashUnitBuilt ? UNICODE_CHECK_MARK : UNICODE_BALLOT_X) + .rightColor(stashUnitBuilt ? Color.GREEN : Color.RED) + .build()); + } panelComponent.getChildren().add(LineComponent.builder().left("Equip:").build()); @@ -312,18 +318,21 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localPoint, plugin.getEmoteImage(), Color.ORANGE); } - final WorldPoint[] worldPoints = stashUnit.getWorldPoints(); - - for (final WorldPoint worldPoint : worldPoints) + if (stashUnit != null) { - final LocalPoint stashUnitLocalPoint = LocalPoint.fromWorld(plugin.getClient(), worldPoint); + final WorldPoint[] worldPoints = stashUnit.getWorldPoints(); - if (stashUnitLocalPoint != null) + for (final WorldPoint worldPoint : worldPoints) { - final Polygon poly = Perspective.getCanvasTilePoly(plugin.getClient(), stashUnitLocalPoint); - if (poly != null) + final LocalPoint stashUnitLocalPoint = LocalPoint.fromWorld(plugin.getClient(), worldPoint); + + if (stashUnitLocalPoint != null) { - OverlayUtil.renderPolygon(graphics, poly, Color.RED); + final Polygon poly = Perspective.getCanvasTilePoly(plugin.getClient(), stashUnitLocalPoint); + if (poly != null) + { + OverlayUtil.renderPolygon(graphics, poly, Color.RED); + } } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java index 50be357242..6fc915db54 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java @@ -29,8 +29,8 @@ import java.awt.Color; import java.awt.Graphics2D; import java.util.Set; import lombok.Getter; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import net.runelite.client.ui.overlay.OverlayUtil; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java similarity index 78% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java index 11c9d1b73a..001a2e0947 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java @@ -30,38 +30,38 @@ import java.awt.Graphics2D; import java.util.List; import javax.annotation.Nonnull; import lombok.Getter; -import api.Item; -import static api.ItemID.ARMADYL_HELMET; -import static api.ItemID.BARRELCHEST_ANCHOR; -import static api.ItemID.BARROWS_GLOVES; -import static api.ItemID.BASALT; -import static api.ItemID.BOOK_OF_BALANCE; -import static api.ItemID.BOOK_OF_DARKNESS; -import static api.ItemID.BOOK_OF_LAW; -import static api.ItemID.BOOK_OF_WAR; -import static api.ItemID.COOKING_GAUNTLETS; -import static api.ItemID.CRYSTAL_BOW_110; -import static api.ItemID.CRYSTAL_BOW_110_I; -import static api.ItemID.DRAGON_DEFENDER; -import static api.ItemID.DRAGON_SCIMITAR; -import static api.ItemID.FIGHTER_TORSO; -import static api.ItemID.GREENMANS_ALEM; -import static api.ItemID.HOLY_BOOK; -import static api.ItemID.INFERNAL_AXE; -import static api.ItemID.IVANDIS_FLAIL; -import static api.ItemID.LAVA_DRAGON_BONES; -import static api.ItemID.MARK_OF_GRACE; -import static api.ItemID.NEW_CRYSTAL_BOW; -import static api.ItemID.NEW_CRYSTAL_BOW_I; -import static api.ItemID.NUMULITE; -import static api.ItemID.ROD_OF_IVANDIS_1; -import static api.ItemID.ROD_OF_IVANDIS_10; -import static api.ItemID.RUNE_PLATEBODY; -import static api.ItemID.TZHAARKETOM; -import static api.ItemID.UNHOLY_BOOK; -import static api.ItemID.WARRIOR_GUILD_TOKEN; -import api.NPC; -import api.coords.WorldPoint; +import net.runelite.api.Item; +import static net.runelite.api.ItemID.ARMADYL_HELMET; +import static net.runelite.api.ItemID.BARRELCHEST_ANCHOR; +import static net.runelite.api.ItemID.BARROWS_GLOVES; +import static net.runelite.api.ItemID.BASALT; +import static net.runelite.api.ItemID.BOOK_OF_BALANCE; +import static net.runelite.api.ItemID.BOOK_OF_DARKNESS; +import static net.runelite.api.ItemID.BOOK_OF_LAW; +import static net.runelite.api.ItemID.BOOK_OF_WAR; +import static net.runelite.api.ItemID.COOKING_GAUNTLETS; +import static net.runelite.api.ItemID.CRYSTAL_BOW_110; +import static net.runelite.api.ItemID.CRYSTAL_BOW_110_I; +import static net.runelite.api.ItemID.DRAGON_DEFENDER; +import static net.runelite.api.ItemID.DRAGON_SCIMITAR; +import static net.runelite.api.ItemID.FIGHTER_TORSO; +import static net.runelite.api.ItemID.GREENMANS_ALEM; +import static net.runelite.api.ItemID.HOLY_BOOK; +import static net.runelite.api.ItemID.INFERNAL_AXE; +import static net.runelite.api.ItemID.IVANDIS_FLAIL; +import static net.runelite.api.ItemID.LAVA_DRAGON_BONES; +import static net.runelite.api.ItemID.MARK_OF_GRACE; +import static net.runelite.api.ItemID.NEW_CRYSTAL_BOW; +import static net.runelite.api.ItemID.NEW_CRYSTAL_BOW_I; +import static net.runelite.api.ItemID.NUMULITE; +import static net.runelite.api.ItemID.ROD_OF_IVANDIS_1; +import static net.runelite.api.ItemID.ROD_OF_IVANDIS_10; +import static net.runelite.api.ItemID.RUNE_PLATEBODY; +import static net.runelite.api.ItemID.TZHAARKETOM; +import static net.runelite.api.ItemID.UNHOLY_BOOK; +import static net.runelite.api.ItemID.WARRIOR_GUILD_TOKEN; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; @@ -79,7 +79,7 @@ public class FaloTheBardClue extends ClueScroll implements TextClueScroll, NpcCl { private static final List CLUES = ImmutableList.of( new FaloTheBardClue("A blood red weapon, a strong curved sword, found on the island of primate lords.", item(DRAGON_SCIMITAR)), - new FaloTheBardClue("A book that preaches of some great figure, lending strength, might, and vigour.", any("Any god book (must be complete)", item(HOLY_BOOK), item(BOOK_OF_BALANCE), item(UNHOLY_BOOK), item(BOOK_OF_LAW), item(BOOK_OF_WAR), item(BOOK_OF_DARKNESS))), + new FaloTheBardClue("A book that preaches of some great figure, lending strength, might and vigour.", any("Any god book (must be complete)", item(HOLY_BOOK), item(BOOK_OF_BALANCE), item(UNHOLY_BOOK), item(BOOK_OF_LAW), item(BOOK_OF_WAR), item(BOOK_OF_DARKNESS))), new FaloTheBardClue("A bow of elven craft was made, it shimmers bright, but will soon fade.", any("Crystal Bow", range(NEW_CRYSTAL_BOW, CRYSTAL_BOW_110), range(NEW_CRYSTAL_BOW_I, CRYSTAL_BOW_110_I))), new FaloTheBardClue("A fiery axe of great inferno, when you use it, you'll wonder where the logs go.", item(INFERNAL_AXE)), new FaloTheBardClue("A mark used to increase one's grace, found atop a seer's place.", item(MARK_OF_GRACE)), @@ -87,11 +87,11 @@ public class FaloTheBardClue extends ClueScroll implements TextClueScroll, NpcCl new FaloTheBardClue("A shiny helmet of flight, to obtain this with melee, struggle you might.", item(ARMADYL_HELMET)), // The wiki doesn't specify whether the trimmed dragon defender will work so I've assumed that it doesn't new FaloTheBardClue("A sword held in the other hand, red its colour, Cyclops strength you must withstand.", item(DRAGON_DEFENDER)), - new FaloTheBardClue("A token used to kill mythical beasts, in hope of a blade or just for an xp feast.", item(WARRIOR_GUILD_TOKEN)), - new FaloTheBardClue("Green is my favorite, mature ale I do love, this takes your herblore above.", item(GREENMANS_ALEM)), + new FaloTheBardClue("A token used to kill mythical beasts, in hopes of a blade or just for an xp feast.", item(WARRIOR_GUILD_TOKEN)), + new FaloTheBardClue("Green is my favourite, mature ale I do love, this takes your herblore above.", item(GREENMANS_ALEM)), new FaloTheBardClue("It can hold down a boat or crush a goat, this object, you see, is quite heavy.", item(BARRELCHEST_ANCHOR)), new FaloTheBardClue("It comes from the ground, underneath the snowy plain. Trolls aplenty, with what looks like a mane.", item(BASALT)), - new FaloTheBardClue("No attack to wield, only strength is required, made of obsidian but with no room for a shield.", item(TZHAARKETOM)), + new FaloTheBardClue("No attack to wield, only strength is required, made of obsidian, but with no room for a shield.", item(TZHAARKETOM)), new FaloTheBardClue("Penance healers runners and more, obtaining this body often gives much deplore.", item(FIGHTER_TORSO)), new FaloTheBardClue("Strangely found in a chest, many believe these gloves are the best.", item(BARROWS_GLOVES)), new FaloTheBardClue("These gloves of white won't help you fight, but aid in cooking, they just might.", item(COOKING_GAUNTLETS)), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java index ce0fcc23d5..762bda9ad9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java @@ -39,9 +39,9 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import lombok.Getter; -import api.NPC; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.NPC; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationClueScroll.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationClueScroll.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationClueScroll.java index cdee3bcdbb..323e0a498e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationClueScroll.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationClueScroll.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.cluescrolls.clues; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; public interface LocationClueScroll { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationsClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationsClueScroll.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationsClueScroll.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationsClueScroll.java index 2a9eef8f50..eff9d9efd7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationsClueScroll.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/LocationsClueScroll.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.cluescrolls.clues; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; public interface LocationsClueScroll { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java index 2dc35f30a7..0d1793d656 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java @@ -29,16 +29,16 @@ import java.awt.Color; import java.awt.Graphics2D; import java.util.Set; import lombok.Getter; -import static api.ItemID.*; -import api.ObjectDefinition; -import static api.ObjectID.CRATE_18506; -import static api.ObjectID.CRATE_2620; -import static api.ObjectID.CRATE_354; -import static api.ObjectID.CRATE_357; -import static api.ObjectID.CRATE_6616; -import api.TileObject; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import static net.runelite.api.ItemID.*; +import net.runelite.api.ObjectDefinition; +import static net.runelite.api.ObjectID.CRATE_18506; +import static net.runelite.api.ObjectID.CRATE_2620; +import static net.runelite.api.ObjectID.CRATE_354; +import static net.runelite.api.ObjectID.CRATE_357; +import static net.runelite.api.ObjectID.CRATE_6616; +import net.runelite.api.TileObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_BORDER_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_FILL_COLOR; @@ -169,7 +169,7 @@ public class MapClue extends ClueScroll implements ObjectClueScroll // Mark game object if (objectId != -1) { - api.Point mousePosition = plugin.getClient().getMouseCanvasPosition(); + net.runelite.api.Point mousePosition = plugin.getClient().getMouseCanvasPosition(); if (plugin.getObjectsToMark() != null) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java index e819584e1c..ad552f841f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java @@ -31,8 +31,8 @@ import java.util.regex.Pattern; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; -import api.NPC; -import api.coords.WorldPoint; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java index 72dc252318..34d036ae5a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java @@ -32,13 +32,13 @@ import java.util.List; import java.util.Map; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.Client; -import api.InventoryID; -import static api.ItemID.TORN_CLUE_SCROLL_PART_1; -import static api.ItemID.TORN_CLUE_SCROLL_PART_2; -import static api.ItemID.TORN_CLUE_SCROLL_PART_3; -import api.coords.WorldPoint; -import api.events.ItemContainerChanged; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import static net.runelite.api.ItemID.TORN_CLUE_SCROLL_PART_1; +import static net.runelite.api.ItemID.TORN_CLUE_SCROLL_PART_2; +import static net.runelite.api.ItemID.TORN_CLUE_SCROLL_PART_3; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.game.ItemManager; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AllRequirementsCollection.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AllRequirementsCollection.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AllRequirementsCollection.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AllRequirementsCollection.java index 091a1ae20f..2efe470b84 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AllRequirementsCollection.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AllRequirementsCollection.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.cluescrolls.clues.emote; -import api.Client; -import api.Item; +import net.runelite.api.Client; +import net.runelite.api.Item; public class AllRequirementsCollection implements ItemRequirement { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AnyRequirementCollection.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AnyRequirementCollection.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AnyRequirementCollection.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AnyRequirementCollection.java index 77f85bdde5..02a713f7b0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AnyRequirementCollection.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/AnyRequirementCollection.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.cluescrolls.clues.emote; -import api.Client; -import api.Item; +import net.runelite.api.Client; +import net.runelite.api.Item; public class AnyRequirementCollection implements ItemRequirement { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/Emote.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/Emote.java similarity index 65% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/Emote.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/Emote.java index cc27663921..3110fab866 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/Emote.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/Emote.java @@ -25,33 +25,33 @@ package net.runelite.client.plugins.cluescrolls.clues.emote; import lombok.Getter; -import static api.SpriteID.EMOTE_ANGRY; -import static api.SpriteID.EMOTE_BECKON; -import static api.SpriteID.EMOTE_BLOW_KISS; -import static api.SpriteID.EMOTE_BOW; -import static api.SpriteID.EMOTE_CHEER; -import static api.SpriteID.EMOTE_CLAP; -import static api.SpriteID.EMOTE_CRY; -import static api.SpriteID.EMOTE_DANCE; -import static api.SpriteID.EMOTE_FLAP; -import static api.SpriteID.EMOTE_GOBLIN_SALUTE; -import static api.SpriteID.EMOTE_HEADBANG; -import static api.SpriteID.EMOTE_JIG; -import static api.SpriteID.EMOTE_JUMP_FOR_JOY; -import static api.SpriteID.EMOTE_LAUGH; -import static api.SpriteID.EMOTE_NO; -import static api.SpriteID.EMOTE_PANIC; -import static api.SpriteID.EMOTE_PUSH_UP; -import static api.SpriteID.EMOTE_RASPBERRY; -import static api.SpriteID.EMOTE_SALUTE; -import static api.SpriteID.EMOTE_SHRUG; -import static api.SpriteID.EMOTE_SLAP_HEAD; -import static api.SpriteID.EMOTE_SPIN; -import static api.SpriteID.EMOTE_STOMP; -import static api.SpriteID.EMOTE_THINK; -import static api.SpriteID.EMOTE_WAVE; -import static api.SpriteID.EMOTE_YAWN; -import static api.SpriteID.EMOTE_YES; +import static net.runelite.api.SpriteID.EMOTE_ANGRY; +import static net.runelite.api.SpriteID.EMOTE_BECKON; +import static net.runelite.api.SpriteID.EMOTE_BLOW_KISS; +import static net.runelite.api.SpriteID.EMOTE_BOW; +import static net.runelite.api.SpriteID.EMOTE_CHEER; +import static net.runelite.api.SpriteID.EMOTE_CLAP; +import static net.runelite.api.SpriteID.EMOTE_CRY; +import static net.runelite.api.SpriteID.EMOTE_DANCE; +import static net.runelite.api.SpriteID.EMOTE_FLAP; +import static net.runelite.api.SpriteID.EMOTE_GOBLIN_SALUTE; +import static net.runelite.api.SpriteID.EMOTE_HEADBANG; +import static net.runelite.api.SpriteID.EMOTE_JIG; +import static net.runelite.api.SpriteID.EMOTE_JUMP_FOR_JOY; +import static net.runelite.api.SpriteID.EMOTE_LAUGH; +import static net.runelite.api.SpriteID.EMOTE_NO; +import static net.runelite.api.SpriteID.EMOTE_PANIC; +import static net.runelite.api.SpriteID.EMOTE_PUSH_UP; +import static net.runelite.api.SpriteID.EMOTE_RASPBERRY; +import static net.runelite.api.SpriteID.EMOTE_SALUTE; +import static net.runelite.api.SpriteID.EMOTE_SHRUG; +import static net.runelite.api.SpriteID.EMOTE_SLAP_HEAD; +import static net.runelite.api.SpriteID.EMOTE_SPIN; +import static net.runelite.api.SpriteID.EMOTE_STOMP; +import static net.runelite.api.SpriteID.EMOTE_THINK; +import static net.runelite.api.SpriteID.EMOTE_WAVE; +import static net.runelite.api.SpriteID.EMOTE_YAWN; +import static net.runelite.api.SpriteID.EMOTE_YES; @Getter public enum Emote diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/ItemRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/ItemRequirement.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/ItemRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/ItemRequirement.java index 4975ae9ab6..ba70f45871 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/ItemRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/ItemRequirement.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.cluescrolls.clues.emote; -import api.Client; -import api.Item; +import net.runelite.api.Client; +import net.runelite.api.Item; public interface ItemRequirement { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/RangeItemRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/RangeItemRequirement.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/RangeItemRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/RangeItemRequirement.java index b4582fbb00..92d1f14de8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/RangeItemRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/RangeItemRequirement.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.cluescrolls.clues.emote; -import api.Client; -import api.Item; +import net.runelite.api.Client; +import net.runelite.api.Item; public class RangeItemRequirement implements ItemRequirement { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java index c34197bc69..8e196c421c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java @@ -25,8 +25,8 @@ package net.runelite.client.plugins.cluescrolls.clues.emote; import lombok.Getter; -import api.NullObjectID; -import api.coords.WorldPoint; +import net.runelite.api.NullObjectID; +import net.runelite.api.coords.WorldPoint; @Getter public enum STASHUnit @@ -96,7 +96,7 @@ public enum STASHUnit VOLCANO_IN_THE_NORTHEASTERN_WILDERNESS(NullObjectID.NULL_29020, new WorldPoint(3368, 3930, 0)), IN_THE_MIDDLE_OF_JIGGIG(NullObjectID.NULL_29021, new WorldPoint(2478, 3048, 0)), AGILITY_PYRAMID(NullObjectID.NULL_29022, new WorldPoint(3357, 2830, 0)), - HOSIDIUS_MESS(NullObjectID.NULL_29023, new WorldPoint(1648, 3631, 0)), + HOSIDIUS_MESS(NullObjectID.NULL_29023, new WorldPoint(1646, 3632, 0)), CHAPEL_IN_WEST_ARDOUGNE(NullObjectID.NULL_29024, new WorldPoint(2527, 3294, 0)), NEAR_A_RUNITE_ROCK_IN_THE_FREMENNIK_ISLES(NullObjectID.NULL_29025, new WorldPoint(2374, 3847, 0)), NEAR_A_LADDER_IN_THE_WILDERNESS_LAVA_MAZE(NullObjectID.NULL_29026, new WorldPoint(3069, 3862, 0)), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SingleItemRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SingleItemRequirement.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SingleItemRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SingleItemRequirement.java index d7e3775631..834fbe7739 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SingleItemRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SingleItemRequirement.java @@ -24,9 +24,9 @@ */ package net.runelite.client.plugins.cluescrolls.clues.emote; -import api.Client; -import api.Item; -import api.ItemDefinition; +import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; public class SingleItemRequirement implements ItemRequirement { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SlotLimitationRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SlotLimitationRequirement.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SlotLimitationRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SlotLimitationRequirement.java index c7fb57eb80..1fae03dde5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SlotLimitationRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/SlotLimitationRequirement.java @@ -24,9 +24,9 @@ */ package net.runelite.client.plugins.cluescrolls.clues.emote; -import api.Client; -import api.EquipmentInventorySlot; -import api.Item; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.Item; public class SlotLimitationRequirement implements ItemRequirement { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdArea.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdArea.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdArea.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdArea.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java similarity index 68% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java index 58a0f42f37..e41fd5357e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java @@ -29,7 +29,7 @@ import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import lombok.AllArgsConstructor; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea.ASGARNIA; import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea.DESERT; import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea.FELDIP_HILLS; @@ -51,127 +51,127 @@ import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea. @Getter public enum HotColdLocation { - ASGARNIA_WARRIORS(new WorldPoint(2860, 3562, 0), ASGARNIA, "North of the Warriors' Guild in Burthorpe."), - ASGARNIA_JATIX(new WorldPoint(2914, 3429, 0), ASGARNIA, "East of Jatix's Herblore Shop in Taverley."), - ASGARNIA_BARB(new WorldPoint(3036, 3439, 0), ASGARNIA, "West of Barbarian Village."), - ASGARNIA_MIAZRQA(new WorldPoint(2973, 3489, 0), ASGARNIA, "North of Miazrqa's tower, outside Goblin Village."), - ASGARNIA_COW(new WorldPoint(3033, 3308, 0), ASGARNIA, "In the cow pen north of Sarah's Farming Shop."), - ASGARNIA_PARTY_ROOM(new WorldPoint(3026, 3363, 0), ASGARNIA, "Outside the Falador Party Room."), - ASGARNIA_CRAFT_GUILD(new WorldPoint(2917, 3295, 0), ASGARNIA, "Outside the Crafting Guild cow pen."), - ASGARNIA_RIMMINGTON(new WorldPoint(2978, 3241, 0), ASGARNIA, "In the centre of the Rimmington mine."), + ASGARNIA_WARRIORS(new WorldPoint(2860, 3562, 0), ASGARNIA, "North of the Warriors' Guild in Burthorpe."), + ASGARNIA_JATIX(new WorldPoint(2914, 3429, 0), ASGARNIA, "East of Jatix's Herblore Shop in Taverley."), + ASGARNIA_BARB(new WorldPoint(3036, 3439, 0), ASGARNIA, "West of Barbarian Village."), + ASGARNIA_MIAZRQA(new WorldPoint(2973, 3489, 0), ASGARNIA, "North of Miazrqa's tower, outside Goblin Village."), + ASGARNIA_COW(new WorldPoint(3033, 3308, 0), ASGARNIA, "In the cow pen north of Sarah's Farming Shop."), + ASGARNIA_PARTY_ROOM(new WorldPoint(3026, 3363, 0), ASGARNIA, "Outside the Falador Party Room."), + ASGARNIA_CRAFT_GUILD(new WorldPoint(2917, 3295, 0), ASGARNIA, "Outside the Crafting Guild cow pen."), + ASGARNIA_RIMMINGTON(new WorldPoint(2978, 3241, 0), ASGARNIA, "In the centre of the Rimmington mine."), ASGARNIA_MUDSKIPPER(new WorldPoint(2984, 3109, 0), ASGARNIA, "Mudskipper Point, on the starfish in the south-west corner."), - ASGARNIA_TROLL(new WorldPoint(2910, 3616, 0), ASGARNIA, "The Troll arena, where the player fights Dad during the Troll Stronghold quest. Bring climbing boots if travelling from Burthorpe."), - DESERT_GENIE(new WorldPoint(3364, 2910, 0), DESERT, "West of Nardah genie cave."), - DESERT_ALKHARID_MINE(new WorldPoint(3282, 3270, 0), DESERT, "West of Al Kharid mine."), - DESERT_MENAPHOS_GATE(new WorldPoint(3224, 2816, 0), DESERT, "North of Menaphos gate."), + ASGARNIA_TROLL(new WorldPoint(2910, 3616, 0), ASGARNIA, "The Troll arena, where the player fights Dad during the Troll Stronghold quest. Bring climbing boots if travelling from Burthorpe."), + DESERT_GENIE(new WorldPoint(3364, 2910, 0), DESERT, "West of Nardah genie cave."), + DESERT_ALKHARID_MINE(new WorldPoint(3282, 3270, 0), DESERT, "West of Al Kharid mine."), + DESERT_MENAPHOS_GATE(new WorldPoint(3224, 2816, 0), DESERT, "North of Menaphos gate."), DESERT_BEDABIN_CAMP(new WorldPoint(3164, 3050, 0), DESERT, "Bedabin Camp, dig around the north tent."), - DESERT_UZER(new WorldPoint(3431, 3106, 0), DESERT, "West of Uzer."), - DESERT_POLLNIVNEACH(new WorldPoint(3287, 2975, 0), DESERT, "West of Pollnivneach."), - DESERT_MTA(new WorldPoint(3350, 3293, 0), DESERT, "Next to Mage Training Arena."), - DESERT_SHANTY(new WorldPoint(3294, 3106, 0), DESERT, "South-west of Shantay Pass."), - FELDIP_HILLS_JIGGIG(new WorldPoint(2413, 3055, 0), FELDIP_HILLS, "West of Jiggig, east of the fairy ring bkp."), - FELDIP_HILLS_SW(new WorldPoint(2582, 2895, 0), FELDIP_HILLS, "West of the southeasternmost lake in Feldip Hills."), - FELDIP_HILLS_GNOME_GLITER(new WorldPoint(2553, 2972, 0), FELDIP_HILLS, "East of the gnome glider (Lemantolly Undri)."), - FELDIP_HILLS_RANTZ(new WorldPoint(2611, 2946, 0), FELDIP_HILLS, "South of Rantz, six steps west of the empty glass bottles."), - FELDIP_HILLS_SOUTH(new WorldPoint(2487, 3005, 0), FELDIP_HILLS, "South of Jiggig."), - FELDIP_HILLS_RED_CHIN(new WorldPoint(2532, 2900, 0), FELDIP_HILLS, "Outside the red chinchompa hunting ground entrance, south of the Hunting expert's hut."), - FELDIP_HILLS_SE(new WorldPoint(2567, 2916, 0), FELDIP_HILLS, "South-east of the ∩-shaped lake, near the icon."), - FELDIP_HILLS_CW_BALLOON(new WorldPoint(2452, 3108, 0), FELDIP_HILLS, "Directly west of the Castle Wars balloon."), - FREMENNIK_PROVINCE_MTN_CAMP(new WorldPoint(2804, 3672, 0), FREMENNIK_PROVINCE, "At the Mountain Camp."), - FREMENNIK_PROVINCE_RELLEKKA_HUNTER(new WorldPoint(2724, 3783, 0), FREMENNIK_PROVINCE, "At the Rellekka Hunter area, near the icon."), - FREMENNIK_PROVINCE_KELGADRIM_ENTRANCE(new WorldPoint(2715, 3689, 0), FREMENNIK_PROVINCE, "West of the Keldagrim entrance mine."), - FREMENNIK_PROVINCE_SW(new WorldPoint(2605, 3648, 0), FREMENNIK_PROVINCE, "Outside the fence in the south-western corner of Rellekka."), - FREMENNIK_PROVINCE_LIGHTHOUSE(new WorldPoint(2589, 3598, 0), FREMENNIK_PROVINCE, "South-east of the Lighthouse."), - FREMENNIK_PROVINCE_ETCETERIA_CASTLE(new WorldPoint(2614, 3867, 0), FREMENNIK_PROVINCE, "Inside Etceteria's castle, in the southern staircase."), - FREMENNIK_PROVINCE_MISC_COURTYARD(new WorldPoint(2529, 3867, 0), FREMENNIK_PROVINCE, "Outside Miscellania's courtyard."), + DESERT_UZER(new WorldPoint(3431, 3106, 0), DESERT, "West of Uzer."), + DESERT_POLLNIVNEACH(new WorldPoint(3287, 2975, 0), DESERT, "West of Pollnivneach."), + DESERT_MTA(new WorldPoint(3350, 3293, 0), DESERT, "Next to Mage Training Arena."), + DESERT_SHANTY(new WorldPoint(3294, 3106, 0), DESERT, "South-west of Shantay Pass."), + FELDIP_HILLS_JIGGIG(new WorldPoint(2413, 3055, 0), FELDIP_HILLS, "West of Jiggig, east of the fairy ring bkp."), + FELDIP_HILLS_SW(new WorldPoint(2582, 2895, 0), FELDIP_HILLS, "West of the southeasternmost lake in Feldip Hills."), + FELDIP_HILLS_GNOME_GLITER(new WorldPoint(2553, 2972, 0), FELDIP_HILLS, "East of the gnome glider (Lemantolly Undri)."), + FELDIP_HILLS_RANTZ(new WorldPoint(2611, 2946, 0), FELDIP_HILLS, "South of Rantz, six steps west of the empty glass bottles."), + FELDIP_HILLS_SOUTH(new WorldPoint(2487, 3005, 0), FELDIP_HILLS, "South of Jiggig."), + FELDIP_HILLS_RED_CHIN(new WorldPoint(2532, 2900, 0), FELDIP_HILLS, "Outside the red chinchompa hunting ground entrance, south of the Hunting expert's hut."), + FELDIP_HILLS_SE(new WorldPoint(2567, 2916, 0), FELDIP_HILLS, "South-east of the ∩-shaped lake, near the icon."), + FELDIP_HILLS_CW_BALLOON(new WorldPoint(2452, 3108, 0), FELDIP_HILLS, "Directly west of the Castle Wars balloon."), + FREMENNIK_PROVINCE_MTN_CAMP(new WorldPoint(2804, 3672, 0), FREMENNIK_PROVINCE, "At the Mountain Camp."), + FREMENNIK_PROVINCE_RELLEKKA_HUNTER(new WorldPoint(2724, 3783, 0), FREMENNIK_PROVINCE, "At the Rellekka Hunter area, near the icon."), + FREMENNIK_PROVINCE_KELGADRIM_ENTRANCE(new WorldPoint(2715, 3689, 0), FREMENNIK_PROVINCE, "West of the Keldagrim entrance mine."), + FREMENNIK_PROVINCE_SW(new WorldPoint(2605, 3648, 0), FREMENNIK_PROVINCE, "Outside the fence in the south-western corner of Rellekka."), + FREMENNIK_PROVINCE_LIGHTHOUSE(new WorldPoint(2589, 3598, 0), FREMENNIK_PROVINCE, "South-east of the Lighthouse."), + FREMENNIK_PROVINCE_ETCETERIA_CASTLE(new WorldPoint(2614, 3867, 0), FREMENNIK_PROVINCE, "Inside Etceteria's castle, in the southern staircase."), + FREMENNIK_PROVINCE_MISC_COURTYARD(new WorldPoint(2529, 3867, 0), FREMENNIK_PROVINCE, "Outside Miscellania's courtyard."), FREMENNIK_PROVINCE_FREMMY_ISLES_MINE(new WorldPoint(2378, 3849, 0), FREMENNIK_PROVINCE, "Central Fremennik Isles mine."), FREMENNIK_PROVINCE_WEST_ISLES_MINE(new WorldPoint(2313, 3854, 0), FREMENNIK_PROVINCE, "West Fremennik Isles mine."), - FREMENNIK_PROVINCE_WEST_JATIZSO_ENTRANCE(new WorldPoint(2391, 3813, 0), FREMENNIK_PROVINCE, "West of the Jatizso mine entrance."), + FREMENNIK_PROVINCE_WEST_JATIZSO_ENTRANCE(new WorldPoint(2391, 3813, 0), FREMENNIK_PROVINCE, "West of the Jatizso mine entrance."), FREMENNIK_PROVINCE_PIRATES_COVE(new WorldPoint(2210, 3814, 0), FREMENNIK_PROVINCE, "Pirates' Cove"), FREMENNIK_PROVINCE_ASTRAL_ALTER(new WorldPoint(2147, 3862, 0), FREMENNIK_PROVINCE, "Astral altar"), FREMENNIK_PROVINCE_LUNAR_VILLAGE(new WorldPoint(2087, 3915, 0), FREMENNIK_PROVINCE, "Lunar Isle, inside the village."), FREMENNIK_PROVINCE_LUNAR_NORTH(new WorldPoint(2106, 3949, 0), FREMENNIK_PROVINCE, "Lunar Isle, north of the village."), - KANDARIN_SINCLAR_MANSION(new WorldPoint(2726, 3588, 0), KANDARIN, "North-west of the Sinclair Mansion, near the log balance shortcut."), + KANDARIN_SINCLAR_MANSION(new WorldPoint(2726, 3588, 0), KANDARIN, "North-west of the Sinclair Mansion, near the log balance shortcut."), KANDARIN_CATHERBY(new WorldPoint(2774, 3433, 0), KANDARIN, "Catherby, between the bank and the beehives, near small rock formation."), KANDARIN_GRAND_TREE(new WorldPoint(2444, 3503, 0), KANDARIN, "Grand Tree, just east of the terrorchick gnome enclosure."), - KANDARIN_SEERS(new WorldPoint(2735, 3486, 0), KANDARIN, "Between the Seers' Village bank and Camelot."), + KANDARIN_SEERS(new WorldPoint(2735, 3486, 0), KANDARIN, "Between the Seers' Village bank and Camelot."), KANDARIN_MCGRUBORS_WOOD(new WorldPoint(2653, 3485, 0), KANDARIN, "McGrubor's Wood"), - KANDARIN_FISHING_BUILD(new WorldPoint(2586, 3372, 0), KANDARIN, "South of Fishing Guild"), - KANDARIN_WITCHHAVEN(new WorldPoint(2708, 3304, 0), KANDARIN, "Outside Witchaven, west of Jeb, Holgart, and Caroline."), - KANDARIN_NECRO_TOWER(new WorldPoint(2669, 3242, 0), KANDARIN, "Ground floor inside the Necromancer Tower. Easily accessed by using fairy ring code djp."), - KANDARIN_FIGHT_ARENA(new WorldPoint(2587, 3134, 0), KANDARIN, "South of the Fight Arena, north-west of the Nightmare Zone."), - KANDARIN_TREE_GNOME_VILLAGE(new WorldPoint(2526, 3160, 0), KANDARIN, "Tree Gnome Village, near the general store icon."), + KANDARIN_FISHING_BUILD(new WorldPoint(2586, 3372, 0), KANDARIN, "South of Fishing Guild"), + KANDARIN_WITCHHAVEN(new WorldPoint(2708, 3304, 0), KANDARIN, "Outside Witchaven, west of Jeb, Holgart, and Caroline."), + KANDARIN_NECRO_TOWER(new WorldPoint(2669, 3242, 0), KANDARIN, "Ground floor inside the Necromancer Tower. Easily accessed by using fairy ring code djp."), + KANDARIN_FIGHT_ARENA(new WorldPoint(2587, 3134, 0), KANDARIN, "South of the Fight Arena, north-west of the Nightmare Zone."), + KANDARIN_TREE_GNOME_VILLAGE(new WorldPoint(2526, 3160, 0), KANDARIN, "Tree Gnome Village, near the general store icon."), KANDARIN_GRAVE_OF_SCORPIUS(new WorldPoint(2464, 3228, 0), KANDARIN, "Grave of Scorpius"), - KANDARIN_KHAZARD_BATTLEFIELD(new WorldPoint(2518, 3249, 0), KANDARIN, "Khazard Battlefield, in the small ruins south of tracker gnome 2."), + KANDARIN_KHAZARD_BATTLEFIELD(new WorldPoint(2518, 3249, 0), KANDARIN, "Khazard Battlefield, in the small ruins south of tracker gnome 2."), KANDARIN_WEST_ARDY(new WorldPoint(2533, 3320, 0), KANDARIN, "West Ardougne, near the staircase outside the Civic Office."), - KANDARIN_SW_TREE_GNOME_STRONGHOLD(new WorldPoint(2411, 3431, 0), KANDARIN, "South-west Tree Gnome Stronghold"), - KANDARIN_OUTPOST(new WorldPoint(2458, 3364, 0), KANDARIN, "South of the Tree Gnome Stronghold, north-east of the Outpost."), - KANDARIN_BAXTORIAN_FALLS(new WorldPoint(2534, 3479, 0), KANDARIN, "South-east of Almera's house on Baxtorian Falls."), - KANDARIN_BA_AGILITY_COURSE(new WorldPoint(2536, 3546, 0), KANDARIN, "Inside the Barbarian Agility Course. Completion of Alfred Grimhand's Barcrawl is required."), + KANDARIN_SW_TREE_GNOME_STRONGHOLD(new WorldPoint(2411, 3431, 0), KANDARIN, "South-west Tree Gnome Stronghold"), + KANDARIN_OUTPOST(new WorldPoint(2458, 3364, 0), KANDARIN, "South of the Tree Gnome Stronghold, north-east of the Outpost."), + KANDARIN_BAXTORIAN_FALLS(new WorldPoint(2534, 3479, 0), KANDARIN, "South-east of Almera's house on Baxtorian Falls."), + KANDARIN_BA_AGILITY_COURSE(new WorldPoint(2536, 3546, 0), KANDARIN, "Inside the Barbarian Agility Course. Completion of Alfred Grimhand's Barcrawl is required."), KARAMJA_MUSA_POINT(new WorldPoint(2914, 3168, 0), KARAMJA, "Musa Point, banana plantation."), - KARAMJA_BRIMHAVEN_FRUIT_TREE(new WorldPoint(2783, 3214, 0), KARAMJA, "Brimhaven, east of the fruit tree patch."), - KARAMJA_WEST_BRIMHAVEN(new WorldPoint(2721, 3169, 0), KARAMJA, "West of Brimhaven."), - KARAMJA_GLIDER(new WorldPoint(2966, 2975, 0), KARAMJA, "West of the gnome glider."), - KARAMJA_KHARAZI_NE(new WorldPoint(2908, 2922, 0), KARAMJA, "North-eastern part of Kharazi Jungle."), - KARAMJA_KHARAZI_SW(new WorldPoint(2783, 2898, 0), KARAMJA, "South-western part of Kharazi Jungle."), - KARAMJA_CRASH_ISLAND(new WorldPoint(2910, 2737, 0), KARAMJA, "Northern part of Crash Island."), - MISTHALIN_VARROCK_STONE_CIRCLE(new WorldPoint(3225, 3355, 0), MISTHALIN, "South of the stone circle near Varrock's entrance."), - MISTHALIN_LUMBRIDGE(new WorldPoint(3238, 3169, 0), MISTHALIN, "Just north-west of the Lumbridge Fishing tutor."), - MISTHALIN_LUMBRIDGE_2(new WorldPoint(3170, 3278, 0), MISTHALIN, "North of the pond between Lumbridge and Draynor Village."), - MISTHALIN_GERTUDES(new WorldPoint(3158, 3421, 0), MISTHALIN, "North-east of Gertrude's house west of Varrock."), - MISTHALIN_DRAYNOR_BANK(new WorldPoint(3096, 3235, 0), MISTHALIN, "South of Draynor Village bank."), - MISTHALIN_LUMBER_YARD(new WorldPoint(3303, 3483, 0), MISTHALIN, "South of Lumber Yard, east of Assistant Serf."), - MORYTANIA_BURGH_DE_ROTT(new WorldPoint(3545, 3253, 0), MORYTANIA, "In the north-east area of Burgh de Rott, by the reverse-L-shaped ruins."), - MORYTANIA_PORT_PHASMATYS(new WorldPoint(3613, 3485, 0), MORYTANIA, "West of Port Phasmatys, south-east of fairy ring."), - MORYTANIA_HOLLOWS(new WorldPoint(3500, 3423, 0), MORYTANIA, "Inside The Hollows, south of the bridge which was repaired in a quest."), - MORYTANIA_SWAMP(new WorldPoint(3422, 3374, 0), MORYTANIA, "Inside the Mort Myre Swamp, north-west of the Nature Grotto."), - MORYTANIA_HAUNTED_MINE(new WorldPoint(3441, 3259, 0), MORYTANIA, "At Haunted Mine quest start."), - MORYTANIA_MAUSOLEUM(new WorldPoint(3499, 3539, 0), MORYTANIA, "South of the Mausoleum."), - MORYTANIA_MOS_LES_HARMLESS(new WorldPoint(3744, 3041, 0), MORYTANIA, "Northern area of Mos Le'Harmless, between the lakes."), - MORYTANIA_MOS_LES_HARMLESS_BAR(new WorldPoint(3670, 2974, 0), MORYTANIA, "Near Mos Le'Harmless southern bar."), - MORYTANIA_DRAGONTOOTH_NORTH(new WorldPoint(3813, 3567, 0), MORYTANIA, "Northern part of Dragontooth Island."), - MORYTANIA_DRAGONTOOTH_SOUTH(new WorldPoint(3803, 3532, 0), MORYTANIA, "Southern part of Dragontooth Island."), - WESTERN_PROVINCE_EAGLES_PEAK(new WorldPoint(2297, 3530, 0), WESTERN_PROVINCE, "North-west of Eagles' Peak."), + KARAMJA_BRIMHAVEN_FRUIT_TREE(new WorldPoint(2783, 3214, 0), KARAMJA, "Brimhaven, east of the fruit tree patch."), + KARAMJA_WEST_BRIMHAVEN(new WorldPoint(2721, 3169, 0), KARAMJA, "West of Brimhaven."), + KARAMJA_GLIDER(new WorldPoint(2966, 2975, 0), KARAMJA, "West of the gnome glider."), + KARAMJA_KHARAZI_NE(new WorldPoint(2904, 2925, 0), KARAMJA, "North-eastern part of Kharazi Jungle."), + KARAMJA_KHARAZI_SW(new WorldPoint(2783, 2898, 0), KARAMJA, "South-western part of Kharazi Jungle."), + KARAMJA_CRASH_ISLAND(new WorldPoint(2910, 2737, 0), KARAMJA, "Northern part of Crash Island."), + MISTHALIN_VARROCK_STONE_CIRCLE(new WorldPoint(3225, 3355, 0), MISTHALIN, "South of the stone circle near Varrock's entrance."), + MISTHALIN_LUMBRIDGE(new WorldPoint(3238, 3169, 0), MISTHALIN, "Just north-west of the Lumbridge Fishing tutor."), + MISTHALIN_LUMBRIDGE_2(new WorldPoint(3170, 3278, 0), MISTHALIN, "North of the pond between Lumbridge and Draynor Village."), + MISTHALIN_GERTUDES(new WorldPoint(3158, 3421, 0), MISTHALIN, "North-east of Gertrude's house west of Varrock."), + MISTHALIN_DRAYNOR_BANK(new WorldPoint(3096, 3235, 0), MISTHALIN, "South of Draynor Village bank."), + MISTHALIN_LUMBER_YARD(new WorldPoint(3303, 3483, 0), MISTHALIN, "South of Lumber Yard, east of Assistant Serf."), + MORYTANIA_BURGH_DE_ROTT(new WorldPoint(3545, 3253, 0), MORYTANIA, "In the north-east area of Burgh de Rott, by the reverse-L-shaped ruins."), + MORYTANIA_PORT_PHASMATYS(new WorldPoint(3613, 3485, 0), MORYTANIA, "West of Port Phasmatys, south-east of fairy ring."), + MORYTANIA_HOLLOWS(new WorldPoint(3500, 3423, 0), MORYTANIA, "Inside The Hollows, south of the bridge which was repaired in a quest."), + MORYTANIA_SWAMP(new WorldPoint(3422, 3374, 0), MORYTANIA, "Inside the Mort Myre Swamp, north-west of the Nature Grotto."), + MORYTANIA_HAUNTED_MINE(new WorldPoint(3441, 3259, 0), MORYTANIA, "At Haunted Mine quest start."), + MORYTANIA_MAUSOLEUM(new WorldPoint(3499, 3539, 0), MORYTANIA, "South of the Mausoleum."), + MORYTANIA_MOS_LES_HARMLESS(new WorldPoint(3744, 3041, 0), MORYTANIA, "Northern area of Mos Le'Harmless, between the lakes."), + MORYTANIA_MOS_LES_HARMLESS_BAR(new WorldPoint(3670, 2974, 0), MORYTANIA, "Near Mos Le'Harmless southern bar."), + MORYTANIA_DRAGONTOOTH_NORTH(new WorldPoint(3813, 3567, 0), MORYTANIA, "Northern part of Dragontooth Island."), + MORYTANIA_DRAGONTOOTH_SOUTH(new WorldPoint(3803, 3532, 0), MORYTANIA, "Southern part of Dragontooth Island."), + WESTERN_PROVINCE_EAGLES_PEAK(new WorldPoint(2297, 3530, 0), WESTERN_PROVINCE, "North-west of Eagles' Peak."), WESTERN_PROVINCE_PISCATORIS(new WorldPoint(2337, 3689, 0), WESTERN_PROVINCE, "Piscatoris Fishing Colony"), - WESTERN_PROVINCE_PISCATORIS_HUNTER_AREA(new WorldPoint(2361, 3566, 0), WESTERN_PROVINCE, "Eastern part of Piscatoris Hunter area, south-west of the Falconry."), - WESTERN_PROVINCE_ARANDAR(new WorldPoint(2366, 3318, 0), WESTERN_PROVINCE, "South-west of the crystal gate to Arandar."), - WESTERN_PROVINCE_ELF_CAMP_EAST(new WorldPoint(2270, 3244, 0), WESTERN_PROVINCE, "East of Elf Camp."), - WESTERN_PROVINCE_ELF_CAMP_NW(new WorldPoint(2174, 3280, 0), WESTERN_PROVINCE, "North-west of Elf Camp."), - WESTERN_PROVINCE_LLETYA(new WorldPoint(2335, 3166, 0), WESTERN_PROVINCE, "In Lletya."), - WESTERN_PROVINCE_TYRAS(new WorldPoint(2204, 3157, 0), WESTERN_PROVINCE, "Near Tyras Camp."), - WESTERN_PROVINCE_ZULANDRA(new WorldPoint(2196, 3057, 0), WESTERN_PROVINCE, "The northern house at Zul-Andra."), - WILDERNESS_5(new WorldPoint(3169, 3558, 0), WILDERNESS, "North of the Grand Exchange, level 5 Wilderness."), - WILDERNESS_12(new WorldPoint(3038, 3612, 0), WILDERNESS, "South-east of the Dark Warriors' Fortress, level 12 Wilderness."), - WILDERNESS_20(new WorldPoint(3225, 3676, 0), WILDERNESS, "East of the Corporeal Beast's lair, level 20 Wilderness."), + WESTERN_PROVINCE_PISCATORIS_HUNTER_AREA(new WorldPoint(2361, 3566, 0), WESTERN_PROVINCE, "Eastern part of Piscatoris Hunter area, south-west of the Falconry."), + WESTERN_PROVINCE_ARANDAR(new WorldPoint(2366, 3318, 0), WESTERN_PROVINCE, "South-west of the crystal gate to Arandar."), + WESTERN_PROVINCE_ELF_CAMP_EAST(new WorldPoint(2270, 3244, 0), WESTERN_PROVINCE, "East of Elf Camp."), + WESTERN_PROVINCE_ELF_CAMP_NW(new WorldPoint(2174, 3280, 0), WESTERN_PROVINCE, "North-west of Elf Camp."), + WESTERN_PROVINCE_LLETYA(new WorldPoint(2335, 3166, 0), WESTERN_PROVINCE, "In Lletya."), + WESTERN_PROVINCE_TYRAS(new WorldPoint(2204, 3157, 0), WESTERN_PROVINCE, "Near Tyras Camp."), + WESTERN_PROVINCE_ZULANDRA(new WorldPoint(2196, 3057, 0), WESTERN_PROVINCE, "The northern house at Zul-Andra."), + WILDERNESS_5(new WorldPoint(3169, 3558, 0), WILDERNESS, "North of the Grand Exchange, level 5 Wilderness."), + WILDERNESS_12(new WorldPoint(3038, 3612, 0), WILDERNESS, "South-east of the Dark Warriors' Fortress, level 12 Wilderness."), + WILDERNESS_20(new WorldPoint(3225, 3676, 0), WILDERNESS, "East of the Corporeal Beast's lair, level 20 Wilderness."), WILDERNESS_27(new WorldPoint(3174, 3735, 0), WILDERNESS, "Inside the Ruins north of the Graveyard of Shadows, level 27 Wilderness."), - WILDERNESS_28(new WorldPoint(3374, 3734, 0), WILDERNESS, "East of Venenatis' nest, level 28 Wilderness."), + WILDERNESS_28(new WorldPoint(3374, 3734, 0), WILDERNESS, "East of Venenatis' nest, level 28 Wilderness."), WILDERNESS_32(new WorldPoint(3311, 3773, 0), WILDERNESS, "North of Venenatis' nest, level 32 Wilderness."), - WILDERNESS_35(new WorldPoint(3153, 3795, 0), WILDERNESS, "East of the Wilderness canoe exit, level 35 Wilderness."), - WILDERNESS_37(new WorldPoint(2975, 3811, 0), WILDERNESS, "South-east of the Chaos Temple, level 37 Wilderness."), - WILDERNESS_38(new WorldPoint(3294, 3817, 0), WILDERNESS, "South of Callisto, level 38 Wilderness."), - WILDERNESS_49(new WorldPoint(3140, 3910, 0), WILDERNESS, "South-west of the Deserted Keep, level 49 Wilderness."), - WILDERNESS_54(new WorldPoint(2983, 3946, 0), WILDERNESS, "West of the Wilderness Agility Course, level 54 Wilderness."), - ZEAH_BLASTMINE_BANK(new WorldPoint(1507, 3856, 0), ZEAH, "Next to the bank in the Lovakengj blast mine."), - ZEAH_BLASTMINE_NORTH(new WorldPoint(1490, 3883, 0), ZEAH, "Northern part of the Lovakengj blast mine."), - ZEAH_LOVAKITE_FURNACE(new WorldPoint(1505, 3814, 0), ZEAH, "Next to the lovakite furnace in Lovakengj."), - ZEAH_LOVAKENGJ_MINE(new WorldPoint(1477, 3779, 0), ZEAH, "Next to mithril rock in the Lovakengj mine."), - ZEAH_SULPHR_MINE(new WorldPoint(1428, 3866, 0), ZEAH, "Western entrance in the Lovakengj sulphur mine."), + WILDERNESS_35(new WorldPoint(3153, 3795, 0), WILDERNESS, "East of the Wilderness canoe exit, level 35 Wilderness."), + WILDERNESS_37(new WorldPoint(2975, 3811, 0), WILDERNESS, "South-east of the Chaos Temple, level 37 Wilderness."), + WILDERNESS_38(new WorldPoint(3294, 3817, 0), WILDERNESS, "South of Callisto, level 38 Wilderness."), + WILDERNESS_49(new WorldPoint(3140, 3910, 0), WILDERNESS, "South-west of the Deserted Keep, level 49 Wilderness."), + WILDERNESS_54(new WorldPoint(2983, 3946, 0), WILDERNESS, "West of the Wilderness Agility Course, level 54 Wilderness."), + ZEAH_BLASTMINE_BANK(new WorldPoint(1507, 3856, 0), ZEAH, "Next to the bank in the Lovakengj blast mine."), + ZEAH_BLASTMINE_NORTH(new WorldPoint(1490, 3883, 0), ZEAH, "Northern part of the Lovakengj blast mine."), + ZEAH_LOVAKITE_FURNACE(new WorldPoint(1505, 3814, 0), ZEAH, "Next to the lovakite furnace in Lovakengj."), + ZEAH_LOVAKENGJ_MINE(new WorldPoint(1477, 3779, 0), ZEAH, "Next to mithril rock in the Lovakengj mine."), + ZEAH_SULPHR_MINE(new WorldPoint(1428, 3866, 0), ZEAH, "Western entrance in the Lovakengj sulphur mine."), ZEAH_SHAYZIEN_BANK(new WorldPoint(1517, 3603, 0), ZEAH, "South-east of the bank in Shayzien."), - ZEAH_OVERPASS(new WorldPoint(1467, 3714, 0), ZEAH, "Overpass between Lovakengj and Shayzien."), - ZEAH_LIZARDMAN(new WorldPoint(1493, 3694, 0), ZEAH, "Within Lizardman Canyon, east of the ladder. Requires 5% favour with Shayzien."), - ZEAH_COMBAT_RING(new WorldPoint(1557, 3580, 0), ZEAH, "Shayzien, south-east of the Combat Ring."), - ZEAH_SHAYZIEN_BANK_2(new WorldPoint(1494, 3622, 0), ZEAH, "North-west of the bank in Shayzien."), - ZEAH_LIBRARY(new WorldPoint(1601, 3842, 0), ZEAH, "North-west of the Arceuus Library."), - ZEAH_HOUSECHURCH(new WorldPoint(1682, 3792, 0), ZEAH, "By the entrance to the Arceuus church."), - ZEAH_DARK_ALTAR(new WorldPoint(1699, 3879, 0), ZEAH, "West of the Dark Altar."), + ZEAH_OVERPASS(new WorldPoint(1467, 3714, 0), ZEAH, "Overpass between Lovakengj and Shayzien."), + ZEAH_LIZARDMAN(new WorldPoint(1493, 3694, 0), ZEAH, "Within Lizardman Canyon, east of the ladder. Requires 5% favour with Shayzien."), + ZEAH_COMBAT_RING(new WorldPoint(1557, 3580, 0), ZEAH, "Shayzien, south-east of the Combat Ring."), + ZEAH_SHAYZIEN_BANK_2(new WorldPoint(1494, 3622, 0), ZEAH, "North-west of the bank in Shayzien."), + ZEAH_LIBRARY(new WorldPoint(1601, 3842, 0), ZEAH, "North-west of the Arceuus Library."), + ZEAH_HOUSECHURCH(new WorldPoint(1682, 3792, 0), ZEAH, "By the entrance to the Arceuus church."), + ZEAH_DARK_ALTAR(new WorldPoint(1699, 3879, 0), ZEAH, "West of the Dark Altar."), ZEAH_ARCEUUS_HOUSE(new WorldPoint(1708, 3701, 0), ZEAH, "By the southern entrance to Arceuus."), - ZEAH_ESSENCE_MINE(new WorldPoint(1762, 3852, 0), ZEAH, "By the Arceuus essence mine."), - ZEAH_ESSENCE_MINE_NE(new WorldPoint(1772, 3866, 0), ZEAH, "North-east of the Arceuus essence mine."), - ZEAH_PISCARILUS_MINE(new WorldPoint(1768, 3705, 0), ZEAH, "South of the Piscarilius mine."), - ZEAH_GOLDEN_FIELD_TAVERN(new WorldPoint(1718, 3647, 0), ZEAH, "South of The Golden Field tavern in the northern area of Hosidius."), - ZEAH_MESS_HALL(new WorldPoint(1658, 3621, 0), ZEAH, "East of the Mess hall."), - ZEAH_WATSONS_HOUSE(new WorldPoint(1653, 3573, 0), ZEAH, "East of Watson's house."), - ZEAH_VANNAHS_FARM_STORE(new WorldPoint(1806, 3521, 0), ZEAH, "North of Vannah's Farm Store, between the chicken coop and willow trees."), + ZEAH_ESSENCE_MINE(new WorldPoint(1762, 3852, 0), ZEAH, "By the Arceuus essence mine."), + ZEAH_ESSENCE_MINE_NE(new WorldPoint(1772, 3866, 0), ZEAH, "North-east of the Arceuus essence mine."), + ZEAH_PISCARILUS_MINE(new WorldPoint(1768, 3705, 0), ZEAH, "South of the Piscarilius mine."), + ZEAH_GOLDEN_FIELD_TAVERN(new WorldPoint(1718, 3647, 0), ZEAH, "South of The Golden Field tavern in the northern area of Hosidius."), + ZEAH_MESS_HALL(new WorldPoint(1658, 3621, 0), ZEAH, "East of the Mess hall."), + ZEAH_WATSONS_HOUSE(new WorldPoint(1653, 3573, 0), ZEAH, "East of Watson's house."), + ZEAH_VANNAHS_FARM_STORE(new WorldPoint(1806, 3521, 0), ZEAH, "North of Vannah's Farm Store, between the chicken coop and willow trees."), ZEAH_FARMING_GUILD_W(new WorldPoint(1209, 3737, 0), ZEAH, "West of the Farming Guild."), ZEAH_DAIRY_COW(new WorldPoint(1320, 3718, 0), ZEAH, "North-east of the Kebos Lowlands, east of the dairy cow."), ZEAH_CRIMSON_SWIFTS(new WorldPoint(1186, 3583, 0), ZEAH, "South-west of the Kebos Swamp, below the crimson swifts."); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounter.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounter.java index 6d9ff30033..24b14895c9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounter.java @@ -27,17 +27,17 @@ package net.runelite.client.plugins.combatcounter; import com.google.inject.Provides; import lombok.Getter; import lombok.Setter; -import api.Actor; -import api.Client; -import api.Hitsplat; -import api.NPC; -import api.NPCDefinition; -import api.Player; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.GameTick; -import api.events.HitsplatApplied; -import api.kit.KitType; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Hitsplat; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.kit.KitType; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounterConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounterConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatCounterConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatOverlay.java similarity index 72% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatOverlay.java index 898af48855..7f97d6ab42 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/CombatOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/CombatOverlay.java @@ -24,22 +24,23 @@ */ package net.runelite.client.plugins.combatcounter; -import api.Client; -import api.Player; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayMenuEntry; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -import net.runelite.client.ui.overlay.components.TitleComponent; - -import javax.inject.Inject; -import java.awt.*; +import java.awt.Dimension; +import java.awt.Graphics2D; import java.util.HashMap; import java.util.Map; - -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import javax.inject.Inject; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Player; +import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class CombatOverlay extends Overlay { @@ -66,8 +67,6 @@ class CombatOverlay extends Overlay getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Tick Counter")); } - - @Override public Dimension render(Graphics2D graphics) { @@ -77,39 +76,54 @@ class CombatOverlay extends Overlay Player local = client.getLocalPlayer(); if (local == null || local.getName() == null) + { return null; + } panelComponent.setBackgroundColor(config.bgColor()); panelComponent.getChildren().add(TitleComponent.builder().text("Tick Counter").color(config.titleColor()).build()); int total = 0; + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (plugin.getCounter().isEmpty()) { - panelComponent.getChildren().add(LineComponent.builder().left(local.getName()).right("0").build()); + tableComponent.addRow(local.getName(), "0"); } else { Map map = this.plugin.getCounter(); if (map == null) + { return null; + } for (String name : map.keySet()) { if (client.getLocalPlayer().getName().contains(name)) { - panelComponent.getChildren().add(1, LineComponent.builder().left(name).right(Long.toString(map.get(name))).leftColor(config.selfColor()).rightColor(config.selfColor()).build()); + tableComponent.addRow(ColorUtil.prependColorTag(name, config.selfColor()), ColorUtil.prependColorTag(Long.toString(map.get(name)), config.selfColor())); } else { - panelComponent.getChildren().add(1, LineComponent.builder().left(name).right(Long.toString(map.get(name))).leftColor(config.otherColor()).rightColor(config.otherColor()).build()); + tableComponent.addRow(ColorUtil.prependColorTag(name, config.otherColor()), ColorUtil.prependColorTag(Long.toString(map.get(name)), config.otherColor())); } total += map.get(name); } if (!map.containsKey(local.getName())) { - panelComponent.getChildren().add(LineComponent.builder().left(local.getName()).right("0").leftColor(config.selfColor()).rightColor(config.selfColor()).build()); + tableComponent.addRow(ColorUtil.prependColorTag(local.getName(), config.selfColor()), ColorUtil.prependColorTag("0", config.selfColor())); } } - panelComponent.getChildren().add(LineComponent.builder().left("Total").leftColor(config.totalColor()).rightColor(config.totalColor()).right(String.valueOf(total)).build()); + + tableComponent.addRow(ColorUtil.prependColorTag("Total:", config.totalColor()), ColorUtil.prependColorTag(String.valueOf(total), config.totalColor())); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + return panelComponent.render(graphics); } else @@ -117,4 +131,4 @@ class CombatOverlay extends Overlay return null; } } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/DamageOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/DamageOverlay.java similarity index 75% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/DamageOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/DamageOverlay.java index 0aeba04d92..998246ccf2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/DamageOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/DamageOverlay.java @@ -24,20 +24,22 @@ */ package net.runelite.client.plugins.combatcounter; -import api.Client; -import api.Player; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.util.Map; +import javax.inject.Inject; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Player; import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -import javax.inject.Inject; -import java.awt.*; -import java.util.Map; - -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class DamageOverlay extends Overlay { @@ -75,39 +77,51 @@ class DamageOverlay extends Overlay Player local = client.getLocalPlayer(); if (local == null || local.getName() == null) + { return null; + } panelComponent.setBackgroundColor(config.bgColor()); panelComponent.getChildren().add(TitleComponent.builder().text("Damage Counter").color(config.titleColor()).build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (plugin.getCounter().isEmpty()) { - panelComponent.getChildren().add(LineComponent.builder().left(local.getName()).right("0").build()); + tableComponent.addRow(local.getName(), "0"); } else { Map map = this.plugin.playerDamage; if (map == null) + { return null; + } for (String name : map.keySet()) { String val = String.format("%.1f", map.get(name)); if (client.getLocalPlayer().getName().contains(name)) { - panelComponent.getChildren().add(1, LineComponent.builder().left(name).right(val).leftColor(config.selfColor()).rightColor(config.selfColor()).build()); + tableComponent.addRow(ColorUtil.prependColorTag(name, config.selfColor()), ColorUtil.prependColorTag(val, config.selfColor())); } else { - panelComponent.getChildren().add(1, LineComponent.builder().left(name).right(val).leftColor(config.otherColor()).rightColor(config.otherColor()).build()); + tableComponent.addRow(ColorUtil.prependColorTag(name, config.otherColor()), ColorUtil.prependColorTag(val, config.otherColor())); } } if (!map.containsKey(local.getName())) { - panelComponent.getChildren().add(LineComponent.builder().left(local.getName()).right("0").leftColor(config.selfColor()).rightColor(config.selfColor()).build()); + tableComponent.addRow(ColorUtil.prependColorTag(local.getName(), config.selfColor()), ColorUtil.prependColorTag("0", config.selfColor())); } } + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + return panelComponent.render(graphics); } else @@ -115,4 +129,4 @@ class DamageOverlay extends Overlay return null; } } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/NPCDamageCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/NPCDamageCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatcounter/NPCDamageCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatcounter/NPCDamageCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java index e36dbc1aca..3083e02cac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java @@ -29,11 +29,11 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.inject.Inject; -import api.Client; -import api.Experience; -import api.Skill; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Skill; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java index a404e14447..e466e939f4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java @@ -30,16 +30,16 @@ import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; -import api.Client; -import api.Experience; -import api.GameState; -import api.Skill; -import api.WorldType; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.ScriptCallbackEvent; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.GameState; +import net.runelite.api.Skill; +import net.runelite.api.WorldType; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index 3e3f5aa0bf..4a4aec4bb8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -36,8 +36,6 @@ import java.awt.Rectangle; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; @@ -77,6 +75,7 @@ import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.plaf.basic.BasicSpinnerUI; import javax.swing.text.JTextComponent; import lombok.extern.slf4j.Slf4j; import net.runelite.client.config.ChatColorConfig; @@ -468,9 +467,8 @@ public class ConfigPanel extends PluginPanel try { Method parse = item.clazz().getMethod(item.method(), String.class); - boolean result = (boolean) parse.invoke(null, value); - return result; + return (boolean) parse.invoke(null, value); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { @@ -506,7 +504,7 @@ public class ConfigPanel extends PluginPanel openGroupConfigPanel(listItem, config, cd, false); } - void openGroupConfigPanel(PluginListItem listItem, Config config, ConfigDescriptor cd, boolean refresh) + private void openGroupConfigPanel(PluginListItem listItem, Config config, ConfigDescriptor cd, boolean refresh) { showingPluginList = false; @@ -635,6 +633,26 @@ public class ConfigPanel extends PluginPanel { show = Boolean.parseBoolean(configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); } + else if (cid2.getType().isEnum()) + { + Class type = (Class) cid2.getType(); + try + { + Enum selectedItem = Enum.valueOf(type, configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); + if (!cid.getItem().unhideValue().equals("")) + { + show = selectedItem.toString().equals(cid.getItem().unhideValue()); + } + else if (!cid.getItem().hideValue().equals("")) + { + show = !selectedItem.toString().equals(cid.getItem().hideValue()); + } + } + catch (IllegalArgumentException ex) + { + log.info("So bad, so sad: {}", ex.toString()); + } + } } if (show) @@ -705,20 +723,66 @@ public class ConfigPanel extends PluginPanel if (max < Integer.MAX_VALUE) { + JLabel sliderValueLabel = new JLabel(); JSlider slider = new JSlider(min, max, value); - configEntryName.setText(name.concat(": ").concat(String.valueOf(slider.getValue()))); + sliderValueLabel.setText(String.valueOf(slider.getValue())); slider.setPreferredSize(new Dimension(85, 25)); - String finalName = name; slider.addChangeListener((l) -> { - configEntryName.setText(finalName.concat(": ").concat(String.valueOf(slider.getValue()))); + sliderValueLabel.setText(String.valueOf(slider.getValue())); if (!slider.getValueIsAdjusting()) { changeConfiguration(listItem, config, slider, cd, cid); } } ); - item.add(slider, BorderLayout.EAST); + + SpinnerModel model = new SpinnerNumberModel(value, min, max, 1); + JSpinner spinner = new JSpinner(model); + Component editor = spinner.getEditor(); + JFormattedTextField spinnerTextField = ((JSpinner.DefaultEditor) editor).getTextField(); + spinnerTextField.setColumns(SPINNER_FIELD_WIDTH); + spinner.setUI(new BasicSpinnerUI() + { + protected Component createNextButton() + { + return null; + } + + protected Component createPreviousButton() + { + return null; + } + }); + spinner.addChangeListener((ce) -> + { + changeConfiguration(listItem, config, spinner, cd, cid); + spinner.setVisible(false); + sliderValueLabel.setText(String.valueOf(spinner.getValue())); + sliderValueLabel.setVisible(true); + slider.setValue((Integer) spinner.getValue()); + slider.setVisible(true); + }); + spinner.setVisible(false); + + sliderValueLabel.addMouseListener(new MouseAdapter() + { + public void mouseClicked(MouseEvent e) + { + spinner.setValue(slider.getValue()); + spinner.setVisible(true); + sliderValueLabel.setVisible(false); + slider.setVisible(false); + } + }); + + JPanel subPanel = new JPanel(); + + subPanel.add(spinner); + subPanel.add(sliderValueLabel); + subPanel.add(slider); + + item.add(subPanel, BorderLayout.EAST); } else { @@ -774,24 +838,21 @@ public class ConfigPanel extends PluginPanel } }); - if (cid.getItem().parse()) { JLabel parsingLabel = new JLabel(); parsingLabel.setHorizontalAlignment(SwingConstants.CENTER); parsingLabel.setPreferredSize(new Dimension(PANEL_WIDTH, 15)); - textField.addKeyListener(new KeyAdapter() + DeferredDocumentChangedListener listener = new DeferredDocumentChangedListener(); + listener.addChangeListener(e -> { - public void keyReleased(KeyEvent e) + if (cid.getItem().parse()) { - ConfigItem item = cid.getItem(); - if (item.parse()) - { - parseLabel(item, parsingLabel, textField.getText()); - } + parseLabel(cid.getItem(), parsingLabel, textField.getText()); } }); + textField.getDocument().addDocumentListener(listener); item.add(textField, BorderLayout.CENTER); @@ -1026,8 +1087,8 @@ public class ConfigPanel extends PluginPanel .splitToList(String.format("%s || %s", cid2.getItem().unhide(), cid2.getItem().hide())); if (itemHide.contains(cid.getItem().keyName())) - { // If another options visibility changes depending on the value of this checkbox, then render the entire menu again - + { + // If another options visibility changes depending on the value of this checkbox, then render the entire menu again reloadPluginlist(listItem, config, cd); } } @@ -1066,6 +1127,36 @@ public class ConfigPanel extends PluginPanel { JComboBox jComboBox = (JComboBox) component; configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), ((Enum) jComboBox.getSelectedItem()).name()); + + for (ConfigItemDescriptor cid2 : cd.getItems()) + { + if (cid2.getItem().hidden() || !cid2.getItem().hide().isEmpty()) + { + List itemHide = Splitter + .onPattern("\\|\\|") + .trimResults() + .omitEmptyStrings() + .splitToList(String.format("%s || %s", cid2.getItem().unhide(), cid2.getItem().hide())); + + if (itemHide.contains(cid.getItem().keyName())) + { + reloadPluginlist(listItem, config, cd); + } + + String changedVal = ((Enum) jComboBox.getSelectedItem()).name(); + + if (cid2.getItem().enabledBy().contains(cid.getItem().keyName()) && cid2.getItem().enabledByValue().equals(changedVal)) + { + configManager.setConfiguration(cd.getGroup().value(), cid2.getItem().keyName(), "true"); + reloadPluginlist(listItem, config, cd); + } + else if (cid2.getItem().disabledBy().contains(cid.getItem().keyName()) && cid2.getItem().disabledByValue().equals(changedVal)) + { + configManager.setConfiguration(cd.getGroup().value(), cid2.getItem().keyName(), "false"); + reloadPluginlist(listItem, config, cd); + } + } + } } else if (component instanceof HotkeyButton) { @@ -1182,4 +1273,4 @@ public class ConfigPanel extends PluginPanel { openGroupConfigPanel(listItem, config, cd, true); } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index ca9b53cf96..2004675a05 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -24,11 +24,11 @@ */ package net.runelite.client.plugins.config; -import api.MenuAction; import java.awt.image.BufferedImage; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; import javax.swing.SwingUtilities; +import net.runelite.api.MenuAction; import net.runelite.client.config.ChatColorConfig; import net.runelite.client.config.ConfigManager; import net.runelite.client.config.RuneLiteConfig; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/DeferredDocumentChangedListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/DeferredDocumentChangedListener.java new file mode 100644 index 0000000000..c8ce0b37dc --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/DeferredDocumentChangedListener.java @@ -0,0 +1,58 @@ +package net.runelite.client.plugins.config; + +import java.util.ArrayList; +import java.util.List; +import javax.swing.Timer; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +class DeferredDocumentChangedListener implements DocumentListener +{ + private Timer timer; + private List listeners; + + DeferredDocumentChangedListener() + { + listeners = new ArrayList<>(25); + timer = new Timer(350, e -> fireStateChanged()); + timer.setRepeats(false); + } + + void addChangeListener(ChangeListener listener) + { + listeners.add(listener); + } + + private void fireStateChanged() + { + if (!listeners.isEmpty()) + { + ChangeEvent evt = new ChangeEvent(this); + for (ChangeListener listener : listeners) + { + listener.stateChanged(evt); + } + } + } + + @Override + public void insertUpdate(DocumentEvent e) + { + timer.restart(); + } + + @Override + public void removeUpdate(DocumentEvent e) + { + timer.restart(); + } + + @Override + public void changedUpdate(DocumentEvent e) + { + timer.restart(); + } + +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java rename to runelite-client/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/config/PluginListItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingConfig.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingConfig.java index 1a1db71368..2a12ac1ede 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingConfig.java @@ -46,8 +46,8 @@ public interface CookingConfig extends Config @ConfigItem( position = 2, keyName = "fermentTimer", - name = "Show wine fermenting timer", - description = "Conifgures if the timer before wines are fermented is shown." + name = "Show wine ferment timer", + description = "Configures if the timer before wines are fermented is shown" ) default boolean fermentTimer() { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java similarity index 76% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java index 6cba7448e3..a7bad8d813 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java @@ -29,22 +29,23 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.text.DecimalFormat; -import java.time.Duration; import java.time.Instant; +import java.time.Duration; import javax.inject.Inject; -import static api.AnimationID.COOKING_FIRE; -import static api.AnimationID.COOKING_RANGE; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Skill; +import static net.runelite.api.AnimationID.COOKING_FIRE; +import static net.runelite.api.AnimationID.COOKING_RANGE; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class CookingOverlay extends Overlay { @@ -53,18 +54,16 @@ class CookingOverlay extends Overlay private final Client client; private final CookingPlugin plugin; - private final CookingConfig config; private final XpTrackerService xpTrackerService; private final PanelComponent panelComponent = new PanelComponent(); @Inject - private CookingOverlay(Client client, CookingPlugin plugin, CookingConfig config, XpTrackerService xpTrackerService) + private CookingOverlay(Client client, CookingPlugin plugin, XpTrackerService xpTrackerService) { super(plugin); setPosition(OverlayPosition.TOP_LEFT); this.client = client; this.plugin = plugin; - this.config = config; this.xpTrackerService = xpTrackerService; getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Cooking overlay")); } @@ -72,7 +71,7 @@ class CookingOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - CookingSession session = plugin.getCookingSession(); + CookingSession session = plugin.getSession(); if (session == null) { return null; @@ -95,15 +94,12 @@ class CookingOverlay extends Overlay .build()); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Cooked:") - .right(session.getCookAmount() + (session.getCookAmount() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.COOKING) + "/hr)" : "")) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Cooked:", session.getCookAmount() + (session.getCookAmount() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.COOKING) + "/hr)" : "")); + tableComponent.addRow("Burnt:", session.getBurnAmount() + (session.getBurnAmount() >= 1 ? " (" + FORMAT.format(session.getBurntPercentage()) + "%)" : "")); - panelComponent.getChildren().add(LineComponent.builder() - .left("Burnt:") - .right(session.getBurnAmount() + (session.getBurnAmount() >= 1 ? " (" + FORMAT.format(session.getBurntPercentage()) + "%)" : "")) - .build()); + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java similarity index 60% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java index 10a3047ed2..976d81c4a0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java @@ -28,23 +28,27 @@ package net.runelite.client.plugins.cooking; import com.google.inject.Provides; import java.time.Duration; import java.time.Instant; +import java.util.Optional; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import static api.AnimationID.COOKING_WINE; -import api.ChatMessageType; -import api.Client; -import api.Player; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.GameTick; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GraphicID; +import net.runelite.api.ItemID; +import net.runelite.api.Player; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.SpotAnimationChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDependency; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.xptracker.XpTrackerPlugin; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; @PluginDescriptor( name = "Cooking", @@ -61,19 +65,19 @@ public class CookingPlugin extends Plugin private CookingConfig config; @Inject - private CookingOverlay cookingOverlay; - - @Inject - private FermentTimerOverlay fermentTimerOverlay; + private CookingOverlay overlay; @Inject private OverlayManager overlayManager; - @Getter(AccessLevel.PACKAGE) - private CookingSession cookingSession; + @Inject + private InfoBoxManager infoBoxManager; + + @Inject + private ItemManager itemManager; @Getter(AccessLevel.PACKAGE) - private FermentTimerSession fermentTimerSession; + private CookingSession session; @Provides CookingConfig getConfig(ConfigManager configManager) @@ -84,69 +88,62 @@ public class CookingPlugin extends Plugin @Override protected void startUp() throws Exception { - cookingSession = null; - fermentTimerSession = null; - overlayManager.add(cookingOverlay); - overlayManager.add(fermentTimerOverlay); + session = null; + overlayManager.add(overlay); } @Override protected void shutDown() throws Exception { - overlayManager.remove(fermentTimerOverlay); - overlayManager.remove(cookingOverlay); - fermentTimerSession = null; - cookingSession = null; + infoBoxManager.removeIf(FermentTimer.class::isInstance); + overlayManager.remove(overlay); + session = null; } @Subscribe public void onGameTick(GameTick gameTick) { - if (config.statTimeout() == 0) + if (session == null || config.statTimeout() == 0) { return; } - if (cookingSession != null) - { - Duration statTimeout = Duration.ofMinutes(config.statTimeout()); - Duration sinceCut = Duration.between(cookingSession.getLastCookingAction(), Instant.now()); + Duration statTimeout = Duration.ofMinutes(config.statTimeout()); + Duration sinceCut = Duration.between(session.getLastCookingAction(), Instant.now()); - if (sinceCut.compareTo(statTimeout) >= 0) - { - cookingSession = null; - } - } - if (fermentTimerSession != null) + if (sinceCut.compareTo(statTimeout) >= 0) { - Duration statTimeout = Duration.ofMinutes(config.statTimeout()); - Duration sinceCut = Duration.between(fermentTimerSession.getLastWineMakingAction(), Instant.now()); - - if (sinceCut.compareTo(statTimeout) >= 0) - { - fermentTimerSession = null; - } + session = null; } } @Subscribe - public void onAnimationChanged(AnimationChanged animationChanged) + public void onSpotAnimationChanged(SpotAnimationChanged graphicChanged) { - Player localPlayer = client.getLocalPlayer(); + Player player = client.getLocalPlayer(); - if (localPlayer != animationChanged.getActor()) + if (graphicChanged.getActor() != player) { return; } - if (localPlayer.getAnimation() == COOKING_WINE && config.fermentTimer()) + if (player.getSpotAnimation() == GraphicID.WINE_MAKE && config.fermentTimer()) { - if (fermentTimerSession == null) - { - fermentTimerSession = new FermentTimerSession(); - } + Optional fermentTimerOpt = infoBoxManager.getInfoBoxes().stream() + .filter(FermentTimer.class::isInstance) + .map(FermentTimer.class::cast) + .findAny(); - fermentTimerSession.updateLastWineMakingAction(); + if (fermentTimerOpt.isPresent()) + { + FermentTimer fermentTimer = fermentTimerOpt.get(); + fermentTimer.reset(); + } + else + { + FermentTimer fermentTimer = new FermentTimer(itemManager.getImage(ItemID.JUG_OF_WINE), this); + infoBoxManager.addInfoBox(fermentTimer); + } } } @@ -166,24 +163,25 @@ public class CookingPlugin extends Plugin || message.startsWith("You roast a") || message.startsWith("You cook")) { - if (cookingSession == null) + if (session == null) { - cookingSession = new CookingSession(); + session = new CookingSession(); } - cookingSession.updateLastCookingAction(); - cookingSession.increaseCookAmount(); + session.updateLastCookingAction(); + session.increaseCookAmount(); } - else if (message.startsWith("You accidentally burn")) + else if (message.startsWith("You accidentally burn") + || message.startsWith("You accidentally spoil")) { - if (cookingSession == null) + if (session == null) { - cookingSession = new CookingSession(); + session = new CookingSession(); } - cookingSession.updateLastCookingAction(); - cookingSession.increaseBurnAmount(); + session.updateLastCookingAction(); + session.increaseBurnAmount(); } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingSession.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingSession.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/cooking/CookingSession.java rename to runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingSession.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimer.java new file mode 100644 index 0000000000..5312414ad1 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimer.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.cooking; + +import java.awt.Color; +import java.awt.Image; +import java.time.Duration; +import java.time.Instant; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.overlay.infobox.InfoBox; + +final class FermentTimer extends InfoBox +{ + private static final Duration FERMENT_TIME = Duration.ofMillis(13_800); + + private Instant fermentTime; + + FermentTimer(Image image, Plugin plugin) + { + super(image, plugin); + reset(); + } + + @Override + public String getText() + { + int seconds = timeUntilFerment(); + return Integer.toString(seconds); + } + + @Override + public Color getTextColor() + { + int seconds = timeUntilFerment(); + return seconds <= 3 ? Color.RED : Color.WHITE; + } + + @Override + public boolean cull() + { + int seconds = timeUntilFerment(); + return seconds <= 0; + } + + void reset() + { + fermentTime = Instant.now().plus(FERMENT_TIME); + } + + private int timeUntilFerment() + { + return (int) Duration.between(Instant.now(), fermentTime).getSeconds(); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CoreOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CoreOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CoreOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/corp/CoreOverlay.java index 0e35fea5e9..29c7dff16a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CoreOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CoreOverlay.java @@ -29,8 +29,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; -import api.Client; -import api.NPC; +import net.runelite.api.Client; +import net.runelite.api.NPC; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java index 5d32848c15..abc6d7578e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java @@ -29,13 +29,13 @@ import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.NPC; -import api.Varbits; -import api.coords.WorldPoint; -import api.widgets.Widget; -import api.widgets.WidgetID; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.NPC; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java index 6969a48306..627c9091e8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java @@ -31,22 +31,22 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.MenuAction; -import static api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; -import api.MenuEntry; -import api.NPC; -import api.NpcID; -import api.Varbits; -import api.events.GameStateChanged; -import api.events.HitsplatApplied; -import api.events.InteractingChanged; -import api.events.MenuEntryAdded; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.MenuAction; +import static net.runelite.api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; +import net.runelite.api.MenuEntry; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxConfig.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxConfig.java index 241e3b13f1..467e6afbf4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxConfig.java @@ -26,6 +26,9 @@ package net.runelite.client.plugins.coxhelper; import java.awt.Color; +import java.awt.Font; +import lombok.AllArgsConstructor; +import lombok.Getter; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; @@ -36,6 +39,24 @@ import net.runelite.client.config.Stub; public interface CoxConfig extends Config { + @Getter + @AllArgsConstructor + public enum FontStyle + { + BOLD("Bold", Font.BOLD), + ITALIC("Italic", Font.ITALIC), + PLAIN("Plain", Font.PLAIN); + + private String name; + private int font; + + @Override + public String toString() + { + return getName(); + } + } + @ConfigItem( position = 1, keyName = "muttadileStub", @@ -48,12 +69,12 @@ public interface CoxConfig extends Config } @ConfigItem( position = 2, - keyName = "Muttadile", + keyName = "muttadile", name = "Muttadile Marker", description = "Places an overlay around muttadiles showing their melee range.", parent = "muttadileStub" ) - default boolean Muttadile() + default boolean muttadile() { return true; } @@ -71,12 +92,12 @@ public interface CoxConfig extends Config @ConfigItem( position = 4, - keyName = "Tekton", + keyName = "tekton", name = "Tekton Marker", description = "Places an overlay around Tekton showing his melee range.", parent = "tektonStub" ) - default boolean Tekton() + default boolean tekton() { return true; } @@ -106,12 +127,24 @@ public interface CoxConfig extends Config @ConfigItem( position = 6, - keyName = "Guardians", - name = "Guardians timing", + keyName = "guardians", + name = "Guardians Overlay", description = "Places an overlay near Guardians showing safespot.", parent = "guardiansStub" ) - default boolean Guardians() + default boolean guardians() + { + return true; + } + + @ConfigItem( + position = 6, + keyName = "guardinTickCounter", + name = "Guardians Tick Timing", + description = "Places an overlay on Guardians showing attack tick timers.", + parent = "guardiansStub" + ) + default boolean guardinTickCounter() { return true; } @@ -200,12 +233,12 @@ public interface CoxConfig extends Config @ConfigItem( position = 14, - keyName = "OlmTick", + keyName = "olmTick", name = "Olm Tick Counter", description = "Show Tick Counter on Olm", parent = "olmStub" ) - default boolean OlmTick() + default boolean olmTick() { return true; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/OlmPrayAgainstOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxInfoBox.java similarity index 55% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/OlmPrayAgainstOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxInfoBox.java index 45c911fec1..55edc43f39 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/OlmPrayAgainstOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxInfoBox.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, gazivodag + * Copyright (c) 2019, lyzrds * Copyright (c) 2019, ganom * All rights reserved. * @@ -32,71 +32,117 @@ import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.SpriteID; +import net.runelite.api.Client; +import net.runelite.api.NpcID; +import net.runelite.api.SpriteID; import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentConstants; -import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.InfoBoxComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; -class OlmPrayAgainstOverlay extends Overlay +public class CoxInfoBox extends Overlay { private static final Color NOT_ACTIVATED_BACKGROUND_COLOR = new Color(150, 0, 0, 150); private final CoxPlugin plugin; private final CoxConfig config; private final Client client; private final SpriteManager spriteManager; + private final PanelComponent prayAgainstPanel = new PanelComponent(); private final PanelComponent panelComponent = new PanelComponent(); @Inject - OlmPrayAgainstOverlay(CoxPlugin plugin, CoxConfig config, Client client, SpriteManager spriteManager) + CoxInfoBox(CoxPlugin plugin, CoxConfig config, Client client, SpriteManager spriteManager) { this.plugin = plugin; this.config = config; this.client = client; this.spriteManager = spriteManager; setPosition(OverlayPosition.BOTTOM_RIGHT); - panelComponent.setOrientation(ComponentOrientation.VERTICAL); + setPriority(OverlayPriority.HIGH); + } - public Dimension render(Graphics2D graphics2D) + @Override + public Dimension render(Graphics2D graphics) { panelComponent.getChildren().clear(); - - final PrayAgainst prayAgainst = plugin.getPrayAgainstOlm(); - if (plugin.getPrayAgainstOlm() == null && !config.prayAgainstOlm()) + if (plugin.inRaid()) { - return null; - } + prayAgainstPanel.getChildren().clear(); - if (System.currentTimeMillis() < (plugin.getLastPrayTime() + 120000) && plugin.getPrayAgainstOlm() != null) - { - InfoBoxComponent prayComponent = new InfoBoxComponent(); - Image prayImg = scaleImg(getPrayerImage(plugin.prayAgainstOlm)); - prayComponent.setImage(prayImg); - prayComponent.setColor(Color.WHITE); - prayComponent.setBackgroundColor(client.isPrayerActive(prayAgainst.getPrayer()) - ? ComponentConstants.STANDARD_BACKGROUND_COLOR - : NOT_ACTIVATED_BACKGROUND_COLOR); - prayComponent.setPreferredSize(new Dimension(40, 40)); - panelComponent.getChildren().add(prayComponent); + final PrayAgainst prayAgainst = plugin.getPrayAgainstOlm(); - panelComponent.setPreferredSize(new Dimension(40, 40)); - panelComponent.setBorder(new Rectangle(0, 0, 0, 0)); - return panelComponent.render(graphics2D); - } - else - { - plugin.setPrayAgainstOlm(null); + if (plugin.getPrayAgainstOlm() == null && !config.prayAgainstOlm()) + { + return null; + } + + if (System.currentTimeMillis() < (plugin.getLastPrayTime() + 120000) && plugin.getPrayAgainstOlm() != null) + { + InfoBoxComponent prayComponent = new InfoBoxComponent(); + Image prayImg = scaleImg(getPrayerImage(plugin.prayAgainstOlm)); + prayComponent.setImage(prayImg); + prayComponent.setColor(Color.WHITE); + prayComponent.setBackgroundColor(client.isPrayerActive(prayAgainst.getPrayer()) + ? ComponentConstants.STANDARD_BACKGROUND_COLOR + : NOT_ACTIVATED_BACKGROUND_COLOR); + prayComponent.setPreferredSize(new Dimension(40, 40)); + prayAgainstPanel.getChildren().add(prayComponent); + + prayAgainstPanel.setPreferredSize(new Dimension(40, 40)); + prayAgainstPanel.setBorder(new Rectangle(0, 0, 0, 0)); + return prayAgainstPanel.render(graphics); + } + else + { + plugin.setPrayAgainstOlm(null); + } + + if (config.vangHealth() && plugin.getVanguards() > 0) + { + panelComponent.getChildren().add(TitleComponent.builder() + .text("Vanguards") + .color(Color.pink) + .build()); + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + for (NPCContainer npcs : plugin.getNpcContainer().values()) + { + float percent = (float) npcs.getNpc().getHealthRatio() / npcs.getNpc().getHealth() * 100; + switch (npcs.getNpc().getId()) + { + case NpcID.VANGUARD_7527: + tableComponent.addRow(ColorUtil.prependColorTag("Melee", npcs.getAttackStyle().getColor()), + Integer.toString((int) percent)); + break; + case NpcID.VANGUARD_7528: + tableComponent.addRow(ColorUtil.prependColorTag("Range", npcs.getAttackStyle().getColor()), + Integer.toString((int) percent)); + break; + case NpcID.VANGUARD_7529: + tableComponent.addRow(ColorUtil.prependColorTag("Mage", npcs.getAttackStyle().getColor()), + Integer.toString((int) percent)); + break; + } + } + + panelComponent.getChildren().add(tableComponent); + + return panelComponent.render(graphics); + } } if (client.getLocalPlayer().getWorldLocation().getRegionID() == 4919) { plugin.setPrayAgainstOlm(null); } - return null; } @@ -134,6 +180,4 @@ class OlmPrayAgainstOverlay extends Overlay g.dispose(); return scaledImage; } - - } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java new file mode 100644 index 0000000000..4218f092c6 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java @@ -0,0 +1,459 @@ +/* + * Copyright (c) 2019, xzact + * Copyright (c) 2019, ganom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.plugins.coxhelper; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Polygon; +import java.util.Iterator; +import java.util.List; +import javax.inject.Inject; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.NpcID; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.OverlayUtil; + +public class CoxOverlay extends Overlay +{ + private final Client client; + private final CoxPlugin plugin; + private final CoxConfig config; + + @Inject + private CoxOverlay(Client client, CoxPlugin plugin, CoxConfig config) + { + this.client = client; + this.plugin = plugin; + this.config = config; + setPosition(OverlayPosition.DYNAMIC); + setPriority(OverlayPriority.HIGH); + setLayer(OverlayLayer.ABOVE_SCENE); + } + + @Override + public Dimension render(Graphics2D graphics) + { + for (WorldPoint point : plugin.getOlm_Heal()) + { + drawTile(graphics, point, config.tpColor(), 2, 150, 50); + } + + for (WorldPoint point : plugin.getOlm_TP()) + { + client.setHintArrow(point); + drawTile(graphics, point, config.tpColor(), 2, 150, 50); + } + + if (plugin.inRaid()) + { + for (NPCContainer npcs : plugin.getNpcContainer().values()) + { + Color color; + List hitSquares; + int ticksLeft; + switch (npcs.getNpc().getId()) + { + case NpcID.TEKTON: + case NpcID.TEKTON_7541: + case NpcID.TEKTON_7542: + case NpcID.TEKTON_7545: + case NpcID.TEKTON_ENRAGED: + case NpcID.TEKTON_ENRAGED_7544: + if (config.tekton()) + { + hitSquares = getHitSquares(npcs.getNpc().getWorldLocation(), npcs.getNpcSize(), 1, false); + for (WorldPoint p : hitSquares) + { + drawTile(graphics, p, config.tektonColor(), 0, 0, 50); + } + if (config.tektonTickCounter()) + { + ticksLeft = npcs.getTicksUntilAttack(); + int attackTicksleft = plugin.getTektonAttackTicks(); + if (ticksLeft > 0) + { + if (ticksLeft == 1) + { + color = npcs.getAttackStyle().getColor(); + } + else + { + color = Color.WHITE; + } + final String ticksLeftStr = String.valueOf(ticksLeft); + Point canvasPoint = npcs.getNpc().getCanvasTextLocation(graphics, ticksLeftStr, 0); + renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), color, canvasPoint); + } + } + if (config.tektonTickCounter()) + { + final int attackTicksleft = plugin.getTektonAttackTicks(); + String attacksLeftStr; + Color attackcolor; + if (attackTicksleft >= 0 && plugin.isTektonActive()) + { + if (attackTicksleft <= 1) + { + attackcolor = new Color(255, 0, 0, 255); + attacksLeftStr = "Phase Over"; + } + else + { + attackcolor = new Color(255, 255, 255, 255); + attacksLeftStr = String.valueOf(attackTicksleft); + } + + if (npcs.getNpc() != null) + { + Point canvasPoint = npcs.getNpc().getCanvasTextLocation(graphics, attacksLeftStr, 0); + renderTextLocationAbove(graphics, attacksLeftStr, config.textSize(), config.fontStyle().getFont(), attackcolor, canvasPoint); + } + } + } + } + break; + case NpcID.MUTTADILE: + case NpcID.MUTTADILE_7562: + case NpcID.MUTTADILE_7563: + if (config.muttadile()) + { + hitSquares = getHitSquares(npcs.getNpc().getWorldLocation(), npcs.getNpcSize(), 1, false); + for (WorldPoint p : hitSquares) + { + drawTile(graphics, p, config.muttaColor(), 0, 0, 50); + } + } + break; + case NpcID.GUARDIAN: + case NpcID.GUARDIAN_7570: + case NpcID.GUARDIAN_7571: + case NpcID.GUARDIAN_7572: + if (config.guardians()) + { + hitSquares = getHitSquares(npcs.getNpc().getWorldLocation(), npcs.getNpcSize(), 2, true); + for (WorldPoint p : hitSquares) + { + drawTile(graphics, p, config.guardColor(), 0, 0, 50); + } + } + if (config.guardinTickCounter()) + { + ticksLeft = npcs.getTicksUntilAttack(); + if (ticksLeft > 0) + { + if (ticksLeft == 1) + { + color = npcs.getAttackStyle().getColor(); + } + else + { + color = Color.WHITE; + } + final String ticksLeftStr = String.valueOf(ticksLeft); + Point canvasPoint = npcs.getNpc().getCanvasTextLocation(graphics, ticksLeftStr, 0); + renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), color, canvasPoint); + } + } + break; + case NpcID.VANGUARD_7526: + case NpcID.VANGUARD_7527: + case NpcID.VANGUARD_7528: + case NpcID.VANGUARD_7529: + if (config.vangHighlight()) + { + OverlayUtil.renderPolygon(graphics, npcs.getNpc().getConvexHull(), npcs.getAttackStyle().getColor()); + } + break; + } + } + + if (plugin.isHandCripple()) + { + int tick = plugin.getCrippleTimer(); + NPC olmHand = plugin.getHand(); + final String tickStr = String.valueOf(tick); + Point canvasPoint = olmHand.getCanvasTextLocation(graphics, tickStr, 50); + renderTextLocation(graphics, tickStr, config.textSize(), config.fontStyle().getFont(), Color.GRAY, canvasPoint); + } + + if (config.timers()) + { + if (plugin.getBurnTarget().size() > 0) + { + for (Actor actor : plugin.getBurnTarget()) + { + final int ticksLeft = plugin.getBurnTicks(); + String ticksLeftStr = String.valueOf(ticksLeft); + Color tickcolor = new Color(255, 255, 255, 255); + if (ticksLeft >= 0) + { + if (ticksLeft == 34 || + ticksLeft == 33 || + ticksLeft == 26 || + ticksLeft == 25 || + ticksLeft == 18 || + ticksLeft == 17 || + ticksLeft == 10 || + ticksLeft == 9 || + ticksLeft == 2 || + ticksLeft == 1) + { + tickcolor = new Color(255, 0, 0, 255); + ticksLeftStr = "GAP"; + } + else + { + tickcolor = new Color(255, 255, 255, 255); + } + Point canvasPoint = actor.getCanvasTextLocation(graphics, ticksLeftStr, 0); + renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), tickcolor, canvasPoint); + } + } + } + + if (plugin.getAcidTarget() != null) + { + Actor actor = plugin.getAcidTarget(); + renderActorOverlay(graphics, actor, config.acidColor(), 2, 100, 10); + final int ticksLeft = plugin.getAcidTicks(); + Color tickcolor = new Color(255, 255, 255, 255); + if (ticksLeft > 0) + { + if (ticksLeft > 1) + { + tickcolor = new Color(69, 241, 44, 255); + } + else + { + tickcolor = new Color(255, 255, 255, 255); + } + final String ticksLeftStr = String.valueOf(ticksLeft); + Point canvasPoint = actor.getCanvasTextLocation(graphics, ticksLeftStr, 0); + renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), tickcolor, canvasPoint); + } + } + } + + if (config.tpOverlay()) + { + if (plugin.getTeleportTarget() != null) + { + renderActorOverlay(graphics, plugin.getTeleportTarget(), new Color(193, 255, 245, 255), 2, 100, 10); + } + } + + if (plugin.isRunOlm()) + { + NPC boss = plugin.getOlm_NPC(); + + if (config.olmTick()) + { + if (boss != null) + { + int tick = plugin.getOlm_TicksUntilAction(); + int cycle = plugin.getOlm_ActionCycle(); + int spec = plugin.getOlm_NextSpec(); + final String tickStr = String.valueOf(tick); + String cycleStr = "?"; + switch (cycle) + { + case 1: + switch (spec) + { + case 1: + cycleStr = "Portals"; + break; + case 2: + cycleStr = "lightning"; + break; + case 3: + cycleStr = "Crystals"; + break; + case 4: + cycleStr = "Heal"; + break; + case -1: + cycleStr = "??"; + break; + } + break; + case 2: + cycleStr = "Sauto"; + break; + case 3: + cycleStr = "Null"; + break; + case 4: + cycleStr = "Nauto"; + break; + case -1: + cycleStr = "??"; + break; + } + final String combinedStr = cycleStr + ":" + tickStr; + Point canvasPoint = boss.getCanvasTextLocation(graphics, combinedStr, 130); + renderTextLocation(graphics, combinedStr, config.textSize(), config.fontStyle().getFont(), Color.WHITE, canvasPoint); + } + } + } + } + + return null; + } + + private void drawTile(Graphics2D graphics, WorldPoint point, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) + { + WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); + if (point.distanceTo(playerLocation) >= 32) + { + return; + } + LocalPoint lp = LocalPoint.fromWorld(client, point); + if (lp == null) + { + return; + } + + Polygon poly = Perspective.getCanvasTilePoly(client, lp); + if (poly == null) + { + return; + } + //OverlayUtil.renderPolygon(graphics, poly, color); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); + graphics.setStroke(new BasicStroke(strokeWidth)); + graphics.draw(poly); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); + graphics.fill(poly); + } + + private void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha) + { + int size = 1; + NPCDefinition composition = actor.getTransformedDefinition(); + if (composition != null) + { + size = composition.getSize(); + } + LocalPoint lp = actor.getLocalLocation(); + Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); + + if (tilePoly != null) + { + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); + graphics.setStroke(new BasicStroke(outlineWidth)); + graphics.draw(tilePoly); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); + graphics.fill(tilePoly); + } + } + + private void renderActorOverlay(Graphics2D graphics, Actor actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha) + { + int size = 1; + LocalPoint lp = actor.getLocalLocation(); + Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); + + if (tilePoly != null) + { + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); + graphics.setStroke(new BasicStroke(outlineWidth)); + graphics.draw(tilePoly); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); + graphics.fill(tilePoly); + } + } + + private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) + { + graphics.setFont(new Font("Arial", fontStyle, fontSize)); + if (canvasPoint != null) + { + final Point canvasCenterPoint = new Point( + canvasPoint.getX(), + canvasPoint.getY()); + final Point canvasCenterPoint_shadow = new Point( + canvasPoint.getX() + 1, + canvasPoint.getY() + 1); + if (config.shadows()) + { + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); + } + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); + } + } + + private void renderTextLocationAbove(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) + { + graphics.setFont(new Font("Arial", fontStyle, fontSize)); + if (canvasPoint != null) + { + final Point canvasCenterPoint = new Point( + canvasPoint.getX(), + canvasPoint.getY() + 20); + final Point canvasCenterPoint_shadow = new Point( + canvasPoint.getX() + 1, + canvasPoint.getY() + 21); + if (config.shadows()) + { + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); + } + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); + } + } + + private List getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder) + { + List little = new WorldArea(npcLoc, npcSize, npcSize).toWorldPointList(); + List big = new WorldArea(npcLoc.getX() - thickness, npcLoc.getY() - thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList(); + if (!includeUnder) + { + for (Iterator it = big.iterator(); it.hasNext(); ) + { + WorldPoint p = it.next(); + if (little.contains(p)) + { + it.remove(); + } + } + } + return big; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java similarity index 50% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java index a479387fdf..f5f08b1199 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java @@ -29,7 +29,9 @@ package net.runelite.client.plugins.coxhelper; import com.google.inject.Provides; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; @@ -38,26 +40,25 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.AnimationID; -import api.ChatMessageType; -import api.Client; -import api.GraphicID; -import api.GraphicsObject; -import api.NPC; -import api.NpcID; -import api.Player; -import api.Projectile; -import api.ProjectileID; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.GameTick; -import api.events.SpotAnimationChanged; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.ProjectileMoved; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GraphicID; +import net.runelite.api.GraphicsObject; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Player; +import net.runelite.api.Projectile; +import net.runelite.api.ProjectileID; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.ProjectileMoved; +import net.runelite.api.events.SpotAnimationChanged; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -65,188 +66,93 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.Text; @PluginDescriptor( name = "CoX Helper", description = "All-in-one plugin for Chambers of Xeric", tags = {"CoX", "chamber", "xeric", "helper"}, - enabledByDefault = false, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) @Slf4j @Singleton public class CoxPlugin extends Plugin { - private static final int GAMEOBJECT_ID_PSN = 30032; - private static final int GRAPHICSOBJECT_ID_CRYSTAL = 1447; - private static final int GRAPHICSOBJECT_ID_HEAL = 1363; private static final int ANIMATION_ID_G1 = 430; private static final String OLM_HAND_CRIPPLE = "The Great Olm\'s left claw clenches to protect itself temporarily."; private static final Pattern TP_REGEX = Pattern.compile("You have been paired with (.*)! The magical power will enact soon..."); - private int sleepcount = 0; - private boolean needOlm = false; - private GraphicsObject teleportObject; - - @Inject - private Client client; - - @Inject - private ChatMessageManager chatMessageManager; - - @Inject - private CoxOverlay overlay; - - @Inject - private TimersOverlay timersOverlay; - - @Inject - private CoxConfig config; - - @Inject - private OverlayManager overlayManager; - - @Inject - private OlmCrippleTimerOverlay olmCrippleTimerOverlay; - - @Inject - private OlmPrayAgainstOverlay prayAgainstOverlay; - - @Inject - private VanguardsHighlight vanguardsHighlight; - - @Inject - private VanguardsOverlay vanguardsOverlay; - @Setter @Getter(AccessLevel.PACKAGE) protected PrayAgainst prayAgainstOlm; - - @Getter(AccessLevel.PACKAGE) - private boolean runMutta; - - @Getter(AccessLevel.PACKAGE) - private boolean runTekton; - - @Getter(AccessLevel.PACKAGE) - private boolean runVanguards; - - @Getter(AccessLevel.PACKAGE) - private boolean runGuard = false; - - @Getter(AccessLevel.PACKAGE) - private boolean enrageStage = false; - - @Getter(AccessLevel.PACKAGE) - private boolean HandCripple; - - @Getter(AccessLevel.PACKAGE) - private boolean runOlm; - - @Getter(AccessLevel.PACKAGE) - private NPC rangeVang; - - @Getter(AccessLevel.PACKAGE) - private NPC mageVang; - - @Getter(AccessLevel.PACKAGE) - private NPC meleeVang; - - @Getter(AccessLevel.PACKAGE) - private NPC Guard1_NPC; - - @Getter(AccessLevel.PACKAGE) - private NPC Guard2_NPC; - - @Getter(AccessLevel.PACKAGE) - private NPC Tekton_NPC; - - @Getter(AccessLevel.PACKAGE) - private NPC hand; - - @Getter(AccessLevel.PACKAGE) - private NPC Olm_NPC; - - @Getter(AccessLevel.PACKAGE) - private NPC OlmMelee_NPC; - - @Getter(AccessLevel.PACKAGE) - private NPC Mutta_NPC; - - @Getter(AccessLevel.PACKAGE) - private NPC Momma_NPC; - - @Getter(AccessLevel.PACKAGE) - private List Olm_Crystals = new ArrayList<>(); - - @Getter(AccessLevel.PACKAGE) - private List Olm_Heal = new ArrayList<>(); - - @Getter(AccessLevel.PACKAGE) - private List Olm_TP = new ArrayList<>(); - - @Getter(AccessLevel.PACKAGE) - private List Olm_PSN = new ArrayList<>(); - - @Getter(AccessLevel.PACKAGE) - private List burnTarget = new ArrayList<>(); - - @Getter(AccessLevel.PACKAGE) - private Actor teleportTarget; - - @Getter(AccessLevel.PACKAGE) - private Actor acidTarget; - - @Getter(AccessLevel.PACKAGE) - private int mageVangHP = -1; - - @Getter(AccessLevel.PACKAGE) - private int rangeVangHP = -1; - - @Getter(AccessLevel.PACKAGE) - private int meleeVangHP = -1; - - @Getter(AccessLevel.PACKAGE) - private int timer = 45; - - @Getter(AccessLevel.PACKAGE) - private int burnTicks = 41; - - @Getter(AccessLevel.PACKAGE) - private int acidTicks = 25; - - @Getter(AccessLevel.PACKAGE) - private int teleportTicks = 10; - - @Getter(AccessLevel.PACKAGE) - private int tektonTicks; - - @Getter(AccessLevel.PACKAGE) - private int tektonAttacks; - - @Getter(AccessLevel.PACKAGE) - private int tektonAttackTicks; - - @Getter(AccessLevel.PACKAGE) - private int guardTick = -1; - - @Getter(AccessLevel.PACKAGE) - private int OlmPhase = 0; - - @Getter(AccessLevel.PACKAGE) - private int Olm_TicksUntilAction = -1; - - @Getter(AccessLevel.PACKAGE) - private int Olm_ActionCycle = -1; //4:0 = auto 3:0 = null 2:0 = auto 1:0 = spec + actioncycle =4 - - @Getter(AccessLevel.PACKAGE) - private int Olm_NextSpec = -1; // 1= crystals 2=lightnig 3=portals 4= heal hand if p4 - @Getter(AccessLevel.PACKAGE) protected long lastPrayTime; - + private int sleepcount = 0; + private boolean needOlm = false; + private GraphicsObject teleportObject; + @Inject + private Client client; + @Inject + private ChatMessageManager chatMessageManager; + @Inject + private CoxOverlay coxOverlay; + @Inject + private CoxInfoBox coxInfoBox; + @Inject + private CoxConfig config; + @Inject + private OverlayManager overlayManager; + @Getter(AccessLevel.PACKAGE) + private boolean HandCripple; + @Getter(AccessLevel.PACKAGE) + private boolean runOlm; + @Getter(AccessLevel.PACKAGE) + private int vanguards; + @Getter(AccessLevel.PACKAGE) + private boolean tektonActive; + @Getter(AccessLevel.PACKAGE) + private NPC hand; + @Getter(AccessLevel.PACKAGE) + private NPC Olm_NPC; + @Getter(AccessLevel.PACKAGE) + private NPC OlmMelee_NPC; + @Getter(AccessLevel.PACKAGE) + private List Olm_Crystals = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private List Olm_Heal = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private List Olm_TP = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private List Olm_PSN = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private List burnTarget = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private Actor teleportTarget; + @Getter(AccessLevel.PACKAGE) + private Actor acidTarget; + @Getter(AccessLevel.PACKAGE) + private int crippleTimer = 45; + @Getter(AccessLevel.PACKAGE) + private int burnTicks = 41; + @Getter(AccessLevel.PACKAGE) + private int acidTicks = 25; + @Getter(AccessLevel.PACKAGE) + private int teleportTicks = 10; + @Getter(AccessLevel.PACKAGE) + private int tektonAttackTicks; + @Getter(AccessLevel.PACKAGE) + private int OlmPhase = 0; + @Getter(AccessLevel.PACKAGE) + private int Olm_TicksUntilAction = -1; + @Getter(AccessLevel.PACKAGE) + private int Olm_ActionCycle = -1; //4:0 = auto 3:0 = null 2:0 = auto 1:0 = spec + actioncycle =4 + @Getter(AccessLevel.PACKAGE) + private int Olm_NextSpec = -1; // 1= crystals 2=lightnig 3=portals 4= heal hand if p4 @Getter(AccessLevel.PACKAGE) private float percent; + @Getter(AccessLevel.PACKAGE) + private Map npcContainer = new HashMap<>(); @Provides CoxConfig getConfig(ConfigManager configManager) @@ -257,23 +163,8 @@ public class CoxPlugin extends Plugin @Override protected void startUp() { - overlayManager.add(overlay); - overlayManager.add(olmCrippleTimerOverlay); - overlayManager.add(prayAgainstOverlay); - overlayManager.add(timersOverlay); - overlayManager.add(vanguardsHighlight); - overlayManager.add(vanguardsOverlay); - } - - @Override - protected void shutDown() - { - overlayManager.remove(overlay); - overlayManager.remove(olmCrippleTimerOverlay); - overlayManager.remove(prayAgainstOverlay); - overlayManager.remove(timersOverlay); - overlayManager.remove(vanguardsHighlight); - overlayManager.remove(vanguardsOverlay); + overlayManager.add(coxOverlay); + overlayManager.add(coxInfoBox); HandCripple = false; hand = null; acidTarget = null; @@ -281,15 +172,18 @@ public class CoxPlugin extends Plugin Olm_TP.clear(); prayAgainstOlm = null; burnTarget.clear(); - timer = 45; + crippleTimer = 45; burnTicks = 40; acidTicks = 25; teleportTicks = 10; + vanguards = 0; } - private boolean inRaid() + @Override + protected void shutDown() { - return client.getVar(Varbits.IN_RAID) == 1; + overlayManager.remove(coxOverlay); + overlayManager.remove(coxInfoBox); } @Subscribe @@ -312,61 +206,55 @@ public class CoxPlugin extends Plugin } } } - String msg = chatMessage.getMessageNode().getValue().toLowerCase(); - if (msg.contains("the great olm rises with the power of")) + switch (Text.standardize(chatMessage.getMessageNode().getValue())) { - if (!runOlm) - { - Olm_ActionCycle = -1; - Olm_TicksUntilAction = 4; - } - else - { - Olm_ActionCycle = -1; - Olm_TicksUntilAction = 3; - } - OlmPhase = 0; - runOlm = true; - needOlm = true; - Olm_NextSpec = -1; - } + case "the great olm rises with the power of acid.": + case "the great olm rises with the power of crystal.": + case "the great olm rises with the power of flame.": + case "the great olm is giving its all. this is its final stand.": + if (!runOlm) + { + Olm_ActionCycle = -1; + Olm_TicksUntilAction = 4; + } + else + { + Olm_ActionCycle = -1; + Olm_TicksUntilAction = 3; + } + OlmPhase = 0; + runOlm = true; + needOlm = true; + crippleTimer = 45; + Olm_NextSpec = -1; + break; + case "the great olm fires a sphere of aggression your way. your prayers have been sapped.": + prayAgainstOlm = PrayAgainst.MELEE; + lastPrayTime = System.currentTimeMillis(); + break; + case "the great olm fires a sphere of aggression your way.": + prayAgainstOlm = PrayAgainst.MELEE; + lastPrayTime = System.currentTimeMillis(); + break; + case "the great olm fires a sphere of magical power your way. your prayers have been sapped.": + prayAgainstOlm = PrayAgainst.MAGIC; + lastPrayTime = System.currentTimeMillis(); + break; + case "the great olm fires a sphere of magical power your way.": + prayAgainstOlm = PrayAgainst.MAGIC; + lastPrayTime = System.currentTimeMillis(); + break; + case "the great olm fires a sphere of accuracy and dexterity your way. your prayers have been sapped.": + prayAgainstOlm = PrayAgainst.RANGED; + lastPrayTime = System.currentTimeMillis(); + break; + case "the great olm fires a sphere of accuracy and dexterity your way.": + prayAgainstOlm = PrayAgainst.RANGED; + lastPrayTime = System.currentTimeMillis(); + break; + case "the great olm's left claw clenches to protect itself temporarily.": + HandCripple = true; - if (msg.contains("the great olm is giving its all. this is its final stand")) - { - if (!runOlm) - { - Olm_ActionCycle = -1; - Olm_TicksUntilAction = 4; - } - else - { - Olm_ActionCycle = -1; - Olm_TicksUntilAction = 3; - } - OlmPhase = 1; - runOlm = true; - needOlm = true; - Olm_NextSpec = -1; - } - if (msg.startsWith(OLM_HAND_CRIPPLE)) - { - HandCripple = true; - timer = 45; - } - if (msg.contains("aggression")) - { - prayAgainstOlm = PrayAgainst.MELEE; - lastPrayTime = System.currentTimeMillis(); - } - if (msg.contains("of magical power")) - { - prayAgainstOlm = PrayAgainst.MAGIC; - lastPrayTime = System.currentTimeMillis(); - } - if (msg.contains("accuracy and dexterity")) - { - prayAgainstOlm = PrayAgainst.RANGED; - lastPrayTime = System.currentTimeMillis(); } } } @@ -390,7 +278,7 @@ public class CoxPlugin extends Plugin } if (projectile.getId() == ProjectileID.OLM_ACID_TRAIL) { - /*acidTarget = projectile.getInteracting();*/ + acidTarget = projectile.getInteracting(); } } } @@ -403,37 +291,10 @@ public class CoxPlugin extends Plugin Actor actor = graphicChanged.getActor(); if (actor.getSpotAnimation() == GraphicID.OLM_BURN) { - burnTarget.add(actor); - } - } - } - - @Subscribe - public void onAnimationChanged(AnimationChanged event) - { - if (event.getActor() == Tekton_NPC) - { - switch (Tekton_NPC.getAnimation()) - { - case AnimationID.TEKTON_AUTO1: - case AnimationID.TEKTON_AUTO2: - case AnimationID.TEKTON_AUTO3: - case AnimationID.TEKTON_ENRAGE_AUTO1: - case AnimationID.TEKTON_ENRAGE_AUTO2: - case AnimationID.TEKTON_ENRAGE_AUTO3: - tektonTicks = 4; - tektonAttacks++; - break; - case AnimationID.TEKTON_FAST_AUTO1: - case AnimationID.TEKTON_FAST_AUTO2: - tektonTicks = 3; - tektonAttacks++; - break; - case AnimationID.TEKTON_ANVIL: - tektonTicks = 15; - tektonAttacks = 0; - tektonAttackTicks = 47; - break; + if (!burnTarget.contains(actor)) + { + burnTarget.add(actor); + } } } } @@ -452,36 +313,23 @@ public class CoxPlugin extends Plugin case NpcID.TEKTON_7545: case NpcID.TEKTON_ENRAGED: case NpcID.TEKTON_ENRAGED_7544: - runTekton = true; - Tekton_NPC = npc; + npcContainer.put(npc, new NPCContainer(npc)); tektonAttackTicks = 27; break; case NpcID.MUTTADILE: - Momma_NPC = npc; - break; case NpcID.MUTTADILE_7562: - runMutta = true; - Mutta_NPC = npc; - break; case NpcID.MUTTADILE_7563: - runMutta = true; - Momma_NPC = npc; - break; case NpcID.GUARDIAN: - Guard1_NPC = npc; - guardTick = -1; - runGuard = true; - break; case NpcID.GUARDIAN_7570: - Guard2_NPC = npc; - guardTick = -1; - runGuard = true; + npcContainer.put(npc, new NPCContainer(npc)); break; + case NpcID.VANGUARD: case NpcID.VANGUARD_7526: case NpcID.VANGUARD_7527: case NpcID.VANGUARD_7528: case NpcID.VANGUARD_7529: - runVanguards = true; + vanguards++; + npcContainer.put(npc, new NPCContainer(npc)); break; case NpcID.GREAT_OLM_LEFT_CLAW: case NpcID.GREAT_OLM_LEFT_CLAW_7555: @@ -492,11 +340,11 @@ public class CoxPlugin extends Plugin } @Subscribe - public void onNpcDespawned(NpcDespawned npcDespawned) + public void onNpcDespawned(NpcDespawned event) { if (inRaid()) { - NPC npc = npcDespawned.getNpc(); + NPC npc = event.getNpc(); switch (npc.getId()) { case NpcID.TEKTON: @@ -505,35 +353,28 @@ public class CoxPlugin extends Plugin case NpcID.TEKTON_7545: case NpcID.TEKTON_ENRAGED: case NpcID.TEKTON_ENRAGED_7544: - enrageStage = false; - runTekton = false; - Tekton_NPC = null; - break; case NpcID.MUTTADILE: - Momma_NPC = null; - break; case NpcID.MUTTADILE_7562: - Mutta_NPC = null; - break; case NpcID.MUTTADILE_7563: - runMutta = false; - Momma_NPC = null; - break; case NpcID.GUARDIAN: - Guard1_NPC = null; - runGuard = false; - Guard2_NPC = null; - break; case NpcID.GUARDIAN_7570: - Guard2_NPC = null; - Guard1_NPC = null; - runGuard = false; - break; case NpcID.GUARDIAN_7571: case NpcID.GUARDIAN_7572: - Guard1_NPC = null; - Guard2_NPC = null; - runGuard = false; + if (npcContainer.remove(event.getNpc()) != null && !npcContainer.isEmpty()) + { + npcContainer.remove(event.getNpc()); + } + break; + case NpcID.VANGUARD: + case NpcID.VANGUARD_7526: + case NpcID.VANGUARD_7527: + case NpcID.VANGUARD_7528: + case NpcID.VANGUARD_7529: + if (npcContainer.remove(event.getNpc()) != null && !npcContainer.isEmpty()) + { + npcContainer.remove(event.getNpc()); + } + vanguards--; break; case NpcID.GREAT_OLM_RIGHT_CLAW_7553: case NpcID.GREAT_OLM_RIGHT_CLAW: @@ -548,20 +389,21 @@ public class CoxPlugin extends Plugin { if (!inRaid()) { - runOlm = false; - runGuard = false; - runMutta = false; - runTekton = false; - runVanguards = false; - enrageStage = false; needOlm = false; OlmPhase = 0; sleepcount = 0; Olm_Heal.clear(); + npcContainer.clear(); + burnTarget.clear(); + Olm_NPC = null; + hand = null; prayAgainstOlm = null; + runOlm = false; return; } + npcHandler(); + if (needOlm = true) { for (NPC monster : client.getNpcs()) @@ -575,217 +417,237 @@ public class CoxPlugin extends Plugin } } - if (runTekton) + if (teleportTarget != null) { - if (Tekton_NPC.getId() == NpcID.TEKTON_ENRAGED || Tekton_NPC.getId() == NpcID.TEKTON_ENRAGED_7544) + log.info(teleportTarget.getName()); + Player target = (Player) teleportTarget; + client.setHintArrow(target); + teleportTicks--; + if (teleportTicks <= 0) { - enrageStage = true; - } - if (tektonTicks > 0) - { - tektonTicks--; - } - if (tektonAttacks > 0 && tektonAttackTicks > 0) - { - tektonAttackTicks--; + client.clearHintArrow(); + teleportTarget = null; + teleportTicks = 10; } } - if (runGuard) + if (acidTarget != null) { - if (guardTick == -1) + acidTicks--; + if (acidTicks <= 0) { - if (Guard1_NPC != null) - { - if (Guard1_NPC.getAnimation() == ANIMATION_ID_G1) - { - guardTick = 5; - } - } - if (Guard2_NPC != null) - { - if (Guard2_NPC.getAnimation() == ANIMATION_ID_G1) - { - guardTick = 5; - } - } - } - else - { - guardTick--; - } - if (guardTick == 0) - { - guardTick = 5; + acidTarget = null; + acidTicks = 25; } } - if (runVanguards) + if (burnTarget.size() > 0) { - for (NPC npc : client.getNpcs()) + burnTicks--; + if (burnTicks <= 0) { - switch (npc.getId()) - { - case NpcID.VANGUARD_7529: - percent = (float) npc.getHealthRatio() / npc.getHealth() * 100; - mageVangHP = (int) percent; - mageVang = npc; - break; - case NpcID.VANGUARD_7528: - percent = (float) npc.getHealthRatio() / npc.getHealth() * 100; - rangeVangHP = (int) percent; - rangeVang = npc; - break; - case NpcID.VANGUARD_7527: - percent = (float) npc.getHealthRatio() / npc.getHealth() * 100; - meleeVangHP = (int) percent; - meleeVang = npc; - break; - case NpcID.VANGUARD_7526: - break; - } - if (meleeVangHP <= 0 && mageVangHP <= 0 && rangeVangHP <= 0) - { - runVanguards = false; - } + burnTarget.clear(); + burnTicks = 41; + } + } + + if (HandCripple) + { + crippleTimer--; + if (crippleTimer <= 0) + { + HandCripple = false; + crippleTimer = 45; } } if (runOlm) { - Olm_Crystals.clear(); - Olm_Heal.clear(); - client.clearHintArrow(); - sleepcount--; + olmHandler(); + } + } - if (teleportTarget != null) + private void npcHandler() + { + for (NPCContainer npcs : getNpcContainer().values()) + { + switch (npcs.getNpc().getId()) { - log.info(teleportTarget.getName()); - Player target = (Player) teleportTarget; - client.setHintArrow(target); - teleportTicks--; - if (teleportTicks <= 0) - { - client.clearHintArrow(); - teleportTarget = null; - teleportTicks = 10; - } - } - if (acidTarget != null) - { - acidTicks--; - if (acidTicks <= 0) - { - acidTarget = null; - acidTicks = 25; - } - } - if (burnTarget.size() > 0) - { - burnTicks--; - if (burnTicks <= 0) - { - burnTarget.clear(); - burnTicks = 41; - } - } - if (HandCripple) - { - timer--; - if (timer <= 0) - { - HandCripple = false; - timer = 45; - } - } - - if (Olm_TicksUntilAction == 1) - { - if (Olm_ActionCycle == 1) - { - Olm_ActionCycle = 4; - Olm_TicksUntilAction = 4; - if (Olm_NextSpec == 1) + case NpcID.TEKTON: + case NpcID.TEKTON_7541: + case NpcID.TEKTON_7542: + case NpcID.TEKTON_7545: + case NpcID.TEKTON_ENRAGED: + case NpcID.TEKTON_ENRAGED_7544: + npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); + npcs.setAttackStyle(NPCContainer.Attackstyle.MELEE); + switch (npcs.getNpc().getAnimation()) { - if (OlmPhase == 1) - { - Olm_NextSpec = 4; // 4 = heal 3= cry 2 = lightn 1 = swap - } - else - { - Olm_NextSpec = 3; - } + case AnimationID.TEKTON_AUTO1: + case AnimationID.TEKTON_AUTO2: + case AnimationID.TEKTON_AUTO3: + case AnimationID.TEKTON_ENRAGE_AUTO1: + case AnimationID.TEKTON_ENRAGE_AUTO2: + case AnimationID.TEKTON_ENRAGE_AUTO3: + tektonActive = true; + if (npcs.getTicksUntilAttack() < 1) + { + npcs.setTicksUntilAttack(4); + } + break; + case AnimationID.TEKTON_FAST_AUTO1: + case AnimationID.TEKTON_FAST_AUTO2: + tektonActive = true; + if (npcs.getTicksUntilAttack() < 1) + { + npcs.setTicksUntilAttack(3); + } + break; + case AnimationID.TEKTON_ANVIL: + tektonActive = false; + tektonAttackTicks = 47; + if (npcs.getTicksUntilAttack() < 1) + { + npcs.setTicksUntilAttack(15); + } + } + break; + case NpcID.GUARDIAN: + case NpcID.GUARDIAN_7570: + case NpcID.GUARDIAN_7571: + case NpcID.GUARDIAN_7572: + npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); + npcs.setAttackStyle(NPCContainer.Attackstyle.MELEE); + if (npcs.getNpc().getAnimation() == ANIMATION_ID_G1 && + npcs.getTicksUntilAttack() < 1) + { + npcs.setTicksUntilAttack(5); + } + break; + case NpcID.VANGUARD_7529: + if (npcs.getAttackStyle() == NPCContainer.Attackstyle.UNKNOWN) + { + npcs.setAttackStyle(NPCContainer.Attackstyle.MAGE); + } + break; + case NpcID.VANGUARD_7528: + if (npcs.getAttackStyle() == NPCContainer.Attackstyle.UNKNOWN) + { + npcs.setAttackStyle(NPCContainer.Attackstyle.RANGE); + } + break; + case NpcID.VANGUARD_7527: + if (npcs.getAttackStyle() == NPCContainer.Attackstyle.UNKNOWN) + { + npcs.setAttackStyle(NPCContainer.Attackstyle.MELEE); + } + break; + } + } + if (tektonActive && tektonAttackTicks > 0) + { + tektonAttackTicks--; + } + } + + private void olmHandler() + { + Olm_Crystals.clear(); + Olm_Heal.clear(); + Olm_TP.clear(); + client.clearHintArrow(); + sleepcount--; + if (Olm_TicksUntilAction == 1) + { + if (Olm_ActionCycle == 1) + { + Olm_ActionCycle = 4; + Olm_TicksUntilAction = 4; + if (Olm_NextSpec == 1) + { + if (OlmPhase == 1) + { + Olm_NextSpec = 4; // 4 = heal 3= cry 2 = lightn 1 = swap } else { - Olm_NextSpec--; + Olm_NextSpec = 3; } } else { - if (Olm_ActionCycle != -1) - { - Olm_ActionCycle--; - } - Olm_TicksUntilAction = 4; + Olm_NextSpec--; } } else { - Olm_TicksUntilAction--; + if (Olm_ActionCycle != -1) + { + Olm_ActionCycle--; + } + Olm_TicksUntilAction = 4; } + } + else + { + Olm_TicksUntilAction--; + } - for (GraphicsObject o : client.getGraphicsObjects()) + for (GraphicsObject o : client.getGraphicsObjects()) + { + if (o.getId() == GraphicID.OLM_CRYSTAL) { - if (o.getId() == GRAPHICSOBJECT_ID_CRYSTAL) + WorldPoint newloc; + for (int x = -1; x <= 1; x++) { - WorldPoint newloc; - for (int x = -1; x <= 1; x++) + for (int y = -1; y <= 1; y++) { - for (int y = -1; y <= 1; y++) - { - newloc = WorldPoint.fromLocal(client, o.getLocation()); - newloc = newloc.dx(x); - newloc = newloc.dy(y); - Olm_Crystals.add(newloc); - } + newloc = WorldPoint.fromLocal(client, o.getLocation()); + newloc = newloc.dx(x); + newloc = newloc.dy(y); + Olm_Crystals.add(newloc); } } - if (sleepcount <= 0) + } + if (sleepcount <= 0) + { + if (o.getId() == 1338) { - if (o.getId() == 1338) - { - Olm_TicksUntilAction = 1; - Olm_NextSpec = 2; - Olm_ActionCycle = 4; //spec=1 null=3 - sleepcount = 5; - } - if (o.getId() == 1356) - { - Olm_TicksUntilAction = 4; - Olm_NextSpec = 1; - Olm_ActionCycle = 4; //spec=1 null=3 - sleepcount = 50; - } + Olm_TicksUntilAction = 1; + Olm_NextSpec = 2; + Olm_ActionCycle = 4; //spec=1 null=3 + sleepcount = 5; } - if (o.getId() == 1359) + if (o.getId() == 1356) { - Olm_TP.add(WorldPoint.fromLocal(client, o.getLocation())); + Olm_TicksUntilAction = 4; + Olm_NextSpec = 1; + Olm_ActionCycle = 4; //spec=1 null=3 + sleepcount = 50; } - if (o.getId() == GRAPHICSOBJECT_ID_HEAL) + } + if (o.getId() == GraphicID.OLM_TELEPORT) + { + Olm_TP.add(WorldPoint.fromLocal(client, o.getLocation())); + } + if (o.getId() == GraphicID.OLM_HEAL) + { + Olm_Heal.add(WorldPoint.fromLocal(client, o.getLocation())); + } + if (!Olm_TP.isEmpty()) + { + teleportTicks--; + if (teleportTicks <= 0) { - Olm_Heal.add(WorldPoint.fromLocal(client, o.getLocation())); - } - if (!Olm_TP.isEmpty()) - { - teleportTicks--; - if (teleportTicks <= 0) - { - client.clearHintArrow(); - teleportTicks = 10; - } + client.clearHintArrow(); + teleportTicks = 10; } } } } + + boolean inRaid() + { + return client.getVar(Varbits.IN_RAID) == 1; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/NPCContainer.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/NPCContainer.java similarity index 68% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/NPCContainer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/NPCContainer.java index d9d2433867..de33254a5d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/NPCContainer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/NPCContainer.java @@ -23,13 +23,15 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.fightcave; +package net.runelite.client.plugins.coxhelper; +import java.awt.Color; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import api.Actor; -import api.NPC; -import api.NPCDefinition; +import net.runelite.api.Actor; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; class NPCContainer { @@ -48,7 +50,11 @@ class NPCContainer @Setter @Getter - private int TicksUntilAttack; + private int ticksUntilAttack; + + @Setter + @Getter + private int intermissionPeriod; @Setter @Getter @@ -58,6 +64,14 @@ class NPCContainer @Getter private Actor npcInteracting; + @Setter + @Getter + private Specials specials; + + @Setter + @Getter + private Attackstyle attackStyle; + NPCContainer(NPC npc) { @@ -66,7 +80,10 @@ class NPCContainer this.npcIndex = npc.getIndex(); this.npcInteracting = npc.getInteracting(); this.npcSpeed = 0; - this.TicksUntilAttack = 0; + this.ticksUntilAttack = 0; + this.intermissionPeriod = 0; + this.attackStyle = Attackstyle.UNKNOWN; + this.specials = Specials.UNKNOWN; final NPCDefinition composition = npc.getTransformedDefinition(); if (composition != null) @@ -74,4 +91,30 @@ class NPCContainer this.npcSize = composition.getSize(); } } + + @AllArgsConstructor + @Getter + public enum Specials + { + PORTALS("Portals"), + LIGHTNING("Lightning"), + CRYSTALS("Crystals"), + HEAL("Heal"), + UNKNOWN("Unknown"); + + private String name = ""; + } + + @AllArgsConstructor + @Getter + public enum Attackstyle + { + MAGE("Mage", Color.CYAN), + RANGE("Range", Color.GREEN), + MELEE("Melee", Color.RED), + UNKNOWN("Unknown", Color.WHITE); + + private String name = ""; + private Color color; + } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/PrayAgainst.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/PrayAgainst.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/PrayAgainst.java rename to runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/PrayAgainst.java index 2f0c0ca03b..2b61b5010e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/PrayAgainst.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/PrayAgainst.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.coxhelper; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Prayer; +import net.runelite.api.Prayer; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/crystalmathlabs/CrystalMathLabs.java b/runelite-client/src/main/java/net/runelite/client/plugins/crystalmathlabs/CrystalMathLabs.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/crystalmathlabs/CrystalMathLabs.java rename to runelite-client/src/main/java/net/runelite/client/plugins/crystalmathlabs/CrystalMathLabs.java index bda5e39e49..155b3bfcc6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/crystalmathlabs/CrystalMathLabs.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/crystalmathlabs/CrystalMathLabs.java @@ -28,12 +28,12 @@ import java.io.IOException; import java.util.Objects; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.Player; -import api.Skill; -import api.events.GameStateChanged; -import api.events.GameTick; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.Skill; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java rename to runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java index c95b14eb1a..7e0fc4c18e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.customcursor; import com.google.inject.Provides; import javax.inject.Inject; -import api.events.ConfigChanged; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java index 2871d85fd0..4e9c86df1d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java @@ -26,17 +26,17 @@ package net.runelite.client.plugins.dailytaskindicators; +import net.runelite.api.vars.AccountType; import com.google.inject.Provides; import javax.inject.Inject; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.VarClientInt; -import api.VarPlayer; -import api.Varbits; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.vars.AccountType; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java index dd496ade33..34bb399c2f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java @@ -33,14 +33,14 @@ import java.time.temporal.ChronoUnit; import java.util.Set; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.ItemID; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.LocalPlayerDeath; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.ItemID; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.LocalPlayerDeath; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java index a8e13d6e12..e6368d87ce 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.deathindicator; import java.awt.Graphics; import java.awt.image.BufferedImage; -import api.Point; -import api.coords.WorldPoint; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; class DeathWorldMapPoint extends WorldMapPoint diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java index 2c4c1abe3a..96d5dfa246 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java @@ -28,9 +28,9 @@ import com.google.inject.Provides; import java.io.IOException; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.SessionOpen; @@ -112,11 +112,17 @@ public class DefaultWorldPlugin extends Plugin try { final WorldResult worldResult = worldClient.lookupWorlds(); + + if (worldResult == null) + { + return; + } + final World world = worldResult.findWorld(correctedWorld); if (world != null) { - final api.World rsWorld = client.createWorld(); + final net.runelite.api.World rsWorld = client.createWorld(); rsWorld.setActivity(world.getActivity()); rsWorld.setAddress(world.getAddress()); rsWorld.setId(world.getId()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorilla.java b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorilla.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorilla.java rename to runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorilla.java index 0604812ea1..fb876683c7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorilla.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorilla.java @@ -28,11 +28,11 @@ import java.util.Arrays; import java.util.List; import lombok.Getter; import lombok.Setter; -import api.Actor; -import api.HeadIcon; -import api.NPC; -import api.NPCDefinition; -import api.coords.WorldArea; +import net.runelite.api.Actor; +import net.runelite.api.HeadIcon; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.coords.WorldArea; public class DemonicGorilla { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaOverlay.java index 81a0670933..bf1154fecc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaOverlay.java @@ -33,11 +33,11 @@ import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.Skill; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Skill; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java index e08e7557f5..0df801bda5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java @@ -33,26 +33,26 @@ import java.util.Map; import java.util.stream.Collectors; import javax.inject.Inject; import lombok.Getter; -import api.AnimationID; -import api.Client; -import api.GameState; -import api.HeadIcon; -import api.Hitsplat; -import api.NPC; -import api.NpcID; -import api.Player; -import api.Projectile; -import api.ProjectileID; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.HitsplatApplied; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.PlayerDespawned; -import api.events.PlayerSpawned; -import api.events.ProjectileMoved; +import net.runelite.api.AnimationID; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.HeadIcon; +import net.runelite.api.Hitsplat; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Player; +import net.runelite.api.Projectile; +import net.runelite.api.ProjectileID; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.PlayerDespawned; +import net.runelite.api.events.PlayerSpawned; +import net.runelite.api.events.ProjectileMoved; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/MemorizedPlayer.java b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/MemorizedPlayer.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/MemorizedPlayer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/MemorizedPlayer.java index 2d306ae81c..7dd0058cd6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/MemorizedPlayer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/MemorizedPlayer.java @@ -28,9 +28,9 @@ import java.util.ArrayList; import java.util.List; import lombok.Getter; import lombok.Setter; -import api.Hitsplat; -import api.Player; -import api.coords.WorldArea; +import net.runelite.api.Hitsplat; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldArea; public class MemorizedPlayer { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/PendingGorillaAttack.java b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/PendingGorillaAttack.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/PendingGorillaAttack.java rename to runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/PendingGorillaAttack.java index 603429cd02..6f3faff8d2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/demonicgorilla/PendingGorillaAttack.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/PendingGorillaAttack.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.demonicgorilla; import lombok.Getter; -import api.Player; +import net.runelite.api.Player; public class PendingGorillaAttack { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java similarity index 69% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java index c7176d1ebf..ee0f83811b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java @@ -27,12 +27,12 @@ package net.runelite.client.plugins.devtools; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; -import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class CameraOverlay extends Overlay { @@ -59,39 +59,17 @@ public class CameraOverlay extends Overlay panelComponent.getChildren().clear(); - panelComponent.getChildren().add(TitleComponent.builder() - .text("Camera") - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panelComponent.getChildren().add(LineComponent.builder() - .left("X") - .right("" + client.getCameraX()) - .build()); + tableComponent.addRow("X", "" + client.getCameraX()); + tableComponent.addRow("Y", "" + client.getCameraY()); + tableComponent.addRow("Z", "" + client.getCameraZ()); + tableComponent.addRow("Pitch", "" + client.getCameraPitch()); + tableComponent.addRow("Yaw", "" + client.getCameraYaw()); + tableComponent.addRow("Scale", "" + client.getScale()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Y") - .right("" + client.getCameraY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Z") - .right("" + client.getCameraZ()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Pitch") - .right("" + client.getCameraPitch()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Yaw") - .right("" + client.getCameraYaw()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Scale") - .right("" + client.getScale()) - .build()); + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java index 52de0309a9..e21af75f5a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java @@ -37,6 +37,7 @@ class DevToolsButton extends JButton { super(title); addActionListener((ev) -> setActive(!active)); + this.setToolTipText(title); } void setActive(boolean active) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java index 3121526d9a..a770bf8b85 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java @@ -38,29 +38,31 @@ import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; import lombok.Setter; -import api.Actor; -import api.Client; -import api.Constants; -import api.DecorativeObject; -import api.GameObject; -import api.GraphicsObject; -import api.GroundObject; -import api.Item; -import api.ItemLayer; -import api.NPC; -import api.NPCDefinition; -import api.Node; -import api.Perspective; -import api.Player; -import api.Point; -import api.Projectile; -import api.Scene; -import api.Tile; -import api.WallObject; -import api.coords.LocalPoint; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetItem; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.DecorativeObject; +import net.runelite.api.DynamicObject; +import net.runelite.api.GameObject; +import net.runelite.api.GraphicsObject; +import net.runelite.api.GroundObject; +import net.runelite.api.Item; +import net.runelite.api.ItemLayer; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Node; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Projectile; +import net.runelite.api.Renderable; +import net.runelite.api.Scene; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -78,6 +80,7 @@ class DevToolsOverlay extends Overlay private static final Font FONT = FontManager.getRunescapeFont().deriveFont(Font.BOLD, 16); private static final Color RED = new Color(221, 44, 0); private static final Color GREEN = new Color(0, 200, 83); + private static final Color TURQOISE = new Color(0, 200, 157); private static final Color ORANGE = new Color(255, 109, 0); private static final Color YELLOW = new Color(255, 214, 0); private static final Color CYAN = new Color(0, 184, 212); @@ -144,6 +147,11 @@ class DevToolsOverlay extends Overlay renderGraphicsObjects(graphics); } + if (plugin.getCursorPos().isActive()) + { + renderCursorTooltip(graphics); + } + renderWidgets(graphics); return null; @@ -255,6 +263,14 @@ class DevToolsOverlay extends Overlay } } + private void renderCursorTooltip(Graphics2D graphics) + { + if (client.getMouseCanvasPosition().getX() >= 0 && client.getMouseCanvasPosition().getY() >= 0) + { + toolTipManager.add(new Tooltip("Cursor Point: " + client.getMouseCanvasPosition().getX() + ", " + client.getMouseCanvasPosition().getY())); + } + } + private void renderTileTooltip(Graphics2D graphics, Tile tile) { Polygon poly = Perspective.getCanvasTilePoly(client, tile.getLocalLocation()); @@ -294,7 +310,15 @@ class DevToolsOverlay extends Overlay { if (player.getLocalLocation().distanceTo(gameObject.getLocalLocation()) <= MAX_DISTANCE) { - OverlayUtil.renderTileOverlay(graphics, gameObject, "ID: " + gameObject.getId(), GREEN); + Renderable renderable = gameObject.getRenderable(); + if (renderable instanceof DynamicObject) + { + OverlayUtil.renderTileOverlay(graphics, gameObject, "ID: " + gameObject.getId() + " Anim: " + ((DynamicObject) renderable).getAnimationID(), TURQOISE); + } + else + { + OverlayUtil.renderTileOverlay(graphics, gameObject, "ID: " + gameObject.getId(), GREEN); + } } // Draw a polygon around the convex hull @@ -404,7 +428,7 @@ class DevToolsOverlay extends Overlay } int projectileId = projectile.getId(); - Actor projectileInteracting = null; + Actor projectileInteracting = projectile.getInteracting(); String infoString = ""; @@ -489,6 +513,7 @@ class DevToolsOverlay extends Overlay WidgetItem widgetItem = widget.getWidgetItem(itemIndex); if (widgetItem == null + || widgetItem.getId() < 0 || widgetItem.getId() == ITEM_EMPTY || widgetItem.getId() == ITEM_FILLED) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java index ecb724b7eb..91876b555c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java @@ -28,7 +28,7 @@ package net.runelite.client.plugins.devtools; import java.awt.GridLayout; import javax.inject.Inject; import javax.swing.JPanel; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; @@ -76,6 +76,7 @@ class DevToolsPanel extends PluginPanel container.add(plugin.getLocation()); container.add(plugin.getWorldMapLocation()); container.add(plugin.getTileLocation()); + container.add(plugin.getCursorPos()); container.add(plugin.getCameraPosition()); container.add(plugin.getChunkBorders()); @@ -132,6 +133,8 @@ class DevToolsPanel extends PluginPanel } }); + container.add(plugin.getSoundEffects()); + return container; } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java index 5d306295b2..cc64835acb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java @@ -33,21 +33,21 @@ import static java.lang.Math.min; import java.util.List; import javax.inject.Inject; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.Experience; -import api.MenuAction; -import api.MenuEntry; -import api.NPC; -import api.Player; -import api.Skill; -import api.coords.WorldPoint; -import api.events.BoostedLevelChanged; -import api.events.CommandExecuted; -import api.events.ExperienceChanged; -import api.events.MenuEntryAdded; -import api.events.VarbitChanged; -import api.kit.KitType; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Skill; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.BoostedLevelChanged; +import net.runelite.api.events.CommandExecuted; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.kit.KitType; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; @@ -100,6 +100,9 @@ public class DevToolsPlugin extends Plugin @Inject private WorldMapRegionOverlay mapRegionOverlay; + @Inject + private SoundEffectOverlay soundEffectOverlay; + @Inject private EventBus eventBus; @@ -121,12 +124,14 @@ public class DevToolsPlugin extends Plugin private DevToolsButton cameraPosition; private DevToolsButton worldMapLocation; private DevToolsButton tileLocation; + private DevToolsButton cursorPos; private DevToolsButton interacting; private DevToolsButton examine; private DevToolsButton detachedCamera; private DevToolsButton widgetInspector; private DevToolsButton varInspector; private DevToolsButton logMenuActions; + private DevToolsButton soundEffects; private NavigationButton navButton; @Provides @@ -153,29 +158,35 @@ public class DevToolsPlugin extends Plugin location = new DevToolsButton("Location"); worldMapLocation = new DevToolsButton("World Map Location"); + tileLocation = new DevToolsButton("Tile Location"); + cursorPos = new DevToolsButton("Cursor Position"); + cameraPosition = new DevToolsButton("Camera Position"); - chunkBorders = new DevToolsButton("Chunk Borders"); - mapSquares = new DevToolsButton("Map Squares"); + mapSquares = new DevToolsButton("Map Squares"); lineOfSight = new DevToolsButton("Line Of Sight"); + validMovement = new DevToolsButton("Valid Movement"); interacting = new DevToolsButton("Interacting"); - examine = new DevToolsButton("Examine"); + examine = new DevToolsButton("Examine"); detachedCamera = new DevToolsButton("Detached Camera"); + widgetInspector = new DevToolsButton("Widget Inspector"); varInspector = new DevToolsButton("Var Inspector"); + soundEffects = new DevToolsButton("Sound Effects"); + logMenuActions = new DevToolsButton("Menu Actions"); + overlayManager.add(overlay); overlayManager.add(locationOverlay); overlayManager.add(sceneOverlay); overlayManager.add(cameraOverlay); overlayManager.add(worldMapLocationOverlay); overlayManager.add(mapRegionOverlay); - - logMenuActions = new DevToolsButton("Menu Actions"); + overlayManager.add(soundEffectOverlay); final DevToolsPanel panel = injector.getInstance(DevToolsPanel.class); @@ -189,17 +200,21 @@ public class DevToolsPlugin extends Plugin .build(); clientToolbar.addNavigation(navButton); + + eventBus.register(soundEffectOverlay); } @Override protected void shutDown() throws Exception { + eventBus.unregister(soundEffectOverlay); overlayManager.remove(overlay); overlayManager.remove(locationOverlay); overlayManager.remove(sceneOverlay); overlayManager.remove(cameraOverlay); overlayManager.remove(worldMapLocationOverlay); overlayManager.remove(mapRegionOverlay); + overlayManager.remove(soundEffectOverlay); clientToolbar.removeNavigation(navButton); } @@ -339,6 +354,12 @@ public class DevToolsPlugin extends Plugin player.getPlayerAppearance().setHash(); break; } + case "sound": + { + int id = Integer.parseInt(args[0]); + client.playSoundEffect(id); + break; + } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java similarity index 69% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java index a6c55a5737..af739d6499 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java @@ -28,14 +28,16 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.Constants.CHUNK_SIZE; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import static net.runelite.api.Constants.CHUNK_SIZE; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; public class LocationOverlay extends Overlay { @@ -66,11 +68,12 @@ public class LocationOverlay extends Overlay int regionID = localWorld.getRegionID(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (client.isInInstancedRegion()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Instance") - .build()); + tableComponent.addRow("Instance", ""); int[][][] instanceTemplateChunks = client.getInstanceTemplateChunks(); int z = client.getPlane(); @@ -80,43 +83,23 @@ public class LocationOverlay extends Overlay int chunkY = (chunkData >> 3 & 0x7FF) * CHUNK_SIZE; int chunkX = (chunkData >> 14 & 0x3FF) * CHUNK_SIZE; - panelComponent.getChildren().add(LineComponent.builder() - .left("Chunk " + localPoint.getSceneX() / CHUNK_SIZE + "," + localPoint.getSceneY() / CHUNK_SIZE) - .right(rotation + " " + chunkX + " " + chunkY) - .build()); + tableComponent.addRow("Chunk " + localPoint.getSceneX() / CHUNK_SIZE + "," + localPoint.getSceneY() / CHUNK_SIZE, rotation + " " + chunkX + " " + chunkY); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Base") - .right(client.getBaseX() + ", " + client.getBaseY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Local") - .right(localPoint.getX() + ", " + localPoint.getY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Scene") - .right(localPoint.getSceneX() + ", " + localPoint.getSceneY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Tile") - .right(localWorld.getX() + ", " + localWorld.getY() + ", " + client.getPlane()) - .build()); + tableComponent.addRow("Base", client.getBaseX() + ", " + client.getBaseY()); + tableComponent.addRow("Local", localPoint.getX() + ", " + localPoint.getY()); + tableComponent.addRow("Scene", localPoint.getSceneX() + ", " + localPoint.getSceneY()); + tableComponent.addRow("Tile", localWorld.getX() + ", " + localWorld.getY() + ", " + client.getPlane()); for (int i = 0; i < client.getMapRegions().length; i++) { int region = client.getMapRegions()[i]; - panelComponent.getChildren().add(LineComponent.builder() - .left((i == 0) ? "Map regions" : " ") - .right(String.valueOf(region)) - .rightColor((region == regionID) ? Color.GREEN : Color.WHITE) - .build()); + tableComponent.addRow((i == 0) ? "Map regions" : " ", ColorUtil.prependColorTag(String.valueOf(region), (region == regionID) ? Color.GREEN : Color.WHITE)); } + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java index bc8f8f8500..8c57b88a6b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java @@ -34,15 +34,15 @@ import java.awt.geom.GeneralPath; import java.util.List; import java.util.stream.Stream; import javax.inject.Inject; -import api.Actor; -import api.Client; -import api.NPC; -import api.Perspective; -import api.Player; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -62,7 +62,7 @@ public class SceneOverlay extends Overlay private static final int MAP_SQUARE_SIZE = CHUNK_SIZE * CHUNK_SIZE; // 64 private static final int CULL_CHUNK_BORDERS_RANGE = 16; private static final int STROKE_WIDTH = 4; - private static final int CULL_LINE_OF_SIGHT_RANGE = 10; + private static final int CULL_LINE_OF_SIGHT_RANGE = 20; private static final int INTERACTING_SHIFT = -16; private static final Polygon ARROW_HEAD = new Polygon( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java new file mode 100644 index 0000000000..fbe2254066 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018, WooxSolo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.devtools; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.AreaSoundEffectPlayed; +import net.runelite.api.events.SoundEffectPlayed; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; + +class SoundEffectOverlay extends Overlay +{ + private final static int MAX_LINES = 16; + private final static Color COLOR_SOUND_EFFECT = Color.WHITE; + private final static Color COLOR_AREA_SOUND_EFFECT = Color.YELLOW; + private final static Color COLOR_SILENT_SOUND_EFFECT = Color.GRAY; + + private final Client client; + private final DevToolsPlugin plugin; + private final PanelComponent panelComponent = new PanelComponent(); + + @Inject + SoundEffectOverlay(Client client, DevToolsPlugin plugin) + { + this.client = client; + this.plugin = plugin; + panelComponent.setPreferredSize(new Dimension(200, 0)); + panelComponent.getChildren().add(LineComponent.builder() + .left("Sound Effects") + .leftColor(Color.CYAN) + .build()); + setPosition(OverlayPosition.TOP_LEFT); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!plugin.getSoundEffects().isActive()) + { + return null; + } + + return panelComponent.render(graphics); + } + + @Subscribe + public void onSoundEffectPlayed(SoundEffectPlayed event) + { + if (!plugin.getSoundEffects().isActive()) + { + return; + } + + String text = + "Id: " + event.getSoundId() + + " - D: " + event.getDelay(); + + panelComponent.getChildren().add(LineComponent.builder() + .left(text) + .leftColor(COLOR_SOUND_EFFECT) + .build()); + + checkMaxLines(); + } + + @Subscribe + public void onAreaSoundEffectPlayed(AreaSoundEffectPlayed event) + { + if (!plugin.getSoundEffects().isActive()) + { + return; + } + + Color textColor = COLOR_AREA_SOUND_EFFECT; + + // Check if the player is within range to hear the sound + Player localPlayer = client.getLocalPlayer(); + if (localPlayer != null) + { + LocalPoint lp = localPlayer.getLocalLocation(); + if (lp != null) + { + int sceneX = lp.getSceneX(); + int sceneY = lp.getSceneY(); + int distance = Math.abs(sceneX - event.getSceneX()) + Math.abs(sceneY - event.getSceneY()); + if (distance > event.getRange()) + { + textColor = COLOR_SILENT_SOUND_EFFECT; + } + } + } + + String text = + "Id: " + event.getSoundId() + + " - L: " + event.getSceneX() + "," + event.getSceneY() + + " - R: " + event.getRange() + + " - D: " + event.getDelay(); + + panelComponent.getChildren().add(LineComponent.builder() + .left(text) + .leftColor(textColor) + .build()); + + checkMaxLines(); + } + + private void checkMaxLines() + { + while (panelComponent.getChildren().size() > MAX_LINES) + { + panelComponent.getChildren().remove(1); + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java index 5533eeabc3..ef8454b712 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java @@ -47,14 +47,14 @@ import javax.swing.SwingUtilities; import javax.swing.border.CompoundBorder; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.VarClientInt; -import api.VarClientStr; -import api.VarPlayer; -import api.Varbits; -import api.events.VarClientIntChanged; -import api.events.VarClientStrChanged; -import api.events.VarbitChanged; +import net.runelite.api.Client; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.VarClientStrChanged; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.ClientUI; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java index 4973f0e99e..a4b21cb94d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java @@ -28,7 +28,7 @@ import java.util.function.BiConsumer; import java.util.function.Function; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.widgets.Widget; +import net.runelite.api.widgets.Widget; import org.slf4j.helpers.MessageFormatter; @Slf4j @@ -88,7 +88,6 @@ public class WidgetField } else { - setter.accept(widget, (T) value); log.warn("Type {} is not supported for editing", type); } setter.accept(widget, (T) value); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetInfoTableModel.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInfoTableModel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetInfoTableModel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInfoTableModel.java index 891544371e..acd8851c0b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetInfoTableModel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInfoTableModel.java @@ -32,7 +32,7 @@ import java.util.Map; import java.util.function.Function; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; -import api.widgets.Widget; +import net.runelite.api.widgets.Widget; import net.runelite.client.callback.ClientThread; public class WidgetInfoTableModel extends AbstractTableModel diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetInspector.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspector.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetInspector.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspector.java index 337b72e770..cea9a2b9c1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetInspector.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspector.java @@ -46,11 +46,11 @@ import javax.swing.SwingUtilities; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.events.ConfigChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetItem; +import net.runelite.api.Client; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetItemNode.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetItemNode.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetItemNode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetItemNode.java index 0400d0131c..2c640c1de6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetItemNode.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetItemNode.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.devtools; import javax.swing.tree.DefaultMutableTreeNode; -import api.widgets.WidgetItem; +import net.runelite.api.widgets.WidgetItem; class WidgetItemNode extends DefaultMutableTreeNode { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetTreeNode.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetTreeNode.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetTreeNode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetTreeNode.java index 3b57f9559d..6b7526637a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WidgetTreeNode.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetTreeNode.java @@ -25,10 +25,10 @@ package net.runelite.client.plugins.devtools; import javax.swing.tree.DefaultMutableTreeNode; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import static api.widgets.WidgetInfo.TO_CHILD; -import static api.widgets.WidgetInfo.TO_GROUP; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; class WidgetTreeNode extends DefaultMutableTreeNode { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java index cf36b5126a..d777033616 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java @@ -30,12 +30,12 @@ import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.inject.Inject; -import api.Client; -import api.Point; -import api.RenderOverview; -import api.coords.WorldPoint; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.RenderOverview; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java index 4bc4caf080..1e136267b8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java @@ -31,11 +31,11 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import javax.inject.Inject; -import api.Client; -import api.Point; -import api.RenderOverview; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.RenderOverview; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -47,7 +47,7 @@ class WorldMapRegionOverlay extends Overlay private static final int LABEL_PADDING = 4; private static final int REGION_SIZE = 1 << 6; // Bitmask to return first coordinate in region - private static final int REGION_TRUNCATE = -(1 << 6); + private static final int REGION_TRUNCATE = ~((1 << 6) - 1); private final Client client; private final DevToolsPlugin plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordAreaType.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordAreaType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordAreaType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordAreaType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordConfig.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordConfig.java index de79193a43..a2ebe63099 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordConfig.java @@ -35,7 +35,7 @@ public interface DiscordConfig extends Config keyName = "actionTimeout", name = "Action timeout (minutes)", description = "Configures after how long of not updating status will be reset (in minutes)", - position = 1 + position = 0 ) default int actionTimeout() { @@ -46,13 +46,24 @@ public interface DiscordConfig extends Config keyName = "hideElapsedTime", name = "Hide elapsed time", description = "Configures if the elapsed time of your activity should be hidden.", - position = 2 + position = 1 ) default boolean hideElapsedTime() { return false; } + @ConfigItem( + keyName = "alwaysShowParty", + name = "Always show party", + description = "Configures if the party counter should be always shown (this also makes party invites always work).", + position = 1 + ) + default boolean alwaysShowParty() + { + return false; + } + @ConfigItem( keyName = "showSkillActivity", name = "Show activity while skilling", diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java index 038f45367f..29bce7dc98 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java @@ -31,9 +31,9 @@ import java.util.List; import java.util.Map; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Client; -import api.Skill; -import api.Varbits; +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.api.Varbits; @AllArgsConstructor @Getter @@ -53,7 +53,7 @@ enum DiscordGameEventType TRAINING_COOKING(Skill.COOKING), TRAINING_WOODCUTTING(Skill.WOODCUTTING), TRAINING_FLETCHING(Skill.FLETCHING), - TRAINING_FISHING(Skill.FISHING), + TRAINING_FISHING(Skill.FISHING, 1), TRAINING_FIREMAKING(Skill.FIREMAKING), TRAINING_CRAFTING(Skill.CRAFTING), TRAINING_SMITHING(Skill.SMITHING), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index 8c759b7bf9..9d698b2085 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -38,15 +38,15 @@ import java.util.Map; import java.util.UUID; import javax.imageio.ImageIO; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.Skill; -import api.WorldType; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.ExperienceChanged; -import api.events.GameStateChanged; -import api.events.VarbitChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Skill; +import net.runelite.api.WorldType; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.RuneLiteProperties; import net.runelite.client.config.ConfigManager; import net.runelite.client.discord.DiscordService; @@ -184,6 +184,7 @@ public class DiscordPlugin extends Plugin { checkForGameStateUpdate(); checkForAreaUpdate(); + updatePresence(); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordState.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java index 0b57424f85..c110194187 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java @@ -97,7 +97,7 @@ class DiscordState .startTimestamp(lastPresence.getStartTimestamp()) .smallImageKey(lastPresence.getSmallImageKey()) .partyMax(lastPresence.getPartyMax()) - .partySize(party.getMembers().size()); + .partySize(Math.max(config.alwaysShowParty() ? 1 : 0, party.getMembers().size())); if (party.isOwner()) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java rename to runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/emojis/Emoji.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/emojis/Emoji.java rename to runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java similarity index 79% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java index db2bc79130..21eb1eab10 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java @@ -26,18 +26,20 @@ package net.runelite.client.plugins.emojis; import java.awt.image.BufferedImage; import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Nullable; import javax.inject.Inject; import joptsimple.internal.Strings; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.IndexedSprite; -import api.MessageNode; -import api.Player; -import api.events.ChatMessage; -import api.events.GameStateChanged; -import api.events.OverheadTextChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.IndexedSprite; +import net.runelite.api.MessageNode; +import net.runelite.api.Player; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.OverheadTextChanged; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -52,6 +54,8 @@ import net.runelite.client.util.ImageUtil; @Slf4j public class EmojiPlugin extends Plugin { + private static final Pattern TAG_REGEXP = Pattern.compile("<[^>]*>"); + @Inject private Client client; @@ -128,7 +132,8 @@ public class EmojiPlugin extends Plugin return; } - final String message = chatMessage.getMessage(); + final MessageNode messageNode = chatMessage.getMessageNode(); + final String message = messageNode.getValue(); final String updatedMessage = updateMessage(message); if (updatedMessage == null) @@ -136,7 +141,6 @@ public class EmojiPlugin extends Plugin return; } - final MessageNode messageNode = chatMessage.getMessageNode(); messageNode.setRuneLiteFormatMessage(updatedMessage); chatMessageManager.update(messageNode); client.refreshChat(); @@ -169,7 +173,9 @@ public class EmojiPlugin extends Plugin boolean editedMessage = false; for (int i = 0; i < messageWords.length; i++) { - final Emoji emoji = Emoji.getEmoji(messageWords[i]); + // Remove tags except for and + final String trigger = removeTags(messageWords[i]); + final Emoji emoji = Emoji.getEmoji(trigger); if (emoji == null) { @@ -178,7 +184,7 @@ public class EmojiPlugin extends Plugin final int emojiId = modIconsStart + emoji.ordinal(); - messageWords[i] = ""; + messageWords[i] = messageWords[i].replace(trigger, ""); editedMessage = true; } @@ -190,4 +196,29 @@ public class EmojiPlugin extends Plugin return Strings.join(messageWords, " "); } + + /** + * Remove tags, except for <lt> and <gt> + * + * @return + */ + private static String removeTags(String str) + { + StringBuffer stringBuffer = new StringBuffer(); + Matcher matcher = TAG_REGEXP.matcher(str); + while (matcher.find()) + { + matcher.appendReplacement(stringBuffer, ""); + String match = matcher.group(0); + switch (match) + { + case "": + case "": + stringBuffer.append(match); + break; + } + } + matcher.appendTail(stringBuffer); + return stringBuffer.toString(); + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderConfig.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderConfig.java index caca619791..154258d2d6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderConfig.java @@ -132,7 +132,18 @@ public interface EntityHiderConfig extends Config } @ConfigItem( - position = 10, + position = 10, + keyName = "hideNPCsNames", + name = "Hide NPCs Names", + description = "Configures which NPCs to hide" + ) + default String hideNPCsNames() + { + return ""; + } + + @ConfigItem( + position = 11, keyName = "hideProjectiles", name = "Hide Projectiles", description = "Configures whether or not projectiles are hidden" @@ -141,4 +152,5 @@ public interface EntityHiderConfig extends Config { return false; } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java index d18c010027..73069862cd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java @@ -27,12 +27,12 @@ package net.runelite.client.plugins.entityhider; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.Player; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -94,6 +94,7 @@ public class EntityHiderPlugin extends Plugin client.setNPCsHidden(config.hideNPCs()); client.setNPCsHidden2D(config.hideNPCs2D()); + client.setNPCsNames(config.hideNPCsNames()); client.setAttackersHidden(config.hideAttackers()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPanel.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPanel.java index 9a9cc58d34..b48a58e153 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPanel.java @@ -40,8 +40,8 @@ import javax.swing.SwingUtilities; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; -import api.ItemDefinition; -import api.kit.KitType; +import net.runelite.api.ItemDefinition; +import net.runelite.api.kit.KitType; import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPlugin.java index 115d2c7b7d..d85f8127ac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/EquipmentInspectorPlugin.java @@ -39,12 +39,12 @@ import javax.annotation.Nullable; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.ItemDefinition; -import api.Player; -import api.events.PlayerMenuOptionClicked; -import api.kit.KitType; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.ItemDefinition; +import net.runelite.api.Player; +import net.runelite.api.events.PlayerMenuOptionClicked; +import net.runelite.api.kit.KitType; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; @@ -63,12 +63,11 @@ import net.runelite.client.util.Text; @PluginDescriptor( name = "Equipment Inspector", - enabledByDefault = false, - type = PluginType.PVP + type = PluginType.PVP, + enabledByDefault = false ) @Slf4j - public class EquipmentInspectorPlugin extends Plugin { private static final String INSPECT_EQUIPMENT = "Gear"; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/ItemPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/ItemPanel.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/ItemPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/ItemPanel.java index c8e7f823e4..20f1c2f9be 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/ItemPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/ItemPanel.java @@ -28,8 +28,8 @@ import javax.swing.GroupLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; -import api.ItemDefinition; -import api.kit.KitType; +import net.runelite.api.ItemDefinition; +import net.runelite.api.kit.KitType; import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/normal.png b/runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/normal.png similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/equipmentinspector/normal.png rename to runelite-client/src/main/java/net/runelite/client/plugins/equipmentinspector/normal.png diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/CacheKey.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/CacheKey.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/CacheKey.java rename to runelite-client/src/main/java/net/runelite/client/plugins/examine/CacheKey.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java index 228abd48f6..ddc21c724b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java @@ -34,17 +34,17 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.regex.Pattern; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.ItemDefinition; -import api.events.ChatMessage; -import api.events.GameStateChanged; -import api.events.MenuOptionClicked; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import static api.widgets.WidgetInfo.TO_CHILD; -import static api.widgets.WidgetInfo.TO_GROUP; -import api.widgets.WidgetItem; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.ItemDefinition; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; @@ -104,7 +104,7 @@ public class ExaminePlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (!event.getMenuOption().equals("Examine")) + if (!event.getOption().equals("Examine")) { return; } @@ -116,20 +116,20 @@ public class ExaminePlugin extends Plugin case EXAMINE_ITEM: { type = ExamineType.ITEM; - id = event.getId(); + id = event.getIdentifier(); - int widgetId = event.getWidgetId(); + int widgetId = event.getActionParam1(); int widgetGroup = TO_GROUP(widgetId); int widgetChild = TO_CHILD(widgetId); Widget widget = client.getWidget(widgetGroup, widgetChild); - WidgetItem widgetItem = widget.getWidgetItem(event.getActionParam()); - quantity = widgetItem != null ? widgetItem.getQuantity() : 1; + WidgetItem widgetItem = widget.getWidgetItem(event.getActionParam0()); + quantity = widgetItem != null && widgetItem.getId() >= 0 ? widgetItem.getQuantity() : 1; break; } case EXAMINE_ITEM_BANK_EQ: { type = ExamineType.ITEM_BANK_EQ; - int[] qi = findItemFromWidget(event.getWidgetId(), event.getActionParam()); + int[] qi = findItemFromWidget(event.getActionParam1(), event.getActionParam0()); if (qi == null) { log.debug("Examine for item with unknown widget: {}", event); @@ -141,11 +141,11 @@ public class ExaminePlugin extends Plugin } case EXAMINE_OBJECT: type = ExamineType.OBJECT; - id = event.getId(); + id = event.getIdentifier(); break; case EXAMINE_NPC: type = ExamineType.NPC; - id = event.getId(); + id = event.getIdentifier(); break; default: return; @@ -199,26 +199,26 @@ public class ExaminePlugin extends Plugin log.debug("Got examine for {} {}: {}", pendingExamine.getType(), pendingExamine.getId(), event.getMessage()); // If it is an item, show the price of it - final ItemDefinition itemComposition; + final ItemDefinition Itemdefinition; if (pendingExamine.getType() == ExamineType.ITEM || pendingExamine.getType() == ExamineType.ITEM_BANK_EQ) { final int itemId = pendingExamine.getId(); final int itemQuantity = pendingExamine.getQuantity(); - itemComposition = itemManager.getItemDefinition(itemId); + Itemdefinition = itemManager.getItemDefinition(itemId); - if (itemComposition != null) + if (Itemdefinition != null) { - final int id = itemManager.canonicalize(itemComposition.getId()); - executor.submit(() -> getItemPrice(id, itemComposition, itemQuantity)); + final int id = itemManager.canonicalize(Itemdefinition.getId()); + executor.submit(() -> getItemPrice(id, Itemdefinition, itemQuantity)); } } else { - itemComposition = null; + Itemdefinition = null; } // Don't submit examine info for tradeable items, which we already have from the RS item api - if (itemComposition != null && itemComposition.isTradeable()) + if (Itemdefinition != null && Itemdefinition.isTradeable()) { return; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/ExamineType.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExamineType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/ExamineType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/examine/ExamineType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/PendingExamine.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/PendingExamine.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/examine/PendingExamine.java rename to runelite-client/src/main/java/net/runelite/client/plugins/examine/PendingExamine.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/DefaultColors.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/DefaultColors.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/DefaultColors.java rename to runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/DefaultColors.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/PrayerType.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/PrayerType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/PrayerType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/PrayerType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java index 7b944cde1c..cfdd113ef6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.experiencedrop; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Actor; -import api.Point; +import net.runelite.api.Actor; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java index ebeefbf6c5..e6e4aa3811 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java @@ -34,24 +34,24 @@ import java.util.stream.IntStream; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.Actor; -import api.Client; -import api.NPC; -import api.Player; -import static api.ScriptID.XPDROP_DISABLED; -import api.Skill; -import api.SpriteID; -import api.Varbits; -import api.WorldType; -import api.events.ConfigChanged; -import api.events.ExperienceChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.ScriptCallbackEvent; -import api.events.WidgetHiddenChanged; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import static net.runelite.api.ScriptID.XPDROP_DISABLED; +import net.runelite.api.Skill; +import net.runelite.api.SpriteID; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.NPCManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpPrayer.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpPrayer.java similarity index 74% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpPrayer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpPrayer.java index 9d5446a524..2d7c2d39c5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/experiencedrop/XpPrayer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpPrayer.java @@ -25,23 +25,23 @@ package net.runelite.client.plugins.experiencedrop; import lombok.Getter; -import api.Prayer; -import static api.Prayer.AUGURY; -import static api.Prayer.BURST_OF_STRENGTH; -import static api.Prayer.CHIVALRY; -import static api.Prayer.CLARITY_OF_THOUGHT; -import static api.Prayer.EAGLE_EYE; -import static api.Prayer.HAWK_EYE; -import static api.Prayer.IMPROVED_REFLEXES; -import static api.Prayer.INCREDIBLE_REFLEXES; -import static api.Prayer.MYSTIC_LORE; -import static api.Prayer.MYSTIC_MIGHT; -import static api.Prayer.MYSTIC_WILL; -import static api.Prayer.PIETY; -import static api.Prayer.RIGOUR; -import static api.Prayer.SHARP_EYE; -import static api.Prayer.SUPERHUMAN_STRENGTH; -import static api.Prayer.ULTIMATE_STRENGTH; +import net.runelite.api.Prayer; +import static net.runelite.api.Prayer.AUGURY; +import static net.runelite.api.Prayer.BURST_OF_STRENGTH; +import static net.runelite.api.Prayer.CHIVALRY; +import static net.runelite.api.Prayer.CLARITY_OF_THOUGHT; +import static net.runelite.api.Prayer.EAGLE_EYE; +import static net.runelite.api.Prayer.HAWK_EYE; +import static net.runelite.api.Prayer.IMPROVED_REFLEXES; +import static net.runelite.api.Prayer.INCREDIBLE_REFLEXES; +import static net.runelite.api.Prayer.MYSTIC_LORE; +import static net.runelite.api.Prayer.MYSTIC_MIGHT; +import static net.runelite.api.Prayer.MYSTIC_WILL; +import static net.runelite.api.Prayer.PIETY; +import static net.runelite.api.Prayer.RIGOUR; +import static net.runelite.api.Prayer.SHARP_EYE; +import static net.runelite.api.Prayer.SUPERHUMAN_STRENGTH; +import static net.runelite.api.Prayer.ULTIMATE_STRENGTH; import static net.runelite.client.plugins.experiencedrop.PrayerType.MAGIC; import static net.runelite.client.plugins.experiencedrop.PrayerType.MELEE; import static net.runelite.client.plugins.experiencedrop.PrayerType.RANGE; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fairyring/FairyRingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fairyring/FairyRingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java index 05de03170b..b32f7f6c10 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java @@ -37,20 +37,20 @@ import javax.annotation.Nullable; import javax.inject.Inject; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.ScriptEvent; -import api.ScriptID; -import api.SoundEffectID; -import api.SpriteID; -import api.Varbits; -import api.events.GameTick; -import api.events.VarbitChanged; -import api.events.WidgetLoaded; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; -import api.widgets.WidgetType; +import net.runelite.api.Client; +import net.runelite.api.ScriptEvent; +import net.runelite.api.ScriptID; +import net.runelite.api.SoundEffectID; +import net.runelite.api.SpriteID; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fairyring/FairyRings.java b/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRings.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fairyring/FairyRings.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRings.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/feed/FeedConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/feed/FeedConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java index a0b35f9b09..8a34a73cf1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java @@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.events.ConfigChanged; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveConfig.java new file mode 100644 index 0000000000..72c21243c5 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveConfig.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.fightcave; + +import java.awt.Font; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Range; +import net.runelite.client.config.Stub; + +@ConfigGroup("fightcave") +public interface FightCaveConfig extends Config +{ + @ConfigItem( + position = 0, + keyName = "mainConfig", + name = "Main Config", + description = "" + ) + default Stub mainConfig() + { + return new Stub(); + } + + @ConfigItem( + position = 1, + keyName = "waveDisplay", + name = "Wave display", + description = "Shows monsters that will spawn on the selected wave(s).", + parent = "mainConfig" + ) + default WaveDisplayMode waveDisplay() + { + return WaveDisplayMode.BOTH; + } + + @ConfigItem( + position = 2, + keyName = "tickTimersWidget", + name = "Tick Timers in Prayer", + description = "Adds an overlay to the Praayer Interface with the ticks until next attack for that prayer.", + parent = "mainConfig" + ) + default boolean tickTimersWidget() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "text", + name = "Text", + description = "" + ) + default Stub text() + { + return new Stub(); + } + + @ConfigItem( + position = 4, + keyName = "fontStyle", + name = "Font Style", + description = "Plain | Bold | Italics", + parent = "text" + ) + default FontStyle fontStyle() + { + return FontStyle.BOLD; + } + + @Range( + min = 14, + max = 40 + ) + @ConfigItem( + position = 5, + keyName = "textSize", + name = "Text Size", + description = "Text Size for Timers.", + parent = "text" + ) + default int textSize() + { + return 32; + } + + @ConfigItem( + position = 6, + keyName = "shadows", + name = "Shadows", + description = "Adds Shadows to text.", + parent = "text" + ) + default boolean shadows() + { + return false; + } + + @Getter + @AllArgsConstructor + enum FontStyle + { + BOLD("Bold", Font.BOLD), + ITALIC("Italic", Font.ITALIC), + PLAIN("Plain", Font.PLAIN); + + private String name; + private int font; + + @Override + public String toString() + { + return getName(); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveContainer.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveContainer.java new file mode 100644 index 0000000000..cc0f1a523c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveContainer.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2019, Ganom + * Copyright (c) 2019, Lucas + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.fightcave; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import java.awt.Color; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.NpcID; +import net.runelite.api.Prayer; + +@Getter +class FightCaveContainer +{ + private NPC npc; + private String npcName; + private int npcIndex; + private int npcSize; + private int attackSpeed; + private int priority; + private ImmutableSet animations; + @Setter + private int ticksUntilAttack; + @Setter + private Actor npcInteracting; + @Setter + private AttackStyle attackStyle; + + FightCaveContainer(NPC npc, int attackSpeed) + { + this.npc = npc; + this.npcName = npc.getName(); + this.npcIndex = npc.getIndex(); + this.npcInteracting = npc.getInteracting(); + this.attackStyle = AttackStyle.UNKNOWN; + this.attackSpeed = attackSpeed; + this.ticksUntilAttack = -1; + final NPCDefinition composition = npc.getTransformedDefinition(); + + BossMonsters monster = BossMonsters.of(npc.getId()); + + if (monster == null) + { + throw new IllegalStateException(); + } + + this.animations = monster.animations; + this.attackStyle = monster.attackStyle; + this.priority = monster.priority; + + if (composition != null) + { + this.npcSize = composition.getSize(); + } + } + + @RequiredArgsConstructor + enum BossMonsters + { + TOK_XIL1(NpcID.TOKXIL_3121, AttackStyle.RANGE, ImmutableSet.of(AnimationID.TOK_XIL_RANGE_ATTACK, AnimationID.TOK_XIL_MELEE_ATTACK), 1), + TOK_XIL2(NpcID.TOKXIL_3122, AttackStyle.RANGE, ImmutableSet.of(AnimationID.TOK_XIL_RANGE_ATTACK, AnimationID.TOK_XIL_MELEE_ATTACK), 1), + KETZEK1(NpcID.KETZEK, AttackStyle.MAGE, ImmutableSet.of(AnimationID.KET_ZEK_MAGE_ATTACK, AnimationID.KET_ZEK_MELEE_ATTACK), 0), + KETZEK2(NpcID.KETZEK_3126, AttackStyle.MAGE, ImmutableSet.of(AnimationID.KET_ZEK_MAGE_ATTACK, AnimationID.KET_ZEK_MELEE_ATTACK), 0), + YTMEJKOT1(NpcID.YTMEJKOT, AttackStyle.MELEE, ImmutableSet.of(AnimationID.MEJ_KOT_HEAL_ATTACK, AnimationID.MEJ_KOT_MELEE_ATTACK), 2), + YTMEJKOT2(NpcID.YTMEJKOT_3124, AttackStyle.MELEE, ImmutableSet.of(AnimationID.MEJ_KOT_HEAL_ATTACK, AnimationID.MEJ_KOT_MELEE_ATTACK), 2), + TZTOKJAD1(NpcID.TZTOKJAD, AttackStyle.UNKNOWN, ImmutableSet.of(AnimationID.TZTOK_JAD_MAGIC_ATTACK, AnimationID.TZTOK_JAD_RANGE_ATTACK, AnimationID.TZTOK_JAD_MELEE_ATTACK), 0), + TZTOKJAD2(NpcID.TZTOKJAD_6506, AttackStyle.UNKNOWN, ImmutableSet.of(AnimationID.TZTOK_JAD_MAGIC_ATTACK, AnimationID.TZTOK_JAD_RANGE_ATTACK, AnimationID.TZTOK_JAD_MELEE_ATTACK), 0); + + private static ImmutableMap idMap; + + static + { + ImmutableMap.Builder builder = ImmutableMap.builder(); + + for (BossMonsters monster : values()) + { + builder.put(monster.npcID, monster); + } + + idMap = builder.build(); + } + + private final int npcID; + private final AttackStyle attackStyle; + private final ImmutableSet animations; + private final int priority; + + static BossMonsters of(int npcID) + { + return idMap.get(npcID); + } + } + + @Getter(AccessLevel.PACKAGE) + @AllArgsConstructor + enum AttackStyle + { + MAGE("Mage", Color.CYAN, Prayer.PROTECT_FROM_MAGIC), + RANGE("Range", Color.GREEN, Prayer.PROTECT_FROM_MISSILES), + MELEE("Melee", Color.RED, Prayer.PROTECT_FROM_MELEE), + UNKNOWN("Unknown", Color.WHITE, null); + + private String name; + private Color color; + private Prayer prayer; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java new file mode 100644 index 0000000000..68569157d5 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2019, Ganom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.plugins.fightcave; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.Prayer; +import net.runelite.api.SpriteID; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.util.ImageUtil; + +public class FightCaveOverlay extends Overlay +{ + private FightCavePlugin plugin; + private FightCaveConfig config; + private Client client; + private SpriteManager spriteManager; + + @Inject + FightCaveOverlay(Client client, FightCavePlugin plugin, FightCaveConfig config, SpriteManager spriteManager) + { + this.client = client; + this.plugin = plugin; + this.config = config; + this.spriteManager = spriteManager; + setPosition(OverlayPosition.DYNAMIC); + setPriority(OverlayPriority.HIGHEST); + setLayer(OverlayLayer.ALWAYS_ON_TOP); + } + + @Override + public Dimension render(Graphics2D graphics) + { + for (FightCaveContainer npc : plugin.getFightCaveContainer()) + { + if (npc.getNpc() == null) + { + continue; + } + + final int ticksLeft = npc.getTicksUntilAttack(); + final FightCaveContainer.AttackStyle attackStyle = npc.getAttackStyle(); + + if (ticksLeft <= 0) + { + continue; + } + + final String ticksLeftStr = String.valueOf(ticksLeft); + final int font = config.fontStyle().getFont(); + final boolean shadows = config.shadows(); + Color color = (ticksLeft <= 1 ? Color.WHITE : attackStyle.getColor()); + final Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, Integer.toString(ticksLeft), 0); + + if (npc.getNpcName().equals("TzTok-Jad")) + { + color = (ticksLeft <= 1 || ticksLeft == 8 ? attackStyle.getColor() : Color.WHITE); + + BufferedImage pray = getPrayerImage(npc.getAttackStyle()); + + if (pray == null) + { + continue; + } + + renderImageLocation(graphics, npc.getNpc().getCanvasImageLocation(ImageUtil.resizeImage(pray, 36, 36), 0), pray, 12, 30); + } + + OverlayUtil.renderTextLocation(graphics, ticksLeftStr, config.textSize(), font, color, canvasPoint, shadows, 0); + } + + if (config.tickTimersWidget()) + { + + if (!plugin.getMageTicks().isEmpty()) + { + widgetHandler(graphics, + Prayer.PROTECT_FROM_MAGIC, + plugin.getMageTicks().get(0) == 1 ? Color.WHITE : Color.CYAN, + Integer.toString(plugin.getMageTicks().get(0)), + config.shadows() + ); + } + if (!plugin.getRangedTicks().isEmpty()) + { + widgetHandler(graphics, + Prayer.PROTECT_FROM_MISSILES, + plugin.getRangedTicks().get(0) == 1 ? Color.WHITE : Color.GREEN, + Integer.toString(plugin.getRangedTicks().get(0)), + config.shadows() + ); + } + if (!plugin.getMeleeTicks().isEmpty()) + { + widgetHandler(graphics, + Prayer.PROTECT_FROM_MELEE, + plugin.getMeleeTicks().get(0) == 1 ? Color.WHITE : Color.RED, + Integer.toString(plugin.getMeleeTicks().get(0)), + config.shadows() + ); + } + } + return null; + } + + private void widgetHandler(Graphics2D graphics, Prayer prayer, Color color, String ticks, boolean shadows) + { + if (prayer != null) + { + Rectangle bounds = OverlayUtil.renderPrayerOverlay(graphics, client, prayer, color); + + if (bounds != null) + { + renderTextLocation(graphics, ticks, 16, config.fontStyle().getFont(), color, centerPoint(bounds), shadows); + } + } + } + + private BufferedImage getPrayerImage(FightCaveContainer.AttackStyle attackStyle) + { + switch (attackStyle) + { + case MAGE: + return spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MAGIC, 0); + case MELEE: + return spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MELEE, 0); + case RANGE: + return spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MISSILES, 0); + } + return null; + } + + private void renderImageLocation(Graphics2D graphics, Point imgLoc, BufferedImage image, int xOffset, int yOffset) + { + int x = imgLoc.getX() + xOffset; + int y = imgLoc.getY() - yOffset; + + graphics.drawImage(image, x, y, null); + } + + private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint, boolean shadows) + { + graphics.setFont(new Font("Arial", fontStyle, fontSize)); + if (canvasPoint != null) + { + final Point canvasCenterPoint = new Point( + canvasPoint.getX() - 3, + canvasPoint.getY() + 6); + final Point canvasCenterPoint_shadow = new Point( + canvasPoint.getX() - 2, + canvasPoint.getY() + 7); + if (shadows) + { + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); + } + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); + } + } + + private Point centerPoint(Rectangle rect) + { + int x = (int) (rect.getX() + rect.getWidth() / 2); + int y = (int) (rect.getY() + rect.getHeight() / 2); + return new Point(x, y); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java similarity index 61% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java index 0eee548d26..c694aae2f2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java @@ -27,29 +27,31 @@ package net.runelite.client.plugins.fightcave; import com.google.inject.Provides; import java.util.ArrayList; +import java.util.Collections; import java.util.EnumMap; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; -import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Nullable; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.NPC; -import api.NpcID; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.AnimationID; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.NPCManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; @@ -60,62 +62,20 @@ import org.apache.commons.lang3.ArrayUtils; name = "Fight Cave", description = "Displays current and upcoming wave monsters in the Fight Caves", tags = {"bosses", "combat", "minigame", "overlay", "pve", "pvm", "jad", "fire", "cape", "wave"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) +@Slf4j public class FightCavePlugin extends Plugin { + static final int MAX_WAVE = 63; + @Getter(AccessLevel.PACKAGE) + static final List> WAVES = new ArrayList<>(); private static final Pattern WAVE_PATTERN = Pattern.compile(".*Wave: (\\d+).*"); private static final int FIGHT_CAVE_REGION = 9551; private static final int MAX_MONSTERS_OF_TYPE_PER_WAVE = 2; - static final int MAX_WAVE = 63; - - @Getter - static final List> WAVES = new ArrayList<>(); - - @Getter - private int currentWave = -1; - - @Inject - private Client client; - - @Inject - private OverlayManager overlayManager; - - @Inject - private WaveOverlay waveOverlay; - - @Inject - private JadOverlay jadOverlay; - - @Inject - private TimersOverlay timersOverlay; - - @Inject - private ConfigManager externalConfig; - - @Getter(AccessLevel.PACKAGE) - private Map Rangers = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private Map Magers = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private Map Meleers = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private Map Drainers = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private Map Ignore = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - @Nullable - private JadAttack attack; - - private NPC jad; - static { final WaveMonster[] waveMonsters = WaveMonster.values(); @@ -156,6 +116,36 @@ public class FightCavePlugin extends Plugin } } + @Inject + private Client client; + @Inject + private NPCManager npcManager; + @Inject + private OverlayManager overlayManager; + @Inject + private WaveOverlay waveOverlay; + @Inject + private FightCaveOverlay fightCaveOverlay; + @Inject + private FightCaveConfig config; + @Getter(AccessLevel.PACKAGE) + private Set fightCaveContainer = new HashSet<>(); + @Getter(AccessLevel.PACKAGE) + private int currentWave = -1; + @Getter(AccessLevel.PACKAGE) + private boolean validRegion; + @Getter(AccessLevel.PACKAGE) + private List mageTicks = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private List rangedTicks = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private List meleeTicks = new ArrayList<>(); + + static String formatMonsterQuantity(final WaveMonster monster, final int quantity) + { + return String.format("%dx %s", quantity, monster); + } + @Provides FightCaveConfig provideConfig(ConfigManager configManager) { @@ -165,21 +155,41 @@ public class FightCavePlugin extends Plugin @Override public void startUp() { - overlayManager.add(waveOverlay); - overlayManager.add(jadOverlay); - overlayManager.add(timersOverlay); + if (client.getGameState() == GameState.LOGGED_IN) + { + if (regionCheck()) + { + validRegion = true; + overlayManager.add(waveOverlay); + overlayManager.add(fightCaveOverlay); + } + } } @Override public void shutDown() { overlayManager.remove(waveOverlay); + overlayManager.remove(fightCaveOverlay); currentWave = -1; - overlayManager.remove(timersOverlay); - overlayManager.remove(jadOverlay); - jad = null; - attack = null; + } + @Subscribe + public void onChatMessage(ChatMessage event) + { + if (!validRegion) + { + return; + } + + final Matcher waveMatcher = WAVE_PATTERN.matcher(event.getMessage()); + + if (event.getType() != ChatMessageType.GAMEMESSAGE || !waveMatcher.matches()) + { + return; + } + + currentWave = Integer.parseInt(waveMatcher.group(1)); } @Subscribe @@ -190,98 +200,43 @@ public class FightCavePlugin extends Plugin return; } - if (!inFightCave()) + if (regionCheck()) { - currentWave = -1; + validRegion = true; + overlayManager.add(waveOverlay); + overlayManager.add(fightCaveOverlay); } + else + { + validRegion = false; + overlayManager.remove(fightCaveOverlay); + overlayManager.remove(fightCaveOverlay); + } + + fightCaveContainer.clear(); } - @Subscribe - public void onGameTick(GameTick Event) - { - for (NPCContainer ranger : getRangers().values()) - { - ranger.setTicksUntilAttack(ranger.getTicksUntilAttack() - 1); - if (ranger.getNpc().getAnimation() == 2633) - { - if (ranger.getTicksUntilAttack() < 1) - { - ranger.setTicksUntilAttack(4); - } - } - } - - for (NPCContainer meleer : getMeleers().values()) - { - meleer.setTicksUntilAttack(meleer.getTicksUntilAttack() - 1); - if (meleer.getNpc().getAnimation() == 2637 || meleer.getNpc().getAnimation() == 2639) - { - if (meleer.getTicksUntilAttack() < 1) - { - meleer.setTicksUntilAttack(4); - } - } - } - - for (NPCContainer mager : getMagers().values()) - { - mager.setTicksUntilAttack(mager.getTicksUntilAttack() - 1); - if (mager.getNpc().getAnimation() == 2647) - { - if (mager.getTicksUntilAttack() < 1) - { - mager.setTicksUntilAttack(4); - } - } - } - } - - @Subscribe - public void onChatMessage(ChatMessage event) - { - final Matcher waveMatcher = WAVE_PATTERN.matcher(event.getMessage()); - - if (event.getType() != ChatMessageType.GAMEMESSAGE - || !inFightCave() - || !waveMatcher.matches()) - { - return; - } - - currentWave = Integer.parseInt(waveMatcher.group(1)); - } - - @Subscribe public void onNpcSpawned(NpcSpawned event) { + if (!validRegion) + { + return; + } + NPC npc = event.getNpc(); + switch (npc.getId()) { - case NpcID.TZKIH_3116: - case NpcID.TZKIH_3117: - Drainers.put(npc, new NPCContainer(npc)); - break; - case NpcID.TZKEK_3118: - case NpcID.TZKEK_3119: - case NpcID.TZKEK_3120: - Ignore.put(npc, new NPCContainer(npc)); - break; case NpcID.TOKXIL_3121: case NpcID.TOKXIL_3122: - Rangers.put(npc, new NPCContainer(npc)); - break; case NpcID.YTMEJKOT: case NpcID.YTMEJKOT_3124: - Meleers.put(npc, new NPCContainer(npc)); - break; case NpcID.KETZEK: case NpcID.KETZEK_3126: - Magers.put(npc, new NPCContainer(npc)); - break; case NpcID.TZTOKJAD: case NpcID.TZTOKJAD_6506: - jad = npc; + fightCaveContainer.add(new FightCaveContainer(npc, npcManager.getAttackSpeed(npc.getId()))); break; } } @@ -289,55 +244,106 @@ public class FightCavePlugin extends Plugin @Subscribe public void onNpcDespawned(NpcDespawned event) { - if (Rangers.remove(event.getNpc()) != null && Rangers.isEmpty()) - { - Rangers.clear(); - } - if (Meleers.remove(event.getNpc()) != null && Meleers.isEmpty()) - { - Meleers.clear(); - } - if (Magers.remove(event.getNpc()) != null && Magers.isEmpty()) - { - Magers.clear(); - } - if (Drainers.remove(event.getNpc()) != null && Drainers.isEmpty()) - { - Drainers.clear(); - } - if (Ignore.remove(event.getNpc()) != null && Ignore.isEmpty()) - { - Ignore.clear(); - } - - } - - @Subscribe - public void onAnimationChanged(AnimationChanged event) - { - if (event.getActor() != jad) + if (!validRegion) { return; } - if (jad.getAnimation() == JadAttack.MAGIC.getAnimation()) - { - attack = JadAttack.MAGIC; - } + NPC npc = event.getNpc(); - else if (jad.getAnimation() == JadAttack.RANGE.getAnimation()) + switch (npc.getId()) { - attack = JadAttack.RANGE; + case NpcID.TOKXIL_3121: + case NpcID.TOKXIL_3122: + case NpcID.YTMEJKOT: + case NpcID.YTMEJKOT_3124: + case NpcID.KETZEK: + case NpcID.KETZEK_3126: + case NpcID.TZTOKJAD: + case NpcID.TZTOKJAD_6506: + fightCaveContainer.removeIf(c -> c.getNpc() == npc); + break; } } - boolean inFightCave() + @Subscribe + public void onGameTick(GameTick Event) + { + if (!validRegion) + { + return; + } + + mageTicks.clear(); + rangedTicks.clear(); + meleeTicks.clear(); + + for (FightCaveContainer npc : fightCaveContainer) + { + if (npc.getTicksUntilAttack() >= 0) + { + npc.setTicksUntilAttack(npc.getTicksUntilAttack() - 1); + } + + for (int anims : npc.getAnimations()) + { + if (anims == npc.getNpc().getAnimation()) + { + if (npc.getTicksUntilAttack() < 1) + { + npc.setTicksUntilAttack(npc.getAttackSpeed()); + } + + switch (anims) + { + case AnimationID.TZTOK_JAD_RANGE_ATTACK: + npc.setAttackStyle(FightCaveContainer.AttackStyle.RANGE); + break; + case AnimationID.TZTOK_JAD_MAGIC_ATTACK: + npc.setAttackStyle(FightCaveContainer.AttackStyle.MAGE); + break; + case AnimationID.TZTOK_JAD_MELEE_ATTACK: + npc.setAttackStyle(FightCaveContainer.AttackStyle.MELEE); + break; + } + } + } + + if (npc.getNpcName().equals("TzTok-Jad")) + { + continue; + } + + switch (npc.getAttackStyle()) + { + case RANGE: + if (npc.getTicksUntilAttack() > 0) + { + rangedTicks.add(npc.getTicksUntilAttack()); + } + break; + case MELEE: + if (npc.getTicksUntilAttack() > 0) + { + meleeTicks.add(npc.getTicksUntilAttack()); + } + break; + case MAGE: + if (npc.getTicksUntilAttack() > 0) + { + mageTicks.add(npc.getTicksUntilAttack()); + } + break; + } + } + + Collections.sort(mageTicks); + Collections.sort(rangedTicks); + Collections.sort(meleeTicks); + } + + private boolean regionCheck() { return ArrayUtils.contains(client.getMapRegions(), FIGHT_CAVE_REGION); } - - static String formatMonsterQuantity(final WaveMonster monster, final int quantity) - { - return String.format("%dx %s", quantity, monster); - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveDisplayMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveDisplayMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveDisplayMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveMonster.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveMonster.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveMonster.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveMonster.java index 9919623124..399cd1947b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveMonster.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveMonster.java @@ -29,12 +29,12 @@ import lombok.AllArgsConstructor; @AllArgsConstructor enum WaveMonster { - TZ_KIH("Tz-Kih", 22), - TZ_KEK("Tz-Kek", 45), - TOK_XIL("Tok-Xil", 90), - YT_MEJKOT("Yt-MejKot", 180), - KET_ZEK("Ket-Zek", 360), - TZKOK_JAD("TzTok-Jad", 702); + TZ_KIH("Drainer", 22), + TZ_KEK("Blob", 45), + TOK_XIL("Range", 90), + YT_MEJKOT("Melee", 180), + KET_ZEK("Mage", 360), + TZKOK_JAD("Jad", 702); private final String name; private final int level; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java index 7f1a69b993..f1d81816f6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java @@ -35,9 +35,10 @@ import javax.inject.Inject; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class WaveOverlay extends Overlay { @@ -45,22 +46,38 @@ class WaveOverlay extends Overlay private final FightCaveConfig config; private final FightCavePlugin plugin; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private WaveOverlay(FightCaveConfig config, FightCavePlugin plugin) { - setPosition(OverlayPosition.TOP_RIGHT); this.config = config; this.plugin = plugin; + setPosition(OverlayPosition.TOP_RIGHT); + } + + private static Collection buildWaveLines(final Map wave) + { + final List> monsters = new ArrayList<>(wave.entrySet()); + monsters.sort(Map.Entry.comparingByKey()); + final List outputLines = new ArrayList<>(); + + for (Map.Entry monsterEntry : monsters) + { + final WaveMonster monster = monsterEntry.getKey(); + final int quantity = monsterEntry.getValue(); + final String line = FightCavePlugin.formatMonsterQuantity(monster, quantity); + + outputLines.add(line); + } + + return outputLines; } @Override public Dimension render(Graphics2D graphics) { - if (!plugin.inFightCave() - || plugin.getCurrentWave() < 0) + if (!plugin.isValidRegion() || plugin.getCurrentWave() < 0) { return null; } @@ -97,29 +114,18 @@ class WaveOverlay extends Overlay .color(HEADER_COLOR) .build()); - for (LineComponent line : buildWaveLines(waveContents)) + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.CENTER); + + for (String line : buildWaveLines(waveContents)) { - panelComponent.getChildren().add(line); - } - } - - private static Collection buildWaveLines(final Map wave) - { - final List> monsters = new ArrayList<>(wave.entrySet()); - monsters.sort(Map.Entry.comparingByKey()); - final List outputLines = new ArrayList<>(); - - for (Map.Entry monsterEntry : monsters) - { - final WaveMonster monster = monsterEntry.getKey(); - final int quantity = monsterEntry.getValue(); - final LineComponent line = LineComponent.builder() - .left(FightCavePlugin.formatMonsterQuantity(monster, quantity)) - .build(); - - outputLines.add(line); + tableComponent.addRow(line); } - return outputLines; + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java index 29ac8165fd..78082d052a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java @@ -28,17 +28,18 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Skill; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class FishingOverlay extends Overlay { @@ -91,18 +92,17 @@ class FishingOverlay extends Overlay int actions = xpTrackerService.getActions(Skill.FISHING); if (actions > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Caught fish:") - .right(Integer.toString(actions)) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + tableComponent.addRow("Caught fish:", Integer.toString(actions)); if (actions > 2) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Fish/hr:") - .right(Integer.toString(xpTrackerService.getActionsHr(Skill.FISHING))) - .build()); + tableComponent.addRow("Fish/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.FISHING))); } + + panelComponent.getChildren().add(tableComponent); } return panelComponent.render(graphics); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java index fb62180b17..aa4db54c50 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java @@ -39,28 +39,28 @@ import javax.inject.Singleton; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.InventoryID; -import api.ItemContainer; -import api.ItemID; -import api.NPC; -import api.Varbits; -import api.coords.LocalPoint; -import api.events.ChatMessage; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.InteractingChanged; -import api.events.ItemContainerChanged; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.VarbitChanged; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.NPC; +import net.runelite.api.Varbits; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSession.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSession.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSession.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSession.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java similarity index 50% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java index d11d640516..04dc3bacf8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java @@ -27,73 +27,77 @@ package net.runelite.client.plugins.fishing; import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; -import api.ItemID; -import static api.NpcID.FISHING_SPOT_1497; -import static api.NpcID.FISHING_SPOT_1498; -import static api.NpcID.FISHING_SPOT_1510; -import static api.NpcID.FISHING_SPOT_1511; -import static api.NpcID.FISHING_SPOT_1518; -import static api.NpcID.FISHING_SPOT_1519; -import static api.NpcID.FISHING_SPOT_1520; -import static api.NpcID.FISHING_SPOT_1521; -import static api.NpcID.FISHING_SPOT_1522; -import static api.NpcID.FISHING_SPOT_1523; -import static api.NpcID.FISHING_SPOT_1524; -import static api.NpcID.FISHING_SPOT_1525; -import static api.NpcID.FISHING_SPOT_1528; -import static api.NpcID.FISHING_SPOT_1530; -import static api.NpcID.FISHING_SPOT_1536; -import static api.NpcID.FISHING_SPOT_1542; -import static api.NpcID.FISHING_SPOT_1544; -import static api.NpcID.FISHING_SPOT_2653; -import static api.NpcID.FISHING_SPOT_2654; -import static api.NpcID.FISHING_SPOT_2655; -import static api.NpcID.FISHING_SPOT_3913; -import static api.NpcID.FISHING_SPOT_3914; -import static api.NpcID.FISHING_SPOT_3915; -import static api.NpcID.FISHING_SPOT_4316; -import static api.NpcID.FISHING_SPOT_4476; -import static api.NpcID.FISHING_SPOT_4477; -import static api.NpcID.FISHING_SPOT_4710; -import static api.NpcID.FISHING_SPOT_4712; -import static api.NpcID.FISHING_SPOT_4713; -import static api.NpcID.FISHING_SPOT_5233; -import static api.NpcID.FISHING_SPOT_5234; -import static api.NpcID.FISHING_SPOT_5820; -import static api.NpcID.FISHING_SPOT_5821; -import static api.NpcID.FISHING_SPOT_6488; -import static api.NpcID.FISHING_SPOT_7155; -import static api.NpcID.FISHING_SPOT_7199; -import static api.NpcID.FISHING_SPOT_7200; -import static api.NpcID.FISHING_SPOT_7323; -import static api.NpcID.FISHING_SPOT_7459; -import static api.NpcID.FISHING_SPOT_7460; -import static api.NpcID.FISHING_SPOT_7461; -import static api.NpcID.FISHING_SPOT_7462; -import static api.NpcID.FISHING_SPOT_7465; -import static api.NpcID.FISHING_SPOT_7466; -import static api.NpcID.FISHING_SPOT_7467; -import static api.NpcID.FISHING_SPOT_7469; -import static api.NpcID.FISHING_SPOT_7470; -import static api.NpcID.FISHING_SPOT_7730; -import static api.NpcID.FISHING_SPOT_7731; -import static api.NpcID.FISHING_SPOT_7732; -import static api.NpcID.FISHING_SPOT_7733; -import static api.NpcID.FISHING_SPOT_7946; -import static api.NpcID.FISHING_SPOT_7947; -import static api.NpcID.FISHING_SPOT_8523; -import static api.NpcID.ROD_FISHING_SPOT; -import static api.NpcID.ROD_FISHING_SPOT_1508; -import static api.NpcID.ROD_FISHING_SPOT_1509; -import static api.NpcID.ROD_FISHING_SPOT_1513; -import static api.NpcID.ROD_FISHING_SPOT_1515; -import static api.NpcID.ROD_FISHING_SPOT_1526; -import static api.NpcID.ROD_FISHING_SPOT_1527; -import static api.NpcID.ROD_FISHING_SPOT_6825; -import static api.NpcID.ROD_FISHING_SPOT_7463; -import static api.NpcID.ROD_FISHING_SPOT_7464; -import static api.NpcID.ROD_FISHING_SPOT_7468; -import static api.NpcID.ROD_FISHING_SPOT_7676; +import net.runelite.api.ItemID; +import static net.runelite.api.NpcID.FISHING_SPOT_1497; +import static net.runelite.api.NpcID.FISHING_SPOT_1498; +import static net.runelite.api.NpcID.FISHING_SPOT_1510; +import static net.runelite.api.NpcID.FISHING_SPOT_1511; +import static net.runelite.api.NpcID.FISHING_SPOT_1518; +import static net.runelite.api.NpcID.FISHING_SPOT_1519; +import static net.runelite.api.NpcID.FISHING_SPOT_1520; +import static net.runelite.api.NpcID.FISHING_SPOT_1521; +import static net.runelite.api.NpcID.FISHING_SPOT_1522; +import static net.runelite.api.NpcID.FISHING_SPOT_1523; +import static net.runelite.api.NpcID.FISHING_SPOT_1524; +import static net.runelite.api.NpcID.FISHING_SPOT_1525; +import static net.runelite.api.NpcID.FISHING_SPOT_1528; +import static net.runelite.api.NpcID.FISHING_SPOT_1530; +import static net.runelite.api.NpcID.FISHING_SPOT_1536; +import static net.runelite.api.NpcID.FISHING_SPOT_1542; +import static net.runelite.api.NpcID.FISHING_SPOT_1544; +import static net.runelite.api.NpcID.FISHING_SPOT_2653; +import static net.runelite.api.NpcID.FISHING_SPOT_2654; +import static net.runelite.api.NpcID.FISHING_SPOT_2655; +import static net.runelite.api.NpcID.FISHING_SPOT_3913; +import static net.runelite.api.NpcID.FISHING_SPOT_3914; +import static net.runelite.api.NpcID.FISHING_SPOT_3915; +import static net.runelite.api.NpcID.FISHING_SPOT_4316; +import static net.runelite.api.NpcID.FISHING_SPOT_4476; +import static net.runelite.api.NpcID.FISHING_SPOT_4477; +import static net.runelite.api.NpcID.FISHING_SPOT_4710; +import static net.runelite.api.NpcID.FISHING_SPOT_4712; +import static net.runelite.api.NpcID.FISHING_SPOT_4713; +import static net.runelite.api.NpcID.FISHING_SPOT_5233; +import static net.runelite.api.NpcID.FISHING_SPOT_5234; +import static net.runelite.api.NpcID.FISHING_SPOT_5820; +import static net.runelite.api.NpcID.FISHING_SPOT_5821; +import static net.runelite.api.NpcID.FISHING_SPOT_6488; +import static net.runelite.api.NpcID.FISHING_SPOT_7155; +import static net.runelite.api.NpcID.FISHING_SPOT_7199; +import static net.runelite.api.NpcID.FISHING_SPOT_7200; +import static net.runelite.api.NpcID.FISHING_SPOT_7323; +import static net.runelite.api.NpcID.FISHING_SPOT_7459; +import static net.runelite.api.NpcID.FISHING_SPOT_7460; +import static net.runelite.api.NpcID.FISHING_SPOT_7461; +import static net.runelite.api.NpcID.FISHING_SPOT_7462; +import static net.runelite.api.NpcID.FISHING_SPOT_7465; +import static net.runelite.api.NpcID.FISHING_SPOT_7466; +import static net.runelite.api.NpcID.FISHING_SPOT_7467; +import static net.runelite.api.NpcID.FISHING_SPOT_7469; +import static net.runelite.api.NpcID.FISHING_SPOT_7470; +import static net.runelite.api.NpcID.FISHING_SPOT_7730; +import static net.runelite.api.NpcID.FISHING_SPOT_7731; +import static net.runelite.api.NpcID.FISHING_SPOT_7732; +import static net.runelite.api.NpcID.FISHING_SPOT_7733; +import static net.runelite.api.NpcID.FISHING_SPOT_7946; +import static net.runelite.api.NpcID.FISHING_SPOT_7947; +import static net.runelite.api.NpcID.FISHING_SPOT_8523; +import static net.runelite.api.NpcID.FISHING_SPOT_8525; +import static net.runelite.api.NpcID.FISHING_SPOT_8526; +import static net.runelite.api.NpcID.FISHING_SPOT_8527; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1508; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1509; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1513; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1515; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1526; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1527; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_6825; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7463; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7464; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7468; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7676; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_8524; @Getter enum FishingSpot @@ -115,7 +119,8 @@ enum FishingSpot FISHING_SPOT_1511, FISHING_SPOT_1520, FISHING_SPOT_3915, FISHING_SPOT_4476, FISHING_SPOT_4477, FISHING_SPOT_5233, FISHING_SPOT_5234, FISHING_SPOT_5821, FISHING_SPOT_7200, - FISHING_SPOT_7461, FISHING_SPOT_7466 + FISHING_SPOT_7461, FISHING_SPOT_7466, FISHING_SPOT_8525, + FISHING_SPOT_8526, FISHING_SPOT_8527 ), MONKFISH("Monkfish", ItemID.RAW_MONKFISH, FISHING_SPOT_4316 @@ -124,7 +129,7 @@ enum FishingSpot ROD_FISHING_SPOT, ROD_FISHING_SPOT_1508, ROD_FISHING_SPOT_1509, ROD_FISHING_SPOT_1513, ROD_FISHING_SPOT_1515, ROD_FISHING_SPOT_1526, ROD_FISHING_SPOT_1527, ROD_FISHING_SPOT_7463, ROD_FISHING_SPOT_7464, - ROD_FISHING_SPOT_7468 + ROD_FISHING_SPOT_7468, ROD_FISHING_SPOT_8524 ), BARB_FISH("Sturgeon, Salmon, Trout", ItemID.LEAPING_STURGEON, FISHING_SPOT_1542, FISHING_SPOT_7323 diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java index b2ac4c4663..c241cd695f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java @@ -30,8 +30,8 @@ import java.awt.Graphics2D; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Setter; -import api.GraphicID; -import api.NPC; +import net.runelite.api.GraphicID; +import net.runelite.api.NPC; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -78,7 +78,7 @@ class FishingSpotMinimapOverlay extends Overlay Color color = npc.getSpotAnimation() == GraphicID.FLYING_FISH ? Color.RED : Color.CYAN; - api.Point minimapLocation = npc.getMinimapLocation(); + net.runelite.api.Point minimapLocation = npc.getMinimapLocation(); if (minimapLocation != null) { OverlayUtil.renderMinimapLocation(graphics, minimapLocation, color.darker()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java index f32d431d51..1b9c27eda0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java @@ -34,12 +34,12 @@ import java.time.Instant; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Setter; -import api.Client; -import api.GraphicID; -import api.NPC; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.GraphicID; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/MinnowSpot.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/MinnowSpot.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/MinnowSpot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fishing/MinnowSpot.java index e8657e6121..b17270dfee 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fishing/MinnowSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/MinnowSpot.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.fishing; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Value; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @AllArgsConstructor @Value diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoConfig.java new file mode 100644 index 0000000000..35cef785ba --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoConfig.java @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.flexo; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Stub; + +@ConfigGroup("flexo") +public interface FlexoConfig extends Config +{ + @ConfigItem( + keyName = "overlayStub", + name = "Overlay", + description = "", + position = 1 + ) + default Stub overlayStub() + { + return new Stub(); + } + + @ConfigItem( + position = 2, + keyName = "overlayEnabled", + name = "Overlay Enabled", + description = "Shows clicking area and points etc.", + parent = "overlayStub" + ) + default boolean overlayEnabled() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "debugNPCs", + name = "Debug NPCs", + description = "Draws clickArea and clickPoints across all visible npcs", + parent = "overlayStub", + hidden = true, + unhide = "overlayEnabled" + ) + default boolean getDebugNPCs() + { + return false; + } + + @ConfigItem( + position = 4, + keyName = "debugPlayers", + name = "Debug Players", + description = "Draws clickArea and clickPoints across all visible players", + parent = "overlayStub", + hidden = true, + unhide = "overlayEnabled" + ) + default boolean getDebugPlayers() + { + return false; + } + + @ConfigItem( + position = 5, + keyName = "debugGroundItems", + name = "Debug Ground Items", + description = "Draws clickArea and clickPoints across all visible ground items", + parent = "overlayStub", + hidden = true, + unhide = "overlayEnabled" + ) + default boolean getDebugGroundItems() + { + return false; + } + + @ConfigItem( + keyName = "mouseStub", + name = "Mouse", + description = "", + position = 6 + ) + default Stub mouseStub() + { + return new Stub(); + } + + @ConfigItem( + position = 7, + keyName = "minDelayAmount", + name = "Min Delay", + description = "Minimum delay that is applied to every action at the end (ms)", + parent = "mouseStub" + ) + default int minDelayAmt() + { + return 45; + } + + + @ConfigItem( + position = 8, + keyName = "reactionTime", + name = "Reaction Time", + description = "The base time between actions (ms)", + parent = "mouseStub" + ) + default int getReactionTimeVariation() + { + return 80; + } + + @ConfigItem( + position = 9, + keyName = "mouseDragSpeed", + name = "Mouse drag speed", + description = "The speed at which steps are executed. Keep at 49? cuz jagex mouse recorder?", + parent = "mouseStub" + ) + default int getMouseDragSpeed() + { + return 49; + } + + + @ConfigItem( + position = 10, + keyName = "overshoots", + name = "Overshoots", + description = "Higher number = more overshoots", + parent = "mouseStub" + ) + default int getOvershoots() + { + return 4; + } + + @ConfigItem( + position = 11, + keyName = "variatingFlow", + name = "Flow - Variating", + description = "", + parent = "mouseStub" + ) + default boolean getVariatingFlow() + { + return true; + } + + @ConfigItem( + position = 12, + keyName = "slowStartupFlow", + name = "Flow - Slow startup", + description = "", + parent = "mouseStub" + ) + default boolean getSlowStartupFlow() + { + return true; + } + + + @ConfigItem( + position = 13, + keyName = "slowStartup2Flow", + name = "Flow - Slow startup 2", + description = "", + parent = "mouseStub" + ) + default boolean getSlowStartup2Flow() + { + return true; + } + + @ConfigItem( + position = 14, + keyName = "jaggedFlow", + name = "Flow - Jagged", + description = "", + parent = "mouseStub" + ) + default boolean getJaggedFlow() + { + return true; + } + + @ConfigItem( + position = 15, + keyName = "interruptedFlow", + name = "Flow - Interrupted", + description = "", + parent = "mouseStub" + ) + default boolean getInterruptedFlow() + { + return false; + } + + + @ConfigItem( + position = 16, + keyName = "interruptedFlow2", + name = "Flow - Interrupted 2", + description = "", + parent = "mouseStub" + ) + default boolean getInterruptedFlow2() + { + return false; + } + + @ConfigItem( + position = 17, + keyName = "stoppingFlow", + name = "Flow - Stopping", + description = "", + parent = "mouseStub" + ) + default boolean getStoppingFlow() + { + return false; + } + + @ConfigItem( + position = 18, + keyName = "deviationSlopeDivider", + name = "Deviation slope divider", + description = "", + parent = "mouseStub" + ) + default int getDeviationSlope() + { + return 10; + } + + + @ConfigItem( + position = 19, + keyName = "noisinessDivider", + name = "Noisiness divider", + description = "", + parent = "mouseStub" + ) + default String getNoisinessDivider() + { + return "2.0D"; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoOverlay.java new file mode 100644 index 0000000000..4c145ae303 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoOverlay.java @@ -0,0 +1,98 @@ +/* + * + * Copyright (c) 2019, Zeruth + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.plugins.flexo; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.geom.Line2D; +import java.util.ArrayList; +import javax.inject.Inject; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; + +public class FlexoOverlay extends Overlay +{ + private static Rectangle clickArea; + + ArrayList clickAreas = new ArrayList<>(); + ArrayList clickPoints = new ArrayList<>(); + + @Inject + private FlexoConfig config; + + @Inject + public FlexoOverlay(FlexoConfig config) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + this.config = config; + } + + + @Override + public Dimension render(Graphics2D graphics) + { + if (config.getDebugNPCs() || config.getDebugGroundItems() || config.getDebugPlayers()) + { + if (clickArea != null) + { + graphics.draw(clickArea); + } + if (clickAreas != null) + { + for (Rectangle clickArea : clickAreas) + { + if (clickArea != null) + { + graphics.draw(clickArea); + } + } + } + if (clickPoints != null) + { + for (Point p : clickPoints) + { + if (p != null) + { + graphics.setColor(Color.MAGENTA); + graphics.draw(new Line2D.Double(p.x, p.y, p.x, p.y)); + graphics.draw(new Line2D.Double(p.x - 1, p.y - 1, p.x - 1, p.y - 1)); + graphics.draw(new Line2D.Double(p.x + 1, p.y + 1, p.x + 1, p.y + 1)); + graphics.draw(new Line2D.Double(p.x - 1, p.y + 1, p.x - 1, p.y + 1)); + graphics.draw(new Line2D.Double(p.x + 1, p.y - 1, p.x + 1, p.y - 1)); + } + } + } + } + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoPlugin.java new file mode 100644 index 0000000000..ed49c53b91 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/flexo/FlexoPlugin.java @@ -0,0 +1,287 @@ +/* + * + * Copyright (c) 2019, Zeruth + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.plugins.flexo; + +import com.github.joonasvali.naturalmouse.api.MouseMotionFactory; +import com.github.joonasvali.naturalmouse.support.DefaultNoiseProvider; +import com.github.joonasvali.naturalmouse.support.DefaultOvershootManager; +import com.github.joonasvali.naturalmouse.support.DefaultSpeedManager; +import com.github.joonasvali.naturalmouse.support.Flow; +import com.github.joonasvali.naturalmouse.support.SinusoidalDeviationProvider; +import com.github.joonasvali.naturalmouse.util.FlowTemplates; +import com.google.inject.Provides; +import java.awt.AWTException; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.BeforeRender; +import net.runelite.api.events.ConfigChanged; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.flexo.Flexo; +import net.runelite.client.flexo.FlexoMouse; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.plugins.grounditems.GroundItem; +import net.runelite.client.plugins.grounditems.GroundItemsPlugin; +import net.runelite.client.plugins.stretchedmode.StretchedModeConfig; +import net.runelite.client.ui.ClientUI; +import net.runelite.client.ui.overlay.OverlayManager; + +@PluginDescriptor( + name = "Flexo Config", + description = "Customizes the flexo api", + tags = {"flexo", "null"}, + type = PluginType.UTILITY +) + +public class FlexoPlugin extends Plugin +{ + private Flexo flexo; + + { + try + { + flexo = new Flexo(); + } + catch (AWTException e) + { + e.printStackTrace(); + } + } + + @Inject + private Client client; + + @Inject + private ClientUI clientUI; + + @Inject + private ConfigManager configManager; + + @Inject + private OverlayManager overlayManager; + + @Inject + private FlexoOverlay overlay; + + @Provides + FlexoConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(FlexoConfig.class); + } + + @Subscribe + private void onConfigChanged(ConfigChanged event) + { + if (event.getKey().compareTo("overlayEnabled") == 0) + { + if (getConfig(configManager).overlayEnabled()) + { + overlayManager.add(overlay); + } + else + { + overlayManager.remove(overlay); + } + } + updateMouseMotionFactory(); + } + + + @Subscribe + public void onBeforeRender(BeforeRender event) + { + if (Flexo.client == null) + { + Flexo.client = client; + } + if (Flexo.clientUI == null) + { + Flexo.clientUI = clientUI; + } + overlay.clickAreas = new ArrayList<>(); + overlay.clickPoints = new ArrayList<>(); + if (getConfig(configManager).getDebugNPCs()) + { + Flexo.isStretched = client.isStretchedEnabled(); + Flexo.scale = configManager.getConfig(StretchedModeConfig.class).scalingFactor(); + if (flexo != null) + { + for (NPC npc : client.getNpcs()) + { + if (npc != null) + { + if (npc.getConvexHull() != null) + { + Rectangle r = FlexoMouse.getClickArea(npc.getConvexHull().getBounds()); + overlay.clickAreas.add(r); + java.awt.Point p = FlexoMouse.getClickPoint(r); + overlay.clickPoints.add(p); + } + } + } + } + } + + if (getConfig(configManager).getDebugPlayers()) + { + Flexo.isStretched = client.isStretchedEnabled(); + Flexo.scale = configManager.getConfig(StretchedModeConfig.class).scalingFactor(); + if (flexo != null) + { + for (Player player : client.getPlayers()) + { + if (player != null) + { + if (player.getConvexHull() != null) + { + Rectangle r = FlexoMouse.getClickArea(player.getConvexHull().getBounds()); + overlay.clickAreas.add(r); + java.awt.Point p = FlexoMouse.getClickPoint(r); + overlay.clickPoints.add(p); + } + } + } + } + } + + // Could still use some improvement + if (getConfig(configManager).getDebugGroundItems()) + { + Flexo.isStretched = client.isStretchedEnabled(); + Flexo.scale = configManager.getConfig(StretchedModeConfig.class).scalingFactor(); + + if (flexo != null) + { + if (GroundItemsPlugin.getCollectedGroundItems() != null) + { + for (GroundItem gi : GroundItemsPlugin.getCollectedGroundItems().values()) + { + if (gi != null) + { + LocalPoint lp = LocalPoint.fromWorld(client, gi.getLocation()); + if (lp != null) + { + if (Perspective.getCanvasTilePoly(client, lp) != null) + { + Rectangle r1 = FlexoMouse.getClickArea(Perspective.getCanvasTilePoly(client, lp).getBounds()); + Rectangle r2 = FlexoMouse.getClickArea(r1); + Rectangle r3 = FlexoMouse.getClickArea(r2); + overlay.clickAreas.add(r3); + java.awt.Point p = FlexoMouse.getClickPoint(r3); + overlay.clickPoints.add(p); + } + } + } + } + } + } + } + } + + private void updateMouseMotionFactory() + { + Flexo.minDelay = getConfig(configManager).minDelayAmt(); + MouseMotionFactory factory = new MouseMotionFactory(); + // TODO:Add Options for various flows to allow more personalization + List flows = new ArrayList<>(); + + // Always add random + flows.add(new Flow(FlowTemplates.random())); + + if (getConfig(configManager).getVariatingFlow()) + { + flows.add(new Flow(FlowTemplates.variatingFlow())); + } + + if (getConfig(configManager).getSlowStartupFlow()) + { + flows.add(new Flow(FlowTemplates.slowStartupFlow())); + } + + if (getConfig(configManager).getSlowStartup2Flow()) + { + flows.add(new Flow(FlowTemplates.slowStartup2Flow())); + } + + if (getConfig(configManager).getJaggedFlow()) + { + flows.add(new Flow(FlowTemplates.jaggedFlow())); + } + + if (getConfig(configManager).getInterruptedFlow()) + { + flows.add(new Flow(FlowTemplates.interruptedFlow())); + } + + if (getConfig(configManager).getInterruptedFlow2()) + { + flows.add(new Flow(FlowTemplates.interruptedFlow2())); + } + + if (getConfig(configManager).getStoppingFlow()) + { + flows.add(new Flow(FlowTemplates.stoppingFlow())); + } + + DefaultSpeedManager manager = new DefaultSpeedManager(flows); + //TODO:Add options for custom Deviation Provider and Noise Provider + factory.setDeviationProvider(new SinusoidalDeviationProvider(getConfig(configManager).getDeviationSlope())); + factory.setNoiseProvider(new DefaultNoiseProvider(Double.valueOf(getConfig(configManager).getNoisinessDivider()))); + factory.getNature().setReactionTimeVariationMs(getConfig(configManager).getReactionTimeVariation()); + manager.setMouseMovementBaseTimeMs(getConfig(configManager).getMouseDragSpeed()); + + DefaultOvershootManager overshootManager = (DefaultOvershootManager) factory.getOvershootManager(); + overshootManager.setOvershoots(getConfig(configManager).getOvershoots()); + + factory.setSpeedManager(manager); + Flexo.currentMouseMotionFactory = factory; + } + + @Override + protected void startUp() throws Exception + { + Flexo.isStretched = client.isStretchedEnabled(); + overlayManager.add(overlay); + updateMouseMotionFactory(); + } + + @Override + protected void shutDown() throws Exception + { + overlayManager.remove(overlay); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingOverlay.java index 503b3b3751..1dfbc0bda0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingOverlay.java @@ -30,11 +30,11 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Map; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingPlugin.java index 4045459d51..bbe125e4f7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingPlugin.java @@ -30,16 +30,16 @@ import java.util.Iterator; import java.util.Map; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.Client; -import api.GameState; -import api.NPC; -import api.Player; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.HitsplatApplied; -import api.events.NpcDespawned; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.NpcDespawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -53,9 +53,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Flinching Timer", description = "Time your attacks while flinching", tags = {"overlay", "flinching", "timers", "combat"}, - enabledByDefault = false, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) + public class FlinchingPlugin extends Plugin { @Inject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingTarget.java b/runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingTarget.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingTarget.java rename to runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingTarget.java index 8befdb3057..24c0aad399 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/flinching/FlinchingTarget.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/flinching/FlinchingTarget.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.flinching; import java.time.Duration; import java.time.Instant; import lombok.Getter; -import api.NPC; -import api.coords.WorldPoint; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; public class FlinchingTarget { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java index d37bb66044..671098a333 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.fps; import javax.inject.Inject; -import api.events.FocusChanged; +import net.runelite.api.events.FocusChanged; /** * FPS Draw Listener runs after the canvas has been painted with the buffered image (unused in this plugin) @@ -45,6 +45,7 @@ public class FpsDrawListener implements Runnable private static final int SAMPLE_SIZE = 4; private final FpsConfig config; + private final FpsPlugin plugin; private long targetDelay = 0; @@ -58,9 +59,10 @@ public class FpsDrawListener implements Runnable private long sleepDelay = 0; @Inject - private FpsDrawListener(FpsConfig config) + private FpsDrawListener(FpsConfig config, FpsPlugin plugin) { this.config = config; + this.plugin = plugin; reloadConfig(); } @@ -83,8 +85,8 @@ public class FpsDrawListener implements Runnable private boolean isEnforced() { - return FpsLimitMode.ALWAYS == config.limitMode() - || (FpsLimitMode.UNFOCUSED == config.limitMode() && !isFocused); + return FpsLimitMode.ALWAYS == plugin.getLimitMode() + || (FpsLimitMode.UNFOCUSED == plugin.getLimitMode() && !isFocused); } @Override diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java index 4f2f1f9e92..110a447966 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java @@ -29,10 +29,10 @@ import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.Point; -import api.Varbits; -import api.events.FocusChanged; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.Varbits; +import net.runelite.api.events.FocusChanged; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -50,7 +50,6 @@ import net.runelite.client.ui.overlay.OverlayUtil; public class FpsOverlay extends Overlay { // Local dependencies - private final FpsConfig config; private final Client client; private final FpsPlugin plugin; @@ -58,9 +57,8 @@ public class FpsOverlay extends Overlay private boolean isFocused = true; @Inject - private FpsOverlay(FpsPlugin plugin, FpsConfig config, Client client) + private FpsOverlay(FpsPlugin plugin, Client client) { - this.config = config; this.client = client; this.plugin = plugin; setLayer(OverlayLayer.ABOVE_WIDGETS); @@ -75,8 +73,8 @@ public class FpsOverlay extends Overlay private boolean isEnforced() { - return FpsLimitMode.ALWAYS == config.limitMode() - || (FpsLimitMode.UNFOCUSED == config.limitMode() && !isFocused); + return FpsLimitMode.ALWAYS == plugin.getLimitMode() + || (FpsLimitMode.UNFOCUSED == plugin.getLimitMode() && !isFocused); } private Color getFpsValueColor() @@ -110,7 +108,7 @@ public class FpsOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!config.drawFps() && !config.drawPing()) + if (!plugin.isDrawFps() && !plugin.isDrawPing()) { return null; } @@ -121,7 +119,7 @@ public class FpsOverlay extends Overlay int baseYOffset = (fontMetrics.getAscent() - fontMetrics.getDescent()) + 1; - if (config.drawFps()) + if (plugin.isDrawFps()) { final String fpsText = String.format("%d FPS", client.getFPS()); final int textWidth = fontMetrics.stringWidth(fpsText); @@ -132,7 +130,7 @@ public class FpsOverlay extends Overlay baseYOffset += 11; } - if (config.drawPing()) + if (plugin.isDrawPing()) { final String pingText = String.format("%dms", plugin.getPing()); final int textWidth = fontMetrics.stringWidth(pingText); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsPlugin.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsPlugin.java index 8d4b45ebb8..2ef788fab8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fps/FpsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsPlugin.java @@ -29,11 +29,12 @@ import com.google.inject.Provides; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.GameState; -import api.events.ConfigChanged; -import api.events.FocusChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -90,6 +91,15 @@ public class FpsPlugin extends Plugin private final ScheduledExecutorService pingExecutorService = new ExecutorServiceExceptionLogger(Executors.newSingleThreadScheduledExecutor()); + @Getter(AccessLevel.PACKAGE) + private FpsLimitMode limitMode; + + @Getter(AccessLevel.PACKAGE) + private boolean drawFps; + + @Getter(AccessLevel.PACKAGE) + private boolean drawPing; + @Provides FpsConfig provideConfig(ConfigManager configManager) { @@ -102,6 +112,10 @@ public class FpsPlugin extends Plugin if (event.getGroup().equals(CONFIG_GROUP_KEY)) { drawListener.reloadConfig(); + + limitMode = fpsConfig.limitMode(); + drawFps = fpsConfig.drawFps(); + drawPing = fpsConfig.drawPing(); } } @@ -115,6 +129,9 @@ public class FpsPlugin extends Plugin @Override protected void startUp() throws Exception { + limitMode = fpsConfig.limitMode(); + drawFps = fpsConfig.drawFps(); + drawPing = fpsConfig.drawPing(); overlayManager.add(overlay); drawManager.registerEveryFrameListener(drawListener); drawListener.reloadConfig(); @@ -131,7 +148,7 @@ public class FpsPlugin extends Plugin private void getPingToCurrentWorld() { - if (client.getGameState().equals(GameState.LOGGED_IN) && fpsConfig.drawPing()) + if (client.getGameState().equals(GameState.LOGGED_IN) && drawPing) { ping = Ping.ping(String.format("oldschool%d.runescape.com", client.getWorld() - 300)); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FontStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FontStyle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FontStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FontStyle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeInfo.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeInfo.java similarity index 74% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeInfo.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeInfo.java index 717008203b..233c6710c0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeInfo.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeInfo.java @@ -2,8 +2,8 @@ package net.runelite.client.plugins.freezetimers; import lombok.Builder; import lombok.Getter; -import api.Actor; -import api.coords.LocalPoint; +import net.runelite.api.Actor; +import net.runelite.api.coords.LocalPoint; @Builder class FreezeInfo diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersOverlay.java similarity index 78% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersOverlay.java index 2ea20eb172..6842cd111d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersOverlay.java @@ -34,10 +34,10 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Actor; -import api.Client; -import api.GraphicID; -import api.Point; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.GraphicID; +import net.runelite.api.Point; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -54,17 +54,17 @@ public class FreezeTimersOverlay extends Overlay private final BufferedImage FREEZE_IMAGE = ImageUtil.getResourceStreamFromClass(getClass(), "freeze.png"); private final BufferedImage TB_IMAGE = ImageUtil.getResourceStreamFromClass(getClass(), "teleblock.png"); private final BufferedImage VENG_IMAGE = ImageUtil.getResourceStreamFromClass(getClass(), "veng.png"); - @Inject private Timers timers; private boolean lock; private long finishedAtTest; @Inject - public FreezeTimersOverlay(FreezeTimersConfig config, Client client) + public FreezeTimersOverlay(FreezeTimersConfig config, Client client, Timers timers) { this.config = config; this.client = client; + this.timers = timers; setPriority(OverlayPriority.HIGHEST); setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.UNDER_WIDGETS); @@ -119,19 +119,23 @@ public class FreezeTimersOverlay extends Overlay String text = processTickCounter(finishedAt); int test = Integer.parseInt(text); Point poi = actor.getCanvasTextLocation(g, text, 0); - int xpoi = poi.getX(); - int ypoi = poi.getY(); - Point FixedPoint = new Point(xpoi, ypoi); + + if (poi == null) + { + return false; + } + + Point FixedPoint = new Point(poi.getX(), poi.getY()); if (config.noImage()) { if (test > 3) { - renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.WHITE, FixedPoint); + OverlayUtil.renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.WHITE, FixedPoint, false, 0); } else { - renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.YELLOW, FixedPoint); + OverlayUtil.renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.YELLOW, FixedPoint, false, 0); } } else @@ -156,23 +160,26 @@ public class FreezeTimersOverlay extends Overlay String text = processTickCounter(finishedAt); Point poi = actor.getCanvasTextLocation(g, text, 0); - int xpoi = poi.getX() + 20; - int ypoi = poi.getY(); - Point FixedPoint = new Point(xpoi, ypoi); + if (poi == null) + { + return false; + } + + Point FixedPoint = new Point(poi.getX() + 20, poi.getY()); if (config.noImage()) { if (timers.getTimerEnd(actor, TimerType.FREEZE) <= currentTick) { - renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.CYAN, poi); + OverlayUtil.renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.CYAN, poi, false, 0); } if (timers.getTimerEnd(actor, TimerType.FREEZE) >= currentTick) { - renderTextLocation(g, " | " + text, config.textSize(), config.fontStyle().getFont(), Color.CYAN, FixedPoint); + OverlayUtil.renderTextLocation(g, " | " + text, config.textSize(), config.fontStyle().getFont(), Color.CYAN, FixedPoint, false, 0); } if (timers.getTimerEnd(actor, TimerType.VENG) >= currentTick) { - renderTextLocation(g, " | " + text, config.textSize(), config.fontStyle().getFont(), Color.CYAN, FixedPoint); + OverlayUtil.renderTextLocation(g, " | " + text, config.textSize(), config.fontStyle().getFont(), Color.CYAN, FixedPoint, false, 0); } } else @@ -197,22 +204,26 @@ public class FreezeTimersOverlay extends Overlay String text = processTickCounter(finishedAt); Point poi = actor.getCanvasTextLocation(g, text, 0); - int xpoi = poi.getX() - 20; - int ypoi = poi.getY(); - Point FixedPoint = new Point(xpoi, ypoi); + + if (poi == null) + { + return false; + } + + Point FixedPoint = new Point(poi.getX() - 20, poi.getY()); if (config.noImage()) { if (timers.getTimerEnd(actor, TimerType.FREEZE) <= currentTick) { - renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.RED, poi); + OverlayUtil.renderTextLocation(g, text, config.textSize(), config.fontStyle().getFont(), Color.RED, poi, false, 0); } if (timers.getTimerEnd(actor, TimerType.FREEZE) >= currentTick) { - renderTextLocation(g, text + " | ", config.textSize(), config.fontStyle().getFont(), Color.RED, FixedPoint); + OverlayUtil.renderTextLocation(g, text + " | ", config.textSize(), config.fontStyle().getFont(), Color.RED, FixedPoint, false, 0); } if (timers.getTimerEnd(actor, TimerType.TELEBLOCK) >= currentTick) { - renderTextLocation(g, text + " | ", config.textSize(), config.fontStyle().getFont(), Color.RED, FixedPoint); + OverlayUtil.renderTextLocation(g, text + " | ", config.textSize(), config.fontStyle().getFont(), Color.RED, FixedPoint, false, 0); } } else @@ -224,10 +235,13 @@ public class FreezeTimersOverlay extends Overlay g.setColor(RED); Polygon poly = actor.getCanvasTilePoly(); - if (poly != null) + + if (poly == null) { - OverlayUtil.renderPolygon(g, poly, RED); + return false; } + + OverlayUtil.renderPolygon(g, poly, RED); OverlayUtil.renderTextLocation(g, new Point((int) poly.getBounds2D().getCenterX(), (int) poly.getBounds2D().getCenterY()), actor.getName(), RED); } @@ -244,22 +258,6 @@ public class FreezeTimersOverlay extends Overlay xOffset); } - private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) - { - graphics.setFont(new Font("Arial", fontStyle, fontSize)); - if (canvasPoint != null) - { - final Point canvasCenterPoint = new Point( - canvasPoint.getX(), - canvasPoint.getY()); - final Point canvasCenterPoint_shadow = new Point( - canvasPoint.getX() + 1, - canvasPoint.getY() + 1); - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); - } - } - public void renderImageLocation(Graphics2D graphics, Point imgLoc, BufferedImage image) { int x = imgLoc.getX(); @@ -268,12 +266,9 @@ public class FreezeTimersOverlay extends Overlay graphics.drawImage(image, x, y, null); } - public void renderActorTextAndImage(Graphics2D graphics, Actor actor, String text, Color color, - BufferedImage image, int yOffset, int xOffset) + private void renderActorTextAndImage(Graphics2D graphics, Actor actor, String text, Color color, BufferedImage image, int yOffset, int xOffset) { - Point textLocation = new Point(actor.getCanvasImageLocation(image, 0).getX() + xOffset, - actor.getCanvasImageLocation(image, 0).getY() + yOffset); - + Point textLocation = new Point(actor.getCanvasImageLocation(image, 0).getX() + xOffset, actor.getCanvasImageLocation(image, 0).getY() + yOffset); renderImageLocation(graphics, textLocation, image); xOffset = image.getWidth() + 1; yOffset = (image.getHeight() - (int) graphics.getFontMetrics().getStringBounds(text, graphics).getHeight()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersPlugin.java index 53020f30af..e66279aa4d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/FreezeTimersPlugin.java @@ -28,12 +28,12 @@ import com.google.inject.Provides; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; -import api.Actor; -import api.Client; -import api.Player; -import api.events.GameTick; -import api.events.SpotAnimationChanged; -import api.events.PlayerDespawned; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.SpotAnimationChanged; +import net.runelite.api.events.PlayerDespawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -45,8 +45,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Freeze Timers", description = "Shows a freeze timer overlay on players", tags = {"freeze", "timers", "barrage", "teleblock", "pklite"}, - type = PluginType.PVP + type = PluginType.PVP, + enabledByDefault = false ) + public class FreezeTimersPlugin extends Plugin { private final Map freezes = new HashMap<>(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/PlayerSpellEffect.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/PlayerSpellEffect.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/PlayerSpellEffect.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/PlayerSpellEffect.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/PrayerTracker.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/PrayerTracker.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/PrayerTracker.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/PrayerTracker.java index 342f27393f..475cff14ad 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/PrayerTracker.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/PrayerTracker.java @@ -27,10 +27,10 @@ import java.util.HashMap; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.Client; -import api.NPC; -import api.Player; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Player; @Slf4j @Singleton diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/TimerType.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/TimerType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/TimerType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/TimerType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/Timers.java b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/Timers.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/Timers.java rename to runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/Timers.java index 746edc6a87..c74ab74c3d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/freezetimers/Timers.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/freezetimers/Timers.java @@ -27,8 +27,8 @@ import java.util.HashMap; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.Client; +import net.runelite.api.Actor; +import net.runelite.api.Client; @Slf4j @Singleton diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendlist/FriendListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/friendlist/FriendListPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/friendlist/FriendListPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/friendlist/FriendListPlugin.java index 16014668a2..355d9db46a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendlist/FriendListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/friendlist/FriendListPlugin.java @@ -26,11 +26,11 @@ package net.runelite.client.plugins.friendlist; import javax.inject.Inject; -import api.Client; -import api.VarPlayer; -import api.events.GameTick; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/FriendNoteOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNoteOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/FriendNoteOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNoteOverlay.java index 426c5d0c8f..554a823573 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/FriendNoteOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNoteOverlay.java @@ -30,7 +30,7 @@ package net.runelite.client.plugins.friendnotes; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java index ff974e383c..fe27938a7e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java @@ -34,16 +34,16 @@ import javax.annotation.Nullable; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Friend; -import api.MenuAction; -import api.MenuEntry; -import api.Nameable; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.events.NameableNameChanged; -import api.events.RemovedFriend; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Friend; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Nameable; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.NameableNameChanged; +import net.runelite.api.events.RemovedFriend; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.chatbox.ChatboxPanelManager; @@ -190,20 +190,20 @@ public class FriendNotesPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (WidgetInfo.TO_GROUP(event.getWidgetId()) == WidgetInfo.FRIENDS_LIST.getGroupId()) + if (WidgetInfo.TO_GROUP(event.getActionParam1()) == WidgetInfo.FRIENDS_LIST.getGroupId()) { - if (Strings.isNullOrEmpty(event.getMenuTarget())) + if (Strings.isNullOrEmpty(event.getTarget())) { return; } // Handle clicks on "Add Note" or "Edit Note" - if (event.getMenuOption().equals(ADD_NOTE) || event.getMenuOption().equals(EDIT_NOTE)) + if (event.getOption().equals(ADD_NOTE) || event.getOption().equals(EDIT_NOTE)) { event.consume(); //Friends have color tags - final String sanitizedTarget = Text.toJagexName(Text.removeTags(event.getMenuTarget())); + final String sanitizedTarget = Text.toJagexName(Text.removeTags(event.getTarget())); final String note = getFriendNote(sanitizedTarget); // Open the new chatbox input dialog diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/HoveredFriend.java b/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/HoveredFriend.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/friendnotes/HoveredFriend.java rename to runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/HoveredFriend.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendtagging/FriendTaggingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/friendtagging/FriendTaggingPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/friendtagging/FriendTaggingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/friendtagging/FriendTaggingPlugin.java index 6af1c20af1..99434bcffe 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/friendtagging/FriendTaggingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/friendtagging/FriendTaggingPlugin.java @@ -20,18 +20,18 @@ import java.util.concurrent.ConcurrentHashMap; import javax.inject.Inject; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Friend; -import api.Ignore; -import api.MenuAction; -import api.MenuEntry; -import api.Nameable; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.events.NameableNameChanged; -import api.events.RemovedFriend; -import api.events.WidgetMenuOptionClicked; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Friend; +import net.runelite.api.Ignore; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Nameable; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.NameableNameChanged; +import net.runelite.api.events.RemovedFriend; +import net.runelite.api.events.WidgetMenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.chatbox.ChatboxPanelManager; @@ -49,8 +49,10 @@ import org.apache.commons.lang3.ArrayUtils; name = "Friend Tagging", description = "Tag people on your friends list.", tags = {"PVP", "friend", "finder", "pk", "pklite"}, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + public class FriendTaggingPlugin extends Plugin { public static final ConcurrentHashMap taggedFriends = new ConcurrentHashMap<>(); @@ -160,16 +162,16 @@ public class FriendTaggingPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (WidgetInfo.TO_GROUP(event.getWidgetId()) == WidgetInfo.FRIENDS_LIST.getGroupId()) + if (WidgetInfo.TO_GROUP(event.getActionParam1()) == WidgetInfo.FRIENDS_LIST.getGroupId()) { - if (Strings.isNullOrEmpty(event.getMenuTarget())) + if (Strings.isNullOrEmpty(event.getTarget())) { return; } - final String sanitizedTarget = Text.removeTags(event.getMenuTarget()); + final String sanitizedTarget = Text.removeTags(event.getTarget()); - if (event.getMenuOption().equals(ADD_TAG)) + if (event.getOption().equals(ADD_TAG)) { event.consume(); final ChatboxTextInput build = chatboxPanelManager.openTextInput("Enter the tag").value("") @@ -183,7 +185,7 @@ public class FriendTaggingPlugin extends Plugin setTag(sanitizedTarget, content); }).build(); } - if (event.getMenuOption().equals(DELETE_TAG)) + if (event.getOption().equals(DELETE_TAG)) { event.consume(); client.getLogger().info(sanitizedTarget); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuFloatBuffer.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuFloatBuffer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuFloatBuffer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuFloatBuffer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuIntBuffer.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuIntBuffer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuIntBuffer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuIntBuffer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 43358d2d87..e437d3cbe9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -52,21 +52,21 @@ import jogamp.nativewindow.SurfaceScaleUtils; import jogamp.nativewindow.jawt.x11.X11JAWTWindow; import jogamp.newt.awt.NewtFactoryAWT; import lombok.extern.slf4j.Slf4j; -import api.BufferProvider; -import api.Client; -import api.Constants; -import api.GameState; -import api.Model; -import api.NodeCache; -import api.Perspective; -import api.Renderable; -import api.Scene; -import api.SceneTileModel; -import api.SceneTilePaint; -import api.Texture; -import api.TextureProvider; -import api.events.GameStateChanged; -import api.hooks.DrawCallbacks; +import net.runelite.api.BufferProvider; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameState; +import net.runelite.api.Model; +import net.runelite.api.NodeCache; +import net.runelite.api.Perspective; +import net.runelite.api.Renderable; +import net.runelite.api.Scene; +import net.runelite.api.SceneTileModel; +import net.runelite.api.SceneTilePaint; +import net.runelite.api.Texture; +import net.runelite.api.TextureProvider; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.hooks.DrawCallbacks; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -1334,10 +1334,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks { int var21 = (pitchCos * modelHeight >> 16) + var19; int var22 = (var18 - var21) * zoom; - if (var22 / var14 < Rasterizer3D_clipMidY2) - { - return true; - } + return var22 / var14 < Rasterizer3D_clipMidY2; } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java index c051f0ea9e..cb7d283d69 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java @@ -27,20 +27,20 @@ package net.runelite.client.plugins.gpu; import java.util.Arrays; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import api.Constants; -import api.DecorativeObject; -import api.GameObject; -import api.GroundObject; -import api.Model; -import api.Perspective; -import api.Point; -import api.Renderable; -import api.Scene; -import api.SceneTileModel; -import api.SceneTilePaint; -import api.Tile; -import api.WallObject; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameObject; +import net.runelite.api.GroundObject; +import net.runelite.api.Model; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Renderable; +import net.runelite.api.Scene; +import net.runelite.api.SceneTileModel; +import net.runelite.api.SceneTilePaint; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; import static net.runelite.client.plugins.gpu.GpuPlugin.SMALL_TRIANGLE_COUNT; @Singleton diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/ShaderException.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/ShaderException.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/ShaderException.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/ShaderException.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/TextureManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/TextureManager.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/TextureManager.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/TextureManager.java index 7b58f559bf..eadaefa9e5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/TextureManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/TextureManager.java @@ -28,8 +28,8 @@ import com.jogamp.opengl.GL4; import java.nio.ByteBuffer; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; -import api.Texture; -import api.TextureProvider; +import net.runelite.api.Texture; +import net.runelite.api.TextureProvider; @Singleton @Slf4j diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/config/AnisotropicFilteringMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/AnisotropicFilteringMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/config/AnisotropicFilteringMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/AnisotropicFilteringMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/config/AntiAliasingMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/AntiAliasingMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/config/AntiAliasingMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/AntiAliasingMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/template/Template.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/template/Template.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/gpu/template/Template.java rename to runelite-client/src/main/java/net/runelite/client/plugins/gpu/template/Template.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java index 4cc1701a53..c2533d59e4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java @@ -28,8 +28,8 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.inject.Inject; import javax.swing.SwingUtilities; -import api.Client; -import api.MenuEntry; +import net.runelite.api.Client; +import net.runelite.api.MenuEntry; import net.runelite.client.input.KeyListener; import net.runelite.client.input.MouseAdapter; import static net.runelite.client.plugins.grandexchange.GrandExchangePlugin.SEARCH_GRAND_EXCHANGE; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItemPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItemPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItemPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItemPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItems.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItems.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItems.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItems.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java index beb9da4fe0..e368e8d5b9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java @@ -41,12 +41,12 @@ import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; -import api.GrandExchangeOffer; -import api.GrandExchangeOfferState; -import static api.GrandExchangeOfferState.CANCELLED_BUY; -import static api.GrandExchangeOfferState.CANCELLED_SELL; -import static api.GrandExchangeOfferState.EMPTY; -import api.ItemDefinition; +import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GrandExchangeOfferState; +import static net.runelite.api.GrandExchangeOfferState.CANCELLED_BUY; +import static net.runelite.api.GrandExchangeOfferState.CANCELLED_SELL; +import static net.runelite.api.GrandExchangeOfferState.EMPTY; +import net.runelite.api.ItemDefinition; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.components.ThinProgressBar; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOffersPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOffersPanel.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOffersPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOffersPanel.java index b4bc3b259e..0531651a56 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOffersPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOffersPanel.java @@ -32,9 +32,9 @@ import java.awt.GridBagLayout; import java.awt.image.BufferedImage; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; -import api.GrandExchangeOffer; -import api.GrandExchangeOfferState; -import api.ItemDefinition; +import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GrandExchangeOfferState; +import net.runelite.api.ItemDefinition; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.components.PluginErrorPanel; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index 14c2262b73..bcdaa20abe 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -42,25 +42,25 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.GrandExchangeOffer; -import api.GrandExchangeOfferState; -import api.ItemDefinition; -import api.MenuAction; -import api.MenuEntry; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.FocusChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.GrandExchangeOfferChanged; -import api.events.MenuEntryAdded; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GrandExchangeOfferState; +import net.runelite.api.ItemDefinition; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.GrandExchangeOfferChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java index 5476f446c1..b5443be68d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java @@ -42,7 +42,7 @@ import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import api.ItemDefinition; +import net.runelite.api.ItemDefinition; import net.runelite.client.callback.ClientThread; import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/SavedOffer.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/SavedOffer.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/SavedOffer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/SavedOffer.java index 7b9194a401..58a4055fed 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grandexchange/SavedOffer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/SavedOffer.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.grandexchange; import lombok.Data; -import api.GrandExchangeOfferState; +import net.runelite.api.GrandExchangeOfferState; @Data class SavedOffer diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/JadAttack.java b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/DuskAttack.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/JadAttack.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/DuskAttack.java index 2321579892..ece52fe62e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/JadAttack.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/DuskAttack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Devin French + * Copyright (c) 2018, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,20 +22,19 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.fightcave; +package net.runelite.client.plugins.grotesqueguardians; -import api.AnimationID; -import api.Prayer; +import net.runelite.api.Prayer; -public enum JadAttack +public enum DuskAttack { - MAGIC(AnimationID.TZTOK_JAD_MAGIC_ATTACK, Prayer.PROTECT_FROM_MAGIC), - RANGE(AnimationID.TZTOK_JAD_RANGE_ATTACK, Prayer.PROTECT_FROM_MISSILES); + MELEE(7800, Prayer.PROTECT_FROM_MELEE), + RANGE(7801, Prayer.PROTECT_FROM_MISSILES); private final int animation; private final Prayer prayer; - JadAttack(int animation, Prayer prayer) + DuskAttack(int animation, Prayer prayer) { this.animation = animation; this.prayer = prayer; @@ -50,4 +49,4 @@ public enum JadAttack { return prayer; } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansOverlay.java similarity index 73% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansOverlay.java index 1f2d55ce75..0c02d79b92 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansOverlay.java @@ -29,29 +29,32 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; -import api.Client; -import api.GraphicsObject; -import api.Perspective; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.GraphicsObject; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.TextComponent; class GrotesqueGuardiansOverlay extends Overlay { private static final int GROTESQUE_GUARDIANS_REGION_ID = 6727; private final Client client; + private final GrotesqueGuardiansPlugin plugin; private static final int GROTESQUE_GUARDIANS_LIGHTNING_START = 1416; private static final int GROTESQUE_GUARDIANS_LIGHTNING_END = 1431; private static final int GROTESQUE_GUARDIANS_FALLING_ROCKS = 1436; private static final int GROTESQUE_GUARDIANS_STONE_ORB = 160; @Inject - private GrotesqueGuardiansOverlay(Client client) + private GrotesqueGuardiansOverlay(Client client, GrotesqueGuardiansPlugin plugin) { this.client = client; + this.plugin = plugin; setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.ABOVE_SCENE); setPriority(OverlayPriority.LOW); @@ -94,6 +97,24 @@ class GrotesqueGuardiansOverlay extends Overlay { OverlayUtil.renderPolygon(graphics, poly, color); } + if ((plugin.isInGargs()) && (plugin.isNeedingToRun())) + { + if ((plugin.getDusk() != null) && (plugin.getDusk().getLocalLocation() != null)) + { + TextComponent textComponent = new TextComponent(); + LocalPoint duskPoint; + + duskPoint = new LocalPoint(plugin.getDusk().getLocalLocation().getX() + 128 * (plugin.getDusk().getTransformedDefinition().getSize() - 1) / 2, plugin.getDusk().getLocalLocation().getY() + 128 * (plugin.getDusk().getTransformedDefinition().getSize() - 1) / 2); + net.runelite.api.Point duskLoc = Perspective.getCanvasTextLocation(client, graphics, duskPoint, "RUN AWAY", 500); + if (duskLoc != null) + { + textComponent.setText("RUN AWAY"); + textComponent.setPosition(new java.awt.Point(duskLoc.getX(), duskLoc.getY())); + textComponent.setColor(Color.red); + textComponent.render(graphics); + } + } + } } return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPlugin.java new file mode 100644 index 0000000000..77332e3c93 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPlugin.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2018, Damen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.grotesqueguardians; + +import javax.inject.Inject; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.eventbus.Subscribe; +import java.util.ArrayList; +import net.runelite.api.events.GameTick; +import net.runelite.api.NPC; +import javax.annotation.Nullable; +import net.runelite.api.Client; + +import static net.runelite.api.NpcID.DUSK_7888; + + +@PluginDescriptor( + name = "Grotesque Guardians", + description = "Show various helpful utitiles during the Grotesque Gaurdians (Gargoyles) fight", + tags = { "bosses", "combat", "gargs", "overlay", "grotesque", "pve", "pvm" }, + type = PluginType.PVM, + enabledByDefault = false +) + +public class GrotesqueGuardiansPlugin extends Plugin +{ + private static final int GARGOYLES_REGION = 6727; + @Inject + private Client client; + @Inject + private OverlayManager overlayManager; + @Inject + private GrotesqueGuardiansPrayerOverlay prayerOverlay; + @Nullable + private DuskAttack prayAgainst; + @Nullable + private NPC dusk; + private boolean inGargs; + private boolean needingToRun; + + public GrotesqueGuardiansPlugin() + { + inGargs = false; + needingToRun = false; + } + + @Inject + private GrotesqueGuardiansOverlay overlay; + + @Override + protected void startUp() throws Exception + { + overlayManager.add(overlay); + overlayManager.add(prayerOverlay); + dusk = null; + prayAgainst = null; + } + + @Override + protected void shutDown() throws Exception + { + overlayManager.remove(overlay); + overlayManager.remove(prayerOverlay); + dusk = null; + prayAgainst = null; + } + + @Subscribe + public void onGameTick(final GameTick event) + { + final ArrayList regions = new ArrayList(); + for (final int intValue : client.getMapRegions()) + { + regions.add(intValue); + } + if (regions.contains(GARGOYLES_REGION)) + { + dusk = null; + inGargs = true; + for (final NPC npc : client.getNpcs()) + { + if (npc.getName() != null && npc.getName().contains("Dusk") && !npc.isDead()) + { + dusk = npc; + } + } + if (inGargs && dusk != null) + { + if (dusk.getId() == DUSK_7888) + { + if (dusk.getAnimation() == DuskAttack.MELEE.getAnimation()) + { + prayAgainst = DuskAttack.MELEE; + } + else if (dusk.getAnimation() == DuskAttack.RANGE.getAnimation()) + { + prayAgainst = DuskAttack.RANGE; + } + } + else + { + prayAgainst = null; + } + if (dusk.getAnimation() == 7802) + { + needingToRun = true; + } + else + { + needingToRun = false; + } + } + } + else + { + inGargs = false; + prayAgainst = null; + dusk = null; + } + } + + @Nullable + DuskAttack getPrayAgainst() + { + return prayAgainst; + } + + @Nullable + NPC getDusk() + { + return dusk; + } + + boolean isInGargs() + { + return inGargs; + } + + boolean isNeedingToRun() + { + return needingToRun; + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPrayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPrayerOverlay.java new file mode 100644 index 0000000000..c63c0845da --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPrayerOverlay.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018, https://runelitepl.us + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.grotesqueguardians; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; + +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.ComponentConstants; +import net.runelite.client.ui.overlay.components.ImageComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; + +public class GrotesqueGuardiansPrayerOverlay extends Overlay +{ + private static final Color NOT_ACTIVATED_BACKGROUND_COLOR = new Color(150, 0, 0, 150); + private final Client client; + private final GrotesqueGuardiansPlugin plugin; + private final SpriteManager spriteManager; + private final PanelComponent imagePanelComponent = new PanelComponent(); + + @Inject + private GrotesqueGuardiansPrayerOverlay(Client client, GrotesqueGuardiansPlugin plugin, SpriteManager spriteManager) + { + setLayer(OverlayLayer.ABOVE_SCENE); + setPriority(OverlayPriority.HIGH); + setPosition(OverlayPosition.DYNAMIC); + this.client = client; + this.plugin = plugin; + this.spriteManager = spriteManager; + } + + public Dimension render(Graphics2D graphics) + { + imagePanelComponent.getChildren().clear(); + if ((plugin.isInGargs()) && (plugin.getPrayAgainst() != null) && (plugin.getDusk() != null)) + { + DuskAttack attack = plugin.getPrayAgainst(); + BufferedImage prayerImage = null; + prayerImage = getPrayerImage(attack); + imagePanelComponent.setBackgroundColor(client + .isPrayerActive(attack.getPrayer()) ? ComponentConstants.STANDARD_BACKGROUND_COLOR : NOT_ACTIVATED_BACKGROUND_COLOR); + + NPC dusk = plugin.getDusk(); + imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); + + + LocalPoint duskPoint = new LocalPoint(dusk.getLocalLocation().getX() + 128 * (dusk.getTransformedDefinition().getSize() - 1) / 2, dusk.getLocalLocation().getY() + 128 * (dusk.getTransformedDefinition().getSize() - 1) / 2); + net.runelite.api.Point duskLoc = Perspective.getCanvasImageLocation(client, duskPoint, prayerImage, 400); + if (duskLoc != null) + { + imagePanelComponent.setPreferredLocation(new java.awt.Point(duskLoc.getX(), duskLoc.getY())); + } + return imagePanelComponent.render(graphics); + } + return null; + } + + private BufferedImage getPrayerImage(DuskAttack attack) + { + int prayerSpriteID = attack == DuskAttack.MELEE ? 129 : 128; + + return spriteManager.getSprite(prayerSpriteID, 0); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java index 3ff09ac330..69f4894e93 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java @@ -28,7 +28,7 @@ import java.time.Instant; import lombok.Builder; import lombok.Data; import lombok.Value; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Data @Builder @@ -46,6 +46,7 @@ class GroundItem private int offset; private boolean tradeable; private boolean isMine; + private int ticks; private int durationMillis; private boolean isAlwaysPrivate; private boolean isOwnedByPlayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemInputListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemInputListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemInputListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java index 0385296120..60b984f66d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java @@ -606,4 +606,16 @@ public interface GroundItemsConfig extends Config { return false; } + + @ConfigItem( + keyName = "showTimer", + name = "Show ground item tick countdown timer", + description = "Shows how many ticks left until disappearing.", + position = 48, + parent = "miscStub" + ) + default boolean showTimer() + { + return false; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java index 7a397b6afb..09ad99417c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java @@ -41,13 +41,13 @@ import java.util.Map; import java.util.List; import java.util.Comparator; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Player; -import api.Point; -import api.Tile; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.grounditems.config.ItemHighlightMode.MENU; import net.runelite.client.plugins.grounditems.config.PriceDisplayMode; import net.runelite.client.plugins.grounditems.config.TimerDisplayMode; @@ -277,6 +277,13 @@ public class GroundItemsOverlay extends Overlay } } + if (item.getTicks() > 0 && config.showTimer()) + { + itemStringBuilder + .append(" - ") + .append(item.getTicks()); + } + final String itemString = itemStringBuilder.toString(); itemStringBuilder.setLength(0); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java index 3d670820f9..41c24e5c0a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java @@ -31,6 +31,7 @@ import com.google.inject.Provides; import java.awt.Color; import java.awt.Rectangle; import static java.lang.Boolean.TRUE; +import static java.lang.Math.floor; import java.time.Instant; import java.util.ArrayList; import java.util.Collection; @@ -48,27 +49,28 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import api.Client; -import api.GameState; -import api.Item; -import api.ItemDefinition; -import api.ItemID; -import api.ItemLayer; -import api.MenuAction; -import api.MenuEntry; -import api.Node; -import api.Player; -import api.Scene; -import api.Tile; -import api.coords.WorldPoint; -import api.events.ClientTick; -import api.events.ConfigChanged; -import api.events.FocusChanged; -import api.events.GameStateChanged; -import api.events.ItemDespawned; -import api.events.ItemQuantityChanged; -import api.events.ItemSpawned; -import api.events.MenuEntryAdded; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemID; +import net.runelite.api.ItemLayer; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Node; +import net.runelite.api.Player; +import net.runelite.api.Scene; +import net.runelite.api.Tile; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ClientTick; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ItemDespawned; +import net.runelite.api.events.ItemQuantityChanged; +import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.GameTick; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -103,11 +105,15 @@ public class GroundItemsPlugin extends Plugin // items stay on the ground for 30 mins in an instance private static final int INSTANCE_DURATION_MILLIS = 45 * 60 * 1000; + private static final int INSTANCE_DURATION_TICKS = (int) floor(30 * 60 / 0.6); //untradeables stay on the ground for 150 seconds (http://oldschoolrunescape.wikia.com/wiki/Item#Dropping_and_Destroying) private static final int UNTRADEABLE_DURATION_MILLIS = 150 * 1000; + private static final int UNTRADEABLE_DURATION_TICKS = (int) floor(150 / 0.6); //items stay on the ground for 1 hour after death private static final int DEATH_DURATION_MILLIS = 60 * 60 * 1000; + private static final int DEATH_DURATION_TICKS = (int) floor(60 * 60 / 0.6); private static final int NORMAL_DURATION_MILLIS = 60 * 1000; + private static final int NORMAL_DURATION_TICKS = (int) floor(60 / 0.6); // Ground item menu options private static final int FIRST_OPTION = MenuAction.GROUND_ITEM_FIRST_OPTION.getId(); @@ -204,6 +210,16 @@ public class GroundItemsPlugin extends Plugin collectedGroundItems.clear(); } + @Subscribe + public void onGameTick(GameTick event) + { + for (GroundItem item : collectedGroundItems.values()) + { + if (item.getTicks() == -1) continue; + item.setTicks(item.getTicks() - 1); + } + } + @Subscribe public void onConfigChanged(ConfigChanged event) { @@ -461,6 +477,7 @@ public class GroundItemsPlugin extends Plugin if (groundItem != null) { groundItem.setMine(true); + groundItem.setTicks(200); boolean shouldNotify = config.onlyShowLoot() && config.highlightedColor().equals(getHighlighted( groundItem.getName(), @@ -483,21 +500,26 @@ public class GroundItemsPlugin extends Plugin final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemId; final int alchPrice = itemManager.getAlchValue(realItemId); int durationMillis; + int durationTicks; + + WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); + if (client.isInInstancedRegion()) { durationMillis = INSTANCE_DURATION_MILLIS; + durationTicks = INSTANCE_DURATION_TICKS; } else if (!itemComposition.isTradeable() && realItemId != COINS) { durationMillis = UNTRADEABLE_DURATION_MILLIS; + durationTicks = UNTRADEABLE_DURATION_TICKS; } else { durationMillis = NORMAL_DURATION_MILLIS; + durationTicks = tile.getWorldLocation().equals(playerLocation) ? NORMAL_DURATION_TICKS * 2 : NORMAL_DURATION_TICKS; } - WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); - final GroundItem groundItem = GroundItem.builder() .id(itemId) .location(tile.getWorldLocation()) @@ -511,6 +533,7 @@ public class GroundItemsPlugin extends Plugin .durationMillis(durationMillis) .isAlwaysPrivate(client.isInInstancedRegion() || (!itemComposition.isTradeable() && realItemId != COINS)) .isOwnedByPlayer(tile.getWorldLocation().equals(playerLocation)) + .ticks(durationTicks) .build(); @@ -580,9 +603,9 @@ public class GroundItemsPlugin extends Plugin { if (config.itemHighlightMode() != OVERLAY && event.getOption().equals("Take") - && event.getType() == THIRD_OPTION) + && event.getIdentifier() == THIRD_OPTION) { - int itemId = event.getIdentifier(); + int itemId = event.getType(); Scene scene = client.getScene(); Tile tile = scene.getTiles()[client.getPlane()][event.getActionParam0()][event.getActionParam1()]; ItemLayer itemLayer = tile.getItemLayer(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/MenuEntryWithCount.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/MenuEntryWithCount.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/MenuEntryWithCount.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/MenuEntryWithCount.java index e5926e7381..a8539921c0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/MenuEntryWithCount.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/MenuEntryWithCount.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.grounditems; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.MenuEntry; +import net.runelite.api.MenuEntry; @RequiredArgsConstructor class MenuEntryWithCount diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/ItemHighlightMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ItemHighlightMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/ItemHighlightMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ItemHighlightMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/MenuHighlightMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/MenuHighlightMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/MenuHighlightMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/MenuHighlightMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/TimerDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/TimerDisplayMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/TimerDisplayMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/TimerDisplayMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerInputListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerInputListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerInputListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java index df8e28b8ba..4e53a7d966 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java @@ -30,11 +30,11 @@ import java.awt.Graphics2D; import static java.lang.Math.floor; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java index b04865780e..0d11dbf4a9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java @@ -31,10 +31,10 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java index c54d8e83e8..400b01bd52 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java @@ -43,18 +43,18 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import static api.Constants.CHUNK_SIZE; -import api.GameState; -import api.MenuAction; -import api.MenuEntry; -import api.Tile; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.FocusChanged; -import api.events.GameStateChanged; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; +import net.runelite.api.Client; +import static net.runelite.api.Constants.CHUNK_SIZE; +import net.runelite.api.GameState; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.KeyManager; @@ -315,13 +315,13 @@ public class GroundMarkerPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (!event.getMenuOption().contains(MARK) && !event.getMenuOption().contains(UNMARK)) + if (!event.getOption().contains(MARK) && !event.getOption().contains(UNMARK)) { return; } int group = 1; - Matcher m = GROUP_MATCHER.matcher(event.getMenuOption()); + Matcher m = GROUP_MATCHER.matcher(event.getOption()); if (m.matches()) { group = Integer.parseInt(m.group(1)); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerWorldPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerWorldPoint.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerWorldPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerWorldPoint.java index e79c1fddc1..9ea9915459 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerWorldPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerWorldPoint.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.groundmarkers; import lombok.Value; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Value public class GroundMarkerWorldPoint diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarMinimapOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarMinimapOverlay.java index 6ebadcaf30..fff22cbc39 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarMinimapOverlay.java @@ -28,8 +28,8 @@ import com.google.inject.Inject; import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Set; -import api.Point; -import api.TileObject; +import net.runelite.api.Point; +import net.runelite.api.TileObject; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarOverlay.java index 550b17ff47..653228cdb3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarOverlay.java @@ -30,8 +30,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.Area; import java.util.Set; -import api.TileObject; -import api.coords.WorldPoint; +import net.runelite.api.TileObject; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarPlugin.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarPlugin.java index 16b81615e7..b921bb5495 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarPlugin.java @@ -34,24 +34,24 @@ import java.util.Set; import javax.inject.Inject; import lombok.Getter; import lombok.Setter; -import api.Client; -import static api.ObjectID.DRIFTWOOD_30523; -import static api.ObjectID.MUSHROOM_30520; -import static api.ObjectID.ROCK_30519; -import static api.ObjectID.ROCK_30521; -import static api.ObjectID.ROCK_30522; -import api.Tile; -import api.TileObject; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GroundObjectChanged; -import api.events.GroundObjectDespawned; -import api.events.GroundObjectSpawned; -import api.events.VarbitChanged; +import net.runelite.api.Client; +import static net.runelite.api.ObjectID.DRIFTWOOD_30523; +import static net.runelite.api.ObjectID.MUSHROOM_30520; +import static net.runelite.api.ObjectID.ROCK_30519; +import static net.runelite.api.ObjectID.ROCK_30521; +import static net.runelite.api.ObjectID.ROCK_30522; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarTrail.java b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarTrail.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarTrail.java rename to runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarTrail.java index 5a86eb741e..6f1dba41fb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarTrail.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/herbiboars/HerbiboarTrail.java @@ -29,8 +29,8 @@ import java.util.HashSet; import java.util.Set; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Varbits; -import api.coords.WorldPoint; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; //Location of GameObjects which show TRAIL_xxxxx when used @AllArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java index 14bafcce93..4acdaa8dd4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java @@ -58,182 +58,182 @@ public interface HidePrayersConfig extends Config @ConfigItem( position = 1, - keyName = "HideTHICK_SKIN", - name = "Hide Thick Skin", + keyName = "ShowTHICK_SKIN", + name = "Show Thick Skin", description = "Hide/Show Thick Skin", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideTHICK_SKIN() + default boolean ShowTHICK_SKIN() { return false; } @ConfigItem( position = 2, - keyName = "HideBURST_OF_STRENGTH", - name = "Hide Burst of Strength", + keyName = "ShowBURST_OF_STRENGTH", + name = "Show Burst of Strength", description = "Hide/Show Burst of Strength", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideBURST_OF_STRENGTH() + default boolean ShowBURST_OF_STRENGTH() { return false; } @ConfigItem( position = 3, - keyName = "HideCLARITY_OF_THOUGHT", - name = "Hide Clarity of Thought", + keyName = "ShowCLARITY_OF_THOUGHT", + name = "Show Clarity of Thought", description = "Hide/Show Clarity of Thought", group = "Individual Prayers", hidden = true, - unhide = "showindividualprayers" + unhide = "Showindividualprayers" ) - default boolean HideCLARITY_OF_THOUGHT() + default boolean ShowCLARITY_OF_THOUGHT() { return false; } @ConfigItem( position = 4, - keyName = "HideSHARP_EYE", - name = "Hide Sharp Eye", + keyName = "ShowSHARP_EYE", + name = "Show Sharp Eye", description = "Hide/Show Sharp Eye", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSHARP_EYE() + default boolean ShowSHARP_EYE() { return false; } @ConfigItem( position = 5, - keyName = "HideMYSTIC_WILL", - name = "Hide Mystic Will", + keyName = "ShowMYSTIC_WILL", + name = "Show Mystic Will", description = "Hide/Show Mystic Will", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideMYSTIC_WILL() + default boolean ShowMYSTIC_WILL() { return false; } @ConfigItem( position = 6, - keyName = "HideROCK_SKIN", - name = "Hide Rock Skin", + keyName = "ShowROCK_SKIN", + name = "Show Rock Skin", description = "Hide/Show Rock Skin", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideROCK_SKIN() + default boolean ShowROCK_SKIN() { return false; } @ConfigItem( position = 7, - keyName = "HideSUPERHUMAN_STRENGTH", - name = "Hide Super Human Strength", + keyName = "ShowSUPERHUMAN_STRENGTH", + name = "Show Super Human Strength", description = "Hide/Show Super Human Strength", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSUPERHUMAN_STRENGTH() + default boolean ShowSUPERHUMAN_STRENGTH() { return false; } @ConfigItem( position = 8, - keyName = "HideIMPROVED_REFLEXES", - name = "Hide Improved_Reflexes", + keyName = "ShowIMPROVED_REFLEXES", + name = "Show Improved_Reflexes", description = "Hide/Show Improved_Reflexes", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideIMPROVED_REFLEXES() + default boolean ShowIMPROVED_REFLEXES() { return false; } @ConfigItem( position = 9, - keyName = "HideRapidRestore", - name = "Hide Rapid Restore", + keyName = "ShowRapidRestore", + name = "Show Rapid Restore", description = "Hide/Show Rapid Restore", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRapidRestore() + default boolean ShowRapidRestore() { return false; } @ConfigItem( position = 10, - keyName = "HideRapidHeal", - name = "Hide Rapid Heal", + keyName = "ShowRapidHeal", + name = "Show Rapid Heal", description = "Hide/Show Rapid Heal", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRapidHeal() + default boolean ShowRapidHeal() { return false; } @ConfigItem( position = 11, - keyName = "HideProtectItem", - name = "Hide Protect Item", + keyName = "ShowProtectItem", + name = "Show Protect Item", description = "Hide/Show Protect Item", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideProtectItem() + default boolean ShowProtectItem() { return false; } @ConfigItem( position = 12, - keyName = "HideHAWK_EYE", - name = "Hide Hawk Eye", + keyName = "ShowHAWK_EYE", + name = "Show Hawk Eye", description = "Hide/Show Hawk Eye", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideHAWK_EYE() + default boolean ShowHAWK_EYE() { return false; } @ConfigItem( position = 13, - keyName = "HideMYSTIC_LORE", - name = "Hide Mystic Lore", + keyName = "ShowMYSTIC_LORE", + name = "Show Mystic Lore", description = "Hide/Show Mystic Lore", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideMYSTIC_LORE() + default boolean ShowMYSTIC_LORE() { return false; } @@ -241,224 +241,224 @@ public interface HidePrayersConfig extends Config @ConfigItem( position = 14, - keyName = "HideSteelSkin", - name = "Hide Steel Skin", + keyName = "ShowSteelSkin", + name = "Show Steel Skin", description = "Hide/Show Steel skin", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSteelSkin() + default boolean ShowSteelSkin() { return false; } @ConfigItem( position = 15, - keyName = "HideUltimateStrength", - name = "Hide Ultimate Strength", + keyName = "ShowUltimateStrength", + name = "Show Ultimate Strength", description = "Hide/Show Ultimate strength", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideUltimateStrength() + default boolean ShowUltimateStrength() { return false; } @ConfigItem( position = 16, - keyName = "HideIncredibleReflex", - name = "Hide Incredible Reflex", + keyName = "ShowIncredibleReflex", + name = "Show Incredible Reflex", description = "Hide/Show Incredible Reflex", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideIncredibleReflex() + default boolean ShowIncredibleReflex() { return false; } @ConfigItem( position = 17, - keyName = "HidePTFMagic", - name = "Hide Protect From Magic", + keyName = "ShowPTFMagic", + name = "Show Protect From Magic", description = "Hide/Show Protect From Magic", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePTFMagic() + default boolean ShowPTFMagic() { return false; } @ConfigItem( position = 18, - keyName = "HidePTFRange", - name = "Hide Protect From Range", + keyName = "ShowPTFRange", + name = "Show Protect From Range", description = "Hide/Show Protect from Range", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePTFRange() + default boolean ShowPTFRange() { return false; } @ConfigItem( position = 19, - keyName = "HidePTFMelee", - name = "Hide Protect From Melee", + keyName = "ShowPTFMelee", + name = "Show Protect From Melee", description = "Hide/Show Protect From Melee", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePTFMelee() + default boolean ShowPTFMelee() { return false; } @ConfigItem( position = 20, - keyName = "HideEagle", - name = "Hide Eagle Eye", + keyName = "ShowEagle", + name = "Show Eagle Eye", description = "Hide/Show Eagle Eye", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideEagle() + default boolean ShowEagle() { return false; } @ConfigItem( position = 19, - keyName = "HideMystic", - name = "Hide Mystic Might", + keyName = "ShowMystic", + name = "Show Mystic Might", description = "Hide/Show Mystic Might", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideMystic() + default boolean ShowMystic() { return false; } @ConfigItem( position = 21, - keyName = "HideRETRIBUTION", - name = "Hide Retribution", + keyName = "ShowRETRIBUTION", + name = "Show Retribution", description = "Hide/Show Retribution", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRETRIBUTION() + default boolean ShowRETRIBUTION() { return false; } @ConfigItem( position = 22, - keyName = "HideRedemption", - name = "Hide Redemption", + keyName = "ShowRedemption", + name = "Show Redemption", description = "Hide/Show Redemption", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRedemption() + default boolean ShowRedemption() { return false; } @ConfigItem( position = 23, - keyName = "HideSmite", - name = "Hide Smite", + keyName = "ShowSmite", + name = "Show Smite", description = "Hide/Show Smite", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSmite() + default boolean ShowSmite() { return false; } @ConfigItem( position = 24, - keyName = "HidePreserve", - name = "Hide Preserve", + keyName = "ShowPreserve", + name = "Show Preserve", description = "Hide/Show Preserve", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePreserve() + default boolean ShowPreserve() { return false; } @ConfigItem( position = 25, - keyName = "HideChivalry", - name = "Hide Chivalry", + keyName = "ShowChivalry", + name = "Show Chivalry", description = "Hide/Show Chivalry", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideChivalry() + default boolean ShowChivalry() { return false; } @ConfigItem( position = 26, - keyName = "HidePiety", - name = "Hide Piety", + keyName = "ShowPiety", + name = "Show Piety", description = "Hide/Show Piety", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePiety() + default boolean ShowPiety() { return false; } @ConfigItem( position = 27, - keyName = "HideRigour", - name = "Hide Rigour", + keyName = "ShowRigour", + name = "Show Rigour", description = "Hide/Show Rigour", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRigour() + default boolean ShowRigour() { return false; } @ConfigItem( position = 28, - keyName = "HideAugury", - name = "Hide Augury", + keyName = "ShowAugury", + name = "Show Augury", description = "Hide/Show Augury", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideAugury() + default boolean ShowAugury() { return false; } @@ -723,4 +723,4 @@ public interface HidePrayersConfig extends Config { return false; } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java index b1764bc815..15ae602352 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java @@ -33,16 +33,18 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.HashTable; -import api.WidgetNode; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.HashTable; +import net.runelite.api.Skill; +import net.runelite.api.WidgetNode; +import net.runelite.api.WorldType; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -50,13 +52,12 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; import net.runelite.client.plugins.hideprayers.util.PrayerTabStates; -@PluginDescriptor - ( - name = "Show/Hide Prayers", - description = "Hides specific Prayers.", - enabledByDefault = false, - type = PluginType.UTILITY - ) +@PluginDescriptor( + name = "Show/Hide Prayers", + description = "Hides specific Prayers.", + type = PluginType.UTILITY, + enabledByDefault = false +) public class HidePrayersPlugin extends Plugin { @@ -121,6 +122,7 @@ public class HidePrayersPlugin extends Plugin { if (event.getGameState() == GameState.LOGGED_IN) { + reallyHidePrayers(); hidePrayers(); } } @@ -250,35 +252,35 @@ public class HidePrayersPlugin extends Plugin if (config.showindividualprayers()) { - prayerWidgets.get(0).setHidden(!config.HideTHICK_SKIN()); // Thick Skin - prayerWidgets.get(1).setHidden(!config.HideBURST_OF_STRENGTH()); // Burst of Strength - prayerWidgets.get(2).setHidden(!config.HideCLARITY_OF_THOUGHT()); // Clarity of Thought - prayerWidgets.get(3).setHidden(!config.HideSHARP_EYE()); // Sharp Eye - prayerWidgets.get(4).setHidden(!config.HideMYSTIC_WILL()); // Mystic Will - prayerWidgets.get(5).setHidden(!config.HideROCK_SKIN()); // Rock Skin - prayerWidgets.get(6).setHidden(!config.HideSUPERHUMAN_STRENGTH()); // Super Human Strength - prayerWidgets.get(7).setHidden(!config.HideIMPROVED_REFLEXES()); // Improved_Reflexes - prayerWidgets.get(8).setHidden(!config.HideRapidRestore()); // Rapid Restore - prayerWidgets.get(9).setHidden(!config.HideRapidHeal()); // Rapid Heal - prayerWidgets.get(10).setHidden(!config.HideProtectItem()); // Protect Item - prayerWidgets.get(11).setHidden(!config.HideHAWK_EYE()); // Hawk Eye - prayerWidgets.get(12).setHidden(!config.HideMYSTIC_LORE()); // Mystic Lore - prayerWidgets.get(13).setHidden(!config.HideSteelSkin()); // Steel Skin - prayerWidgets.get(14).setHidden(!config.HideUltimateStrength()); // Ultimate Strength - prayerWidgets.get(15).setHidden(!config.HideIncredibleReflex()); // Incredible Reflexes - prayerWidgets.get(16).setHidden(!config.HidePTFMagic()); // Protect from Magic - prayerWidgets.get(17).setHidden(!config.HidePTFRange()); // Protect from Range - prayerWidgets.get(18).setHidden(!config.HidePTFMelee()); // Protect from Melee - prayerWidgets.get(19).setHidden(!config.HideEagle()); // eagle eye - prayerWidgets.get(20).setHidden(!config.HideMystic()); // Mystic Might - prayerWidgets.get(21).setHidden(!config.HideRETRIBUTION()); // Retribution - prayerWidgets.get(22).setHidden(!config.HideRedemption()); // Redemption - prayerWidgets.get(23).setHidden(!config.HideSmite()); // Smite - prayerWidgets.get(24).setHidden(!config.HidePreserve()); // Preserve - prayerWidgets.get(25).setHidden(!config.HideChivalry()); // Chivalry - prayerWidgets.get(26).setHidden(!config.HidePiety()); // Piety - prayerWidgets.get(27).setHidden(!config.HideRigour()); // Rigour - prayerWidgets.get(28).setHidden(!config.HideAugury()); // Augury + prayerWidgets.get(0).setHidden(!config.ShowTHICK_SKIN()); // Thick Skin + prayerWidgets.get(1).setHidden(!config.ShowBURST_OF_STRENGTH()); // Burst of Strength + prayerWidgets.get(2).setHidden(!config.ShowCLARITY_OF_THOUGHT()); // Clarity of Thought + prayerWidgets.get(3).setHidden(!config.ShowSHARP_EYE()); // Sharp Eye + prayerWidgets.get(4).setHidden(!config.ShowMYSTIC_WILL()); // Mystic Will + prayerWidgets.get(5).setHidden(!config.ShowROCK_SKIN()); // Rock Skin + prayerWidgets.get(6).setHidden(!config.ShowSUPERHUMAN_STRENGTH()); // Super Human Strength + prayerWidgets.get(7).setHidden(!config.ShowIMPROVED_REFLEXES()); // Improved_Reflexes + prayerWidgets.get(8).setHidden(!config.ShowRapidRestore()); // Rapid Restore + prayerWidgets.get(9).setHidden(!config.ShowRapidHeal()); // Rapid Heal + prayerWidgets.get(10).setHidden(!config.ShowProtectItem()); // Protect Item + prayerWidgets.get(11).setHidden(!config.ShowHAWK_EYE()); // Hawk Eye + prayerWidgets.get(12).setHidden(!config.ShowMYSTIC_LORE()); // Mystic Lore + prayerWidgets.get(13).setHidden(!config.ShowSteelSkin()); // Steel Skin + prayerWidgets.get(14).setHidden(!config.ShowUltimateStrength()); // Ultimate Strength + prayerWidgets.get(15).setHidden(!config.ShowIncredibleReflex()); // Incredible Reflexes + prayerWidgets.get(16).setHidden(!config.ShowPTFMagic()); // Protect from Magic + prayerWidgets.get(17).setHidden(!config.ShowPTFRange()); // Protect from Range + prayerWidgets.get(18).setHidden(!config.ShowPTFMelee()); // Protect from Melee + prayerWidgets.get(19).setHidden(!config.ShowEagle()); // eagle eye + prayerWidgets.get(20).setHidden(!config.ShowMystic()); // Mystic Might + prayerWidgets.get(21).setHidden(!config.ShowRETRIBUTION()); // Retribution + prayerWidgets.get(22).setHidden(!config.ShowRedemption()); // Redemption + prayerWidgets.get(23).setHidden(!config.ShowSmite()); // Smite + prayerWidgets.get(24).setHidden(!config.ShowPreserve()); // Preserve + prayerWidgets.get(25).setHidden(!config.ShowChivalry()); // Chivalry + prayerWidgets.get(26).setHidden(!config.ShowPiety()); // Piety + prayerWidgets.get(27).setHidden(!config.ShowRigour()); // Rigour + prayerWidgets.get(28).setHidden(!config.ShowAugury()); // Augury } else if (config.getarmadylprayers()) @@ -507,9 +509,19 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(9).setHidden(false); // Rapid Heal } + if (WorldType.isAllHighRiskWorld(client.getWorldType()) || client.getRealSkillLevel(Skill.PRAYER) <= 24) + { + prayerWidgets.get(10).setHidden(true); // Protect Item + } + else + { + prayerWidgets.get(10).setHidden(false); // Protect Item + } + switch (config.pvpprayers()) { case DISABLED: + reallyHidePrayers(); break; case PRAY1: prayerWidgets.get(0).setHidden(false); // Thick Skin @@ -522,30 +534,21 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(6).setHidden(false); // Super Human Strength break; case PRAY16: - prayerWidgets.get(3).setHidden(false); // Sharp Eye - prayerWidgets.get(4).setHidden(false); // Mystic Will - prayerWidgets.get(5).setHidden(false); // Rock Skin - prayerWidgets.get(6).setHidden(false); // Super Human Strength - prayerWidgets.get(7).setHidden(false); // Improved Reflexed - break; case PRAY25: prayerWidgets.get(3).setHidden(false); // Sharp Eye prayerWidgets.get(4).setHidden(false); // Mystic Will prayerWidgets.get(5).setHidden(false); // Rock Skin prayerWidgets.get(6).setHidden(false); // Super Human Strength prayerWidgets.get(7).setHidden(false); // Improved Reflexed - prayerWidgets.get(10).setHidden(false); // Protect Item break; case PRAY31: prayerWidgets.get(7).setHidden(false); // Improved Reflexed - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(11).setHidden(false); // Hawk Eye prayerWidgets.get(12).setHidden(false); // Mystic Lore prayerWidgets.get(13).setHidden(false); // Steel Skin prayerWidgets.get(14).setHidden(false); // Ultimate Strength break; case PRAY43: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(11).setHidden(false); // Hawk Eye prayerWidgets.get(12).setHidden(false); // Mystic Lore prayerWidgets.get(13).setHidden(false); // Steel Skin @@ -556,7 +559,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(18).setHidden(false); // Protect from Melee break; case PRAY44: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(12).setHidden(false); // Mystic Lore prayerWidgets.get(13).setHidden(false); // Steel Skin prayerWidgets.get(14).setHidden(false); // Ultimate Strength @@ -567,7 +569,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(19).setHidden(false); // Eagle Eye break; case PRAY45: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(13).setHidden(false); // Steel Skin prayerWidgets.get(14).setHidden(false); // Ultimate Strength prayerWidgets.get(15).setHidden(false); // Incredible Reflexes @@ -578,7 +579,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(20).setHidden(false); // Mystic Might break; case PRAY52: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(13).setHidden(false); // Steel Skin prayerWidgets.get(14).setHidden(false); // Ultimate Strength prayerWidgets.get(15).setHidden(false); // Incredible Reflexes @@ -591,7 +591,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(23).setHidden(false); // Smite break; case PRAY55: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(13).setHidden(false); // Steel Skin prayerWidgets.get(14).setHidden(false); // Ultimate Strength prayerWidgets.get(15).setHidden(false); // Incredible Reflexes @@ -605,7 +604,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(24).setHidden(false); // Preserve break; case PRAY60: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(16).setHidden(false); // Protect from Magic prayerWidgets.get(17).setHidden(false); // Protect from Range prayerWidgets.get(18).setHidden(false); // Protect from Melee @@ -617,7 +615,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(25).setHidden(false); // Chivalry break; case PRAY70: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(16).setHidden(false); // Protect from Magic prayerWidgets.get(17).setHidden(false); // Protect from Range prayerWidgets.get(18).setHidden(false); // Protect from Melee @@ -629,7 +626,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(26).setHidden(false); // Piety break; case PRAY74: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(16).setHidden(false); // Protect from Magic prayerWidgets.get(17).setHidden(false); // Protect from Range prayerWidgets.get(18).setHidden(false); // Protect from Melee @@ -641,7 +637,6 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(27).setHidden(false); // Rigour break; case PRAY77: - prayerWidgets.get(10).setHidden(false); // Protect Item prayerWidgets.get(16).setHidden(false); // Protect from Magic prayerWidgets.get(17).setHidden(false); // Protect from Range prayerWidgets.get(18).setHidden(false); // Protect from Melee diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Armadyl.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Armadyl.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Armadyl.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Armadyl.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Bandos.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Bandos.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Bandos.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Bandos.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Barrows.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Barrows.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Barrows.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Barrows.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Cerberus.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Cerberus.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Cerberus.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Cerberus.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/PVPPrayers.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/PVPPrayers.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/PVPPrayers.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/PVPPrayers.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/PrayerTabStates.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/PrayerTabStates.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/PrayerTabStates.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/PrayerTabStates.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Saradomin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Saradomin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Saradomin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Saradomin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Vorkath.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Vorkath.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Vorkath.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Vorkath.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Zamorak.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Zamorak.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Zamorak.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Zamorak.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Zulrah.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Zulrah.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hideprayers/util/Zulrah.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/util/Zulrah.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyOverlay.java index 3f79fbedcd..191b7c9cf9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyOverlay.java @@ -33,11 +33,11 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.ItemDefinition; -import api.ItemID; -import api.widgets.Widget; -import static api.widgets.WidgetInfo.TO_GROUP; -import api.widgets.WidgetItem; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemID; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.WidgetItemOverlay; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyPlugin.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyPlugin.java index e47d09e233..ecfa486fed 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/highalchemy/HighAlchemyPlugin.java @@ -34,15 +34,15 @@ import java.util.Set; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.events.ConfigChanged; -import static api.widgets.WidgetID.BANK_GROUP_ID; -import static api.widgets.WidgetID.BANK_INVENTORY_GROUP_ID; -import static api.widgets.WidgetID.DEPOSIT_BOX_GROUP_ID; -import static api.widgets.WidgetID.EQUIPMENT_INVENTORY_GROUP_ID; -import static api.widgets.WidgetID.GRAND_EXCHANGE_INVENTORY_GROUP_ID; -import static api.widgets.WidgetID.GUIDE_PRICES_INVENTORY_GROUP_ID; -import static api.widgets.WidgetID.INVENTORY_GROUP_ID; -import static api.widgets.WidgetID.SHOP_INVENTORY_GROUP_ID; +import net.runelite.api.events.ConfigChanged; +import static net.runelite.api.widgets.WidgetID.BANK_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.BANK_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.DEPOSIT_BOX_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.EQUIPMENT_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.GRAND_EXCHANGE_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.GUIDE_PRICES_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.SHOP_INVENTORY_GROUP_ID; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -57,6 +57,7 @@ import net.runelite.client.ui.overlay.OverlayManager; type = PluginType.UTILITY, enabledByDefault = false ) + public class HighAlchemyPlugin extends Plugin { private static final String CONFIG_GROUP = "highalchemy"; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscoreConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscoreConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscoreConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscoreConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index 96a1162e93..c667fca463 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -48,10 +48,10 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Experience; -import api.Player; -import api.WorldType; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Player; +import net.runelite.api.WorldType; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index 582b17374e..a7f7dd9b4a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java @@ -36,15 +36,15 @@ import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Provider; import javax.swing.SwingUtilities; -import api.ChatMessageType; -import api.Client; -import api.MenuAction; -import api.MenuEntry; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.MenuEntryAdded; -import api.events.PlayerMenuOptionClicked; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.PlayerMenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.menus.MenuManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/NameAutocompleter.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/NameAutocompleter.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/NameAutocompleter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hiscore/NameAutocompleter.java index d56868c988..3fd3fbe26d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hiscore/NameAutocompleter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/NameAutocompleter.java @@ -37,10 +37,10 @@ import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import lombok.extern.slf4j.Slf4j; -import api.ClanMember; -import api.Client; -import api.Friend; -import api.Player; +import net.runelite.api.ClanMember; +import net.runelite.api.Client; +import net.runelite.api.Friend; +import net.runelite.api.Player; @Slf4j class NameAutocompleter implements KeyListener diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java index c616dda179..2e307a4992 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java @@ -32,17 +32,17 @@ import java.util.Map; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameObject; -import api.ObjectID; -import api.Player; -import api.Tile; -import api.coords.Direction; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameObjectSpawned; -import api.events.GameTick; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.ObjectID; +import net.runelite.api.Player; +import net.runelite.api.Tile; +import net.runelite.api.coords.Direction; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameTick; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterTrap.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterTrap.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterTrap.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterTrap.java index ce5fded78d..4a28288994 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/HunterTrap.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterTrap.java @@ -28,8 +28,8 @@ import java.time.Duration; import java.time.Instant; import lombok.Getter; import lombok.Setter; -import api.GameObject; -import api.coords.WorldPoint; +import net.runelite.api.GameObject; +import net.runelite.api.coords.WorldPoint; /** * Wrapper class for a GameObject that represents a hunter trap. diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java index a9702f3232..6c41519726 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java @@ -29,10 +29,10 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Map; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -141,7 +141,7 @@ public class TrapOverlay extends Overlay { return; } - api.Point loc = Perspective.localToCanvas(client, localLoc, client.getPlane()); + net.runelite.api.Point loc = Perspective.localToCanvas(client, localLoc, client.getPlane()); if (loc == null) { @@ -177,7 +177,7 @@ public class TrapOverlay extends Overlay { return; } - api.Point loc = Perspective.localToCanvas(client, localLoc, client.getPlane()); + net.runelite.api.Point loc = Perspective.localToCanvas(client, localLoc, client.getPlane()); ProgressPieComponent pie = new ProgressPieComponent(); pie.setFill(fill); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraIndicatorOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraIndicatorOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraIndicatorOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraIndicatorOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraOverlay.java index 5c56f99936..08ea0a13c9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraOverlay.java @@ -28,9 +28,9 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Point; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPlugin.java index 99f8260c62..dfd72f8ee1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPlugin.java @@ -29,13 +29,13 @@ import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import lombok.Getter; -import api.Actor; -import api.Client; -import api.NPC; -import api.events.AnimationChanged; -import api.events.ConfigChanged; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -47,8 +47,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Hydra Helper", description = "Overlays for small hydras", tags = {"Hydra", "Helper", "you", "probably", "want", "the", "other", "one"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) + public class BabyHydraPlugin extends Plugin { @Inject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPrayOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPrayOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPrayOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPrayOverlay.java index db555b9260..f11c6b172d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPrayOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hydra/BabyHydraPrayOverlay.java @@ -29,9 +29,9 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.Prayer; -import api.SpriteID; +import net.runelite.api.Client; +import net.runelite.api.Prayer; +import net.runelite.api.SpriteID; import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java new file mode 100644 index 0000000000..f8ad288e45 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2017, Devin French + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.idlenotifier; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("idlenotifier") +public interface IdleNotifierConfig extends Config +{ + @ConfigItem( + keyName = "animationidle", + name = "Idle Animation Notifications", + description = "Configures if idle animation notifications are enabled", + position = 1 + ) + default boolean animationIdle() + { + return true; + } + + @ConfigItem( + keyName = "animationidlesound", + name = "Idle Animation Sound", + description = "Plays a custom sound accompanying Idle Animation notifications", + position = 2 + ) + default boolean animationIdleSound() + { + return false; + } + + @ConfigItem( + keyName = "interactionidle", + name = "Idle Interaction Notifications", + description = "Configures if idle interaction notifications are enabled e.g. combat, fishing", + position = 3 + ) + default boolean interactionIdle() + { + return true; + } + + @ConfigItem( + keyName = "interactionidlesound", + name = "Idle Interaction Sound", + description = "Plays a custom sound accompanying Idle Interaction notifications", + position = 4 + ) + default boolean interactionIdleSound() + { + return false; + } + + @ConfigItem( + keyName = "logoutidle", + name = "Idle Logout Notifications", + description = "Configures if the idle logout notifications are enabled", + position = 5 + ) + default boolean logoutIdle() + { + return true; + } + + @ConfigItem( + keyName = "outofcombatsound", + name = "Out of Combat Sound", + description = "Plays a custom sound whenever you leave combat", + position = 6 + ) + default boolean outOfCombatSound() + { + return false; + } + + @ConfigItem( + position = 7, + keyName = "skullNotification", + name = "Skull Notification", + description = "Receive a notification when you skull." + ) + default boolean showSkullNotification() + { + return false; + } + + @ConfigItem( + position = 8, + keyName = "unskullNotification", + name = "Unskull Notification", + description = "Receive a notification when you unskull." + ) + default boolean showUnskullNotification() + { + return false; + } + + @ConfigItem( + keyName = "timeout", + name = "Idle Notification Delay (ms)", + description = "The notification delay after the player is idle", + position = 9 + ) + default int getIdleNotificationDelay() + { + return 5000; + } + + @ConfigItem( + keyName = "hitpoints", + name = "Hitpoints Notification Threshold", + description = "The amount of hitpoints to send a notification at. A value of 0 will disable notification.", + position = 10 + ) + default int getHitpointsThreshold() + { + return 0; + } + + @ConfigItem( + keyName = "playHealthSound", + name = "Play sound for Low Health", + description = "Will play a sound for every Low Health notification sent", + position = 12 + ) + default boolean getPlayHealthSound() + { + return false; + } + + @ConfigItem( + keyName = "prayer", + name = "Prayer Notification Threshold", + description = "The amount of prayer points to send a notification at. A value of 0 will disable notification.", + position = 12 + ) + default int getPrayerThreshold() + { + return 0; + } + + @ConfigItem( + keyName = "playPrayerSound", + name = "Play sound for Low Prayer", + description = "Will play a sound for every Low Prayer notification sent", + position = 13 + ) + default boolean getPlayPrayerSound() + { + return false; + } + + @ConfigItem( + keyName = "oxygen", + name = "Oxygen Notification Threshold", + position = 14, + description = "The amount of remaining oxygen to send a notification at. A value of 0 will disable notification." + ) + default int getOxygenThreshold() + { + return 0; + } + + @ConfigItem( + keyName = "spec", + name = "Special Attack Energy Notification Threshold", + position = 15, + description = "The amount of spec energy reached to send a notification at. A value of 0 will disable notification." + ) + default int getSpecEnergyThreshold() + { + return 0; + } + + @ConfigItem( + keyName = "specSound", + name = "Special Attack Energy Sound", + description = "Plays a custom sound accompanying Special Attack energy notifications", + position = 16 + ) + default boolean getSpecSound() + { + return false; + } + + @ConfigItem( + keyName = "overspec", + name = "Over Special Energy Notification", + description = "Will repeat notifications for any value over the special energy threshold", + position = 17 + ) + default boolean getOverSpecEnergy() + { + return false; + } + + @ConfigItem( + keyName = "pkers", + name = "PKer Notifier", + position = 18, + description = "Notifies if an attackable player based on your level range appears on screen.", + group = "PvP", + warning = "This will not notify you if the player is in your cc or is online on your friends list." + ) + default boolean notifyPkers() + { + return false; + } + +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java similarity index 71% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java index 7efa77ed2c..e0d3925cb6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java @@ -27,124 +27,121 @@ package net.runelite.client.plugins.idlenotifier; import com.google.inject.Provides; import java.awt.TrayIcon; +//import java.io.IOException; import java.time.Duration; import java.time.Instant; import java.util.Arrays; import java.util.EnumSet; import java.util.List; import javax.inject.Inject; -import api.Actor; -import api.AnimationID; -import static api.AnimationID.COOKING_FIRE; -import static api.AnimationID.COOKING_RANGE; -import static api.AnimationID.COOKING_WINE; -import static api.AnimationID.CRAFTING_BATTLESTAVES; -import static api.AnimationID.CRAFTING_GLASSBLOWING; -import static api.AnimationID.CRAFTING_LEATHER; -import static api.AnimationID.CRAFTING_POTTERS_WHEEL; -import static api.AnimationID.CRAFTING_POTTERY_OVEN; -import static api.AnimationID.CRAFTING_SPINNING; -import static api.AnimationID.DENSE_ESSENCE_CHIPPING; -import static api.AnimationID.DENSE_ESSENCE_CHISELING; -import static api.AnimationID.FARMING_MIX_ULTRACOMPOST; -import static api.AnimationID.FISHING_CRUSHING_INFERNAL_EELS; -import static api.AnimationID.FISHING_CUTTING_SACRED_EELS; -import static api.AnimationID.FLETCHING_BOW_CUTTING; -import static api.AnimationID.FLETCHING_STRING_MAGIC_LONGBOW; -import static api.AnimationID.FLETCHING_STRING_MAGIC_SHORTBOW; -import static api.AnimationID.FLETCHING_STRING_MAPLE_LONGBOW; -import static api.AnimationID.FLETCHING_STRING_MAPLE_SHORTBOW; -import static api.AnimationID.FLETCHING_STRING_NORMAL_LONGBOW; -import static api.AnimationID.FLETCHING_STRING_NORMAL_SHORTBOW; -import static api.AnimationID.FLETCHING_STRING_OAK_LONGBOW; -import static api.AnimationID.FLETCHING_STRING_OAK_SHORTBOW; -import static api.AnimationID.FLETCHING_STRING_WILLOW_LONGBOW; -import static api.AnimationID.FLETCHING_STRING_WILLOW_SHORTBOW; -import static api.AnimationID.FLETCHING_STRING_YEW_LONGBOW; -import static api.AnimationID.FLETCHING_STRING_YEW_SHORTBOW; -import static api.AnimationID.GEM_CUTTING_AMETHYST; -import static api.AnimationID.GEM_CUTTING_DIAMOND; -import static api.AnimationID.GEM_CUTTING_EMERALD; -import static api.AnimationID.GEM_CUTTING_JADE; -import static api.AnimationID.GEM_CUTTING_OPAL; -import static api.AnimationID.GEM_CUTTING_REDTOPAZ; -import static api.AnimationID.GEM_CUTTING_RUBY; -import static api.AnimationID.GEM_CUTTING_SAPPHIRE; -import static api.AnimationID.HERBLORE_MAKE_TAR; -import static api.AnimationID.HERBLORE_PESTLE_AND_MORTAR; -import static api.AnimationID.HERBLORE_POTIONMAKING; -import static api.AnimationID.HOME_MAKE_TABLET; -import static api.AnimationID.IDLE; -import static api.AnimationID.MAGIC_CHARGING_ORBS; -import static api.AnimationID.MAGIC_ENCHANTING_AMULET_1; -import static api.AnimationID.MAGIC_ENCHANTING_AMULET_2; -import static api.AnimationID.MAGIC_ENCHANTING_AMULET_3; -import static api.AnimationID.MAGIC_ENCHANTING_JEWELRY; -import static api.AnimationID.MAGIC_LUNAR_PLANK_MAKE; -import static api.AnimationID.MAGIC_LUNAR_SHARED; -import static api.AnimationID.MAGIC_LUNAR_STRING_JEWELRY; -import static api.AnimationID.MAGIC_MAKE_TABLET; -import static api.AnimationID.MINING_3A_PICKAXE; -import static api.AnimationID.MINING_ADAMANT_PICKAXE; -import static api.AnimationID.MINING_BLACK_PICKAXE; -import static api.AnimationID.MINING_BRONZE_PICKAXE; -import static api.AnimationID.MINING_DRAGON_PICKAXE; -import static api.AnimationID.MINING_DRAGON_PICKAXE_ORN; -import static api.AnimationID.MINING_INFERNAL_PICKAXE; -import static api.AnimationID.MINING_IRON_PICKAXE; -import static api.AnimationID.MINING_MITHRIL_PICKAXE; -import static api.AnimationID.MINING_MOTHERLODE_3A; -import static api.AnimationID.MINING_MOTHERLODE_ADAMANT; -import static api.AnimationID.MINING_MOTHERLODE_BLACK; -import static api.AnimationID.MINING_MOTHERLODE_BRONZE; -import static api.AnimationID.MINING_MOTHERLODE_DRAGON; -import static api.AnimationID.MINING_MOTHERLODE_DRAGON_ORN; -import static api.AnimationID.MINING_MOTHERLODE_INFERNAL; -import static api.AnimationID.MINING_MOTHERLODE_IRON; -import static api.AnimationID.MINING_MOTHERLODE_MITHRIL; -import static api.AnimationID.MINING_MOTHERLODE_RUNE; -import static api.AnimationID.MINING_MOTHERLODE_STEEL; -import static api.AnimationID.MINING_RUNE_PICKAXE; -import static api.AnimationID.MINING_STEEL_PICKAXE; -import static api.AnimationID.PISCARILIUS_CRANE_REPAIR; -import static api.AnimationID.SAND_COLLECTION; -import static api.AnimationID.SMITHING_ANVIL; -import static api.AnimationID.SMITHING_CANNONBALL; -import static api.AnimationID.SMITHING_SMELTING; -import static api.AnimationID.USING_GILDED_ALTAR; -import static api.AnimationID.WOODCUTTING_3A_AXE; -import static api.AnimationID.WOODCUTTING_ADAMANT; -import static api.AnimationID.WOODCUTTING_BLACK; -import static api.AnimationID.WOODCUTTING_BRONZE; -import static api.AnimationID.WOODCUTTING_DRAGON; -import static api.AnimationID.WOODCUTTING_INFERNAL; -import static api.AnimationID.WOODCUTTING_IRON; -import static api.AnimationID.WOODCUTTING_MITHRIL; -import static api.AnimationID.WOODCUTTING_RUNE; -import static api.AnimationID.WOODCUTTING_STEEL; -import api.Client; -import api.Constants; -import api.GameState; -import api.GraphicID; -import api.Hitsplat; -import api.NPC; -import api.NPCDefinition; -import api.Player; -import api.Skill; -import api.SkullIcon; -import api.VarPlayer; -import api.Varbits; -import api.WorldType; -import api.events.AnimationChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.SpotAnimationChanged; -import api.events.HitsplatApplied; -import api.events.InteractingChanged; -import api.events.PlayerSpawned; +//import javax.sound.sampled.LineUnavailableException; +//import javax.sound.sampled.UnsupportedAudioFileException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import static net.runelite.api.AnimationID.COOKING_FIRE; +import static net.runelite.api.AnimationID.COOKING_RANGE; +import static net.runelite.api.AnimationID.COOKING_WINE; +import static net.runelite.api.AnimationID.CRAFTING_BATTLESTAVES; +import static net.runelite.api.AnimationID.CRAFTING_GLASSBLOWING; +import static net.runelite.api.AnimationID.CRAFTING_LEATHER; +import static net.runelite.api.AnimationID.CRAFTING_POTTERS_WHEEL; +import static net.runelite.api.AnimationID.CRAFTING_POTTERY_OVEN; +import static net.runelite.api.AnimationID.CRAFTING_SPINNING; +import static net.runelite.api.AnimationID.DENSE_ESSENCE_CHIPPING; +import static net.runelite.api.AnimationID.DENSE_ESSENCE_CHISELING; +import static net.runelite.api.AnimationID.FARMING_MIX_ULTRACOMPOST; +import static net.runelite.api.AnimationID.FISHING_CRUSHING_INFERNAL_EELS; +import static net.runelite.api.AnimationID.FISHING_CUTTING_SACRED_EELS; +import static net.runelite.api.AnimationID.FLETCHING_BOW_CUTTING; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAGIC_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAGIC_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAPLE_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAPLE_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_NORMAL_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_NORMAL_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_OAK_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_OAK_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_WILLOW_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_WILLOW_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_YEW_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_YEW_SHORTBOW; +import static net.runelite.api.AnimationID.GEM_CUTTING_AMETHYST; +import static net.runelite.api.AnimationID.GEM_CUTTING_DIAMOND; +import static net.runelite.api.AnimationID.GEM_CUTTING_EMERALD; +import static net.runelite.api.AnimationID.GEM_CUTTING_JADE; +import static net.runelite.api.AnimationID.GEM_CUTTING_OPAL; +import static net.runelite.api.AnimationID.GEM_CUTTING_REDTOPAZ; +import static net.runelite.api.AnimationID.GEM_CUTTING_RUBY; +import static net.runelite.api.AnimationID.GEM_CUTTING_SAPPHIRE; +import static net.runelite.api.AnimationID.HERBLORE_MAKE_TAR; +import static net.runelite.api.AnimationID.HERBLORE_PESTLE_AND_MORTAR; +import static net.runelite.api.AnimationID.HERBLORE_POTIONMAKING; +import static net.runelite.api.AnimationID.HOME_MAKE_TABLET; +import static net.runelite.api.AnimationID.IDLE; +import static net.runelite.api.AnimationID.MAGIC_CHARGING_ORBS; +import static net.runelite.api.AnimationID.MAGIC_ENCHANTING_AMULET_1; +import static net.runelite.api.AnimationID.MAGIC_ENCHANTING_AMULET_2; +import static net.runelite.api.AnimationID.MAGIC_ENCHANTING_AMULET_3; +import static net.runelite.api.AnimationID.MAGIC_ENCHANTING_JEWELRY; +import static net.runelite.api.AnimationID.MAGIC_LUNAR_PLANK_MAKE; +import static net.runelite.api.AnimationID.MAGIC_LUNAR_SHARED; +import static net.runelite.api.AnimationID.MAGIC_LUNAR_STRING_JEWELRY; +import static net.runelite.api.AnimationID.MAGIC_MAKE_TABLET; +import static net.runelite.api.AnimationID.MINING_3A_PICKAXE; +import static net.runelite.api.AnimationID.MINING_ADAMANT_PICKAXE; +import static net.runelite.api.AnimationID.MINING_BLACK_PICKAXE; +import static net.runelite.api.AnimationID.MINING_BRONZE_PICKAXE; +import static net.runelite.api.AnimationID.MINING_DRAGON_PICKAXE; +import static net.runelite.api.AnimationID.MINING_DRAGON_PICKAXE_ORN; +import static net.runelite.api.AnimationID.MINING_INFERNAL_PICKAXE; +import static net.runelite.api.AnimationID.MINING_IRON_PICKAXE; +import static net.runelite.api.AnimationID.MINING_MITHRIL_PICKAXE; +import static net.runelite.api.AnimationID.MINING_RUNE_PICKAXE; +import static net.runelite.api.AnimationID.MINING_STEEL_PICKAXE; +import static net.runelite.api.AnimationID.PISCARILIUS_CRANE_REPAIR; +import static net.runelite.api.AnimationID.SAND_COLLECTION; +import static net.runelite.api.AnimationID.SMITHING_ANVIL; +import static net.runelite.api.AnimationID.SMITHING_CANNONBALL; +import static net.runelite.api.AnimationID.SMITHING_SMELTING; +import static net.runelite.api.AnimationID.USING_GILDED_ALTAR; +import static net.runelite.api.AnimationID.WOODCUTTING_3A_AXE; +import static net.runelite.api.AnimationID.WOODCUTTING_ADAMANT; +import static net.runelite.api.AnimationID.WOODCUTTING_BLACK; +import static net.runelite.api.AnimationID.WOODCUTTING_BRONZE; +import static net.runelite.api.AnimationID.WOODCUTTING_DRAGON; +import static net.runelite.api.AnimationID.WOODCUTTING_INFERNAL; +import static net.runelite.api.AnimationID.WOODCUTTING_IRON; +import static net.runelite.api.AnimationID.WOODCUTTING_MITHRIL; +import static net.runelite.api.AnimationID.WOODCUTTING_RUNE; +import static net.runelite.api.AnimationID.WOODCUTTING_STEEL; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameState; +import net.runelite.api.GraphicID; +import net.runelite.api.Hitsplat; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Player; +import net.runelite.api.Skill; +import net.runelite.api.SkullIcon; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.SpotAnimationChanged; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.PlayerSpawned; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.Sound; +import net.runelite.client.game.SoundManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.util.PvPUtil; @@ -156,6 +153,8 @@ import net.runelite.client.util.PvPUtil; ) public class IdleNotifierPlugin extends Plugin { + private static final Logger logger = LoggerFactory.getLogger(IdleNotifierPlugin.class); + // This must be more than 500 client ticks (10 seconds) before you get AFK kicked private static final int LOGOUT_WARNING_MILLIS = (4 * 60 + 40) * 1000; // 4 minutes and 40 seconds private static final int COMBAT_WARNING_MILLIS = 19 * 60 * 1000; // 19 minutes @@ -173,6 +172,9 @@ public class IdleNotifierPlugin extends Plugin @Inject private Client client; + @Inject + private SoundManager soundManager; + @Inject private IdleNotifierConfig config; @@ -282,19 +284,7 @@ public class IdleNotifierPlugin extends Plugin case MINING_3A_PICKAXE: case DENSE_ESSENCE_CHIPPING: case DENSE_ESSENCE_CHISELING: - /* Mining(Motherlode) */ - case MINING_MOTHERLODE_BRONZE: - case MINING_MOTHERLODE_IRON: - case MINING_MOTHERLODE_STEEL: - case MINING_MOTHERLODE_BLACK: - case MINING_MOTHERLODE_MITHRIL: - case MINING_MOTHERLODE_ADAMANT: - case MINING_MOTHERLODE_RUNE: - case MINING_MOTHERLODE_DRAGON: - case MINING_MOTHERLODE_DRAGON_ORN: - case MINING_MOTHERLODE_INFERNAL: - case MINING_MOTHERLODE_3A: - /* Herblore */ + /* Herblore */ case HERBLORE_PESTLE_AND_MORTAR: case HERBLORE_POTIONMAKING: case HERBLORE_MAKE_TAR: @@ -509,28 +499,47 @@ public class IdleNotifierPlugin extends Plugin if (config.animationIdle() && checkAnimationIdle(waitDuration, local)) { notifier.notify("[" + local.getName() + "] is now idle!"); + if (config.animationIdleSound()) + { + soundManager.playSound(Sound.IDLE); + } } - if (config.interactionIdle() && checkInteractionIdle(waitDuration, local)) { if (lastInteractWasCombat) { notifier.notify("[" + local.getName() + "] is now out of combat!"); + if (config.outOfCombatSound()) + { + soundManager.playSound(Sound.OUT_OF_COMBAT); + } } else { notifier.notify("[" + local.getName() + "] is now idle!"); + if (config.interactionIdleSound()) + { + soundManager.playSound(Sound.IDLE); + } } } if (checkLowHitpoints()) { notifier.notify("[" + local.getName() + "] has low hitpoints!"); + if (config.getPlayHealthSound()) + { + soundManager.playSound(Sound.LOW_HEATLH); + } } if (checkLowPrayer()) { notifier.notify("[" + local.getName() + "] has low prayer!"); + if (config.getPlayPrayerSound()) + { + soundManager.playSound(Sound.LOW_PRAYER); + } } if (checkLowOxygen()) @@ -541,6 +550,10 @@ public class IdleNotifierPlugin extends Plugin if (checkFullSpecEnergy()) { notifier.notify("[" + local.getName() + "] has restored spec energy!"); + if (config.getSpecSound()) + { + soundManager.playSound(Sound.RESTORED_SPECIAL_ATTACK); + } } } @@ -557,8 +570,10 @@ public class IdleNotifierPlugin extends Plugin // Check if we have regenerated over the threshold, and that the // regen was small enough. - boolean notify = lastSpecEnergy < threshold && currentSpecEnergy >= threshold - && currentSpecEnergy - lastSpecEnergy <= 100; + boolean notify = lastSpecEnergy < threshold && currentSpecEnergy >= threshold && currentSpecEnergy - lastSpecEnergy <= 100; + + notify = (notify) || ((config.getOverSpecEnergy()) && (currentSpecEnergy >= threshold) && (currentSpecEnergy != lastSpecEnergy) && (currentSpecEnergy - lastSpecEnergy <= 100)); + lastSpecEnergy = currentSpecEnergy; return notify; } @@ -794,4 +809,4 @@ public class IdleNotifierPlugin extends Plugin lastTickSkull = currentTickSkull; } } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/Impling.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/Impling.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/Impling.java rename to runelite-client/src/main/java/net/runelite/client/plugins/implings/Impling.java index f5c6dbb0c3..473fad2c23 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/Impling.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/Impling.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.AllArgsConstructor; import lombok.Getter; -import api.NpcID; +import net.runelite.api.NpcID; @AllArgsConstructor @Getter diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingCounterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingCounterOverlay.java new file mode 100644 index 0000000000..c88d433254 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingCounterOverlay.java @@ -0,0 +1,53 @@ +package net.runelite.client.plugins.implings; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.util.Map; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; + +public class ImplingCounterOverlay extends Overlay +{ + private final Client client; + private final ImplingsPlugin plugin; + private final ImplingsConfig config; + + private final PanelComponent panelComponent = new PanelComponent(); + + @Inject + public ImplingCounterOverlay(Client client, ImplingsConfig config, ImplingsPlugin plugin) + { + this.client = client; + this.config = config; + this.plugin = plugin; + setPosition(OverlayPosition.TOP_LEFT); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!config.showCounter() || plugin.getImplings().isEmpty()) + return null; + + panelComponent.getChildren().clear(); + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + for (Map.Entry entry : plugin.getImplingCounterMap().entrySet()) + { + if (plugin.showImplingType(entry.getKey()) && entry.getValue() != 0) + { + tableComponent.addRow(entry.getKey().getName(), entry.getValue().toString()); + } + } + + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); + } +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingMinimapOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingMinimapOverlay.java index 62c8119ace..ab35f9f945 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingMinimapOverlay.java @@ -29,8 +29,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.util.List; import javax.inject.Inject; -import api.NPC; -import api.Point; +import net.runelite.api.NPC; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingSpawn.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingSpawn.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingSpawn.java rename to runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingSpawn.java index 39200fa709..d624c02682 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingSpawn.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingSpawn.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.implings; import lombok.AllArgsConstructor; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; /** * @author Juzzed diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingType.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsConfig.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsConfig.java index 386284a874..d55be9f962 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsConfig.java @@ -320,4 +320,15 @@ public interface ImplingsConfig extends Config { return Color.WHITE; } + + @ConfigItem( + position = 26, + keyName = "showCounter", + name = "Show impling counter overlay", + description = "Shows how many of each impling there is nearby" + ) + default boolean showCounter() + { + return false; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java index efee7062ab..8b4e404bd3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java @@ -31,14 +31,14 @@ import java.awt.Polygon; import java.util.List; import java.util.Map; import javax.inject.Inject; -import api.Actor; -import api.Client; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsPlugin.java similarity index 83% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsPlugin.java index 11f7a20bf4..5ec61041da 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/implings/ImplingsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsPlugin.java @@ -33,11 +33,12 @@ import java.util.Map; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.GameState; -import api.NPC; -import api.events.GameStateChanged; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -58,6 +59,9 @@ public class ImplingsPlugin extends Plugin private static final int DYNAMIC_SPAWN_ECLECTIC = 1633; private static final int DYNAMIC_SPAWN_BABY_ESSENCE = 1634; + @Getter + private Map implingCounterMap = new HashMap<>(); + @Getter(AccessLevel.PACKAGE) private final List implings = new ArrayList<>(); @@ -67,6 +71,10 @@ public class ImplingsPlugin extends Plugin @Inject private ImplingsOverlay overlay; + @Inject + private ImplingCounterOverlay implingCounterOverlay; + + @Inject private OverlayManager overlayManager; @@ -91,6 +99,7 @@ public class ImplingsPlugin extends Plugin overlayManager.add(overlay); overlayManager.add(minimapOverlay); + overlayManager.add(implingCounterOverlay); } @Override @@ -98,6 +107,32 @@ public class ImplingsPlugin extends Plugin { overlayManager.remove(overlay); overlayManager.remove(minimapOverlay); + overlayManager.remove(implingCounterOverlay); + } + + @Subscribe + public void onGameTick(GameTick event) + { + implingCounterMap.clear(); + for (NPC npc : implings) + { + Impling impling = Impling.findImpling(npc.getId()); + + if (impling == null || impling.getImplingType() == null) + { + continue; + } + + ImplingType type = impling.getImplingType(); + if (implingCounterMap.containsKey(type)) + { + implingCounterMap.put(type, implingCounterMap.get(type) + 1); + } + else + { + implingCounterMap.put(type, 1); + } + } } @Subscribe @@ -118,6 +153,7 @@ public class ImplingsPlugin extends Plugin if (event.getGameState() == GameState.LOGIN_SCREEN || event.getGameState() == GameState.HOPPING) { implings.clear(); + implingCounterMap.clear(); } } @@ -131,6 +167,7 @@ public class ImplingsPlugin extends Plugin NPC npc = npcDespawned.getNpc(); implings.remove(npc); + } boolean showNpc(NPC npc) @@ -183,7 +220,12 @@ public class ImplingsPlugin extends Plugin return null; } - switch (impling.getImplingType()) + return typeToColor(impling.getImplingType()); + } + + Color typeToColor(ImplingType type) + { + switch (type) { case BABY: diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoConfig.java similarity index 55% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoConfig.java index 910cff8289..bd7c2b045e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mining/MiningConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoConfig.java @@ -1,6 +1,5 @@ /* - * Copyright (c) 2018, Seth - * Copyright (c) 2018, Lars + * Copyright (c) 2019, Jacky * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,54 +22,68 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.mining; +package net.runelite.client.plugins.inferno; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; +import java.awt.Color; -@ConfigGroup("mining") -public interface MiningConfig extends Config -{ - @ConfigItem( - keyName = "showMiningRocks", - name = "Show rock mining spots", - description = "Configures whether or not the mining spots are displayed." - ) - default boolean showMiningRocks() +@ConfigGroup("inferno") +public interface InfernoConfig extends Config { - return true; - } - + @ConfigItem( + position = 0, + keyName = "Nibbler Overlay", + name = "Nibbler Overlay", + description = "Shows if there are any Nibblers left" + ) + default boolean displayNibblerOverlay() + { + return false; + } @ConfigItem( - keyName = "statTimeout", - name = "Reset stats (minutes)", - description = "Configures the time until statistics are reset" + position = 1, + keyName = "Prayer Helper", + name = "Prayer Helper", + description = "Tells you what to flick in how many ticks" ) - default int statTimeout() - { - return 5; - } + default boolean showPrayerHelp() + { + return false; + } @ConfigItem( - keyName = "showMiningStats", - name = "Show mining session stats", - description = "Configures whether to display mining session stats" + position = 2, + keyName = "waveDisplay", + name = "Wave display", + description = "Shows monsters that will spawn on the selected wave(s)." ) - default boolean showMiningStats() - { - return true; - } - + default InfernoWaveDisplayMode waveDisplay() + { + return InfernoWaveDisplayMode.BOTH; + } @ConfigItem( - keyName = "showMiningState", - name = "Show current mining state", - description = "Shows current mining state. 'You are currently mining' / 'You are currently NOT mining'" + position = 3, + keyName = "getWaveOverlayHeaderColor", + name = "Wave Header", + description = "Color for Wave Header" ) - default boolean showMiningState() - { - return true; - } -} + default Color getWaveOverlayHeaderColor() + { + return Color.ORANGE; + } + + @ConfigItem( + position = 4, + keyName = "getWaveTextColor", + name = "Wave Text Color", + description = "Color for Wave Texts" + ) + default Color getWaveTextColor() + { + return Color.WHITE; + } + } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoInfobox.java similarity index 56% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoInfobox.java index 8fc5d0f29c..12b4571b09 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoInfobox.java @@ -1,6 +1,5 @@ /* - * Copyright (c) 2019, lyzrds - * Copyright (c) 2019, ganom + * Copyright (c) 2019, Jacky * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -11,6 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -22,69 +22,57 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.coxhelper; +package net.runelite.client.plugins.inferno; -import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; import net.runelite.client.ui.overlay.components.PanelComponent; -import net.runelite.client.ui.overlay.components.TitleComponent; -public class VanguardsOverlay extends Overlay +public class InfernoInfobox extends Overlay { - private final Client client; - private final CoxPlugin plugin; - private final CoxConfig config; + private final InfernoPlugin plugin; + private final InfernoConfig config; + private final PanelComponent panelComponent = new PanelComponent(); @Inject - VanguardsOverlay(Client client, CoxPlugin plugin, CoxConfig config) + public InfernoInfobox(Client client, InfernoConfig config, InfernoPlugin plugin) { - super(plugin); - setPosition(OverlayPosition.DYNAMIC); - setPosition(OverlayPosition.DETACHED); this.client = client; - this.plugin = plugin; this.config = config; + this.plugin = plugin; + setPosition(OverlayPosition.TOP_LEFT); } @Override public Dimension render(Graphics2D graphics) { - if (plugin.isRunVanguards()) - { - panelComponent.getChildren().clear(); + if (!config.showPrayerHelp() || client.getMapRegions()[0] != 9043) return null; - if (config.vangHealth()) + panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + for (int i = plugin.getPriorityNPC().length; i > 0; i--) + { + if (plugin.getPriorityNPC()[i - 1] == null) { - panelComponent.getChildren().add(TitleComponent.builder() - .text("Vanguards") - .color(Color.pink) - .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Range") - .right(Integer.toString(plugin.getRangeVangHP())) - .leftColor(Color.green) - .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Mage") - .right(Integer.toString(plugin.getMageVangHP())) - .leftColor(Color.blue) - .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Melee") - .right(Integer.toString(plugin.getMeleeVangHP())) - .leftColor(Color.red) - .build()); - return panelComponent.render(graphics); + tableComponent.addRow(Integer.toString(i), "-"); + } + else + { + tableComponent.addRow(plugin.getPriorityNPC()[i - 1].getName(), plugin.getPriorityNPC()[i - 1 ].getAttackstyle().getName()); } } - return null; + + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadAttack.java similarity index 59% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadAttack.java index 6713c72e27..28ae29c1cd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/grotesqueguardians/GrotesqueGuardiansPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadAttack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Damen + * Copyright (c) 2017, Devin French * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,37 +22,32 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.grotesqueguardians; +package net.runelite.client.plugins.inferno; -import javax.inject.Inject; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.api.AnimationID; +import net.runelite.api.Prayer; -@PluginDescriptor( - name = "Grotesque Guardians", - description = "Display tile indicators for the Grotesque Guardian special attacks", - tags = {"grotesque", "guardians", "gargoyle", "garg"}, - type = PluginType.PVM -) -public class GrotesqueGuardiansPlugin extends Plugin -{ - @Inject - private OverlayManager overlayManager; - - @Inject - private GrotesqueGuardiansOverlay overlay; - - @Override - protected void startUp() throws Exception +public enum InfernoJadAttack { - overlayManager.add(overlay); - } + MAGIC(AnimationID.JALTOK_JAD_MAGE_ATTACK, Prayer.PROTECT_FROM_MAGIC), + RANGE(AnimationID.JALTOK_JAD_RANGE_ATTACK, Prayer.PROTECT_FROM_MISSILES); - @Override - protected void shutDown() throws Exception - { - overlayManager.remove(overlay); + private final int animation; + private final Prayer prayer; + + InfernoJadAttack(int animation, Prayer prayer) + { + this.animation = animation; + this.prayer = prayer; + } + + public int getAnimation() + { + return animation; + } + + public Prayer getPrayer() + { + return prayer; + } } -} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/JadOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadOverlay.java similarity index 59% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/JadOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadOverlay.java index 52c9130978..43252b4c95 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/JadOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadOverlay.java @@ -6,10 +6,10 @@ * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -22,15 +22,16 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.fightcave; +package net.runelite.client.plugins.inferno; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.SpriteID; + +import net.runelite.api.Client; +import net.runelite.api.SpriteID; import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; @@ -39,49 +40,48 @@ import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.ImageComponent; import net.runelite.client.ui.overlay.components.PanelComponent; -public class JadOverlay extends Overlay -{ +public class InfernoJadOverlay extends Overlay + { private static final Color NOT_ACTIVATED_BACKGROUND_COLOR = new Color(150, 0, 0, 150); - private final Client client; - private final FightCavePlugin plugin; + private final InfernoPlugin plugin; private final SpriteManager spriteManager; private final PanelComponent imagePanelComponent = new PanelComponent(); @Inject - private JadOverlay(Client client, FightCavePlugin plugin, SpriteManager spriteManager) - { - setPosition(OverlayPosition.BOTTOM_RIGHT); - setPriority(OverlayPriority.HIGH); - this.client = client; - this.plugin = plugin; - this.spriteManager = spriteManager; - } + private InfernoJadOverlay(Client client, InfernoPlugin plugin, SpriteManager spriteManager) + { + setPosition(OverlayPosition.BOTTOM_RIGHT); + setPriority(OverlayPriority.HIGH); + this.client = client; + this.plugin = plugin; + this.spriteManager = spriteManager; + } @Override public Dimension render(Graphics2D graphics) - { - final JadAttack attack = plugin.getAttack(); - - if (attack == null) { - return null; + final InfernoJadAttack attack = plugin.getAttack(); + + if (attack == null) + { + return null; + } + + final BufferedImage prayerImage = getPrayerImage(attack); + + imagePanelComponent.getChildren().clear(); + imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); + imagePanelComponent.setBackgroundColor(client.isPrayerActive(attack.getPrayer()) + ? ComponentConstants.STANDARD_BACKGROUND_COLOR + : NOT_ACTIVATED_BACKGROUND_COLOR); + + return imagePanelComponent.render(graphics); } - final BufferedImage prayerImage = getPrayerImage(attack); - - imagePanelComponent.getChildren().clear(); - imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); - imagePanelComponent.setBackgroundColor(client.isPrayerActive(attack.getPrayer()) - ? ComponentConstants.STANDARD_BACKGROUND_COLOR - : NOT_ACTIVATED_BACKGROUND_COLOR); - - return imagePanelComponent.render(graphics); + private BufferedImage getPrayerImage(InfernoJadAttack attack) + { + final int prayerSpriteID = attack == InfernoJadAttack.MAGIC ? SpriteID.PRAYER_PROTECT_FROM_MAGIC : SpriteID.PRAYER_PROTECT_FROM_MISSILES; + return spriteManager.getSprite(prayerSpriteID, 0); + } } - - private BufferedImage getPrayerImage(JadAttack attack) - { - final int prayerSpriteID = attack == JadAttack.MAGIC ? SpriteID.PRAYER_PROTECT_FROM_MAGIC : SpriteID.PRAYER_PROTECT_FROM_MISSILES; - return spriteManager.getSprite(prayerSpriteID, 0); - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNPC.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNPC.java new file mode 100644 index 0000000000..392ec4bad6 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNPC.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2019, Jacky + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.inferno; + +import java.awt.Color; +import lombok.Getter; +import lombok.Setter; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; + +public class InfernoNPC +{ + public enum Attackstyle + { + MAGE("Mage", Color.CYAN), + RANGE("Range", Color.GREEN), + MELEE("Melee", Color.WHITE), + RANDOM("Random", Color.ORANGE); + + @Getter + private String name = ""; + + @Getter + private Color color; + + Attackstyle(String s, Color c) + { + this.name = s; + this.color = c; + } + } + + @Getter + private NPC npc; + + @Getter + private String name; + + @Getter + @Setter + private Attackstyle attackstyle; + + @Getter + private int attackTicks; + + @Getter + private int priority; + + @Getter + @Setter + private int ticksTillAttack = -1; + + @Getter + @Setter + private boolean attacking = false; + + @Getter + private int attackAnimation; + + @Getter + private boolean isMidAttack = false; + + @Getter + @Setter + private int distanceToPlayer = 0; + + @Getter + int textLocHeight; + + public InfernoNPC(NPC npc) + { + this.npc = npc; + textLocHeight = npc.getLogicalHeight() + 40; + switch (npc.getId()) + { + case NpcID.JALAKREKKET: + attackTicks = 4; + name = "lil mel"; + attackAnimation = 7582; + attackstyle = Attackstyle.MELEE; + priority = 7; + break; + + case NpcID.JALAKREKXIL: + attackTicks = 4; + name = "lil range"; + attackAnimation = 7583; + attackstyle = Attackstyle.RANGE; + priority = 6; + break; + + case NpcID.JALAKREKMEJ: + attackTicks = 4; + name = "lil mage"; + attackAnimation = 7581; + attackstyle = Attackstyle.MAGE; + priority = 5; + break; + + case NpcID.JALMEJRAH: + attackTicks = 3; + name = "bat"; + attackAnimation = 7578; + attackstyle = Attackstyle.RANGE; + priority = 4; + break; + + case NpcID.JALAK: + attackTicks = 6; + name = "blob"; + attackAnimation = 7583; // also 7581 + attackstyle = Attackstyle.RANDOM; + priority = 3; + break; + + case NpcID.JALIMKOT: + attackTicks = 4; + name = "meleer"; + attackAnimation = 7597; + attackstyle = Attackstyle.MELEE; + priority = 2; + break; + + case NpcID.JALXIL: + attackTicks = 4; + name = "ranger"; + attackAnimation = 7605; + attackstyle = Attackstyle.RANGE; + priority = 1; + break; + + case NpcID.JALZEK: + attackTicks = 4; + name = "mager"; + attackAnimation = 7610; + attackstyle = Attackstyle.MAGE; + priority = 0; + break; + + default: + attackTicks = 0; + } + } + + public String info() + { + String info = ""; + + if (attacking) + { + info += ticksTillAttack; + } + //info += " D: " + distanceToPlayer; + + return info; + } + + public void attacked() + { + ticksTillAttack = attackTicks; + attacking = true; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/test/TestOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNibblerOverlay.java similarity index 58% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/test/TestOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNibblerOverlay.java index 59edb9e8ea..12d88ef2af 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/test/TestOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNibblerOverlay.java @@ -1,6 +1,5 @@ /* - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Cas + * Copyright (c) 2019, Jacky * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,41 +22,50 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.test; - -import api.Client; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import net.runelite.client.ui.overlay.OverlayPosition; +package net.runelite.client.plugins.inferno; +import java.awt.Dimension; +import java.awt.Graphics2D; import javax.inject.Inject; -import java.awt.*; +import net.runelite.api.Client; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; -class TestOverlay extends Overlay +public class InfernoNibblerOverlay extends Overlay { - private static final Color SHORTCUT_HIGH_LEVEL_COLOR = Color.ORANGE; - private final Client client; - private final Test plugin; - private final TestConfig config; + private final InfernoPlugin plugin; + private final InfernoConfig config; + + private final PanelComponent panelComponent = new PanelComponent(); @Inject - private TestOverlay(Client client, Test plugin, TestConfig config) + public InfernoNibblerOverlay(Client client, InfernoConfig config, InfernoPlugin plugin) { - super(plugin); - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_SCENE); this.client = client; - this.plugin = plugin; this.config = config; + this.plugin = plugin; + setPosition(OverlayPosition.TOP_LEFT); } + @Override public Dimension render(Graphics2D graphics) { - System.out.println("Rendered Test"); - graphics.setColor(Color.RED); - graphics.drawString("Hello World", 20, 20); + if (!config.displayNibblerOverlay() || plugin.getNibblers().size() == 0 || client.getMapRegions()[0] != 9043) return null; + + panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + tableComponent.addRow("Nibblers Left: ", Integer.toString(plugin.getNibblers().size())); + + panelComponent.getChildren().add(tableComponent); + + return panelComponent.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/OlmCrippleTimerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoOverlay.java similarity index 50% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/OlmCrippleTimerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoOverlay.java index 9970785127..0175e1f751 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/OlmCrippleTimerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoOverlay.java @@ -1,6 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us - * Copyright (c) 2019, ganom + * Copyright (c) 2019, Jacky * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,73 +22,87 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.coxhelper; - +package net.runelite.client.plugins.inferno; +import com.google.common.base.Strings; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; - -public class OlmCrippleTimerOverlay extends Overlay +public class InfernoOverlay extends Overlay { - - private final Client client; - private final CoxPlugin plugin; - private final CoxConfig config; + private final InfernoPlugin plugin; + private final InfernoConfig config; + private final PanelComponent panelComponent = new PanelComponent(); @Inject - private OlmCrippleTimerOverlay(Client client, CoxPlugin plugin, CoxConfig config) + public InfernoOverlay(Client client, InfernoConfig config, InfernoPlugin plugin) { - this.client = client; - this.plugin = plugin; - this.config = config; setPosition(OverlayPosition.DYNAMIC); - setPriority(OverlayPriority.HIGH); setLayer(OverlayLayer.ABOVE_SCENE); + this.client = client; + this.config = config; + this.plugin = plugin; } @Override public Dimension render(Graphics2D graphics) { - if (plugin.isHandCripple()) + if (!client.isInInstancedRegion() || client.getMapRegions()[0] != 9043) return null; + + for (InfernoNPC monster : plugin.getMonsters().values()) { - int tick = plugin.getTimer(); - NPC olmHand = plugin.getHand(); - final String tickStr = String.valueOf(tick); - Point canvasPoint = olmHand.getCanvasTextLocation(graphics, tickStr, 50); - renderTextLocation(graphics, tickStr, config.textSize(), config.fontStyle().getFont(), Color.GRAY, canvasPoint); + NPC npc = monster.getNpc(); + //if (npc == null || !config.showPrayer()) return; + LocalPoint lp = npc.getLocalLocation(); + if (lp != null) + { + Point point = Perspective.localToCanvas(client, lp, client.getPlane(), npc.getLogicalHeight()); + if (point != null) + { + if (monster.getTicksTillAttack() == 1 || (monster.getName().equals("blob") && monster.getTicksTillAttack() <= 3)) + { + renderTextLocation(graphics, monster, monster.info(), Color.GREEN); + } + else + { + renderTextLocation(graphics, monster, monster.info(), Color.RED); + } + } + } } - - return null; } - private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) + // renders text location + public static void renderTextLocation(Graphics2D graphics, InfernoNPC actor, String text, Color color) { - graphics.setFont(new Font("Arial", fontStyle, fontSize)); - if (canvasPoint != null) + graphics.setFont(new Font("Arial", Font.BOLD, 15)); + Point textLocation = actor.getNpc().getCanvasTextLocation(graphics, text, actor.textLocHeight + 40); + if (Strings.isNullOrEmpty(text)) { - final Point canvasCenterPoint = new Point( - canvasPoint.getX(), - canvasPoint.getY()); - final Point canvasCenterPoint_shadow = new Point( - canvasPoint.getX() + 1, - canvasPoint.getY() + 1); - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); - OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); + return; } - } -} \ No newline at end of file + int x = textLocation.getX(); + int y = textLocation.getY(); + + graphics.setColor(Color.BLACK); + graphics.drawString(text, x + 1, y + 1); + + graphics.setColor(color); + graphics.drawString(text, x, y); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPlugin.java new file mode 100644 index 0000000000..8a8549c4d5 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPlugin.java @@ -0,0 +1,477 @@ +/* + * Copyright (c) 2019, Jacky + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.inferno; + +import com.google.inject.Provides; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Nullable; +import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.HeadIcon; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.ui.overlay.OverlayManager; +import org.apache.commons.lang3.ArrayUtils; + +@PluginDescriptor( + name = "Inferno", + description = "Inferno helper", + tags = {"combat", "overlay", "pve", "pvm"}, + type = PluginType.PVM +) +@Slf4j +public class InfernoPlugin extends Plugin +{ + private static final int INFERNO_REGION = 9043; + + @Inject + private Client client; + + @Inject + private OverlayManager overlayManager; + + @Inject + private InfernoOverlay infernoOverlay; + + @Inject + private InfernoWaveOverlay waveOverlay; + + @Inject + private InfernoJadOverlay jadOverlay; + + @Inject + private InfernoInfobox infernoInfobox; + + @Inject + private InfernoNibblerOverlay nibblerOverlay; + + @Inject + private InfernoConfig config; + + @Getter + private int currentWave = -1; + + @Getter + private Map monsters; + + @Getter + private Map> monsterCurrentAttackMap; + + @Getter + private List nibblers; + + @Getter + private InfernoNPC[] priorityNPC; + + + @Getter(AccessLevel.PACKAGE) + @Nullable + private InfernoJadAttack attack; + + private NPC jad; + + @Getter(AccessLevel.PACKAGE) + private int currentWaveNumber; + + private List waveMonsters; + + public InfernoPlugin() + { + waveMonsters = new ArrayList<>(); + } + + @Provides + InfernoConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(InfernoConfig.class); + } + + @Override + protected void startUp() throws Exception + { + waveOverlay.setDisplayMode(config.waveDisplay()); + + if (isInInferno()) + { + overlayManager.add(infernoOverlay); + overlayManager.add(infernoInfobox); + overlayManager.add(nibblerOverlay); + + if (config.waveDisplay() != InfernoWaveDisplayMode.NONE) + { + overlayManager.add(waveOverlay); + } + + overlayManager.add(jadOverlay); + } + + waveOverlay.setWaveHeaderColor(config.getWaveOverlayHeaderColor()); + waveOverlay.setWaveTextColor(config.getWaveTextColor()); + + monsters = new HashMap<>(); + monsterCurrentAttackMap = new HashMap<>(6); + + for (int i = 1; i <= 6; i++) + { + monsterCurrentAttackMap.put(i, new ArrayList<>()); + } + + nibblers = new ArrayList<>(); + priorityNPC = new InfernoNPC[4]; + } + + @Override + protected void shutDown() throws Exception + { + overlayManager.remove(infernoInfobox); + overlayManager.remove(infernoOverlay); + overlayManager.remove(nibblerOverlay); + overlayManager.remove(waveOverlay); + overlayManager.remove(jadOverlay); + jad = null; + attack = null; + monsters = null; + currentWaveNumber = -1; + } + @Subscribe + private void onConfigChanged(ConfigChanged event) + { + if (!"inferno".equals(event.getGroup())) + { + return; + } + + if (event.getKey().endsWith("color")) + { + waveOverlay.setWaveHeaderColor(config.getWaveOverlayHeaderColor()); + waveOverlay.setWaveTextColor(config.getWaveTextColor()); + } + else if ("waveDisplay".equals(event.getKey())) + { + overlayManager.remove(waveOverlay); + + waveOverlay.setDisplayMode(config.waveDisplay()); + + if (isInInferno() && config.waveDisplay() != InfernoWaveDisplayMode.NONE) + { + overlayManager.add(waveOverlay); + } + } + } + + @Subscribe + public void onNpcSpawned(NpcSpawned event) + { + if (client.getMapRegions()[0] != 9043) return; + + NPC npc = event.getNpc(); + if (isValidInfernoMob(npc)) + { + monsters.put(npc, new InfernoNPC(npc)); + log.debug(String.valueOf(monsters.size())); + } + + if (npc.getId() == NpcID.JALNIB) + { + nibblers.add(npc); + } + + final int id = event.getNpc().getId(); + + if (id == NpcID.JALTOKJAD || id == NpcID.JALTOKJAD_7704) + { + jad = event.getNpc(); + } + + final Actor actor = event.getActor(); + + if (actor != null) + { + waveMonsters.add(actor); + } + } + + @Subscribe + public void onNpcDespawned(NpcDespawned event) + { + if (client.getMapRegions()[0] != 9043) return; + + NPC npc = event.getNpc(); + if (monsters.containsKey(npc)) + { + monsters.remove(npc); + log.debug(String.valueOf(monsters.size())); + } + + if (npc.getId() == NpcID.JALNIB) + { + nibblers.remove(npc); + } + + if (jad == event.getNpc()) + { + jad = null; + attack = null; + } + final Actor actor = event.getActor(); + if (actor != null) + { + waveMonsters.remove(actor); + } + } + + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + if (event.getGameState() != GameState.LOGGED_IN) + { + return; + } + + if (!isInInferno()) + { + currentWaveNumber = -1; + overlayManager.remove(infernoInfobox); + overlayManager.remove(infernoOverlay); + overlayManager.remove(nibblerOverlay); + overlayManager.remove(waveOverlay); + overlayManager.remove(jadOverlay); + } + else if (currentWaveNumber == -1) + { + currentWaveNumber = 1; + overlayManager.add(infernoOverlay); + overlayManager.add(infernoInfobox); + overlayManager.add(nibblerOverlay); + + if (config.waveDisplay() != InfernoWaveDisplayMode.NONE) + { + overlayManager.add(waveOverlay); + } + + overlayManager.add(jadOverlay); + } + } + + @Subscribe + public void onChatMessage(ChatMessage event) + { + if (!isInInferno() || event.getType() != ChatMessageType.GAMEMESSAGE) + { + return; + } + + String message = event.getMessage(); + + if (event.getMessage().contains("Wave:")) + { + message = message.substring(message.indexOf(": ") + 2); + currentWaveNumber = Integer.parseInt(message.substring(0, message.indexOf("<"))); + } + } + + @Subscribe + public void onGameTick(GameTick event) + { + if (client.getMapRegions()[0] != 9043) return; + + clearMapAndPriority(); + + for (InfernoNPC monster : monsters.values()) + { + calculateDistanceToPlayer(monster); + + NPC npc = monster.getNpc(); + + // if they are not attacking but are still attacking + if (monster.isAttacking()) + { + monster.setTicksTillAttack(monster.getTicksTillAttack() - 1); + + // sets the blobs attack style + if (monster.getName().equals("blob") && monster.getTicksTillAttack() == 3 && monster.getDistanceToPlayer() <= 15) + { + if (client.getLocalPlayer().getOverheadIcon() == null) + { + monster.setAttackstyle(InfernoNPC.Attackstyle.RANDOM); + } + else if (client.getLocalPlayer().getOverheadIcon().equals(HeadIcon.MAGIC)) + { + monster.setAttackstyle(InfernoNPC.Attackstyle.RANGE); + } + else if (client.getLocalPlayer().getOverheadIcon().equals(HeadIcon.RANGED)) + { + monster.setAttackstyle(InfernoNPC.Attackstyle.MAGE); + } + } + + // we know the monster is not attacking because it should have attacked and is idling + if (monster.getTicksTillAttack() == 0) + { + if (npc.getAnimation() == -1) + { + monster.setAttacking(false); + } + else + { + // want to reset the monsters attack back to attacking + monster.attacked(); + } + } + } + else + { + // they've just attacked + if (npc.getAnimation() == monster.getAttackAnimation() || npc.getAnimation() == 7581) // special case for blob + { + monster.attacked(); + } + } + + if (monster.getTicksTillAttack() >= 1) + { + monsterCurrentAttackMap.get(monster.getTicksTillAttack()).add(monster); + } + } + + calculatePriorityNPC(); + } + + @Subscribe + public void onAnimationChanged(final AnimationChanged event) + { + if (event.getActor() != jad) + { + return; + } + + if (jad.getAnimation() == InfernoJadAttack.MAGIC.getAnimation()) + { + attack = InfernoJadAttack.MAGIC; + } + else if (jad.getAnimation() == InfernoJadAttack.RANGE.getAnimation()) + { + attack = InfernoJadAttack.RANGE; + } + } + + private void calculatePriorityNPC() + { + for (int i = 0; i < priorityNPC.length; i++) + { + ArrayList monsters = monsterCurrentAttackMap.get(i + 1); + + if (monsters.size() == 0) continue; + + int priority = monsters.get(0).getPriority(); + + InfernoNPC infernoNPC = monsters.get(0); + + for (InfernoNPC npc : monsters) + { + if (npc.getPriority() < priority) + { + priority = npc.getPriority(); + infernoNPC = npc; + } + } + + priorityNPC[i] = infernoNPC; + + log.debug("i: " + i + " " + infernoNPC.getName()); + } + } + + // TODO: blob calculator + private void calculateDistanceToPlayer(InfernoNPC monster) + { + monster.setDistanceToPlayer(client.getLocalPlayer().getWorldLocation().distanceTo(monster.getNpc().getWorldArea())); + } + + private void clearMapAndPriority() + { + for (List l : monsterCurrentAttackMap.values()) + { + l.clear(); + } + + for (int i = 0; i < priorityNPC.length; i++) + { + priorityNPC[i] = null; + } + } + + private boolean isValidInfernoMob(NPC npc) + { + // we only want the bat, blob, melee, ranger and mager + return npc.getId() == NpcID.JALMEJRAH || + npc.getId() == NpcID.JALAK || + npc.getId() == NpcID.JALIMKOT || + npc.getId() == NpcID.JALXIL || + npc.getId() == NpcID.JALZEK; + } + + private boolean isInInferno() + { + return ArrayUtils.contains(client.getMapRegions(), INFERNO_REGION); + } + + boolean isNotFinalWave() + { + return currentWaveNumber <= 68; + } + + List getWaveMonsters() + { + return waveMonsters; + } + + int getNextWaveNumber() + { + return currentWaveNumber == -1 || currentWaveNumber == 69 ? -1 : currentWaveNumber + 1; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveDisplayMode.java new file mode 100644 index 0000000000..96c7d12001 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveDisplayMode.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.inferno; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum InfernoWaveDisplayMode +{ + CURRENT("Current wave"), + NEXT("Next wave"), + BOTH("Both"), + NONE("None"); + + private final String name; + + @Override + public String toString() + { + return name; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveMappings.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveMappings.java new file mode 100644 index 0000000000..0e87b0c13b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveMappings.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2019, Kyleeld + * Copyright (c) 2019, RuneLitePlus + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.inferno; + +import com.google.common.collect.ImmutableMap; +import java.awt.Color; +import lombok.Getter; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.TitleComponent; + +class InfernoWaveMappings +{ + @Getter + private static final ImmutableMap waveMapping; + + @Getter + private static final ImmutableMap npcNameMapping; + + static + { + ImmutableMap.Builder waveMapBuilder = new ImmutableMap.Builder<>(); + + waveMapBuilder.put(1, new int[]{32, 32, 32, 85}); + waveMapBuilder.put(2, new int[]{32, 32, 32, 85, 85}); + waveMapBuilder.put(3, new int[]{32, 32, 32, 32, 32, 32}); + waveMapBuilder.put(4, new int[]{32, 32, 32, 165}); + waveMapBuilder.put(5, new int[]{32, 32, 32, 85, 165}); + waveMapBuilder.put(6, new int[]{32, 32, 32, 85, 85, 165}); + waveMapBuilder.put(7, new int[]{32, 32, 32, 165, 165}); + waveMapBuilder.put(8, new int[]{32, 32, 32, 32, 32, 32}); + waveMapBuilder.put(9, new int[]{32, 32, 32, 240}); + waveMapBuilder.put(10, new int[]{32, 32, 32, 85, 240}); + waveMapBuilder.put(11, new int[]{32, 32, 32, 85, 85, 240}); + waveMapBuilder.put(12, new int[]{32, 32, 32, 165, 240}); + waveMapBuilder.put(13, new int[]{32, 32, 32, 85, 165, 240}); + waveMapBuilder.put(14, new int[]{32, 32, 32, 85, 85, 165, 240}); + waveMapBuilder.put(15, new int[]{32, 32, 32, 165, 165, 240}); + waveMapBuilder.put(16, new int[]{32, 32, 32, 240, 240}); + waveMapBuilder.put(17, new int[]{32, 32, 32, 32, 32, 32}); + waveMapBuilder.put(18, new int[]{32, 32, 32, 370}); + waveMapBuilder.put(19, new int[]{32, 32, 32, 85, 370}); + waveMapBuilder.put(20, new int[]{32, 32, 32, 85, 85, 370}); + waveMapBuilder.put(21, new int[]{32, 32, 32, 165, 370}); + waveMapBuilder.put(22, new int[]{32, 32, 32, 85, 165, 370}); + waveMapBuilder.put(23, new int[]{32, 32, 32, 85, 85, 165, 370}); + waveMapBuilder.put(24, new int[]{32, 32, 32, 165, 165, 370}); + waveMapBuilder.put(25, new int[]{32, 32, 32, 240, 370}); + waveMapBuilder.put(26, new int[]{32, 32, 32, 85, 240, 370}); + waveMapBuilder.put(27, new int[]{32, 32, 32, 85, 85, 240, 370}); + waveMapBuilder.put(28, new int[]{32, 32, 32, 165, 240, 370}); + waveMapBuilder.put(29, new int[]{32, 32, 32, 85, 165, 240, 370}); + waveMapBuilder.put(30, new int[]{32, 32, 32, 85, 85, 165, 240, 370}); + waveMapBuilder.put(31, new int[]{32, 32, 32, 165, 165, 240, 370}); + waveMapBuilder.put(32, new int[]{32, 32, 32, 240, 240, 370}); + waveMapBuilder.put(33, new int[]{32, 32, 32, 370, 370}); + waveMapBuilder.put(34, new int[]{32, 32, 32, 32, 32, 32}); + waveMapBuilder.put(35, new int[]{32, 32, 32, 490}); + waveMapBuilder.put(36, new int[]{32, 32, 32, 85, 490}); + waveMapBuilder.put(37, new int[]{32, 32, 32, 85, 85, 490}); + waveMapBuilder.put(38, new int[]{32, 32, 32, 165, 490}); + waveMapBuilder.put(39, new int[]{32, 32, 32, 85, 165, 490}); + waveMapBuilder.put(40, new int[]{32, 32, 32, 85, 85, 165, 490}); + waveMapBuilder.put(41, new int[]{32, 32, 32, 165, 165, 490}); + waveMapBuilder.put(42, new int[]{32, 32, 32, 240, 490}); + waveMapBuilder.put(43, new int[]{32, 32, 32, 85, 240, 490}); + waveMapBuilder.put(44, new int[]{32, 32, 32, 85, 85, 240, 490}); + waveMapBuilder.put(45, new int[]{32, 32, 32, 165, 240, 490 }); + waveMapBuilder.put(46, new int[]{32, 32, 32, 85, 165, 240, 490}); + waveMapBuilder.put(47, new int[]{32, 32, 32, 85, 85, 165, 240, 490}); + waveMapBuilder.put(48, new int[]{32, 32, 32, 165, 165, 240, 490}); + waveMapBuilder.put(49, new int[]{32, 32, 32, 240, 240, 490}); + waveMapBuilder.put(50, new int[]{32, 32, 32, 370, 490}); + waveMapBuilder.put(51, new int[]{32, 32, 32, 85, 370, 490}); + waveMapBuilder.put(52, new int[]{32, 32, 32, 85, 85, 370, 490}); + waveMapBuilder.put(53, new int[]{32, 32, 32, 165, 370, 490}); + waveMapBuilder.put(54, new int[]{32, 32, 32, 85, 165, 370, 490}); + waveMapBuilder.put(55, new int[]{32, 32, 32, 85, 85, 165, 370, 490}); + waveMapBuilder.put(56, new int[]{32, 32, 32, 165, 165, 370, 490}); + waveMapBuilder.put(57, new int[]{32, 32, 32, 240, 370, 490}); + waveMapBuilder.put(58, new int[]{32, 32, 32, 85, 240, 370, 490}); + waveMapBuilder.put(59, new int[]{32, 32, 32, 85, 85, 240, 370, 490}); + waveMapBuilder.put(60, new int[]{32, 32, 32, 165, 240, 370, 490}); + waveMapBuilder.put(61, new int[]{32, 32, 32, 85, 165, 240, 370, 490}); + waveMapBuilder.put(62, new int[]{32, 32, 32, 85, 85, 165, 240, 370, 490}); + waveMapBuilder.put(63, new int[]{32, 32, 32, 165, 165, 240, 370, 490}); + waveMapBuilder.put(64, new int[]{32, 32, 32, 85, 240, 240, 370, 490}); + waveMapBuilder.put(65, new int[]{32, 32, 32, 85, 370, 370, 490}); + waveMapBuilder.put(66, new int[]{32, 32, 32, 85, 490, 490}); + waveMapBuilder.put(67, new int[]{900}); + waveMapBuilder.put(68, new int[]{900, 900, 900}); + waveMapBuilder.put(69, new int[]{1400}); + + waveMapping = waveMapBuilder.build(); + + ImmutableMap.Builder nameMapBuilder = new ImmutableMap.Builder<>(); + + nameMapBuilder.put(32, "Jal-Nib - Level 32"); + nameMapBuilder.put(85, "Jal-MejRah - Level 85"); + nameMapBuilder.put(165, "Jal-Ak - Level 165"); + nameMapBuilder.put(240, "Jal-ImKot - Level 240"); + nameMapBuilder.put(370, "Jal-Xil - Level 370"); + nameMapBuilder.put(490, "Jal-Zek - Level 490"); + nameMapBuilder.put(900, "JalTok-Jad - Level 900"); + nameMapBuilder.put(1400, "TzKal-Zuk - Level 1400"); + + npcNameMapping = nameMapBuilder.build(); + } + + static void addWaveComponent(PanelComponent panelComponent, String header, int wave, Color titleColor, Color color) + { + int[] monsters = waveMapping.get(wave); + + if (monsters == null) + { + return; + } + + panelComponent.getChildren() + .add(TitleComponent.builder() + .text(header) + .color(titleColor) + .build() + ); + + + for (int i = 0; i < monsters.length; i++) + { + int monsterType = monsters[i]; + int count = 1; + + for (; i < monsters.length - 1 && monsters[i + 1] == monsterType; i++) + { + count++; + } + + TitleComponent.TitleComponentBuilder builder = TitleComponent.builder(); + + builder.text(count + "x " + npcNameMapping.get(monsterType)); + builder.color(color); + + panelComponent.getChildren().add(builder.build()); + } + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveOverlay.java new file mode 100644 index 0000000000..88e3e32766 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveOverlay.java @@ -0,0 +1,69 @@ +package net.runelite.client.plugins.inferno; + +import java.awt.Color; +import com.google.inject.Inject; +import lombok.Setter; +import static net.runelite.client.plugins.inferno.InfernoWaveMappings.addWaveComponent; +import java.awt.Graphics2D; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.OverlayPosition; +import java.awt.Dimension; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.Overlay; + +public class InfernoWaveOverlay extends Overlay + { + private final InfernoPlugin plugin; + private final PanelComponent panelComponent; + + @Setter + private Color waveHeaderColor; + + @Setter + private Color waveTextColor; + + @Setter + private InfernoWaveDisplayMode displayMode; + + @Inject + InfernoWaveOverlay(final InfernoPlugin plugin) + { + this.panelComponent = new PanelComponent(); + this.setPosition(OverlayPosition.TOP_RIGHT); + this.setPriority(OverlayPriority.HIGH); + this.plugin = plugin; + + panelComponent.setPreferredSize(new Dimension(160, 0)); + } + + public Dimension render(final Graphics2D graphics) + { + panelComponent.getChildren().clear(); + + if (displayMode == InfernoWaveDisplayMode.CURRENT || + displayMode == InfernoWaveDisplayMode.BOTH) + { + addWaveComponent( + panelComponent, + "Current Wave (Wave " + plugin.getCurrentWaveNumber() + ")", + plugin.getCurrentWaveNumber(), + waveHeaderColor, + waveTextColor + ); + } + + if (displayMode == InfernoWaveDisplayMode.NEXT || + displayMode == InfernoWaveDisplayMode.BOTH) + { + addWaveComponent( + panelComponent, + "Next Wave (Wave " + plugin.getNextWaveNumber() + ")", + plugin.getNextWaveNumber(), + waveHeaderColor, + waveTextColor + ); + } + + return panelComponent.render(graphics); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/info/InfoPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/info/InfoPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java index d16069fcae..43a4b09437 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/info/InfoPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java @@ -44,7 +44,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.event.HyperlinkEvent; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.RuneLiteProperties; import net.runelite.client.account.SessionManager; import net.runelite.client.config.ConfigManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/info/JRichTextPane.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/JRichTextPane.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/info/JRichTextPane.java rename to runelite-client/src/main/java/net/runelite/client/plugins/info/JRichTextPane.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java index 810108b514..87d164b78f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java @@ -33,14 +33,14 @@ import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; import lombok.Setter; -import api.Client; -import api.Player; -import static api.SpriteID.WINDOW_CLOSE_BUTTON_RED_X; -import static api.SpriteID.WINDOW_CLOSE_BUTTON_RED_X_HOVERED; -import api.Sprite; -import api.Tile; -import api.coords.LocalPoint; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.Player; +import static net.runelite.api.SpriteID.WINDOW_CLOSE_BUTTON_RED_X; +import static net.runelite.api.SpriteID.WINDOW_CLOSE_BUTTON_RED_X_HOVERED; +import net.runelite.api.Sprite; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapPlugin.java index d0ab780257..38803e3c1b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapPlugin.java @@ -26,10 +26,10 @@ package net.runelite.client.plugins.instancemap; import com.google.inject.Binder; import javax.inject.Inject; -import api.events.GameStateChanged; -import api.events.WidgetMenuOptionClicked; -import api.widgets.WidgetInfo; -import static api.widgets.WidgetInfo.WORLD_MAP_OPTION; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.WidgetMenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; +import static net.runelite.api.widgets.WidgetInfo.WORLD_MAP_OPTION; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.KeyManager; import net.runelite.client.input.MouseManager; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java new file mode 100644 index 0000000000..c0e844939a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2019 Hydrox6 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.interfacestyles; + +import com.google.common.collect.ImmutableMap; +import java.util.Map; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import static net.runelite.api.SpriteID.*; +import net.runelite.client.game.SpriteOverride; + +@RequiredArgsConstructor +enum HealthbarOverride implements SpriteOverride +{ + BACK_30PX(HEALTHBAR_DEFAULT_BACK_30PX, "back_30px.png"), + BACK_50PX(HEALTHBAR_DEFAULT_BACK_50PX, "back_30px.png"), + BACK_60PX(HEALTHBAR_DEFAULT_BACK_60PX, "back_30px.png"), + BACK_80PX(HEALTHBAR_DEFAULT_BACK_80PX, "back_90px.png"), + BACK_100PX(HEALTHBAR_DEFAULT_BACK_100PX, "back_90px.png"), + BACK_120PX(HEALTHBAR_DEFAULT_BACK_120PX, "back_90px.png"), + BACK_140PX(HEALTHBAR_DEFAULT_BACK_140PX, "back_90px.png"), + BACK_160PX(HEALTHBAR_DEFAULT_BACK_160PX, "back_90px.png"), + + FRONT_30PX(HEALTHBAR_DEFAULT_FRONT_30PX, "front_30px.png"), + FRONT_50PX(HEALTHBAR_DEFAULT_FRONT_50PX, "front_30px.png"), + FRONT_60PX(HEALTHBAR_DEFAULT_FRONT_60PX, "front_30px.png"), + FRONT_80PX(HEALTHBAR_DEFAULT_FRONT_80PX, "front_90px.png"), + FRONT_100PX(HEALTHBAR_DEFAULT_FRONT_100PX, "front_90px.png"), + FRONT_120PX(HEALTHBAR_DEFAULT_FRONT_120PX, "front_90px.png"), + FRONT_140PX(HEALTHBAR_DEFAULT_FRONT_140PX, "front_90px.png"), + FRONT_160PX(HEALTHBAR_DEFAULT_FRONT_160PX, "front_90px.png"); + + @Getter + private final int spriteId; + + private final String fileName; + + @Getter + private int padding = 1; + + private static final Map MAP; + + static + { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + + for (HealthbarOverride override : values()) + { + builder.put(override.spriteId, override); + } + + MAP = builder.build(); + } + + static HealthbarOverride get(int spriteID) + { + return MAP.get(spriteID); + } + + @Override + public String getFileName() + { + return Skin.AROUND_2010.toString() + "/healthbar/" + this.fileName; + } +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java index 540186558c..3f64778e52 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java @@ -62,4 +62,14 @@ public interface InterfaceStylesConfig extends Config { return false; } + + @ConfigItem( + keyName = "rsCrossSprites", + name = "RuneScape cross sprites", + description = "Replaces left-click cross sprites with the ones in RuneScape" + ) + default boolean rsCrossSprites() + { + return false; + } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java similarity index 70% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java index 4ddd58de8a..6944a982d7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java @@ -30,18 +30,18 @@ import com.google.inject.Provides; import java.awt.image.BufferedImage; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.HealthBar; -import api.HealthBarOverride; -import api.NodeCache; -import api.SpriteID; -import api.Sprite; -import api.events.BeforeMenuRender; -import api.events.ConfigChanged; -import api.events.PostHealthBar; -import api.events.WidgetPositioned; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.HealthBar; +import net.runelite.api.SpriteID; +import net.runelite.api.Sprite; +import net.runelite.api.events.BeforeMenuRender; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.PostHealthBar; +import net.runelite.api.events.WidgetPositioned; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -71,7 +71,7 @@ public class InterfaceStylesPlugin extends Plugin @Inject private SpriteManager spriteManager; - private HealthBarOverride healthBarOverride; + private Sprite[] defaultCrossSprites; @Provides InterfaceStylesConfig provideConfig(ConfigManager configManager) @@ -92,10 +92,8 @@ public class InterfaceStylesPlugin extends Plugin { restoreWidgetDimensions(); removeGameframe(); - healthBarOverride = null; - client.setHealthBarOverride(null); - NodeCache heathBarCache = client.getHealthBarCache(); - heathBarCache.reset(); // invalidate healthbar cache so padding resets + restoreHealthBars(); + restoreCrossSprites(); }); } @@ -117,22 +115,38 @@ public class InterfaceStylesPlugin extends Plugin @Subscribe public void onPostHealthBar(PostHealthBar postHealthBar) { - if (healthBarOverride == null || !config.hdHealthBars()) + if (!config.hdHealthBars()) { return; } HealthBar healthBar = postHealthBar.getHealthBar(); - Sprite frontSprite = healthBar.getHealthBarFrontSprite(); + HealthbarOverride override = HealthbarOverride.get(healthBar.getHealthBarFrontSpriteId()); // Check if this is the health bar we are replacing - if (frontSprite == healthBarOverride.getFrontSprite() || frontSprite == healthBarOverride.getFrontSpriteLarge()) + if (override != null) { // Increase padding to show some more green at very low hp percentages - healthBar.setPadding(1); + healthBar.setPadding(override.getPadding()); } } + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + if (gameStateChanged.getGameState() != GameState.LOGIN_SCREEN) + { + return; + } + + /* + * The cross sprites aren't loaded yet when the initial config change event is received. + * So run the overriding for cross sprites when we reach the login screen, + * at which point the cross sprites will have been loaded. + */ + overrideCrossSprites(); + } + private void updateAllOverrides() { removeGameframe(); @@ -141,6 +155,7 @@ public class InterfaceStylesPlugin extends Plugin restoreWidgetDimensions(); adjustWidgetDimensions(); overrideHealthBars(); + overrideCrossSprites(); } @Subscribe @@ -224,7 +239,7 @@ public class InterfaceStylesPlugin extends Plugin { log.debug("Loading: {}", file); BufferedImage image = ImageUtil.getResourceStreamFromClass(this.getClass(), file); - return ImageUtil.getImageSpritePixels(image, client); + return ImageUtil.getImageSprite(image, client); } catch (RuntimeException ex) { @@ -272,31 +287,80 @@ public class InterfaceStylesPlugin extends Plugin private void overrideHealthBars() { - // Reset health bar cache to reset applied padding - NodeCache healthBarCache = client.getHealthBarCache(); - healthBarCache.reset(); - if (config.hdHealthBars()) { - String fileBase = Skin.AROUND_2010.toString() + "/healthbar/"; - - Sprite frontSprite = getFileSpritePixels(fileBase + "front.png"); - Sprite backSprite = getFileSpritePixels(fileBase + "back.png"); - - Sprite frontSpriteLarge = getFileSpritePixels(fileBase + "front_large.png"); - Sprite backSpriteLarge = getFileSpritePixels(fileBase + "back_large.png"); - - HealthBarOverride override = new HealthBarOverride(frontSprite, backSprite, frontSpriteLarge, backSpriteLarge); - healthBarOverride = override; - client.setHealthBarOverride(override); + spriteManager.addSpriteOverrides(HealthbarOverride.values()); + // Reset health bar caches to apply the override + clientThread.invokeLater(client::resetHealthBarCaches); } else { - healthBarOverride = null; - client.setHealthBarOverride(null); + restoreHealthBars(); } } + private void restoreHealthBars() + { + spriteManager.removeSpriteOverrides(HealthbarOverride.values()); + clientThread.invokeLater(client::resetHealthBarCaches); + } + + private void overrideCrossSprites() + { + if (config.rsCrossSprites()) + { + // If we've already replaced them, + // we don't need to replace them again + if (defaultCrossSprites != null) + { + return; + } + + Sprite[] crossSprites = client.getCrossSprites(); + + if (crossSprites == null) + { + return; + } + + defaultCrossSprites = new Sprite[crossSprites.length]; + System.arraycopy(crossSprites, 0, defaultCrossSprites, 0, defaultCrossSprites.length); + + for (int i = 0; i < crossSprites.length; i++) + { + Sprite newSprite = getFileSpritePixels("rs3/cross_sprites/" + i + ".png"); + + if (newSprite == null) + { + continue; + } + + crossSprites[i] = newSprite; + } + } + else + { + restoreCrossSprites(); + } + } + + private void restoreCrossSprites() + { + if (defaultCrossSprites == null) + { + return; + } + + Sprite[] crossSprites = client.getCrossSprites(); + + if (crossSprites != null && defaultCrossSprites.length == crossSprites.length) + { + System.arraycopy(defaultCrossSprites, 0, crossSprites, 0, defaultCrossSprites.length); + } + + defaultCrossSprites = null; + } + private void restoreWidgetDimensions() { for (WidgetOffset widgetOffset : WidgetOffset.values()) @@ -319,7 +383,7 @@ public class InterfaceStylesPlugin extends Plugin if (compassImage != null) { - Sprite compass = ImageUtil.getImageSpritePixels(compassImage, client); + Sprite compass = ImageUtil.getImageSprite(compassImage, client); client.setCompass(compass); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/SpriteOverride.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/SpriteOverride.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/SpriteOverride.java rename to runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/SpriteOverride.java index 5e9a7e23f5..b5db7bb69c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/SpriteOverride.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/SpriteOverride.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.interfacestyles; import lombok.Getter; -import api.SpriteID; +import net.runelite.api.SpriteID; import static net.runelite.client.plugins.interfacestyles.Skin.AROUND_2005; import static net.runelite.client.plugins.interfacestyles.Skin.AROUND_2010; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java rename to runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java index b6f035fd31..9edf17165e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.interfacestyles; import lombok.Getter; -import api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetInfo; @Getter enum WidgetOffset @@ -118,33 +118,33 @@ enum WidgetOffset FIXED_2005_INTERFACE_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INTERFACE_CONTAINER, 7, null, null, null), FIXED_2005_BANK_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_BANK_CONTAINER, 7, null, null, null), FIXED_2005_COMBAT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_TAB, 19, 2, null, null), - FIXED_2005_COMBAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_ICON, 26, null, null, null), + FIXED_2005_COMBAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_ICON, 28, 1, null, null), FIXED_2005_STATS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_TAB, 55, null, 30, null), - FIXED_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_ICON, 53, null, null, null), + FIXED_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_ICON, 51, null, null, null), FIXED_2005_QUESTS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_TAB, 82, 1, 30, null), - FIXED_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 81, null, null, null), + FIXED_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 80, null, null, null), FIXED_2005_INVENTORY_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB, null, null, 45, null), - FIXED_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_ICON, 115, null, null, null), + FIXED_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_ICON, 113, 1, null, null), FIXED_2005_EQUIPMENT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_TAB, 153, 1, 30, null), - FIXED_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 152, 4, null, null), + FIXED_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 151, 4, null, null), FIXED_2005_PRAYER_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_TAB, 180, null, 32, null), - FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 180, null, null, null), + FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 178, null, null, null), FIXED_2005_MAGIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_TAB, 209, 1, 30, null), - FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 3, null, null), + FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 2, null, null), FIXED_2005_CLAN_CHAT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_CLAN_CHAT_TAB, 15, null, null, null), FIXED_2005_CLAN_CHAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_CLAN_CHAT_ICON, 22, 0, null, null), FIXED_2005_FRIENDS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_TAB, 51, null, 30, null), - FIXED_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 50, null, null, null), + FIXED_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 49, -1, null, null), FIXED_2005_IGNORES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_IGNORES_TAB, 79, null, 30, null), FIXED_2005_IGNORES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_IGNORES_ICON, 78, null, null, null), FIXED_2005_LOGOUT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_TAB, 107, 1, 45, null), - FIXED_2005_LOGOUT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_ICON, 114, 1, null, null), + FIXED_2005_LOGOUT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_ICON, 112, null, null, null), FIXED_2005_OPTIONS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_TAB, 150, null, 30, null), - FIXED_2005_OPTIONS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_ICON, 149, null, null, null), + FIXED_2005_OPTIONS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_ICON, 148, -1, null, null), FIXED_2005_EMOTES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_TAB, 178, null, 30, null), - FIXED_2005_EMOTES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_ICON, 179, null, null, null), + FIXED_2005_EMOTES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_ICON, 178, 1, null, null), FIXED_2005_MUSIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_TAB, 206, null, 30, null), - FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 5, null, null); + FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 2, null, null); private Skin skin; private WidgetInfo widgetInfo; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOverride.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOverride.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOverride.java rename to runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOverride.java index b2560e62aa..1998fb3808 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOverride.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOverride.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.interfacestyles; import lombok.Getter; -import api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetInfo; @Getter enum WidgetOverride diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridConfig.java similarity index 64% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridConfig.java index 7a59d02a33..33c6868c4d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Tomas Slusny + * Copyright (c) 2018, Jeremy Plsek * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,56 +22,54 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +package net.runelite.client.plugins.inventorygrid; -package net.runelite.client.plugins.objectindicators; - -import java.awt.Color; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; import net.runelite.client.config.Range; -@ConfigGroup("objectindicators") -public interface ObjectIndicatorsConfig extends Config +@ConfigGroup("inventorygrid") +public interface InventoryGridConfig extends Config { @ConfigItem( - position = 0, - keyName = "markerColor", - name = "Marker color", - description = "Configures the color of object marker" + keyName = "showItem", + name = "Show item", + description = "Show a preview of the item in the new slot" ) - default Color markerColor() + default boolean showItem() { - return Color.YELLOW; + return true; } - @Range( - min = 0, - max = 10 - ) @ConfigItem( - position = 1, - keyName = "stroke", - name = "Stroke Size", - description = "Configures the stroke size of object marker" + keyName = "showGrid", + name = "Show grid", + description = "Show a grid on the inventory while dragging" ) - default int stroke() + default boolean showGrid() { - return 2; + return true; } - @Range( - min = 0, - max = 255 - ) @ConfigItem( - position = 2, - keyName = "alpha", - name = "Alpha", - description = "Configures the opacity/alpha of object marker" + keyName = "showHighlight", + name = "Highlight background", + description = "Show a green background highlight on the new slot" ) - default int alpha() + default boolean showHighlight() { - return 20; + return true; + } + + @ConfigItem( + keyName = "dragDelay", + name = "Drag Delay", + description = "Time in ms to wait after item press before showing grid" + ) + @Range(min = 100) + default int dragDelay() + { + return 100; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridOverlay.java new file mode 100644 index 0000000000..e7395f299d --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridOverlay.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018, Jeremy Plsek + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.inventorygrid; + +import com.google.inject.Inject; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.game.ItemManager; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; + +class InventoryGridOverlay extends Overlay +{ + private static final int INVENTORY_SIZE = 28; + + private static final Color HIGHLIGHT = new Color(0, 255, 0, 45); + private static final Color GRID = new Color(255, 255, 255, 45); + + private final InventoryGridConfig config; + private final Client client; + private final ItemManager itemManager; + + @Inject + private InventoryGridOverlay(InventoryGridConfig config, Client client, ItemManager itemManager) + { + this.itemManager = itemManager; + this.client = client; + this.config = config; + + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + } + + @Override + public Dimension render(Graphics2D graphics) + { + final Widget if1DraggingWidget = client.getIf1DraggedWidget(); + final Widget inventoryWidget = client.getWidget(WidgetInfo.INVENTORY); + + if (if1DraggingWidget == null || if1DraggingWidget != inventoryWidget + || client.getItemPressedDuration() < config.dragDelay() / Constants.CLIENT_TICK_LENGTH) + { + return null; + } + + final net.runelite.api.Point mouse = client.getMouseCanvasPosition(); + final Point mousePoint = new Point(mouse.getX(), mouse.getY()); + + for (int i = 0; i < INVENTORY_SIZE; ++i) + { + WidgetItem widgetItem = inventoryWidget.getWidgetItem(i); + + final Rectangle bounds = widgetItem.getCanvasBounds(); + boolean inBounds = bounds.contains(mousePoint); + + if (config.showItem() && inBounds) + { + final WidgetItem draggedItem = inventoryWidget.getWidgetItem(client.getIf1DraggedItemIndex()); + final BufferedImage draggedItemImage = itemManager.getImage(draggedItem.getId()); + final int x = (int) bounds.getX(); + final int y = (int) bounds.getY(); + + graphics.setComposite(AlphaComposite.SrcOver.derive(0.3f)); + graphics.drawImage(draggedItemImage, x, y, null); + graphics.setComposite(AlphaComposite.SrcOver); + } + + if (config.showHighlight() && inBounds) + { + graphics.setColor(HIGHLIGHT); + graphics.fill(bounds); + } + else if (config.showGrid()) + { + graphics.setColor(GRID); + graphics.fill(bounds); + } + } + + return null; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/rememberclan/RememberClanPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridPlugin.java similarity index 62% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/rememberclan/RememberClanPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridPlugin.java index b92a7246b3..dc6b0ae372 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/rememberclan/RememberClanPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridPlugin.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2018, Infinitay - * Copyright (c) 2018, Shaun Dreclin + * Copyright (c) 2018, Jeremy Plsek + * Copyright (c) 2019, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,53 +23,44 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +package net.runelite.client.plugins.inventorygrid; -package net.runelite.client.plugins.rememberclan; - +import com.google.inject.Inject; import com.google.inject.Provides; -import javax.inject.Inject; -import api.Client; -import api.VarClientStr; -import api.events.GameTick; -import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; +import net.runelite.client.ui.overlay.OverlayManager; @PluginDescriptor( - name = "Remember Clan", - description = "Remember a specific clan!", - type = PluginType.UTILITY, + name = "Inventory Grid", + description = "Shows a grid over the inventory and a preview of where items will be dragged", + tags = {"items", "overlay"}, enabledByDefault = false ) -public class RememberClanPlugin extends Plugin +public class InventoryGridPlugin extends Plugin { + @Inject + private InventoryGridOverlay overlay; @Inject - private Client client; + private OverlayManager overlayManager; - @Inject - private RememberClanConfig config; + @Override + public void startUp() + { + overlayManager.add(overlay); + } - @Inject - private ChatMessageManager chatMessageManager; - - private boolean loggingIn; + @Override + public void shutDown() + { + overlayManager.remove(overlay); + } @Provides - RememberClanConfig provideConfig(ConfigManager configManager) + InventoryGridConfig getConfig(ConfigManager configManager) { - return configManager.getConfig(RememberClanConfig.class); + return configManager.getConfig(InventoryGridConfig.class); } - - @Subscribe - public void onGameTick(GameTick event) - { - client.setVar(VarClientStr.RECENT_CLAN_CHAT, config.clanname()); - - } - - } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetup.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetup.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetup.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetup.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupBankOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupBankOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupBankOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupBankOverlay.java index fbb0193d94..1b0be390fb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupBankOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupBankOverlay.java @@ -32,7 +32,7 @@ import java.awt.image.BufferedImage; import java.util.stream.IntStream; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.widgets.WidgetItem; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.WidgetItemOverlay; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupItem.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupItem.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupPlugin.java index b49929b3c6..fa35f2718e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/InventorySetupPlugin.java @@ -32,20 +32,21 @@ import java.awt.image.BufferedImage; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; +import java.util.Map; import java.util.Objects; import javax.inject.Inject; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.ItemContainerChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -64,8 +65,8 @@ import net.runelite.client.util.ImageUtil; name = "Inventory Setups", description = "Save inventory setups", tags = {"items", "inventory", "setups"}, - enabledByDefault = false, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) @Slf4j @@ -102,7 +103,7 @@ public class InventorySetupPlugin extends Plugin private InventorySetupPluginPanel panel; - private HashMap inventorySetups; + private Map inventorySetups = new HashMap<>(); private NavigationButton navButton; @@ -270,7 +271,7 @@ public class InventorySetupPlugin extends Plugin final String json = configManager.getConfiguration(CONFIG_GROUP, CONFIG_KEY); if (json == null || json.isEmpty()) { - inventorySetups = new HashMap<>(); + inventorySetups.clear(); } else { @@ -280,7 +281,8 @@ public class InventorySetupPlugin extends Plugin { }.getType(); - inventorySetups = gson.fromJson(json, type); + inventorySetups.clear(); + inventorySetups.putAll(gson.fromJson(json, type)); } for (final String key : inventorySetups.keySet()) @@ -288,7 +290,6 @@ public class InventorySetupPlugin extends Plugin panel.addInventorySetup(key); } - highlightDifference = false; } @Subscribe @@ -333,17 +334,20 @@ public class InventorySetupPlugin extends Plugin // set the highlighting off if login screen shows up case LOGIN_SCREEN: highlightDifference = false; - final String setupName = panel.getSelectedInventorySetup(); - if (!setupName.isEmpty()) - { - panel.setCurrentInventorySetup(setupName); - } break; // set highlighting case LOGGED_IN: highlightDifference = config.getHighlightDifferences(); break; + + default: + return; + } + final String setupName = panel.getSelectedInventorySetup(); + if (!setupName.isEmpty()) + { + panel.setCurrentInventorySetup(setupName); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupContainerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupContainerPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupContainerPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupContainerPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupEquipmentPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupEquipmentPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupEquipmentPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupEquipmentPanel.java index ab37645c9d..b964a205eb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupEquipmentPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupEquipmentPanel.java @@ -29,7 +29,7 @@ import java.awt.GridLayout; import java.util.ArrayList; import java.util.HashMap; import javax.swing.JPanel; -import api.EquipmentInventorySlot; +import net.runelite.api.EquipmentInventorySlot; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.inventorysetups.InventorySetup; import net.runelite.client.plugins.inventorysetups.InventorySetupItem; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupInventoryPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupInventoryPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupInventoryPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupInventoryPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupPluginPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupPluginPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupPluginPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupPluginPanel.java index a29582e1ad..73f0033819 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupPluginPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupPluginPanel.java @@ -42,7 +42,7 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder; -import api.InventoryID; +import net.runelite.api.InventoryID; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.inventorysetups.InventorySetup; import net.runelite.client.plugins.inventorysetups.InventorySetupItem; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupSlot.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupSlot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorysetups/ui/InventorySetupSlot.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java index d5a6f7b096..de7d786eb6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java @@ -29,7 +29,7 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.widgets.WidgetItem; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.WidgetItemOverlay; @@ -58,7 +58,7 @@ public class InventoryTagsOverlay extends WidgetItemOverlay { Rectangle bounds = itemWidget.getCanvasBounds(); final BufferedImage outline = itemManager.getItemOutline(itemId, itemWidget.getQuantity(), color); - graphics.drawImage(outline, (int) bounds.getX() + 1, (int) bounds.getY() + 1, null); + graphics.drawImage(outline, (int) bounds.getX(), (int) bounds.getY(), null); } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java index c439869653..23e518e1f5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java @@ -30,13 +30,13 @@ import com.google.inject.Provides; import java.awt.Color; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.MenuAction; -import api.MenuEntry; -import api.events.MenuOpened; -import api.events.MenuOptionClicked; -import api.events.WidgetMenuOptionClicked; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.MenuOpened; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.WidgetMenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.menus.MenuManager; @@ -165,15 +165,15 @@ public class InventoryTagsPlugin extends Plugin return; } - final String selectedMenu = Text.removeTags(event.getMenuTarget()); + final String selectedMenu = Text.removeTags(event.getTarget()); - if (event.getMenuOption().equals(MENU_SET)) + if (event.getOption().equals(MENU_SET)) { - setTag(event.getId(), selectedMenu); + setTag(event.getIdentifier(), selectedMenu); } - else if (event.getMenuOption().equals(MENU_REMOVE)) + else if (event.getOption().equals(MENU_REMOVE)) { - unsetTag(event.getId()); + unsetTag(event.getIdentifier()); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java index 0be5d91f4e..efe6df33a0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java @@ -33,13 +33,15 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.VarClientInt; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.VarClientInt; import net.runelite.client.game.ItemManager; +import static net.runelite.client.plugins.lootingbagviewer.LootingBagViewerOverlay.PLACEHOLDER_WIDTH; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentConstants; @@ -51,9 +53,8 @@ import net.runelite.client.ui.overlay.components.TitleComponent; class InventoryViewerOverlay extends Overlay { private static final int INVENTORY_SIZE = 28; - private static final int PLACEHOLDER_WIDTH = 36; - private static final int PLACEHOLDER_HEIGHT = 32; - private static final ImageComponent PLACEHOLDER_IMAGE = new ImageComponent(new BufferedImage(PLACEHOLDER_WIDTH, PLACEHOLDER_HEIGHT, BufferedImage.TYPE_4BYTE_ABGR)); + private static final ImageComponent PLACEHOLDER_IMAGE = new ImageComponent( + new BufferedImage(Constants.ITEM_SPRITE_WIDTH, Constants.ITEM_SPRITE_HEIGHT, BufferedImage.TYPE_4BYTE_ABGR)); private final Client client; private final ItemManager itemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeInfobox.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeInfobox.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeInfobox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeInfobox.java index acef5e3a2a..7ee70d44b5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeInfobox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeInfobox.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.itemcharges; import java.awt.Color; import java.awt.image.BufferedImage; import lombok.Getter; -import api.EquipmentInventorySlot; +import net.runelite.api.EquipmentInventorySlot; import net.runelite.client.ui.overlay.infobox.Counter; @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java index 69a0f12225..32f92da25e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java @@ -29,8 +29,8 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import javax.inject.Inject; -import api.ItemID; -import api.widgets.WidgetItem; +import net.runelite.api.ItemID; +import net.runelite.api.widgets.WidgetItem; import static net.runelite.client.plugins.itemcharges.ItemChargeType.ABYSSAL_BRACELET; import static net.runelite.client.plugins.itemcharges.ItemChargeType.BELLOWS; import static net.runelite.client.plugins.itemcharges.ItemChargeType.FUNGICIDE_SPRAY; @@ -162,9 +162,7 @@ class ItemChargeOverlay extends WidgetItemOverlay final Rectangle bounds = itemWidget.getCanvasBounds(); final TextComponent textComponent = new TextComponent(); - textComponent.setPosition(new - - Point(bounds.x, bounds.y + 16)); + textComponent.setPosition(new Point(bounds.x - 1, bounds.y + 15)); textComponent.setText(charges < 0 ? "?" : String.valueOf(charges)); textComponent.setColor(itemChargePlugin.getColor(charges)); textComponent.render(graphics); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java index 4469f17c3c..5267d8c0f4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java @@ -34,24 +34,24 @@ import java.util.regex.Pattern; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.EquipmentInventorySlot; -import api.GraphicID; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; -import api.Varbits; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.SpotAnimationChanged; -import api.events.ItemContainerChanged; -import api.events.ScriptCallbackEvent; -import api.events.VarbitChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.GraphicID; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.SpotAnimationChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -62,7 +62,7 @@ import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.Text; -import static api.ItemID.RING_OF_RECOIL; +import static net.runelite.api.ItemID.RING_OF_RECOIL; @PluginDescriptor( name = "Item Charges", diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemRecoilOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemRecoilOverlay.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemRecoilOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemRecoilOverlay.java index 00ff09ad01..af55d54fe7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemRecoilOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemRecoilOverlay.java @@ -30,11 +30,13 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ImageComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class ItemRecoilOverlay extends Overlay { @@ -55,6 +57,9 @@ class ItemRecoilOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + this.imagePanelComponent.getChildren().clear(); if (config.showrecoil()) { @@ -64,6 +69,8 @@ class ItemRecoilOverlay extends Overlay imagePanelComponent.setBackgroundColor(plugin .isRingOfRecoilEquipped() ? ACTIVATED_BACKGROUND_COLOR : NOT_ACTIVATED_BACKGROUND_COLOR); imagePanelComponent.getChildren().add(new ImageComponent(recoilImage)); + + imagePanelComponent.getChildren().add(tableComponent); return imagePanelComponent.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java similarity index 52% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java index aa40e4f93d..2f2fe76469 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java @@ -29,133 +29,133 @@ import java.util.Map; import javax.annotation.Nullable; import lombok.AllArgsConstructor; import lombok.Getter; -import static api.ItemID.ABYSSAL_BRACELET1; -import static api.ItemID.ABYSSAL_BRACELET2; -import static api.ItemID.ABYSSAL_BRACELET3; -import static api.ItemID.ABYSSAL_BRACELET4; -import static api.ItemID.ABYSSAL_BRACELET5; -import static api.ItemID.AMULET_OF_GLORY1; -import static api.ItemID.AMULET_OF_GLORY2; -import static api.ItemID.AMULET_OF_GLORY3; -import static api.ItemID.AMULET_OF_GLORY4; -import static api.ItemID.AMULET_OF_GLORY5; -import static api.ItemID.AMULET_OF_GLORY6; -import static api.ItemID.AMULET_OF_GLORY_T1; -import static api.ItemID.AMULET_OF_GLORY_T2; -import static api.ItemID.AMULET_OF_GLORY_T3; -import static api.ItemID.AMULET_OF_GLORY_T4; -import static api.ItemID.AMULET_OF_GLORY_T5; -import static api.ItemID.AMULET_OF_GLORY_T6; -import static api.ItemID.BURNING_AMULET1; -import static api.ItemID.BURNING_AMULET2; -import static api.ItemID.BURNING_AMULET3; -import static api.ItemID.BURNING_AMULET4; -import static api.ItemID.BURNING_AMULET5; -import static api.ItemID.COMBAT_BRACELET1; -import static api.ItemID.COMBAT_BRACELET2; -import static api.ItemID.COMBAT_BRACELET3; -import static api.ItemID.COMBAT_BRACELET4; -import static api.ItemID.COMBAT_BRACELET5; -import static api.ItemID.COMBAT_BRACELET6; -import static api.ItemID.DIGSITE_PENDANT_1; -import static api.ItemID.DIGSITE_PENDANT_2; -import static api.ItemID.DIGSITE_PENDANT_3; -import static api.ItemID.DIGSITE_PENDANT_4; -import static api.ItemID.DIGSITE_PENDANT_5; -import static api.ItemID.ENCHANTED_LYRE1; -import static api.ItemID.ENCHANTED_LYRE2; -import static api.ItemID.ENCHANTED_LYRE3; -import static api.ItemID.ENCHANTED_LYRE4; -import static api.ItemID.ENCHANTED_LYRE5; -import static api.ItemID.FUNGICIDE_SPRAY_0; -import static api.ItemID.FUNGICIDE_SPRAY_1; -import static api.ItemID.FUNGICIDE_SPRAY_10; -import static api.ItemID.FUNGICIDE_SPRAY_2; -import static api.ItemID.FUNGICIDE_SPRAY_3; -import static api.ItemID.FUNGICIDE_SPRAY_4; -import static api.ItemID.FUNGICIDE_SPRAY_5; -import static api.ItemID.FUNGICIDE_SPRAY_6; -import static api.ItemID.FUNGICIDE_SPRAY_7; -import static api.ItemID.FUNGICIDE_SPRAY_8; -import static api.ItemID.FUNGICIDE_SPRAY_9; -import static api.ItemID.GAMES_NECKLACE1; -import static api.ItemID.GAMES_NECKLACE2; -import static api.ItemID.GAMES_NECKLACE3; -import static api.ItemID.GAMES_NECKLACE4; -import static api.ItemID.GAMES_NECKLACE5; -import static api.ItemID.GAMES_NECKLACE6; -import static api.ItemID.GAMES_NECKLACE7; -import static api.ItemID.GAMES_NECKLACE8; -import static api.ItemID.IMPINABOX1; -import static api.ItemID.IMPINABOX2; -import static api.ItemID.NECKLACE_OF_PASSAGE1; -import static api.ItemID.NECKLACE_OF_PASSAGE2; -import static api.ItemID.NECKLACE_OF_PASSAGE3; -import static api.ItemID.NECKLACE_OF_PASSAGE4; -import static api.ItemID.NECKLACE_OF_PASSAGE5; -import static api.ItemID.OGRE_BELLOWS; -import static api.ItemID.OGRE_BELLOWS_1; -import static api.ItemID.OGRE_BELLOWS_2; -import static api.ItemID.OGRE_BELLOWS_3; -import static api.ItemID.PHARAOHS_SCEPTRE_1; -import static api.ItemID.PHARAOHS_SCEPTRE_2; -import static api.ItemID.PHARAOHS_SCEPTRE_3; -import static api.ItemID.PHARAOHS_SCEPTRE_4; -import static api.ItemID.PHARAOHS_SCEPTRE_5; -import static api.ItemID.PHARAOHS_SCEPTRE_6; -import static api.ItemID.PHARAOHS_SCEPTRE_7; -import static api.ItemID.PHARAOHS_SCEPTRE_8; -import static api.ItemID.RING_OF_DUELING1; -import static api.ItemID.RING_OF_DUELING2; -import static api.ItemID.RING_OF_DUELING3; -import static api.ItemID.RING_OF_DUELING4; -import static api.ItemID.RING_OF_DUELING5; -import static api.ItemID.RING_OF_DUELING6; -import static api.ItemID.RING_OF_DUELING7; -import static api.ItemID.RING_OF_DUELING8; -import static api.ItemID.RING_OF_RETURNING1; -import static api.ItemID.RING_OF_RETURNING2; -import static api.ItemID.RING_OF_RETURNING3; -import static api.ItemID.RING_OF_RETURNING4; -import static api.ItemID.RING_OF_RETURNING5; -import static api.ItemID.RING_OF_WEALTH_1; -import static api.ItemID.RING_OF_WEALTH_2; -import static api.ItemID.RING_OF_WEALTH_3; -import static api.ItemID.RING_OF_WEALTH_4; -import static api.ItemID.RING_OF_WEALTH_5; -import static api.ItemID.SKILLS_NECKLACE1; -import static api.ItemID.SKILLS_NECKLACE2; -import static api.ItemID.SKILLS_NECKLACE3; -import static api.ItemID.SKILLS_NECKLACE4; -import static api.ItemID.SKILLS_NECKLACE5; -import static api.ItemID.SKILLS_NECKLACE6; -import static api.ItemID.SLAYER_RING_1; -import static api.ItemID.SLAYER_RING_2; -import static api.ItemID.SLAYER_RING_3; -import static api.ItemID.SLAYER_RING_4; -import static api.ItemID.SLAYER_RING_5; -import static api.ItemID.SLAYER_RING_6; -import static api.ItemID.SLAYER_RING_7; -import static api.ItemID.SLAYER_RING_8; -import static api.ItemID.TELEPORT_CRYSTAL_1; -import static api.ItemID.TELEPORT_CRYSTAL_2; -import static api.ItemID.TELEPORT_CRYSTAL_3; -import static api.ItemID.TELEPORT_CRYSTAL_4; -import static api.ItemID.TELEPORT_CRYSTAL_5; -import static api.ItemID.WATERING_CAN; -import static api.ItemID.WATERING_CAN1; -import static api.ItemID.WATERING_CAN2; -import static api.ItemID.WATERING_CAN3; -import static api.ItemID.WATERING_CAN4; -import static api.ItemID.WATERING_CAN5; -import static api.ItemID.WATERING_CAN6; -import static api.ItemID.WATERING_CAN7; -import static api.ItemID.WATERING_CAN8; -import static api.ItemID.WATERSKIN0; -import static api.ItemID.WATERSKIN1; -import static api.ItemID.WATERSKIN2; -import static api.ItemID.WATERSKIN3; -import static api.ItemID.WATERSKIN4; +import static net.runelite.api.ItemID.ABYSSAL_BRACELET1; +import static net.runelite.api.ItemID.ABYSSAL_BRACELET2; +import static net.runelite.api.ItemID.ABYSSAL_BRACELET3; +import static net.runelite.api.ItemID.ABYSSAL_BRACELET4; +import static net.runelite.api.ItemID.ABYSSAL_BRACELET5; +import static net.runelite.api.ItemID.AMULET_OF_GLORY1; +import static net.runelite.api.ItemID.AMULET_OF_GLORY2; +import static net.runelite.api.ItemID.AMULET_OF_GLORY3; +import static net.runelite.api.ItemID.AMULET_OF_GLORY4; +import static net.runelite.api.ItemID.AMULET_OF_GLORY5; +import static net.runelite.api.ItemID.AMULET_OF_GLORY6; +import static net.runelite.api.ItemID.AMULET_OF_GLORY_T1; +import static net.runelite.api.ItemID.AMULET_OF_GLORY_T2; +import static net.runelite.api.ItemID.AMULET_OF_GLORY_T3; +import static net.runelite.api.ItemID.AMULET_OF_GLORY_T4; +import static net.runelite.api.ItemID.AMULET_OF_GLORY_T5; +import static net.runelite.api.ItemID.AMULET_OF_GLORY_T6; +import static net.runelite.api.ItemID.BURNING_AMULET1; +import static net.runelite.api.ItemID.BURNING_AMULET2; +import static net.runelite.api.ItemID.BURNING_AMULET3; +import static net.runelite.api.ItemID.BURNING_AMULET4; +import static net.runelite.api.ItemID.BURNING_AMULET5; +import static net.runelite.api.ItemID.COMBAT_BRACELET1; +import static net.runelite.api.ItemID.COMBAT_BRACELET2; +import static net.runelite.api.ItemID.COMBAT_BRACELET3; +import static net.runelite.api.ItemID.COMBAT_BRACELET4; +import static net.runelite.api.ItemID.COMBAT_BRACELET5; +import static net.runelite.api.ItemID.COMBAT_BRACELET6; +import static net.runelite.api.ItemID.DIGSITE_PENDANT_1; +import static net.runelite.api.ItemID.DIGSITE_PENDANT_2; +import static net.runelite.api.ItemID.DIGSITE_PENDANT_3; +import static net.runelite.api.ItemID.DIGSITE_PENDANT_4; +import static net.runelite.api.ItemID.DIGSITE_PENDANT_5; +import static net.runelite.api.ItemID.ENCHANTED_LYRE1; +import static net.runelite.api.ItemID.ENCHANTED_LYRE2; +import static net.runelite.api.ItemID.ENCHANTED_LYRE3; +import static net.runelite.api.ItemID.ENCHANTED_LYRE4; +import static net.runelite.api.ItemID.ENCHANTED_LYRE5; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_0; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_1; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_10; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_2; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_3; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_4; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_5; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_6; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_7; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_8; +import static net.runelite.api.ItemID.FUNGICIDE_SPRAY_9; +import static net.runelite.api.ItemID.GAMES_NECKLACE1; +import static net.runelite.api.ItemID.GAMES_NECKLACE2; +import static net.runelite.api.ItemID.GAMES_NECKLACE3; +import static net.runelite.api.ItemID.GAMES_NECKLACE4; +import static net.runelite.api.ItemID.GAMES_NECKLACE5; +import static net.runelite.api.ItemID.GAMES_NECKLACE6; +import static net.runelite.api.ItemID.GAMES_NECKLACE7; +import static net.runelite.api.ItemID.GAMES_NECKLACE8; +import static net.runelite.api.ItemID.IMPINABOX1; +import static net.runelite.api.ItemID.IMPINABOX2; +import static net.runelite.api.ItemID.NECKLACE_OF_PASSAGE1; +import static net.runelite.api.ItemID.NECKLACE_OF_PASSAGE2; +import static net.runelite.api.ItemID.NECKLACE_OF_PASSAGE3; +import static net.runelite.api.ItemID.NECKLACE_OF_PASSAGE4; +import static net.runelite.api.ItemID.NECKLACE_OF_PASSAGE5; +import static net.runelite.api.ItemID.OGRE_BELLOWS; +import static net.runelite.api.ItemID.OGRE_BELLOWS_1; +import static net.runelite.api.ItemID.OGRE_BELLOWS_2; +import static net.runelite.api.ItemID.OGRE_BELLOWS_3; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_1; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_2; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_3; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_4; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_5; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_6; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_7; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_8; +import static net.runelite.api.ItemID.RING_OF_DUELING1; +import static net.runelite.api.ItemID.RING_OF_DUELING2; +import static net.runelite.api.ItemID.RING_OF_DUELING3; +import static net.runelite.api.ItemID.RING_OF_DUELING4; +import static net.runelite.api.ItemID.RING_OF_DUELING5; +import static net.runelite.api.ItemID.RING_OF_DUELING6; +import static net.runelite.api.ItemID.RING_OF_DUELING7; +import static net.runelite.api.ItemID.RING_OF_DUELING8; +import static net.runelite.api.ItemID.RING_OF_RETURNING1; +import static net.runelite.api.ItemID.RING_OF_RETURNING2; +import static net.runelite.api.ItemID.RING_OF_RETURNING3; +import static net.runelite.api.ItemID.RING_OF_RETURNING4; +import static net.runelite.api.ItemID.RING_OF_RETURNING5; +import static net.runelite.api.ItemID.RING_OF_WEALTH_1; +import static net.runelite.api.ItemID.RING_OF_WEALTH_2; +import static net.runelite.api.ItemID.RING_OF_WEALTH_3; +import static net.runelite.api.ItemID.RING_OF_WEALTH_4; +import static net.runelite.api.ItemID.RING_OF_WEALTH_5; +import static net.runelite.api.ItemID.SKILLS_NECKLACE1; +import static net.runelite.api.ItemID.SKILLS_NECKLACE2; +import static net.runelite.api.ItemID.SKILLS_NECKLACE3; +import static net.runelite.api.ItemID.SKILLS_NECKLACE4; +import static net.runelite.api.ItemID.SKILLS_NECKLACE5; +import static net.runelite.api.ItemID.SKILLS_NECKLACE6; +import static net.runelite.api.ItemID.SLAYER_RING_1; +import static net.runelite.api.ItemID.SLAYER_RING_2; +import static net.runelite.api.ItemID.SLAYER_RING_3; +import static net.runelite.api.ItemID.SLAYER_RING_4; +import static net.runelite.api.ItemID.SLAYER_RING_5; +import static net.runelite.api.ItemID.SLAYER_RING_6; +import static net.runelite.api.ItemID.SLAYER_RING_7; +import static net.runelite.api.ItemID.SLAYER_RING_8; +import static net.runelite.api.ItemID.TELEPORT_CRYSTAL_1; +import static net.runelite.api.ItemID.TELEPORT_CRYSTAL_2; +import static net.runelite.api.ItemID.TELEPORT_CRYSTAL_3; +import static net.runelite.api.ItemID.TELEPORT_CRYSTAL_4; +import static net.runelite.api.ItemID.TELEPORT_CRYSTAL_5; +import static net.runelite.api.ItemID.WATERING_CAN; +import static net.runelite.api.ItemID.WATERING_CAN1; +import static net.runelite.api.ItemID.WATERING_CAN2; +import static net.runelite.api.ItemID.WATERING_CAN3; +import static net.runelite.api.ItemID.WATERING_CAN4; +import static net.runelite.api.ItemID.WATERING_CAN5; +import static net.runelite.api.ItemID.WATERING_CAN6; +import static net.runelite.api.ItemID.WATERING_CAN7; +import static net.runelite.api.ItemID.WATERING_CAN8; +import static net.runelite.api.ItemID.WATERSKIN0; +import static net.runelite.api.ItemID.WATERSKIN1; +import static net.runelite.api.ItemID.WATERSKIN2; +import static net.runelite.api.ItemID.WATERSKIN3; +import static net.runelite.api.ItemID.WATERSKIN4; import static net.runelite.client.plugins.itemcharges.ItemChargeType.ABYSSAL_BRACELET; import static net.runelite.client.plugins.itemcharges.ItemChargeType.BELLOWS; import static net.runelite.client.plugins.itemcharges.ItemChargeType.FUNGICIDE_SPRAY; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java index fe56ac11d2..4e7aec6b52 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java @@ -28,7 +28,7 @@ package net.runelite.client.plugins.itemcharges; import com.google.common.collect.Sets; import java.util.Set; import lombok.Getter; -import api.EquipmentInventorySlot; +import net.runelite.api.EquipmentInventorySlot; @Getter enum ItemWithSlot diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java index 7d0a3457d4..d2e9913bbf 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.itemidentification; import com.google.common.collect.ImmutableMap; import java.util.Map; -import api.ItemID; +import net.runelite.api.ItemID; enum ItemIdentification { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java similarity index 83% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java index 704c2cb357..588a51173d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java @@ -28,9 +28,12 @@ import com.google.inject.Inject; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; -import static api.widgets.WidgetID.GUIDE_PRICE_GROUP_ID; -import static api.widgets.WidgetID.KEPT_ON_DEATH_GROUP_ID; -import api.widgets.WidgetItem; +import static net.runelite.api.widgets.WidgetID.GUIDE_PRICE_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.KEPT_ON_DEATH_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.LOOTING_BAG_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.SEED_BOX_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.KINGDOM_GROUP_ID; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.WidgetItemOverlay; import net.runelite.client.ui.overlay.components.TextComponent; @@ -45,7 +48,7 @@ class ItemIdentificationOverlay extends WidgetItemOverlay this.config = config; showOnInventory(); showOnBank(); - showOnInterfaces(KEPT_ON_DEATH_GROUP_ID, GUIDE_PRICE_GROUP_ID); + showOnInterfaces(KEPT_ON_DEATH_GROUP_ID, GUIDE_PRICE_GROUP_ID, LOOTING_BAG_GROUP_ID, SEED_BOX_GROUP_ID, KINGDOM_GROUP_ID); } @Override @@ -87,7 +90,7 @@ class ItemIdentificationOverlay extends WidgetItemOverlay private void renderText(Graphics2D graphics, Rectangle bounds, ItemIdentification iden) { final TextComponent textComponent = new TextComponent(); - textComponent.setPosition(new Point(bounds.x, bounds.y + bounds.height)); + textComponent.setPosition(new Point(bounds.x - 1, bounds.y + bounds.height - 1)); textComponent.setColor(config.textColor()); switch (config.identificationType()) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java index 173f976574..c252bc054c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java @@ -28,16 +28,17 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.ItemID; -import api.MenuAction; -import api.MenuEntry; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; @@ -93,6 +94,8 @@ class ItemPricesOverlay extends Overlay // Tooltip action type handling switch (action) { + case ITEM_USE_ON_WIDGET: + if (!menuEntry.getTarget().contains("High Level Alchemy") || !config.showAlchProfit()) return null; case WIDGET_DEFAULT: case ITEM_USE: case ITEM_FIRST_OPTION: @@ -194,6 +197,7 @@ class ItemPricesOverlay extends Overlay int gePrice = 0; int haPrice = 0; int haProfit = 0; + final int itemHaPrice = Math.round(itemDef.getPrice() * Constants.HIGH_ALCHEMY_MULTIPLIER); if (config.showGEPrice()) { @@ -203,9 +207,9 @@ class ItemPricesOverlay extends Overlay { haPrice = itemManager.getAlchValue(id); } - if (gePrice > 0 && haPrice > 0 && config.showAlchProfit()) + if (gePrice > 0 && itemHaPrice > 0 && config.showAlchProfit()) { - haProfit = calculateHAProfit(haPrice, gePrice); + haProfit = calculateHAProfit(itemHaPrice, gePrice); } if (gePrice > 0 || haPrice > 0) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/AlwaysLostItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/AlwaysLostItem.java similarity index 82% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/AlwaysLostItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/AlwaysLostItem.java index c54c899c95..37066622bc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/AlwaysLostItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/AlwaysLostItem.java @@ -22,48 +22,43 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.keptondeath; +package net.runelite.client.plugins.itemskeptondeath; import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; /** * Certain Items receive a white outline by Jagex as they are always lost on death. This is sometimes incorrectly * added to Items by Jagex as the item is actually kept in non-pvp areas of the game, such as the Rune Pouch. - *

    + * * The white outline will be added to these items when they are lost on death. */ -public enum AlwaysLostItem +@AllArgsConstructor +@Getter +enum AlwaysLostItem { RUNE_POUCH(ItemID.RUNE_POUCH, true), LOOTING_BAG(ItemID.LOOTING_BAG, false), - LOOTING_BAG_22586(ItemID.LOOTING_BAG_22586, false), CLUE_BOX(ItemID.CLUE_BOX, false); private final int itemID; - @Getter - private final boolean kept; + private final boolean keptOutsideOfWilderness; private static final ImmutableMap ID_MAP; static { - ImmutableMap.Builder map = ImmutableMap.builder(); - for (AlwaysLostItem p : values()) + final ImmutableMap.Builder map = ImmutableMap.builder(); + for (final AlwaysLostItem p : values()) { map.put(p.itemID, p); } ID_MAP = map.build(); } - AlwaysLostItem(int itemID, boolean kept) - { - this.itemID = itemID; - this.kept = kept; - } - - public static AlwaysLostItem getByItemID(int itemID) + static AlwaysLostItem getByItemID(final int itemID) { return ID_MAP.get(itemID); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/BrokenOnDeathItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/BrokenOnDeathItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java index fd11d66c7f..9f1fd5c95e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/BrokenOnDeathItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java @@ -22,17 +22,19 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.keptondeath; +package net.runelite.client.plugins.itemskeptondeath; -import java.util.HashSet; -import api.ItemID; +import com.google.common.collect.ImmutableSet; +import lombok.AllArgsConstructor; +import net.runelite.api.ItemID; /** * Some non tradeable items are kept on death inside low level wilderness (1-20) but are turned into a broken variant. - *

    + * * The non-broken variant will be shown inside the interface. */ -public enum BrokenOnDeathItem +@AllArgsConstructor +enum BrokenOnDeathItem { // Capes FIRE_CAPE(ItemID.FIRE_CAPE), @@ -90,23 +92,19 @@ public enum BrokenOnDeathItem private final int itemID; - private static final HashSet ID_SET; + private static final ImmutableSet ID_SET; static { - ID_SET = new HashSet<>(); - for (BrokenOnDeathItem p : values()) + final ImmutableSet.Builder set = new ImmutableSet.Builder<>(); + for (final BrokenOnDeathItem p : values()) { - ID_SET.add(p.itemID); + set.add(p.itemID); } + ID_SET = set.build(); } - BrokenOnDeathItem(int itemID) - { - this.itemID = itemID; - } - - public static boolean check(int itemID) + static boolean isBrokenOnDeath(final int itemID) { return ID_SET.contains(itemID); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java new file mode 100644 index 0000000000..a40851dc65 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2019, Adam + * Copyright (c) 2019, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemskeptondeath; + +import com.google.common.collect.ImmutableMap; +import java.util.Map; +import javax.annotation.Nullable; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +/** + * Some items have a fixed price that is added to its default value when calculating death prices. + * These are typically imbued items, such as Berserker ring (i), to help it protect over the non-imbued variants. + */ +@AllArgsConstructor +@Getter +enum FixedPriceItem +{ + IMBUED_BLACK_MASK_I(ItemID.BLACK_MASK_I, 5000), + IMBUED_BLACK_MASK_1_I(ItemID.BLACK_MASK_1_I, 5000), + IMBUED_BLACK_MASK_2_I(ItemID.BLACK_MASK_2_I, 5000), + IMBUED_BLACK_MASK_3_I(ItemID.BLACK_MASK_3_I, 5000), + IMBUED_BLACK_MASK_4_I(ItemID.BLACK_MASK_4_I, 5000), + IMBUED_BLACK_MASK_5_I(ItemID.BLACK_MASK_5_I, 5000), + IMBUED_BLACK_MASK_6_I(ItemID.BLACK_MASK_6_I, 5000), + IMBUED_BLACK_MASK_7_I(ItemID.BLACK_MASK_7_I, 5000), + IMBUED_BLACK_MASK_8_I(ItemID.BLACK_MASK_8_I, 5000), + IMBUED_BLACK_MASK_9_I(ItemID.BLACK_MASK_9_I, 5000), + IMBUED_BLACK_MASK_10_I(ItemID.BLACK_MASK_10_I, 5000), + + IMBUED_SLAYER_HELMET_I(ItemID.SLAYER_HELMET_I, 1000), + IMBUED_BLACK_SLAYER_HELMET_I(ItemID.BLACK_SLAYER_HELMET_I, 1000), + IMBUED_PURPLE_SLAYER_HELMET_I(ItemID.PURPLE_SLAYER_HELMET_I, 1000), + IMBUED_RED_SLAYER_HELMET_I(ItemID.RED_SLAYER_HELMET_I, 1000), + IMBUED_GREEN_SLAYER_HELMET_I(ItemID.GREEN_SLAYER_HELMET_I, 1000), + IMBUED_TURQUOISE_SLAYER_HELMET_I(ItemID.TURQUOISE_SLAYER_HELMET_I, 1000), + IMBUED_HYDRA_SLAYER_HELMET_I(ItemID.HYDRA_SLAYER_HELMET_I, 1000), + + IMBUED_ARCHERS_RING_I(ItemID.ARCHERS_RING_I, 2000), + IMBUED_BERSERKER_RING_I(ItemID.BERSERKER_RING_I, 2000), + IMBUED_SEERS_RING_I(ItemID.SEERS_RING_I, 2000), + + IMBUED_RING_OF_THE_GODS_I(ItemID.RING_OF_THE_GODS_I, 2000), + IMBUED_TREASONOUS_RING_I(ItemID.TREASONOUS_RING_I, 2000), + IMBUED_TYRANNICAL_RING_I(ItemID.TYRANNICAL_RING_I, 2000); + + private final int itemId; + private final int offset; + + private static final Map FIXED_ITEMS; + + static + { + final ImmutableMap.Builder map = ImmutableMap.builder(); + for (final FixedPriceItem p : values()) + { + map.put(p.itemId, p); + } + FIXED_ITEMS = map.build(); + } + + @Nullable + static FixedPriceItem find(int itemId) + { + return FIXED_ITEMS.get(itemId); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java new file mode 100644 index 0000000000..ee761ad9a9 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java @@ -0,0 +1,610 @@ +/* + * Copyright (c) 2018, TheStonedTurtle + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemskeptondeath; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.FontID; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.ScriptID; +import net.runelite.api.SkullIcon; +import net.runelite.api.SpriteID; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.vars.AccountType; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetType; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.ItemManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.util.StackFormatter; + +@PluginDescriptor( + name = "Items Kept on Death", + description = "Updates the Items Kept on Death interface to be more accurate", + enabledByDefault = false +) +@Slf4j +public class ItemsKeptOnDeathPlugin extends Plugin +{ + private static final int DEEP_WILDY = 20; + private static final Pattern WILDERNESS_LEVEL_PATTERN = Pattern.compile("^Level: (\\d+).*"); + + // Item Container helpers + private static final int MAX_ROW_ITEMS = 8; + private static final int ITEM_X_OFFSET = 5; + private static final int ITEM_Y_OFFSET = 25; + private static final int ITEM_X_STRIDE = 38; + private static final int ITEM_Y_STRIDE = 38; + private static final int ORIGINAL_LOST_HEIGHT = 209; + private static final int ORIGINAL_LOST_Y = 107; + + // Information panel text helpers + private static final String LINE_BREAK = "
    "; + private static final int INFORMATION_CONTAINER_HEIGHT = 183; + private static final int FONT_COLOR = 0xFF981F; + + // Button Images + private static final int PROTECT_ITEM_SPRITE_ID = SpriteID.PRAYER_PROTECT_ITEM; + private static final int SKULL_SPRITE_ID = SpriteID.PLAYER_KILLER_SKULL_523; + private static final int SWORD_SPRITE_ID = SpriteID.MULTI_COMBAT_ZONE_CROSSED_SWORDS; + private static final int SKULL_2_SPRITE_ID = SpriteID.FIGHT_PITS_WINNER_SKULL_RED; + + @Inject + private Client client; + + @Inject + private ItemManager itemManager; + + private WidgetButton deepWildyButton; + private WidgetButton lowWildyButton; + + private boolean isSkulled; + private boolean protectingItem; + private int wildyLevel; + + @Subscribe + public void onScriptCallbackEvent(ScriptCallbackEvent event) + { + if (event.getEventName().equals("itemsKeptOnDeath")) + { + // The script in charge of building the Items Kept on Death interface has finished running. + // Make all necessary changes now. + + // Players inside Safe Areas (POH/Clan Wars) or playing DMM see the default interface + if (isInSafeArea() || client.getWorldType().contains(WorldType.DEADMAN)) + { + return; + } + + syncSettings(); + createWidgetButtons(); + rebuildItemsKeptOnDeathInterface(); + + final Widget keptText = client.getWidget(WidgetInfo.ITEMS_KEPT_ON_DEATH_TEXT); + keptText.setText("Items you will keep on death:"); + + final Widget lostText = client.getWidget(WidgetInfo.ITEMS_LOST_ON_DEATH_TEXT); + lostText.setText("Items you will lose on death:"); + } + } + + // Sync user settings + private void syncSettings() + { + final SkullIcon s = client.getLocalPlayer().getSkullIcon(); + // Ultimate iron men deaths are treated like they are always skulled + isSkulled = s == SkullIcon.SKULL || isUltimateIronman(); + protectingItem = client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 1; + syncWildernessLevel(); + } + + private void syncWildernessLevel() + { + if (client.getVar(Varbits.IN_WILDERNESS) != 1) + { + // if they are in a PvP world and not in a safe zone act like in lvl 1 wildy + if (isInPvpWorld() && !isInPvPSafeZone()) + { + wildyLevel = 1; + return; + } + wildyLevel = -1; + return; + } + + final Widget wildernessLevelWidget = client.getWidget(WidgetInfo.PVP_WILDERNESS_LEVEL); + if (wildernessLevelWidget == null) + { + wildyLevel = -1; + return; + } + + final String wildernessLevelText = wildernessLevelWidget.getText(); + final Matcher m = WILDERNESS_LEVEL_PATTERN.matcher(wildernessLevelText); + if (!m.matches()) + { + wildyLevel = -1; + return; + } + + wildyLevel = Integer.parseInt(m.group(1)); + } + + private boolean isInPvpWorld() + { + final EnumSet world = client.getWorldType(); + return world.contains(WorldType.PVP); + } + + private boolean isProtectItemAllowed() + { + return !client.getWorldType().contains(WorldType.HIGH_RISK) + && !isUltimateIronman(); + } + + private boolean isInPvPSafeZone() + { + final Widget w = client.getWidget(WidgetInfo.PVP_WORLD_SAFE_ZONE); + return w != null && !w.isHidden(); + } + + private boolean isInSafeArea() + { + final Widget w = client.getWidget(WidgetInfo.ITEMS_KEPT_SAFE_ZONE_CONTAINER); + return w != null && !w.isHidden(); + } + + private boolean isUltimateIronman() + { + return client.getAccountType() == AccountType.ULTIMATE_IRONMAN; + } + + private int getDefaultItemsKept() + { + final int count = isSkulled ? 0 : 3; + return count + (protectingItem ? 1 : 0); + } + + private void rebuildItemsKeptOnDeathInterface() + { + final Widget lost = client.getWidget(WidgetInfo.ITEMS_LOST_ON_DEATH_CONTAINER); + final Widget kept = client.getWidget(WidgetInfo.ITEMS_KEPT_ON_DEATH_CONTAINER); + if (lost == null || kept == null) + { + return; + } + + lost.deleteAllChildren(); + kept.deleteAllChildren(); + + // Grab all items on player + final ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); + final Item[] inv = inventory == null ? new Item[0] : inventory.getItems(); + final ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT); + final Item[] equip = equipment == null ? new Item[0] : equipment.getItems(); + + final List items = new ArrayList<>(); + Collections.addAll(items, inv); + Collections.addAll(items, equip); + + // Sort by item price + items.sort(Comparator.comparing(this::getDeathPrice).reversed()); + + boolean hasAlwaysLost = false; + int keepCount = getDefaultItemsKept(); + + final List keptItems = new ArrayList<>(); + final List lostItems = new ArrayList<>(); + for (final Item i : items) + { + final int id = i.getId(); + int itemQuantity = i.getQuantity(); + + if (id == -1) + { + continue; + } + + final ItemDefinition c = itemManager.getItemDefinition(i.getId()); + + // Bonds are always kept and do not count towards the limit. + if (id == ItemID.OLD_SCHOOL_BOND || id == ItemID.OLD_SCHOOL_BOND_UNTRADEABLE) + { + final Widget itemWidget = createItemWidget(kept, itemQuantity, c); + itemWidget.setOnOpListener(ScriptID.DEATH_KEEP_ITEM_EXAMINE, 1, itemQuantity, c.getName()); + keptItems.add(itemWidget); + continue; + } + + // Certain items are always lost on death and have a white outline which we need to add + final AlwaysLostItem alwaysLostItem = AlwaysLostItem.getByItemID(i.getId()); + if (alwaysLostItem != null) + { + // Some of these items are kept on death (outside wildy), like the Rune pouch. Ignore them + if (!alwaysLostItem.isKeptOutsideOfWilderness() || wildyLevel > 0) + { + final Widget itemWidget = createItemWidget(lost, itemQuantity, c); + itemWidget.setOnOpListener(ScriptID.DEATH_KEEP_ITEM_EXAMINE, 0, itemQuantity, c.getName()); + itemWidget.setBorderType(2); // white outline + lostItems.add(itemWidget); + hasAlwaysLost = true; + continue; + } + // the rune pouch is "always lost" but its kept outside of pvp, and does not count towards your keep count + } + else if (keepCount > 0) + { + // Keep most valuable items regardless of trade-ability. + if (i.getQuantity() > keepCount) + { + final Widget itemWidget = createItemWidget(kept, keepCount, c); + itemWidget.setOnOpListener(ScriptID.DEATH_KEEP_ITEM_EXAMINE, 1, keepCount, c.getName()); + keptItems.add(itemWidget); + itemQuantity -= keepCount; + keepCount = 0; + // Fall through to below to drop the rest of the stack + } + else + { + final Widget itemWidget = createItemWidget(kept, itemQuantity, c); + itemWidget.setOnOpListener(ScriptID.DEATH_KEEP_ITEM_EXAMINE, 1, itemQuantity, c.getName()); + keptItems.add(itemWidget); + keepCount -= i.getQuantity(); + continue; + } + } + + // Items are kept if: + // 1) is not tradeable + // 2) is under the deep wilderness line + // 3) is outside of the wilderness, or item has a broken form + if (!Pets.isPet(id) + && !isTradeable(c) && wildyLevel <= DEEP_WILDY + && (wildyLevel <= 0 || BrokenOnDeathItem.isBrokenOnDeath(i.getId()))) + { + final Widget itemWidget = createItemWidget(kept, itemQuantity, c); + itemWidget.setOnOpListener(ScriptID.DEATH_KEEP_ITEM_EXAMINE, 1, itemQuantity, c.getName()); + keptItems.add(itemWidget); + } + else + { + // Otherwise, the item is lost + final Widget itemWidget = createItemWidget(lost, itemQuantity, c); + itemWidget.setOnOpListener(ScriptID.DEATH_KEEP_ITEM_EXAMINE, 0, itemQuantity, c.getName()); + lostItems.add(itemWidget); + } + } + + int rows = (keptItems.size() + MAX_ROW_ITEMS - 1) / MAX_ROW_ITEMS; + // Show an empty row if there isn't anything + if (rows > 0) + { + // ORIGINAL_LOST_Y/HEIGHT includes a row already + rows--; + } + // Adjust items lost container position if new rows were added to kept items container + lost.setOriginalY(ORIGINAL_LOST_Y + (rows * ITEM_Y_STRIDE)); + lost.setOriginalHeight(ORIGINAL_LOST_HEIGHT - (rows * ITEM_Y_STRIDE)); + positionWidgetItems(kept, keptItems); + positionWidgetItems(lost, lostItems); + + updateKeptWidgetInfoText(hasAlwaysLost, keptItems, lostItems); + } + + /** + * Get the price of an item + * @param item + * @return + */ + private int getDeathPrice(Item item) + { + int itemId = item.getId(); + // Unnote/unplaceholder item + int canonicalizedItemId = itemManager.canonicalize(itemId); + int exchangePrice = itemManager.getItemPrice(canonicalizedItemId); + if (exchangePrice == 0) + { + final ItemDefinition c1 = itemManager.getItemDefinition(canonicalizedItemId); + exchangePrice = c1.getPrice(); + } + else + { + // Some items have artifically applied death prices - such as ring imbues + // which are +2k over the non imbues. Check if the item has a fixed price. + FixedPriceItem fixedPrice = FixedPriceItem.find(canonicalizedItemId); + if (fixedPrice != null) + { + // Apply fixed price offset + exchangePrice += fixedPrice.getOffset(); + } + } + return exchangePrice; + } + + /** + * Position a list of widget items in the parent container + */ + private static void positionWidgetItems(final Widget parent, final List widgets) + { + int startingIndex = 0; + for (final Widget w : widgets) + { + final int originalX = ITEM_X_OFFSET + ((startingIndex % MAX_ROW_ITEMS) * ITEM_X_STRIDE); + final int originalY = ITEM_Y_OFFSET + ((startingIndex / MAX_ROW_ITEMS) * ITEM_Y_STRIDE); + + w.setOriginalX(originalX); + w.setOriginalY(originalY); + w.revalidate(); + + ++startingIndex; + } + + parent.revalidate(); + } + + /** + * Creates the text to be displayed in the right side of the interface based on current selections + */ + private String getInfoText(final boolean hasAlwaysLost) + { + final StringBuilder sb = new StringBuilder(); + if (isUltimateIronman()) + { + sb.append("You are an UIM which means 0 items are protected by default"); + } + else + { + sb.append("3 items protected by default"); + + if (isSkulled) + { + sb.append(LINE_BREAK) + .append("PK skull -3"); + } + + if (protectingItem) + { + sb.append(LINE_BREAK) + .append("Protect Item prayer +1"); + } + + sb.append(LINE_BREAK) + .append(String.format("Actually protecting %s items", getDefaultItemsKept())); + } + + + if (wildyLevel < 1) + { + sb.append(LINE_BREAK) + .append(LINE_BREAK) + .append("You will have 1 hour to retrieve your lost items."); + } + + if (hasAlwaysLost) + { + sb.append(LINE_BREAK) + .append(LINE_BREAK) + .append("Items with a white outline will always be lost."); + } + + sb.append(LINE_BREAK) + .append(LINE_BREAK) + .append("Untradeable items are kept on death in non-pvp scenarios."); + + return sb.toString(); + } + + /** + * Updates the information panel based on the item containers + */ + private void updateKeptWidgetInfoText(final boolean hasAlwaysLost, final List keptItems, final List lostItems) + { + // Add Information text widget + final Widget textWidget = findOrCreateInfoText(); + textWidget.setText(getInfoText(hasAlwaysLost)); + textWidget.revalidate(); + + // Update Items lost total value + long total = 0; + for (final Widget w : lostItems) + { + int cid = itemManager.canonicalize(w.getItemId()); + int price = itemManager.getItemPrice(cid); + if (price == 0) + { + // Default to alch price + price = (int) (itemManager.getItemDefinition(cid).getPrice() * Constants.HIGH_ALCHEMY_MULTIPLIER); + } + total += (long) price * w.getItemQuantity(); + } + final Widget lostValue = client.getWidget(WidgetInfo.ITEMS_LOST_VALUE); + lostValue.setText(StackFormatter.quantityToStackSize(total) + " gp"); + + // Update Max items kept + final Widget max = client.getWidget(WidgetInfo.ITEMS_KEPT_MAX); + final int keptQty = keptItems.stream().mapToInt(Widget::getItemQuantity).sum(); + max.setText(String.format("Max items kept on death:

    ~ %d ~", keptQty)); + } + + /** + * Check if an item is tradeable to another player + * + * @param c The item + * @return + */ + private static boolean isTradeable(final ItemDefinition c) + { + // ItemDefinition:: isTradeable checks if they are traded on the grand exchange, some items are trade-able but not via GE + if (c.getNote() != -1 + || c.getLinkedNoteId() != -1 + || c.isTradeable()) + { + return true; + } + + final int id = c.getId(); + switch (id) + { + case ItemID.COINS_995: + case ItemID.PLATINUM_TOKEN: + return true; + default: + return false; + } + } + + private Widget findOrCreateInfoText() + { + // The text was on the ITEMS_KEPT_INFORMATION_CONTAINER widget - but now that it is a layer, + // we need to create a child widget to hold the text + final Widget parent = client.getWidget(WidgetInfo.ITEMS_KEPT_INFORMATION_CONTAINER); + + // Use the text TEXT widget if it already exists. It should be the last child of the parent + final Widget[] children = parent.getChildren(); + if (children != null && children.length > 0) + { + final Widget w = parent.getChild(children.length - 1); + if (w != null && w.getType() == WidgetType.TEXT) + { + log.debug("Reusing old text widget"); + return w; + } + } + + log.debug("Creating new text widget"); + + final Widget w = parent.createChild(-1, WidgetType.TEXT); + // Position under buttons taking remaining space + w.setOriginalWidth(parent.getOriginalWidth()); + w.setOriginalHeight(INFORMATION_CONTAINER_HEIGHT - parent.getOriginalHeight()); + w.setOriginalY(parent.getOriginalHeight()); + + w.setFontId(FontID.PLAIN_11); + w.setTextShadowed(true); + w.setTextColor(FONT_COLOR); + + // Need to adjust parent height so text is visible + parent.setOriginalHeight(INFORMATION_CONTAINER_HEIGHT); + parent.revalidate(); + + return w; + } + + private void createWidgetButtons() + { + final Widget parent = client.getWidget(WidgetInfo.ITEMS_KEPT_INFORMATION_CONTAINER); + // Change the information container from a text widget to a layer + parent.setType(WidgetType.LAYER); + parent.deleteAllChildren(); + + // Ultimate Iron men are always skulled and can't use the protect item prayer + WidgetButton protectItemButton = isProtectItemAllowed() + ? new WidgetButton(parent, "Protect Item Prayer", PROTECT_ITEM_SPRITE_ID, protectingItem, selected -> + { + protectingItem = selected; + rebuildItemsKeptOnDeathInterface(); + }) : null; + + WidgetButton skulledButton = !isUltimateIronman() + ? new WidgetButton(parent, "Skulled", SKULL_SPRITE_ID, isSkulled, selected -> + { + isSkulled = selected; + rebuildItemsKeptOnDeathInterface(); + }) : null; + + lowWildyButton = new WidgetButton(parent, "Low Wildy (1-20)", SWORD_SPRITE_ID, wildyLevel > 0 && wildyLevel <= DEEP_WILDY, selected -> + { + if (!selected) + { + syncWildernessLevel(); + } + else + { + wildyLevel = 1; + deepWildyButton.setSelected(false); + } + + rebuildItemsKeptOnDeathInterface(); + }); + + deepWildyButton = new WidgetButton(parent, "Deep Wildy (21+)", SKULL_2_SPRITE_ID, wildyLevel > DEEP_WILDY, selected -> + { + if (!selected) + { + syncWildernessLevel(); + } + else + { + wildyLevel = DEEP_WILDY + 1; + lowWildyButton.setSelected(false); + } + + rebuildItemsKeptOnDeathInterface(); + }); + + parent.revalidate(); + WidgetButton.layoutButtonsToContainer(parent, protectItemButton, skulledButton, lowWildyButton, deepWildyButton); + } + + /** + * Creates an Item Widget for use inside the Kept on Death Interface + * + * @param qty Amount of item + * @param c Items Composition + * @return + */ + private static Widget createItemWidget(final Widget parent, final int qty, final ItemDefinition c) + { + final Widget itemWidget = parent.createChild(-1, WidgetType.GRAPHIC); + itemWidget.setItemId(c.getId()); + itemWidget.setItemQuantity(qty); + itemWidget.setHasListener(true); + itemWidget.setOriginalWidth(Constants.ITEM_SPRITE_WIDTH); + itemWidget.setOriginalHeight(Constants.ITEM_SPRITE_HEIGHT); + itemWidget.setBorderType(1); + + itemWidget.setAction(1, String.format("Item: %s", c.getName())); + + return itemWidget; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/Pets.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/Pets.java new file mode 100644 index 0000000000..de2b0edcb7 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/Pets.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemskeptondeath; + +import com.google.common.collect.ImmutableSet; +import java.util.Set; +import static net.runelite.api.ItemID.*; + +final class Pets +{ + private Pets() + { + } + + private static final Set PETS = ImmutableSet.of( + BABY_MOLE, + PRINCE_BLACK_DRAGON, + PET_CORPOREAL_CRITTER, PET_DARK_CORE, + JALNIBREK, TZREKZUK, + KALPHITE_PRINCESS, KALPHITE_PRINCESS_12654, + LIL_ZIK, + SKOTOS, + PET_SNAKELING, PET_SNAKELING_12939, PET_SNAKELING_12940, + TZREKJAD, + VORKI, + + OLMLET, PUPPADILE, TEKTINY, VANGUARD, VASA_MINIRIO, VESPINA, + + PET_DAGANNOTH_PRIME, PET_DAGANNOTH_REX, PET_DAGANNOTH_SUPREME, + + PET_GENERAL_GRAARDOR, PET_KRIL_TSUTSAROTH, PET_KREEARRA, PET_ZILYANA, + + ABYSSAL_ORPHAN, + HELLPUPPY, + PET_KRAKEN, + MIDNIGHT, NOON, + PET_SMOKE_DEVIL, PET_SMOKE_DEVIL_22663, + IKKLE_HYDRA, IKKLE_HYDRA_22748, IKKLE_HYDRA_22750, IKKLE_HYDRA_22752, + + CALLISTO_CUB, + PET_CHAOS_ELEMENTAL, + SCORPIAS_OFFSPRING, + VENENATIS_SPIDERLING, + VETION_JR, VETION_JR_13180, + + BABY_CHINCHOMPA, BABY_CHINCHOMPA_13324, BABY_CHINCHOMPA_13325, BABY_CHINCHOMPA_13326, + BEAVER, + GIANT_SQUIRREL, + HERON, + RIFT_GUARDIAN, RIFT_GUARDIAN_20667, RIFT_GUARDIAN_20669, RIFT_GUARDIAN_20671, RIFT_GUARDIAN_20673, RIFT_GUARDIAN_20675, + RIFT_GUARDIAN_20677, RIFT_GUARDIAN_20679, RIFT_GUARDIAN_20681, RIFT_GUARDIAN_20683, RIFT_GUARDIAN_20685, RIFT_GUARDIAN_20687, + RIFT_GUARDIAN_20689, RIFT_GUARDIAN_20691, RIFT_GUARDIAN_21990, + ROCK_GOLEM, ROCK_GOLEM_21187, ROCK_GOLEM_21188, ROCK_GOLEM_21189, ROCK_GOLEM_21190, ROCK_GOLEM_21191, ROCK_GOLEM_21192, + ROCK_GOLEM_21193, ROCK_GOLEM_21194, ROCK_GOLEM_21195, ROCK_GOLEM_21196, ROCK_GOLEM_21197, ROCK_GOLEM_21340, ROCK_GOLEM_21358, + ROCK_GOLEM_21359, ROCK_GOLEM_21360, + ROCKY, + TANGLEROOT, + + PET_KITTEN, PET_KITTEN_1556, PET_KITTEN_1557, PET_KITTEN_1558, PET_KITTEN_1559, PET_KITTEN_1560, + PET_CAT, PET_CAT_1562, PET_CAT_1563, PET_CAT_1564, PET_CAT_1565, PET_CAT_1566, PET_CAT_1567, PET_CAT_1568, PET_CAT_1569, + PET_CAT_1570, PET_CAT_1571, PET_CAT_1572, + LAZY_CAT, LAZY_CAT_6550, LAZY_CAT_6551, LAZY_CAT_6552, LAZY_CAT_6553, LAZY_CAT_6554, + WILY_CAT, WILY_CAT_6556, WILY_CAT_6557, WILY_CAT_6558, WILY_CAT_6559, WILY_CAT_6560, + OVERGROWN_HELLCAT, HELL_CAT, HELLKITTEN, LAZY_HELL_CAT, WILY_HELLCAT, + + BLOODHOUND, + CHOMPY_CHICK, + HERBI, + PET_PENANCE_QUEEN, + PHOENIX + ); + + public static boolean isPet(int id) + { + return PETS.contains(id); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/WidgetButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/WidgetButton.java similarity index 55% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/WidgetButton.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/WidgetButton.java index 0438c243d1..93cb27e41c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/keptondeath/WidgetButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/WidgetButton.java @@ -22,20 +22,15 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.keptondeath; +package net.runelite.client.plugins.itemskeptondeath; -import java.util.Arrays; -import java.util.Collection; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.SpriteID; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetType; +import net.runelite.api.ScriptEvent; +import net.runelite.api.SpriteID; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetType; -@Slf4j -public class WidgetButton +class WidgetButton { private static final int ICON_HEIGHT = 26; private static final int ICON_WIDTH = 26; @@ -47,55 +42,62 @@ public class WidgetButton private static final int BACKGROUND_SPRITE_ID = SpriteID.EQUIPMENT_SLOT_TILE; private static final int SELECTED_BACKGROUND_SPRITE_ID = SpriteID.EQUIPMENT_SLOT_SELECTED; + @FunctionalInterface public interface WidgetButtonCallback { - void run(String name, boolean newState); + void run(boolean newState); } - private String name; - private int spriteID; - @Getter - private Widget icon; - @Getter - private Widget background; + private final Widget parent; + private final String name; + private final int spriteID; private boolean selected; - private WidgetButtonCallback callback; + private final WidgetButtonCallback callback; - WidgetButton(String name, int spriteID, boolean selectedStartState, WidgetButtonCallback callback, Client client) + private Widget icon; + private Widget background; + + WidgetButton( + final Widget parent, + final String name, + final int spriteID, + final boolean selectedStartState, + final WidgetButtonCallback callback) { + this.parent = parent; this.name = name; this.spriteID = spriteID; this.selected = selectedStartState; this.callback = callback; - createBackgroundWidget(client); - createIconWidget(client); + createBackgroundWidget(); + createIconWidget(); } - private void createBackgroundWidget(Client client) + private void createBackgroundWidget() { - background = createWidget(client); + background = createWidget(); background.setOriginalWidth(BACKGROUND_WIDTH); background.setOriginalHeight(BACKGROUND_HEIGHT); syncBackgroundSprite(); } - private void createIconWidget(Client client) + private void createIconWidget() { - icon = createWidget(client); + icon = createWidget(); icon.setAction(1, "Toggle:"); - icon.setOnOpListener((JavaScriptCallback) ev -> onButtonClicked()); + icon.setOnOpListener((JavaScriptCallback) this::onButtonClicked); + icon.setOnMouseRepeatListener((JavaScriptCallback) e -> e.getSource().setOpacity(120)); + icon.setOnMouseLeaveListener((JavaScriptCallback) e -> e.getSource().setOpacity(0)); icon.setHasListener(true); icon.setSpriteId(spriteID); } - private Widget createWidget(Client client) + private Widget createWidget() { - Widget w = client.createWidget(); - w.setType(WidgetType.GRAPHIC); + final Widget w = parent.createChild(-1, WidgetType.GRAPHIC); w.setOriginalWidth(ICON_WIDTH); w.setOriginalHeight(ICON_HEIGHT); w.setName("" + this.name); - w.setIsIf3(true); return w; } @@ -116,61 +118,46 @@ public class WidgetButton * @param container Widget to add buttons too * @param buttons buttons to add */ - static void addButtonsToContainerWidget(Widget container, Collection buttons) + static void layoutButtonsToContainer(final Widget container, final WidgetButton... buttons) { - Widget[] children = container.getChildren(); - if (children == null) - { - // Create a child so we can copy the returned Widget[] and avoid hn casting issues from creating a new Widget[] - container.createChild(0, WidgetType.GRAPHIC); - children = container.getChildren(); - } // Each button has two widgets, Icon and Background - Widget[] itemsArray = Arrays.copyOf(children, buttons.size() * 2); - int parentId = container.getId(); - - int xIncrement = BACKGROUND_WIDTH + PADDING; - int yIncrement = BACKGROUND_HEIGHT + PADDING; + final int xIncrement = BACKGROUND_WIDTH + PADDING; + final int yIncrement = BACKGROUND_HEIGHT + PADDING; int maxRowItems = container.getWidth() / xIncrement; // Ensure at least 1 button per row maxRowItems = maxRowItems < 1 ? 1 : maxRowItems; - int startingIndex = 0; - for (WidgetButton w : buttons) + int index = 0; + for (final WidgetButton w : buttons) { - int originalX = (((startingIndex / 2) % maxRowItems) * xIncrement); - int originalY = (((startingIndex / 2) / maxRowItems) * yIncrement); - Widget background = updateWidgetPosition(w.getBackground(), parentId, startingIndex, originalX, originalY); - itemsArray[startingIndex] = background; - startingIndex++; + if (w == null) + { + continue; + } + + final int originalX = ((index % maxRowItems) * xIncrement); + final int originalY = ((index / maxRowItems) * yIncrement); + w.background.setOriginalX(originalX); + w.background.setOriginalY(originalY); + w.background.revalidate(); + // Icon must be padded to center inside image - Widget icon = updateWidgetPosition(w.getIcon(), parentId, startingIndex, originalX + ICON_PADDING, originalY + ICON_PADDING); - itemsArray[startingIndex] = icon; - startingIndex++; + w.icon.setOriginalX(originalX + ICON_PADDING); + w.icon.setOriginalY(originalY + ICON_PADDING); + w.icon.revalidate(); + + index++; } - int rows = 1 + (buttons.size() > maxRowItems ? buttons.size() / maxRowItems : 0); + final int numButtons = index; + final int rows = 1 + (numButtons > maxRowItems ? numButtons / maxRowItems : 0); container.setOriginalHeight(yIncrement * rows); - container.setChildren(itemsArray); container.revalidate(); } - private static Widget updateWidgetPosition(Widget w, int id, int index, int originalX, int originalY) - { - w.setParentId(id); - w.setId(id); - w.setIndex(index); - - w.setOriginalX(originalX); - w.setOriginalY(originalY); - w.revalidate(); - - return w; - } - - private void onButtonClicked() + private void onButtonClicked(ScriptEvent scriptEvent) { setSelected(!selected); - callback.run(name, selected); + callback.run(selected); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/BoostedStatBoost.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/BoostedStatBoost.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/BoostedStatBoost.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/BoostedStatBoost.java index 33c30d2aa2..1de61aa8c2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/BoostedStatBoost.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/BoostedStatBoost.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.plugins.itemstats.delta.DeltaCalculator; import net.runelite.client.plugins.itemstats.stats.Stat; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Builders.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Builders.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Builders.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Builders.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Combo.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Combo.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Combo.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Combo.java index aac1a56b1d..9749f1a17b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Combo.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Combo.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats; -import api.Client; +import net.runelite.api.Client; public class Combo implements Effect { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Effect.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Effect.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Effect.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Effect.java index 9721e38af0..d937405ed9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Effect.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Effect.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats; -import api.Client; +import net.runelite.api.Client; public interface Effect { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Food.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Food.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Food.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Food.java index 7460ae23d0..a00ad41f6c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Food.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Food.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.plugins.itemstats.delta.DeltaCalculator; public class Food extends FoodBase diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/FoodBase.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/FoodBase.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/FoodBase.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/FoodBase.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java new file mode 100644 index 0000000000..c03da92e0f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java @@ -0,0 +1,628 @@ +/* + * Copyright (c) 2016-2018, Adam + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemstats; + +import com.google.inject.Singleton; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; +import static net.runelite.api.ItemID.ADMIRAL_PIE; +import static net.runelite.api.ItemID.AGILITY_POTION1; +import static net.runelite.api.ItemID.AGILITY_POTION2; +import static net.runelite.api.ItemID.AGILITY_POTION3; +import static net.runelite.api.ItemID.AGILITY_POTION4; +import static net.runelite.api.ItemID.ANCHOVIES; +import static net.runelite.api.ItemID.ANCHOVY_PIZZA; +import static net.runelite.api.ItemID.ANGLERFISH; +import static net.runelite.api.ItemID.APPLE_PIE; +import static net.runelite.api.ItemID.ATTACK_POTION1; +import static net.runelite.api.ItemID.ATTACK_POTION2; +import static net.runelite.api.ItemID.ATTACK_POTION3; +import static net.runelite.api.ItemID.ATTACK_POTION4; +import static net.runelite.api.ItemID.AUTUMN_SQIRKJUICE; +import static net.runelite.api.ItemID.BAGUETTE; +import static net.runelite.api.ItemID.BAKED_POTATO; +import static net.runelite.api.ItemID.BANANA; +import static net.runelite.api.ItemID.BANDAGES; +import static net.runelite.api.ItemID.BASS; +import static net.runelite.api.ItemID.BASTION_POTION1; +import static net.runelite.api.ItemID.BASTION_POTION2; +import static net.runelite.api.ItemID.BASTION_POTION3; +import static net.runelite.api.ItemID.BASTION_POTION4; +import static net.runelite.api.ItemID.BATTLEMAGE_POTION1; +import static net.runelite.api.ItemID.BATTLEMAGE_POTION2; +import static net.runelite.api.ItemID.BATTLEMAGE_POTION3; +import static net.runelite.api.ItemID.BATTLEMAGE_POTION4; +import static net.runelite.api.ItemID.BAT_SHISH; +import static net.runelite.api.ItemID.BOTANICAL_PIE; +import static net.runelite.api.ItemID.BOTTLE_OF_WINE; +import static net.runelite.api.ItemID.BRAWK_FISH_3; +import static net.runelite.api.ItemID.BREAD; +import static net.runelite.api.ItemID.CABBAGE; +import static net.runelite.api.ItemID.CABBAGE_1967; +import static net.runelite.api.ItemID.CAKE; +import static net.runelite.api.ItemID.CAVE_EEL; +import static net.runelite.api.ItemID.CAVIAR; +import static net.runelite.api.ItemID.CHEESE; +import static net.runelite.api.ItemID.CHEESETOM_BATTA; +import static net.runelite.api.ItemID.CHILLI_CON_CARNE; +import static net.runelite.api.ItemID.CHILLI_POTATO; +import static net.runelite.api.ItemID.CHOCCHIP_CRUNCHIES; +import static net.runelite.api.ItemID.CHOCICE; +import static net.runelite.api.ItemID.CHOCOLATEY_MILK; +import static net.runelite.api.ItemID.CHOCOLATE_BAR; +import static net.runelite.api.ItemID.CHOCOLATE_BOMB; +import static net.runelite.api.ItemID.CHOCOLATE_CAKE; +import static net.runelite.api.ItemID.CHOCOLATE_SLICE; +import static net.runelite.api.ItemID.CHOC_SATURDAY; +import static net.runelite.api.ItemID.CHOPPED_ONION; +import static net.runelite.api.ItemID.CHOPPED_TOMATO; +import static net.runelite.api.ItemID.CHOPPED_TUNA; +import static net.runelite.api.ItemID.COATED_FROGS_LEGS; +import static net.runelite.api.ItemID.COD; +import static net.runelite.api.ItemID.COMBAT_POTION1; +import static net.runelite.api.ItemID.COMBAT_POTION2; +import static net.runelite.api.ItemID.COMBAT_POTION3; +import static net.runelite.api.ItemID.COMBAT_POTION4; +import static net.runelite.api.ItemID.COOKED_CHICKEN; +import static net.runelite.api.ItemID.COOKED_CHOMPY; +import static net.runelite.api.ItemID.COOKED_CRAB_MEAT; +import static net.runelite.api.ItemID.COOKED_FISHCAKE; +import static net.runelite.api.ItemID.COOKED_JUBBLY; +import static net.runelite.api.ItemID.COOKED_KARAMBWAN; +import static net.runelite.api.ItemID.COOKED_MEAT; +import static net.runelite.api.ItemID.COOKED_RABBIT; +import static net.runelite.api.ItemID.COOKED_SLIMY_EEL; +import static net.runelite.api.ItemID.COOKED_SWEETCORN; +import static net.runelite.api.ItemID.CURRY; +import static net.runelite.api.ItemID.DARK_CRAB; +import static net.runelite.api.ItemID.DEFENCE_POTION1; +import static net.runelite.api.ItemID.DEFENCE_POTION2; +import static net.runelite.api.ItemID.DEFENCE_POTION3; +import static net.runelite.api.ItemID.DEFENCE_POTION4; +import static net.runelite.api.ItemID.DRUNK_DRAGON; +import static net.runelite.api.ItemID.DWELLBERRIES; +import static net.runelite.api.ItemID.EASTER_EGG; +import static net.runelite.api.ItemID.EDIBLE_SEAWEED; +import static net.runelite.api.ItemID.EEL_SUSHI; +import static net.runelite.api.ItemID.EGG_AND_TOMATO; +import static net.runelite.api.ItemID.EGG_POTATO; +import static net.runelite.api.ItemID.ELDER_1; +import static net.runelite.api.ItemID.ELDER_1_20921; +import static net.runelite.api.ItemID.ELDER_2; +import static net.runelite.api.ItemID.ELDER_2_20922; +import static net.runelite.api.ItemID.ELDER_3; +import static net.runelite.api.ItemID.ELDER_3_20923; +import static net.runelite.api.ItemID.ELDER_4; +import static net.runelite.api.ItemID.ELDER_4_20924; +import static net.runelite.api.ItemID.ELDER_POTION_1; +import static net.runelite.api.ItemID.ELDER_POTION_2; +import static net.runelite.api.ItemID.ELDER_POTION_3; +import static net.runelite.api.ItemID.ELDER_POTION_4; +import static net.runelite.api.ItemID.ENERGY_POTION1; +import static net.runelite.api.ItemID.ENERGY_POTION2; +import static net.runelite.api.ItemID.ENERGY_POTION3; +import static net.runelite.api.ItemID.ENERGY_POTION4; +import static net.runelite.api.ItemID.FAT_SNAIL_MEAT; +import static net.runelite.api.ItemID.FIELD_RATION; +import static net.runelite.api.ItemID.FILLETS; +import static net.runelite.api.ItemID.FINGERS; +import static net.runelite.api.ItemID.FISHING_POTION1; +import static net.runelite.api.ItemID.FISHING_POTION2; +import static net.runelite.api.ItemID.FISHING_POTION3; +import static net.runelite.api.ItemID.FISHING_POTION4; +import static net.runelite.api.ItemID.FISH_PIE; +import static net.runelite.api.ItemID.FRIED_MUSHROOMS; +import static net.runelite.api.ItemID.FRIED_ONIONS; +import static net.runelite.api.ItemID.FROGBURGER; +import static net.runelite.api.ItemID.FROGSPAWN_GUMBO; +import static net.runelite.api.ItemID.FROG_SPAWN; +import static net.runelite.api.ItemID.FRUIT_BATTA; +import static net.runelite.api.ItemID.FRUIT_BLAST; +import static net.runelite.api.ItemID.GARDEN_PIE; +import static net.runelite.api.ItemID.GIANT_CARP; +import static net.runelite.api.ItemID.GIRAL_BAT_2; +import static net.runelite.api.ItemID.GOUT_TUBER; +import static net.runelite.api.ItemID.GREEN_GLOOP_SOUP; +import static net.runelite.api.ItemID.GRUBS__LA_MODE; +import static net.runelite.api.ItemID.GUANIC_BAT_0; +import static net.runelite.api.ItemID.GUTHIX_REST1; +import static net.runelite.api.ItemID.GUTHIX_REST2; +import static net.runelite.api.ItemID.GUTHIX_REST3; +import static net.runelite.api.ItemID.GUTHIX_REST4; +import static net.runelite.api.ItemID.HALF_AN_ADMIRAL_PIE; +import static net.runelite.api.ItemID.HALF_AN_APPLE_PIE; +import static net.runelite.api.ItemID.HALF_A_BOTANICAL_PIE; +import static net.runelite.api.ItemID.HALF_A_FISH_PIE; +import static net.runelite.api.ItemID.HALF_A_GARDEN_PIE; +import static net.runelite.api.ItemID.HALF_A_MEAT_PIE; +import static net.runelite.api.ItemID.HALF_A_MUSHROOM_PIE; +import static net.runelite.api.ItemID.HALF_A_REDBERRY_PIE; +import static net.runelite.api.ItemID.HALF_A_SUMMER_PIE; +import static net.runelite.api.ItemID.HALF_A_WILD_PIE; +import static net.runelite.api.ItemID.HERRING; +import static net.runelite.api.ItemID.HUNTER_POTION1; +import static net.runelite.api.ItemID.HUNTER_POTION2; +import static net.runelite.api.ItemID.HUNTER_POTION3; +import static net.runelite.api.ItemID.HUNTER_POTION4; +import static net.runelite.api.ItemID.IMBUED_HEART; +import static net.runelite.api.ItemID.JANGERBERRIES; +import static net.runelite.api.ItemID.JUG_OF_WINE; +import static net.runelite.api.ItemID.KODAI_1; +import static net.runelite.api.ItemID.KODAI_1_20945; +import static net.runelite.api.ItemID.KODAI_2; +import static net.runelite.api.ItemID.KODAI_2_20946; +import static net.runelite.api.ItemID.KODAI_3; +import static net.runelite.api.ItemID.KODAI_3_20947; +import static net.runelite.api.ItemID.KODAI_4; +import static net.runelite.api.ItemID.KODAI_4_20948; +import static net.runelite.api.ItemID.KODAI_POTION_1; +import static net.runelite.api.ItemID.KODAI_POTION_2; +import static net.runelite.api.ItemID.KODAI_POTION_3; +import static net.runelite.api.ItemID.KODAI_POTION_4; +import static net.runelite.api.ItemID.KRYKET_BAT_4; +import static net.runelite.api.ItemID.KYREN_FISH_6; +import static net.runelite.api.ItemID.LAVA_EEL; +import static net.runelite.api.ItemID.LECKISH_FISH_2; +import static net.runelite.api.ItemID.LEMON; +import static net.runelite.api.ItemID.LEMON_CHUNKS; +import static net.runelite.api.ItemID.LEMON_SLICES; +import static net.runelite.api.ItemID.LIME; +import static net.runelite.api.ItemID.LIME_CHUNKS; +import static net.runelite.api.ItemID.LIME_SLICES; +import static net.runelite.api.ItemID.LOACH; +import static net.runelite.api.ItemID.LOBSTER; +import static net.runelite.api.ItemID.MACKEREL; +import static net.runelite.api.ItemID.MAGIC_ESSENCE1; +import static net.runelite.api.ItemID.MAGIC_ESSENCE2; +import static net.runelite.api.ItemID.MAGIC_ESSENCE3; +import static net.runelite.api.ItemID.MAGIC_ESSENCE4; +import static net.runelite.api.ItemID.MAGIC_POTION1; +import static net.runelite.api.ItemID.MAGIC_POTION2; +import static net.runelite.api.ItemID.MAGIC_POTION3; +import static net.runelite.api.ItemID.MAGIC_POTION4; +import static net.runelite.api.ItemID.MANTA_RAY; +import static net.runelite.api.ItemID.MEAT_PIE; +import static net.runelite.api.ItemID.MEAT_PIZZA; +import static net.runelite.api.ItemID.MINT_CAKE; +import static net.runelite.api.ItemID.MONKFISH; +import static net.runelite.api.ItemID.MOONLIGHT_MEAD; +import static net.runelite.api.ItemID.MURNG_BAT_5; +import static net.runelite.api.ItemID.MUSHROOMS; +import static net.runelite.api.ItemID.MUSHROOM_PIE; +import static net.runelite.api.ItemID.MUSHROOM_POTATO; +import static net.runelite.api.ItemID.MUSHROOM__ONION; +import static net.runelite.api.ItemID.MYCIL_FISH_4; +import static net.runelite.api.ItemID.ONION; +import static net.runelite.api.ItemID.ORANGE; +import static net.runelite.api.ItemID.ORANGE_CHUNKS; +import static net.runelite.api.ItemID.ORANGE_SLICES; +import static net.runelite.api.ItemID.OVERLOAD_1; +import static net.runelite.api.ItemID.OVERLOAD_1_20985; +import static net.runelite.api.ItemID.OVERLOAD_1_20989; +import static net.runelite.api.ItemID.OVERLOAD_1_20993; +import static net.runelite.api.ItemID.OVERLOAD_2; +import static net.runelite.api.ItemID.OVERLOAD_2_20986; +import static net.runelite.api.ItemID.OVERLOAD_2_20990; +import static net.runelite.api.ItemID.OVERLOAD_2_20994; +import static net.runelite.api.ItemID.OVERLOAD_3; +import static net.runelite.api.ItemID.OVERLOAD_3_20987; +import static net.runelite.api.ItemID.OVERLOAD_3_20991; +import static net.runelite.api.ItemID.OVERLOAD_3_20995; +import static net.runelite.api.ItemID.OVERLOAD_4; +import static net.runelite.api.ItemID.OVERLOAD_4_20988; +import static net.runelite.api.ItemID.OVERLOAD_4_20992; +import static net.runelite.api.ItemID.OVERLOAD_4_20996; +import static net.runelite.api.ItemID.PAPAYA_FRUIT; +import static net.runelite.api.ItemID.PEACH; +import static net.runelite.api.ItemID.PHLUXIA_BAT_3; +import static net.runelite.api.ItemID.PIKE; +import static net.runelite.api.ItemID.PINEAPPLE_CHUNKS; +import static net.runelite.api.ItemID.PINEAPPLE_PIZZA; +import static net.runelite.api.ItemID.PINEAPPLE_PUNCH; +import static net.runelite.api.ItemID.PINEAPPLE_RING; +import static net.runelite.api.ItemID.PLAIN_PIZZA; +import static net.runelite.api.ItemID.POISON_KARAMBWAN; +import static net.runelite.api.ItemID.POTATO; +import static net.runelite.api.ItemID.POTATO_WITH_BUTTER; +import static net.runelite.api.ItemID.POTATO_WITH_CHEESE; +import static net.runelite.api.ItemID.POT_OF_CREAM; +import static net.runelite.api.ItemID.PRAEL_BAT_1; +import static net.runelite.api.ItemID.PRAYER_POTION1; +import static net.runelite.api.ItemID.PRAYER_POTION2; +import static net.runelite.api.ItemID.PRAYER_POTION3; +import static net.runelite.api.ItemID.PRAYER_POTION4; +import static net.runelite.api.ItemID.PREMADE_CHOC_BOMB; +import static net.runelite.api.ItemID.PREMADE_CHOC_SDY; +import static net.runelite.api.ItemID.PREMADE_CH_CRUNCH; +import static net.runelite.api.ItemID.PREMADE_CT_BATTA; +import static net.runelite.api.ItemID.PREMADE_DR_DRAGON; +import static net.runelite.api.ItemID.PREMADE_FRT_BATTA; +import static net.runelite.api.ItemID.PREMADE_FR_BLAST; +import static net.runelite.api.ItemID.PREMADE_P_PUNCH; +import static net.runelite.api.ItemID.PREMADE_SGG; +import static net.runelite.api.ItemID.PREMADE_SY_CRUNCH; +import static net.runelite.api.ItemID.PREMADE_TD_BATTA; +import static net.runelite.api.ItemID.PREMADE_TD_CRUNCH; +import static net.runelite.api.ItemID.PREMADE_TTL; +import static net.runelite.api.ItemID.PREMADE_VEG_BALL; +import static net.runelite.api.ItemID.PREMADE_VEG_BATTA; +import static net.runelite.api.ItemID.PREMADE_WIZ_BLZD; +import static net.runelite.api.ItemID.PREMADE_WM_BATTA; +import static net.runelite.api.ItemID.PREMADE_WM_CRUN; +import static net.runelite.api.ItemID.PREMADE_WORM_HOLE; +import static net.runelite.api.ItemID.PSYKK_BAT_6; +import static net.runelite.api.ItemID.PUMPKIN; +import static net.runelite.api.ItemID.PURPLE_SWEETS_10476; +import static net.runelite.api.ItemID.PYSK_FISH_0; +import static net.runelite.api.ItemID.RAINBOW_FISH; +import static net.runelite.api.ItemID.RANGING_POTION1; +import static net.runelite.api.ItemID.RANGING_POTION2; +import static net.runelite.api.ItemID.RANGING_POTION3; +import static net.runelite.api.ItemID.RANGING_POTION4; +import static net.runelite.api.ItemID.REDBERRY_PIE; +import static net.runelite.api.ItemID.RESTORE_POTION1; +import static net.runelite.api.ItemID.RESTORE_POTION2; +import static net.runelite.api.ItemID.RESTORE_POTION3; +import static net.runelite.api.ItemID.RESTORE_POTION4; +import static net.runelite.api.ItemID.REVITALISATION_1_20957; +import static net.runelite.api.ItemID.REVITALISATION_2_20958; +import static net.runelite.api.ItemID.REVITALISATION_3_20959; +import static net.runelite.api.ItemID.REVITALISATION_4_20960; +import static net.runelite.api.ItemID.ROAST_BEAST_MEAT; +import static net.runelite.api.ItemID.ROAST_BIRD_MEAT; +import static net.runelite.api.ItemID.ROAST_FROG; +import static net.runelite.api.ItemID.ROAST_RABBIT; +import static net.runelite.api.ItemID.ROE; +import static net.runelite.api.ItemID.ROLL; +import static net.runelite.api.ItemID.ROQED_FISH_5; +import static net.runelite.api.ItemID.SALMON; +import static net.runelite.api.ItemID.SANFEW_SERUM1; +import static net.runelite.api.ItemID.SANFEW_SERUM2; +import static net.runelite.api.ItemID.SANFEW_SERUM3; +import static net.runelite.api.ItemID.SANFEW_SERUM4; +import static net.runelite.api.ItemID.SARADOMIN_BREW1; +import static net.runelite.api.ItemID.SARADOMIN_BREW2; +import static net.runelite.api.ItemID.SARADOMIN_BREW3; +import static net.runelite.api.ItemID.SARADOMIN_BREW4; +import static net.runelite.api.ItemID.SARDINE; +import static net.runelite.api.ItemID.SEA_TURTLE; +import static net.runelite.api.ItemID.SHARK; +import static net.runelite.api.ItemID.SHORT_GREEN_GUY; +import static net.runelite.api.ItemID.SHRIMPS; +import static net.runelite.api.ItemID.SLICED_BANANA; +import static net.runelite.api.ItemID.SLICE_OF_CAKE; +import static net.runelite.api.ItemID.SPICY_CRUNCHIES; +import static net.runelite.api.ItemID.SPICY_SAUCE; +import static net.runelite.api.ItemID.SPICY_STEW; +import static net.runelite.api.ItemID.SPINACH_ROLL; +import static net.runelite.api.ItemID.SPRING_SQIRKJUICE; +import static net.runelite.api.ItemID.SQUARE_SANDWICH; +import static net.runelite.api.ItemID.STAMINA_POTION1; +import static net.runelite.api.ItemID.STAMINA_POTION2; +import static net.runelite.api.ItemID.STAMINA_POTION3; +import static net.runelite.api.ItemID.STAMINA_POTION4; +import static net.runelite.api.ItemID.STEW; +import static net.runelite.api.ItemID.STRANGE_FRUIT; +import static net.runelite.api.ItemID.STRAWBERRY; +import static net.runelite.api.ItemID.STRENGTH_POTION1; +import static net.runelite.api.ItemID.STRENGTH_POTION2; +import static net.runelite.api.ItemID.STRENGTH_POTION3; +import static net.runelite.api.ItemID.STRENGTH_POTION4; +import static net.runelite.api.ItemID.STUFFED_SNAKE; +import static net.runelite.api.ItemID.SUMMER_PIE; +import static net.runelite.api.ItemID.SUMMER_SQIRKJUICE; +import static net.runelite.api.ItemID.SUPER_ATTACK1; +import static net.runelite.api.ItemID.SUPER_ATTACK2; +import static net.runelite.api.ItemID.SUPER_ATTACK3; +import static net.runelite.api.ItemID.SUPER_ATTACK4; +import static net.runelite.api.ItemID.SUPER_COMBAT_POTION1; +import static net.runelite.api.ItemID.SUPER_COMBAT_POTION2; +import static net.runelite.api.ItemID.SUPER_COMBAT_POTION3; +import static net.runelite.api.ItemID.SUPER_COMBAT_POTION4; +import static net.runelite.api.ItemID.SUPER_DEFENCE1; +import static net.runelite.api.ItemID.SUPER_DEFENCE2; +import static net.runelite.api.ItemID.SUPER_DEFENCE3; +import static net.runelite.api.ItemID.SUPER_DEFENCE4; +import static net.runelite.api.ItemID.SUPER_ENERGY1; +import static net.runelite.api.ItemID.SUPER_ENERGY2; +import static net.runelite.api.ItemID.SUPER_ENERGY3; +import static net.runelite.api.ItemID.SUPER_ENERGY4; +import static net.runelite.api.ItemID.SUPER_MAGIC_POTION_1; +import static net.runelite.api.ItemID.SUPER_MAGIC_POTION_2; +import static net.runelite.api.ItemID.SUPER_MAGIC_POTION_3; +import static net.runelite.api.ItemID.SUPER_MAGIC_POTION_4; +import static net.runelite.api.ItemID.SUPER_RANGING_1; +import static net.runelite.api.ItemID.SUPER_RANGING_2; +import static net.runelite.api.ItemID.SUPER_RANGING_3; +import static net.runelite.api.ItemID.SUPER_RANGING_4; +import static net.runelite.api.ItemID.SUPER_RESTORE1; +import static net.runelite.api.ItemID.SUPER_RESTORE2; +import static net.runelite.api.ItemID.SUPER_RESTORE3; +import static net.runelite.api.ItemID.SUPER_RESTORE4; +import static net.runelite.api.ItemID.SUPER_STRENGTH1; +import static net.runelite.api.ItemID.SUPER_STRENGTH2; +import static net.runelite.api.ItemID.SUPER_STRENGTH3; +import static net.runelite.api.ItemID.SUPER_STRENGTH4; +import static net.runelite.api.ItemID.SUPHI_FISH_1; +import static net.runelite.api.ItemID.SWEETCORN_7088; +import static net.runelite.api.ItemID.SWORDFISH; +import static net.runelite.api.ItemID.TANGLED_TOADS_LEGS; +import static net.runelite.api.ItemID.THIN_SNAIL_MEAT; +import static net.runelite.api.ItemID.TOAD_BATTA; +import static net.runelite.api.ItemID.TOAD_CRUNCHIES; +import static net.runelite.api.ItemID.TOMATO; +import static net.runelite.api.ItemID.TRIANGLE_SANDWICH; +import static net.runelite.api.ItemID.TROUT; +import static net.runelite.api.ItemID.TUNA; +import static net.runelite.api.ItemID.TUNA_AND_CORN; +import static net.runelite.api.ItemID.TUNA_POTATO; +import static net.runelite.api.ItemID.TWISTED_1; +import static net.runelite.api.ItemID.TWISTED_1_20933; +import static net.runelite.api.ItemID.TWISTED_2; +import static net.runelite.api.ItemID.TWISTED_2_20934; +import static net.runelite.api.ItemID.TWISTED_3; +import static net.runelite.api.ItemID.TWISTED_3_20935; +import static net.runelite.api.ItemID.TWISTED_4; +import static net.runelite.api.ItemID.TWISTED_4_20936; +import static net.runelite.api.ItemID.TWISTED_POTION_1; +import static net.runelite.api.ItemID.TWISTED_POTION_2; +import static net.runelite.api.ItemID.TWISTED_POTION_3; +import static net.runelite.api.ItemID.TWISTED_POTION_4; +import static net.runelite.api.ItemID.UGTHANKI_KEBAB; +import static net.runelite.api.ItemID.UGTHANKI_KEBAB_1885; +import static net.runelite.api.ItemID.VEGETABLE_BATTA; +import static net.runelite.api.ItemID.VEG_BALL; +import static net.runelite.api.ItemID.WATERMELON_SLICE; +import static net.runelite.api.ItemID.WHITE_TREE_FRUIT; +import static net.runelite.api.ItemID.WILD_PIE; +import static net.runelite.api.ItemID.WINTER_SQIRKJUICE; +import static net.runelite.api.ItemID.WIZARD_BLIZZARD; +import static net.runelite.api.ItemID.WORM_BATTA; +import static net.runelite.api.ItemID.WORM_CRUNCHIES; +import static net.runelite.api.ItemID.WORM_HOLE; +import static net.runelite.api.ItemID.XERICS_AID_1_20981; +import static net.runelite.api.ItemID.XERICS_AID_2_20982; +import static net.runelite.api.ItemID.XERICS_AID_3_20983; +import static net.runelite.api.ItemID.XERICS_AID_4_20984; +import static net.runelite.api.ItemID.ZAMORAK_BREW1; +import static net.runelite.api.ItemID.ZAMORAK_BREW2; +import static net.runelite.api.ItemID.ZAMORAK_BREW3; +import static net.runelite.api.ItemID.ZAMORAK_BREW4; +import static net.runelite.api.ItemID._12_ANCHOVY_PIZZA; +import static net.runelite.api.ItemID._12_MEAT_PIZZA; +import static net.runelite.api.ItemID._12_PINEAPPLE_PIZZA; +import static net.runelite.api.ItemID._12_PLAIN_PIZZA; +import static net.runelite.api.ItemID._23_CAKE; +import static net.runelite.api.ItemID._23_CHOCOLATE_CAKE; +import static net.runelite.client.plugins.itemstats.Builders.boost; +import static net.runelite.client.plugins.itemstats.Builders.combo; +import static net.runelite.client.plugins.itemstats.Builders.dec; +import static net.runelite.client.plugins.itemstats.Builders.food; +import static net.runelite.client.plugins.itemstats.Builders.heal; +import static net.runelite.client.plugins.itemstats.Builders.perc; +import static net.runelite.client.plugins.itemstats.Builders.range; +import net.runelite.client.plugins.itemstats.food.Anglerfish; +import net.runelite.client.plugins.itemstats.potions.PrayerPotion; +import net.runelite.client.plugins.itemstats.potions.SaradominBrew; +import net.runelite.client.plugins.itemstats.potions.SuperRestore; +import net.runelite.client.plugins.itemstats.special.CastleWarsBandage; +import net.runelite.client.plugins.itemstats.special.SpicyStew; +import static net.runelite.client.plugins.itemstats.stats.Stats.AGILITY; +import static net.runelite.client.plugins.itemstats.stats.Stats.ATTACK; +import static net.runelite.client.plugins.itemstats.stats.Stats.CRAFTING; +import static net.runelite.client.plugins.itemstats.stats.Stats.DEFENCE; +import static net.runelite.client.plugins.itemstats.stats.Stats.FARMING; +import static net.runelite.client.plugins.itemstats.stats.Stats.FISHING; +import static net.runelite.client.plugins.itemstats.stats.Stats.HERBLORE; +import static net.runelite.client.plugins.itemstats.stats.Stats.HITPOINTS; +import static net.runelite.client.plugins.itemstats.stats.Stats.HUNTER; +import static net.runelite.client.plugins.itemstats.stats.Stats.MAGIC; +import static net.runelite.client.plugins.itemstats.stats.Stats.PRAYER; +import static net.runelite.client.plugins.itemstats.stats.Stats.RANGED; +import static net.runelite.client.plugins.itemstats.stats.Stats.RUN_ENERGY; +import static net.runelite.client.plugins.itemstats.stats.Stats.SLAYER; +import static net.runelite.client.plugins.itemstats.stats.Stats.STRENGTH; +import static net.runelite.client.plugins.itemstats.stats.Stats.THIEVING; + +@Singleton +@Slf4j +public class ItemStatChanges +{ + ItemStatChanges() + { + init(); + } + + private void init() + { + add(food(-5), POISON_KARAMBWAN); + add(food(1), POTATO, ONION, CABBAGE, POT_OF_CREAM, CHOPPED_ONION, ANCHOVIES); + add(food(2), TOMATO, CHOPPED_TOMATO, BANANA, SLICED_BANANA, ORANGE, ORANGE_SLICES, ORANGE_CHUNKS, + PINEAPPLE_RING, PINEAPPLE_CHUNKS, SPICY_SAUCE, CHEESE, SPINACH_ROLL, LEMON, LEMON_CHUNKS, LEMON_SLICES, + LIME, LIME_CHUNKS, LIME_SLICES, DWELLBERRIES); + add(food(3), SHRIMPS, COOKED_MEAT, COOKED_CHICKEN, ROE, CHOCOLATE_BAR); + add(food(4), SARDINE, CAKE, _23_CAKE, SLICE_OF_CAKE, CHOCOLATEY_MILK, BAKED_POTATO, EDIBLE_SEAWEED, MOONLIGHT_MEAD); + add(food(5), BREAD, HERRING, CHOCOLATE_CAKE, _23_CHOCOLATE_CAKE, CHOCOLATE_SLICE, COOKED_RABBIT, CHILLI_CON_CARNE, + FRIED_MUSHROOMS, FRIED_ONIONS, REDBERRY_PIE, HALF_A_REDBERRY_PIE, CAVIAR, PYSK_FISH_0); + add(food(6), CHOCICE, MACKEREL, MEAT_PIE, HALF_A_MEAT_PIE, GUANIC_BAT_0, ROAST_BIRD_MEAT, + SQUARE_SANDWICH, ROLL, BAGUETTE, TRIANGLE_SANDWICH, GIANT_CARP); + add(food(7), TROUT, COD, PLAIN_PIZZA, _12_PLAIN_PIZZA, APPLE_PIE, HALF_AN_APPLE_PIE, ROAST_RABBIT, + PREMADE_CH_CRUNCH, CHOCCHIP_CRUNCHIES, PREMADE_SY_CRUNCH, SPICY_CRUNCHIES); + add(food(8), PIKE, ROAST_BEAST_MEAT, MEAT_PIZZA, _12_MEAT_PIZZA, PREMADE_WM_CRUN, WORM_CRUNCHIES, PREMADE_TD_CRUNCH, + TOAD_CRUNCHIES, EGG_AND_TOMATO, PRAEL_BAT_1, PEACH, SUPHI_FISH_1); + add(food(9), PREMADE_P_PUNCH, PINEAPPLE_PUNCH, PREMADE_FR_BLAST, FRUIT_BLAST, SALMON, ANCHOVY_PIZZA, + _12_ANCHOVY_PIZZA); + add(food(10), TUNA, COOKED_CRAB_MEAT, CHOPPED_TUNA, COOKED_CHOMPY, FIELD_RATION); + add(food(11), RAINBOW_FISH, STEW, PINEAPPLE_PIZZA, _12_PINEAPPLE_PIZZA, COOKED_FISHCAKE, + PREMADE_VEG_BATTA, VEGETABLE_BATTA, PREMADE_WM_BATTA, WORM_BATTA, PREMADE_TD_BATTA, TOAD_BATTA, PREMADE_CT_BATTA, + CHEESETOM_BATTA, PREMADE_FRT_BATTA, FRUIT_BATTA, MUSHROOM__ONION, GIRAL_BAT_2, LAVA_EEL, LECKISH_FISH_2); + add(food(12), LOBSTER, PREMADE_WORM_HOLE, WORM_HOLE, PREMADE_VEG_BALL, VEG_BALL); + add(food(13), BASS, TUNA_AND_CORN); + add(food(14), POTATO_WITH_BUTTER, CHILLI_POTATO, SWORDFISH, PHLUXIA_BAT_3, PUMPKIN, EASTER_EGG, BRAWK_FISH_3); + add(food(15), PREMADE_TTL, TANGLED_TOADS_LEGS, PREMADE_CHOC_BOMB, CHOCOLATE_BOMB, COOKED_JUBBLY); + add(food(16), MONKFISH, POTATO_WITH_CHEESE, EGG_POTATO); + add(food(17), MYCIL_FISH_4, KRYKET_BAT_4); + add(food(18), COOKED_KARAMBWAN); + add(food(19), CURRY, UGTHANKI_KEBAB, UGTHANKI_KEBAB_1885); + add(food(20), MUSHROOM_POTATO, SHARK, ROQED_FISH_5, MURNG_BAT_5, STUFFED_SNAKE); + add(food(21), SEA_TURTLE); + add(food(22), MANTA_RAY, DARK_CRAB, TUNA_POTATO); + add(food(23), KYREN_FISH_6, PSYKK_BAT_6); + add(new Anglerfish(), ANGLERFISH); + add(food(maxHP -> (int) Math.ceil(maxHP * .06)), STRAWBERRY); + add(food(maxHP -> (int) Math.ceil(maxHP * .05)), WATERMELON_SLICE); + add(food(perc(.1, 1)), COOKED_SWEETCORN, SWEETCORN_7088 /* Bowl of cooked sweetcorn */); + add(combo(food(1), boost(DEFENCE, perc(.02, 1))), CABBAGE_1967 /* Draynor Manor */); + add(combo(2, food(8), heal(RUN_ENERGY, 5)), PAPAYA_FRUIT); + add(range(food(5), food(7)), THIN_SNAIL_MEAT); + add(range(food(7), food(9)), FAT_SNAIL_MEAT); + + // Dorgeshuun Cuisine + add(food(2), BAT_SHISH, COATED_FROGS_LEGS, FILLETS, FINGERS, FROGBURGER, FROGSPAWN_GUMBO, GREEN_GLOOP_SOUP, + GRUBS__LA_MODE, MUSHROOMS, ROAST_FROG); + add(food(3), LOACH); + add(range(food(3), food(6)), FROG_SPAWN); + add(range(food(6), food(10)), COOKED_SLIMY_EEL); + add(range(food(8), food(12)), CAVE_EEL); + add(food(10), EEL_SUSHI); + + // Alcoholic Beverages + add(combo(food(11), dec(ATTACK, 2)), JUG_OF_WINE); + add(combo(food(14), dec(ATTACK, 3)), BOTTLE_OF_WINE); + add(combo(2, food(5), boost(STRENGTH, 6), heal(ATTACK, -4)), PREMADE_WIZ_BLZD, WIZARD_BLIZZARD); + add(combo(2, food(5), boost(STRENGTH, 4), heal(ATTACK, -3)), PREMADE_SGG, SHORT_GREEN_GUY); + add(combo(2, food(5), boost(STRENGTH, 7), heal(ATTACK, -4)), PREMADE_DR_DRAGON, DRUNK_DRAGON); + add(combo(2, food(5), boost(STRENGTH, 7), heal(ATTACK, -4)), PREMADE_CHOC_SDY, CHOC_SATURDAY); + + // Sq'irk Juice + add(heal(RUN_ENERGY, 5), WINTER_SQIRKJUICE); + add(combo(heal(RUN_ENERGY, 10), boost(THIEVING, 1)), SPRING_SQIRKJUICE); + add(combo(heal(RUN_ENERGY, 15), boost(THIEVING, 2)), AUTUMN_SQIRKJUICE); + add(combo(heal(RUN_ENERGY, 20), boost(THIEVING, 3)), SUMMER_SQIRKJUICE); + + // Combat potions + add(boost(ATTACK, perc(.10, 3)), ATTACK_POTION1, ATTACK_POTION2, ATTACK_POTION3, ATTACK_POTION4); + add(boost(STRENGTH, perc(.10, 3)), STRENGTH_POTION1, STRENGTH_POTION2, STRENGTH_POTION3, STRENGTH_POTION4); + add(boost(DEFENCE, perc(.10, 3)), DEFENCE_POTION1, DEFENCE_POTION2, DEFENCE_POTION3, DEFENCE_POTION4); + add(boost(MAGIC, 4), MAGIC_POTION1, MAGIC_POTION2, MAGIC_POTION3, MAGIC_POTION4); + add(boost(RANGED, perc(.10, 4)), RANGING_POTION1, RANGING_POTION2, RANGING_POTION3, RANGING_POTION4); + add(combo(2, boost(ATTACK, perc(.10, 3)), boost(STRENGTH, perc(.10, 3))), COMBAT_POTION1, COMBAT_POTION2, COMBAT_POTION3, COMBAT_POTION4); + add(boost(ATTACK, perc(.15, 5)), SUPER_ATTACK1, SUPER_ATTACK2, SUPER_ATTACK3, SUPER_ATTACK4); + add(boost(STRENGTH, perc(.15, 5)), SUPER_STRENGTH1, SUPER_STRENGTH2, SUPER_STRENGTH3, SUPER_STRENGTH4); + add(boost(DEFENCE, perc(.15, 5)), SUPER_DEFENCE1, SUPER_DEFENCE2, SUPER_DEFENCE3, SUPER_DEFENCE4); + add(boost(MAGIC, 3), MAGIC_ESSENCE1, MAGIC_ESSENCE2, MAGIC_ESSENCE3, MAGIC_ESSENCE4); + add(combo(3, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5))), SUPER_COMBAT_POTION1, SUPER_COMBAT_POTION2, SUPER_COMBAT_POTION3, SUPER_COMBAT_POTION4); + add(combo(3, boost(ATTACK, perc(.20, 2)), boost(STRENGTH, perc(.12, 2)), heal(PRAYER, perc(.10, 0)), heal(DEFENCE, perc(.10, -2)), new BoostedStatBoost(HITPOINTS, false, perc(-.12, 0))), ZAMORAK_BREW1, ZAMORAK_BREW2, ZAMORAK_BREW3, ZAMORAK_BREW4); + add(new SaradominBrew(0.15, 0.2, 0.1, 2, 2), SARADOMIN_BREW1, SARADOMIN_BREW2, SARADOMIN_BREW3, SARADOMIN_BREW4); + add(boost(RANGED, perc(.15, 5)), SUPER_RANGING_1, SUPER_RANGING_2, SUPER_RANGING_3, SUPER_RANGING_4); + add(boost(MAGIC, perc(.15, 5)), SUPER_MAGIC_POTION_1, SUPER_MAGIC_POTION_2, SUPER_MAGIC_POTION_3, SUPER_MAGIC_POTION_4); + add(combo(2, boost(RANGED, perc(0.1, 4)), boost(DEFENCE, perc(0.15, 5))), BASTION_POTION1, BASTION_POTION2, BASTION_POTION3, BASTION_POTION4); + add(combo(2, boost(MAGIC, 4), boost(DEFENCE, perc(0.15, 5))), BATTLEMAGE_POTION1, BATTLEMAGE_POTION2, BATTLEMAGE_POTION3, BATTLEMAGE_POTION4); + + // Regular overload (NMZ) + add(combo(5, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5)), boost(RANGED, perc(.15, 5)), boost(MAGIC, perc(.15, 5)), heal(HITPOINTS, -50)), OVERLOAD_1, OVERLOAD_2, OVERLOAD_3, OVERLOAD_4); + + // Bandages (Castle Wars) + add(new CastleWarsBandage(), BANDAGES); + + // Recovery potions + add(combo(5, heal(ATTACK, perc(.30, 10)), heal(STRENGTH, perc(.30, 10)), heal(DEFENCE, perc(.30, 10)), heal(RANGED, perc(.30, 10)), heal(MAGIC, perc(.30, 10))), RESTORE_POTION1, RESTORE_POTION2, RESTORE_POTION3, RESTORE_POTION4); + add(heal(RUN_ENERGY, 10), ENERGY_POTION1, ENERGY_POTION2, ENERGY_POTION3, ENERGY_POTION4); + add(new PrayerPotion(7), PRAYER_POTION1, PRAYER_POTION2, PRAYER_POTION3, PRAYER_POTION4); + add(heal(RUN_ENERGY, 20), SUPER_ENERGY1, SUPER_ENERGY2, SUPER_ENERGY3, SUPER_ENERGY4); + add(new SuperRestore(.25, 8), SUPER_RESTORE1, SUPER_RESTORE2, SUPER_RESTORE3, SUPER_RESTORE4); + add(new SuperRestore(.25, 9), SANFEW_SERUM1, SANFEW_SERUM2, SANFEW_SERUM3, SANFEW_SERUM4); + add(heal(RUN_ENERGY, 20), STAMINA_POTION1, STAMINA_POTION2, STAMINA_POTION3, STAMINA_POTION4); + + // Raids potions (+) + add(combo(5, boost(ATTACK, perc(.16, 6)), boost(STRENGTH, perc(.16, 6)), boost(DEFENCE, perc(.16, 6)), boost(RANGED, perc(.16, 6)), boost(MAGIC, perc(.16, 6)), heal(HITPOINTS, -50)), OVERLOAD_1_20993, OVERLOAD_2_20994, OVERLOAD_3_20995, OVERLOAD_4_20996); + add(combo(3, boost(ATTACK, perc(.16, 6)), boost(STRENGTH, perc(.16, 6)), boost(DEFENCE, perc(.16, 6))), ELDER_1_20921, ELDER_2_20922, ELDER_3_20923, ELDER_4_20924); + add(combo(2, boost(RANGED, perc(.16, 6)), boost(DEFENCE, perc(.16, 6))), TWISTED_1_20933, TWISTED_2_20934, TWISTED_3_20935, TWISTED_4_20936); + add(combo(2, boost(MAGIC, perc(.16, 6)), boost(DEFENCE, perc(.16, 6))), KODAI_1_20945, KODAI_2_20946, KODAI_3_20947, KODAI_4_20948); + add(new SuperRestore(.30, 11), REVITALISATION_1_20957, REVITALISATION_2_20958, REVITALISATION_3_20959, REVITALISATION_4_20960); + add(new SaradominBrew(0.15, 0.2, 0.1, 5, 4), XERICS_AID_1_20981, XERICS_AID_2_20982, XERICS_AID_3_20983, XERICS_AID_4_20984); + + // Raids potions + add(combo(5, boost(ATTACK, perc(.13, 5)), boost(STRENGTH, perc(.13, 5)), boost(DEFENCE, perc(.13, 5)), boost(RANGED, perc(.13, 5)), boost(MAGIC, perc(.13, 5)), heal(HITPOINTS, -50)), OVERLOAD_1_20989, OVERLOAD_2_20990, OVERLOAD_3_20991, OVERLOAD_4_20992); + add(combo(3, boost(ATTACK, perc(.13, 5)), boost(STRENGTH, perc(.13, 5)), boost(DEFENCE, perc(.13, 5))), ELDER_POTION_1, ELDER_POTION_2, ELDER_POTION_3, ELDER_POTION_4); + add(combo(2, boost(RANGED, perc(.13, 5)), boost(DEFENCE, perc(.13, 5))), TWISTED_POTION_1, TWISTED_POTION_2, TWISTED_POTION_3, TWISTED_POTION_4); + add(combo(2, boost(MAGIC, perc(.13, 5)), boost(DEFENCE, perc(.13, 5))), KODAI_POTION_1, KODAI_POTION_2, KODAI_POTION_3, KODAI_POTION_4); + + // Raids potions (-) + add(combo(5, boost(ATTACK, perc(.10, 4)), boost(STRENGTH, perc(.10, 4)), boost(DEFENCE, perc(.10, 4)), boost(RANGED, perc(.10, 4)), boost(MAGIC, perc(.10, 4)), heal(HITPOINTS, -50)), OVERLOAD_1_20985, OVERLOAD_2_20986, OVERLOAD_3_20987, OVERLOAD_4_20988); + add(combo(3, boost(ATTACK, perc(.10, 4)), boost(STRENGTH, perc(.10, 4)), boost(DEFENCE, perc(.10, 4))), ELDER_1, ELDER_2, ELDER_3, ELDER_4); + add(combo(3, boost(RANGED, perc(.10, 4)), boost(DEFENCE, perc(.10, 4))), TWISTED_1, TWISTED_2, TWISTED_3, TWISTED_4); + add(combo(3, boost(MAGIC, perc(.10, 4)), boost(DEFENCE, perc(.10, 4))), KODAI_1, KODAI_2, KODAI_3, KODAI_4); + + // Skill potions + add(boost(AGILITY, 3), AGILITY_POTION1, AGILITY_POTION2, AGILITY_POTION3, AGILITY_POTION4); + add(boost(FISHING, 3), FISHING_POTION1, FISHING_POTION2, FISHING_POTION3, FISHING_POTION4); + add(boost(HUNTER, 3), HUNTER_POTION1, HUNTER_POTION2, HUNTER_POTION3, HUNTER_POTION4); + add(combo(2, boost(HITPOINTS, 5), heal(RUN_ENERGY, 5)), GUTHIX_REST1, GUTHIX_REST2, GUTHIX_REST3, GUTHIX_REST4); + + // Misc/run energy + add(heal(RUN_ENERGY, 10), WHITE_TREE_FRUIT); + add(heal(RUN_ENERGY, 30), STRANGE_FRUIT); + add(heal(RUN_ENERGY, 50), MINT_CAKE); + add(combo(food(12), heal(RUN_ENERGY, 50)), GOUT_TUBER); + + // Pies + add(combo(2, heal(HITPOINTS, 6), boost(FARMING, 3)), GARDEN_PIE, HALF_A_GARDEN_PIE); + add(combo(2, heal(HITPOINTS, 6), boost(FISHING, 3)), FISH_PIE, HALF_A_FISH_PIE); + add(combo(2, heal(HITPOINTS, 7), boost(HERBLORE, 4)), BOTANICAL_PIE, HALF_A_BOTANICAL_PIE); + add(combo(2, heal(HITPOINTS, 8), boost(CRAFTING, 4)), MUSHROOM_PIE, HALF_A_MUSHROOM_PIE); + add(combo(2, heal(HITPOINTS, 8), boost(FISHING, 5)), ADMIRAL_PIE, HALF_AN_ADMIRAL_PIE); + add(combo(2, heal(HITPOINTS, 11), boost(SLAYER, 5), boost(RANGED, 4)), WILD_PIE, HALF_A_WILD_PIE); + add(combo(2, heal(HITPOINTS, 11), boost(AGILITY, 5), heal(RUN_ENERGY, 10)), SUMMER_PIE, HALF_A_SUMMER_PIE); + + // Other + add(combo(range(food(1), food(3)), heal(RUN_ENERGY, 10)), PURPLE_SWEETS_10476); + add(new SpicyStew(), SPICY_STEW); + add(boost(MAGIC, perc(.10, 1)), IMBUED_HEART); + add(combo(boost(ATTACK, 2), boost(STRENGTH, 1), heal(DEFENCE, -1)), JANGERBERRIES); + + log.debug("{} items; {} behaviours loaded", effects.size(), new HashSet<>(effects.values()).size()); + } + + private final Map effects = new HashMap<>(); + + private void add(Effect effect, int... items) + { + assert items.length > 0; + for (int item : items) + { + Effect prev = effects.put(item, effect); + assert prev == null : "Item already added"; + } + } + + public Effect get(int id) + { + return effects.get(id); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesService.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesService.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesService.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesService.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesServiceImpl.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesServiceImpl.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesServiceImpl.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChangesServiceImpl.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatConfig.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatConfig.java index 34cec317a2..1bf4c37222 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatConfig.java @@ -92,6 +92,16 @@ public interface ItemStatConfig extends Config return false; } + @ConfigItem( + keyName = "showWeight", + name = "Show Weight", + description = "Show weight in tooltip" + ) + default boolean showWeight() + { + return true; + } + @ConfigItem( keyName = "colorBetterUncapped", name = "Better (Uncapped)", diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java index 263a371360..209e86aa41 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java @@ -28,14 +28,14 @@ import com.google.inject.Inject; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; -import api.Client; -import api.EquipmentInventorySlot; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.MenuEntry; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.MenuEntry; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.JagexColors; import net.runelite.client.ui.overlay.Overlay; @@ -189,7 +189,10 @@ public class ItemStatOverlay extends Overlay private String buildStatBonusString(ItemStats s) { final StringBuilder b = new StringBuilder(); - b.append(getChangeString("Weight", s.getWeight(), true, false)); + if (config.showWeight()) + { + b.append(getChangeString("Weight", s.getWeight(), true, false)); + } ItemStats other = null; final ItemEquipmentStats currentEquipment = s.getEquipment(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java index 6c0217ba5c..2b0e476677 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java @@ -34,24 +34,25 @@ import java.awt.FontMetrics; import java.util.List; import java.util.Map; import java.util.Set; -import api.Client; -import api.FontID; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; -import api.SpriteID; -import api.VarPlayer; -import api.Varbits; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.ScriptCallbackEvent; -import api.events.VarbitChanged; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetTextAlignment; -import api.widgets.WidgetType; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.FontID; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.SpriteID; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetTextAlignment; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -232,8 +233,8 @@ public class ItemStatPlugin extends Plugin Widget icon = invContainer.createChild(-1, WidgetType.GRAPHIC); icon.setOriginalX(8); icon.setOriginalY(yPos); - icon.setOriginalWidth(36); - icon.setOriginalHeight(32); + icon.setOriginalWidth(Constants.ITEM_SPRITE_WIDTH); + icon.setOriginalHeight(Constants.ITEM_SPRITE_HEIGHT); icon.setItemId(id); icon.setItemQuantityMode(0); icon.setBorderType(1); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Positivity.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Positivity.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/Positivity.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/Positivity.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/RangeStatBoost.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/RangeStatBoost.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/RangeStatBoost.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/RangeStatBoost.java index 265e9def1f..13011b9f6a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/RangeStatBoost.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/RangeStatBoost.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats; -import api.Client; +import net.runelite.api.Client; public class RangeStatBoost extends SingleEffect { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/RangeStatChange.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/RangeStatChange.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/RangeStatChange.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/RangeStatChange.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/SimpleStatBoost.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/SimpleStatBoost.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/SimpleStatBoost.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/SimpleStatBoost.java index b1dd0d5e35..3b6eccd4f8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/SimpleStatBoost.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/SimpleStatBoost.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.plugins.itemstats.delta.DeltaCalculator; import net.runelite.client.plugins.itemstats.stats.Stat; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/SingleEffect.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/SingleEffect.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/SingleEffect.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/SingleEffect.java index 1692187e4c..31059ac1b9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/SingleEffect.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/SingleEffect.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats; -import api.Client; +import net.runelite.api.Client; public abstract class SingleEffect implements Effect { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/StatBoost.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/StatBoost.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/StatBoost.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/StatBoost.java index ff36537f4a..ad40c469a4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/StatBoost.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/StatBoost.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.itemstats; import lombok.Getter; import lombok.Setter; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.plugins.itemstats.stats.Stat; public abstract class StatBoost extends SingleEffect diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/StatChange.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/StatChange.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/StatChange.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/StatChange.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/StatsChanges.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/StatsChanges.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/StatsChanges.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/StatsChanges.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaCalculator.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaCalculator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaCalculator.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaPercentage.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaPercentage.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaPercentage.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/delta/DeltaPercentage.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/food/Anglerfish.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/food/Anglerfish.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/food/Anglerfish.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/food/Anglerfish.java index 6f45550bd7..01e44eff8a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/food/Anglerfish.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/food/Anglerfish.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats.food; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.plugins.itemstats.FoodBase; public class Anglerfish extends FoodBase diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java index 4287ed08ec..bd2fbfa4b6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java @@ -25,12 +25,12 @@ package net.runelite.client.plugins.itemstats.potions; import com.google.common.collect.ImmutableSet; -import api.Client; -import api.EquipmentInventorySlot; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; import net.runelite.client.plugins.itemstats.StatBoost; import static net.runelite.client.plugins.itemstats.stats.Stats.PRAYER; import net.runelite.client.util.ItemUtil; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/SaradominBrew.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/SaradominBrew.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/SaradominBrew.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/SaradominBrew.java index f8c2c32bff..d4ee16fa1a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/SaradominBrew.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/SaradominBrew.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.itemstats.potions; import java.util.Comparator; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.plugins.itemstats.BoostedStatBoost; import static net.runelite.client.plugins.itemstats.Builders.perc; import net.runelite.client.plugins.itemstats.Effect; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/SuperRestore.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/SuperRestore.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/SuperRestore.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/SuperRestore.java index 14945fe376..d8180ae9e0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/potions/SuperRestore.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/SuperRestore.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.itemstats.potions; import java.util.Comparator; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; -import api.Client; +import net.runelite.api.Client; import static net.runelite.client.plugins.itemstats.Builders.perc; import net.runelite.client.plugins.itemstats.Effect; import net.runelite.client.plugins.itemstats.SimpleStatBoost; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java index 7dfed3a833..11c0bdc077 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java @@ -27,12 +27,12 @@ package net.runelite.client.plugins.itemstats.special; import com.google.common.collect.ImmutableSet; import java.util.Comparator; import java.util.stream.Stream; -import api.Client; -import api.EquipmentInventorySlot; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; import static net.runelite.client.plugins.itemstats.Builders.heal; import static net.runelite.client.plugins.itemstats.Builders.perc; import net.runelite.client.plugins.itemstats.Effect; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/special/SpicyStew.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/SpicyStew.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/special/SpicyStew.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/SpicyStew.java index e6c38e1909..25b7f019f8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/special/SpicyStew.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/SpicyStew.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.itemstats.special; import java.util.ArrayList; import java.util.List; -import api.Client; -import api.Varbits; +import net.runelite.api.Client; +import net.runelite.api.Varbits; import net.runelite.client.plugins.itemstats.Effect; import net.runelite.client.plugins.itemstats.Positivity; import net.runelite.client.plugins.itemstats.RangeStatChange; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/EnergyStat.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/EnergyStat.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/EnergyStat.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/EnergyStat.java index 98cd98ed84..ca4b05b892 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/EnergyStat.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/EnergyStat.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats.stats; -import api.Client; +import net.runelite.api.Client; public class EnergyStat extends Stat { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/SkillStat.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/SkillStat.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/SkillStat.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/SkillStat.java index a3af88eaba..892783e8b5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/SkillStat.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/SkillStat.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.itemstats.stats; -import api.Client; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.Skill; public class SkillStat extends Stat { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/Stat.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/Stat.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/Stat.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/Stat.java index fd51e4cd5d..6a481163e0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/Stat.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/Stat.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.itemstats.stats; -import api.Client; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.Skill; /** * Abstract stat of a player. diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/Stats.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/Stats.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/Stats.java rename to runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/Stats.java index 7395b1d761..8398ebff94 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/itemstats/stats/Stats.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/stats/Stats.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.itemstats.stats; -import api.Skill; +import net.runelite.api.Skill; public class Stats { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java similarity index 71% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java index e84b31a17d..cc14b5ff67 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.wasdcamera; +package net.runelite.client.plugins.keyremapping; import java.awt.event.KeyEvent; import net.runelite.client.config.Config; @@ -30,13 +30,35 @@ import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ModifierlessKeybind; -@ConfigGroup("wasdcamera") -public interface WASDCameraConfig extends Config +@ConfigGroup("keyremapping") +public interface KeyRemappingConfig extends Config { + @ConfigItem( + position = 0, + keyName = "hideDisplayName", + name = "Hide display name", + description = "Hides the display name from showing before \"Press Enter to Chat...\"" + ) + default boolean hideDisplayName() + { + return false; + } + @ConfigItem( position = 1, + keyName = "cameraRemap", + name = "Remap Camera", + description = "Configures whether the camera movement uses remapped keys" + ) + default boolean cameraRemap() + { + return true; + } + + @ConfigItem( + position = 2, keyName = "up", - name = "Up key", + name = "Camera Up key", description = "The key which will replace up." ) default ModifierlessKeybind up() @@ -45,9 +67,9 @@ public interface WASDCameraConfig extends Config } @ConfigItem( - position = 2, + position = 3, keyName = "down", - name = "Down key", + name = "Camera Down key", description = "The key which will replace down." ) default ModifierlessKeybind down() @@ -56,9 +78,9 @@ public interface WASDCameraConfig extends Config } @ConfigItem( - position = 3, + position = 4, keyName = "left", - name = "Left key", + name = "Camera Left key", description = "The key which will replace left." ) default ModifierlessKeybind left() @@ -67,13 +89,24 @@ public interface WASDCameraConfig extends Config } @ConfigItem( - position = 4, + position = 5, keyName = "right", - name = "Right key", + name = "Camera Right key", description = "The key which will replace right." ) default ModifierlessKeybind right() { return new ModifierlessKeybind(KeyEvent.VK_D, 0); } + + @ConfigItem( + position = 6, + keyName = "fkeyRemap", + name = "Remap F Keys", + description = "Configures whether F-Keys are Remapped to 1 (F1) through 0 (F10), '-' (F11), and '=' (F12)" + ) + default boolean fkeyRemap() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java new file mode 100644 index 0000000000..56cf3bbedc --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2018, Adam + * Copyright (c) 2018, Abexlry + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.keyremapping; + +import com.google.common.base.Strings; +import java.awt.event.KeyEvent; +import java.util.HashMap; +import java.util.Map; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.VarClientStr; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.Keybind; +import net.runelite.client.config.ModifierlessKeybind; +import net.runelite.client.input.KeyListener; +import net.runelite.client.input.MouseAdapter; + +class KeyRemappingListener extends MouseAdapter implements KeyListener +{ + private static final Keybind ONE = new ModifierlessKeybind(KeyEvent.VK_1, 0); + private static final Keybind TWO = new ModifierlessKeybind(KeyEvent.VK_2, 0); + private static final Keybind THREE = new ModifierlessKeybind(KeyEvent.VK_3, 0); + private static final Keybind FOUR = new ModifierlessKeybind(KeyEvent.VK_4, 0); + private static final Keybind FIVE = new ModifierlessKeybind(KeyEvent.VK_5, 0); + private static final Keybind SIX = new ModifierlessKeybind(KeyEvent.VK_6, 0); + private static final Keybind SEVEN = new ModifierlessKeybind(KeyEvent.VK_7, 0); + private static final Keybind EIGHT = new ModifierlessKeybind(KeyEvent.VK_8, 0); + private static final Keybind NINE = new ModifierlessKeybind(KeyEvent.VK_9, 0); + private static final Keybind ZERO = new ModifierlessKeybind(KeyEvent.VK_0, 0); + private static final Keybind MINUS = new ModifierlessKeybind(KeyEvent.VK_MINUS, 0); + private static final Keybind EQUALS = new ModifierlessKeybind(KeyEvent.VK_EQUALS, 0); + + @Inject + private KeyRemappingPlugin plugin; + + @Inject + private KeyRemappingConfig config; + + @Inject + private Client client; + + @Inject + private ClientThread clientThread; + + private final Map modified = new HashMap<>(); + + @Override + public void keyTyped(KeyEvent e) + { + } + + @Override + public void keyPressed(KeyEvent e) + { + if (client.getGameState() == GameState.LOGIN_SCREEN || !plugin.chatboxFocused()) + { + return; + } + + if (!plugin.isTyping()) + { + if (config.cameraRemap()) + { + if (config.up().matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_UP); + e.setKeyCode(KeyEvent.VK_UP); + } + else if (config.down().matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_DOWN); + e.setKeyCode(KeyEvent.VK_DOWN); + } + else if (config.left().matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_LEFT); + e.setKeyCode(KeyEvent.VK_LEFT); + } + else if (config.right().matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_RIGHT); + e.setKeyCode(KeyEvent.VK_RIGHT); + } + } + + // In addition to the above checks, the F-key remapping shouldn't + // activate when dialogs are open which listen for number keys + // to select options + if (config.fkeyRemap() && !plugin.isDialogOpen()) + { + if (ONE.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F1); + e.setKeyCode(KeyEvent.VK_F1); + } + else if (TWO.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F2); + e.setKeyCode(KeyEvent.VK_F2); + } + else if (THREE.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F3); + e.setKeyCode(KeyEvent.VK_F3); + } + else if (FOUR.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F4); + e.setKeyCode(KeyEvent.VK_F4); + } + else if (FIVE.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F5); + e.setKeyCode(KeyEvent.VK_F5); + } + else if (SIX.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F6); + e.setKeyCode(KeyEvent.VK_F6); + } + else if (SEVEN.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F7); + e.setKeyCode(KeyEvent.VK_F7); + } + else if (EIGHT.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F8); + e.setKeyCode(KeyEvent.VK_F8); + } + else if (NINE.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F9); + e.setKeyCode(KeyEvent.VK_F9); + } + else if (ZERO.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F10); + e.setKeyCode(KeyEvent.VK_F10); + } + else if (MINUS.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F11); + e.setKeyCode(KeyEvent.VK_F11); + } + else if (EQUALS.matches(e)) + { + modified.put(e.getKeyCode(), KeyEvent.VK_F12); + e.setKeyCode(KeyEvent.VK_F12); + } + } + + switch (e.getKeyCode()) + { + case KeyEvent.VK_ENTER: + case KeyEvent.VK_SLASH: + case KeyEvent.VK_COLON: + // refocus chatbox + plugin.setTyping(true); + clientThread.invoke(plugin::unlockChat); + break; + } + + } + else + { + switch (e.getKeyCode()) + { + case KeyEvent.VK_ENTER: + case KeyEvent.VK_ESCAPE: + plugin.setTyping(false); + clientThread.invoke(plugin::lockChat); + break; + case KeyEvent.VK_BACK_SPACE: + // Only lock chat on backspace when the typed text is now empty + if (Strings.isNullOrEmpty(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT))) + { + plugin.setTyping(false); + clientThread.invoke(plugin::lockChat); + } + break; + } + } + } + + @Override + public void keyReleased(KeyEvent e) + { + if (client.getGameState() == GameState.LOGIN_SCREEN) + { + return; + } + + if (plugin.chatboxFocused() && !plugin.isTyping()) + { + modified.remove(e.getKeyCode()); + + if (config.cameraRemap()) + { + if (config.up().matches(e)) + { + e.setKeyCode(KeyEvent.VK_UP); + } + else if (config.down().matches(e)) + { + e.setKeyCode(KeyEvent.VK_DOWN); + } + else if (config.left().matches(e)) + { + e.setKeyCode(KeyEvent.VK_LEFT); + } + else if (config.right().matches(e)) + { + e.setKeyCode(KeyEvent.VK_RIGHT); + } + } + + if (config.fkeyRemap()) + { + if (ONE.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F1); + } + else if (TWO.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F2); + } + else if (THREE.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F3); + } + else if (FOUR.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F4); + } + else if (FIVE.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F5); + } + else if (SIX.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F6); + } + else if (SEVEN.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F7); + } + else if (EIGHT.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F8); + } + else if (NINE.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F9); + } + else if (ZERO.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F10); + } + else if (MINUS.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F11); + } + else if (EQUALS.matches(e)) + { + e.setKeyCode(KeyEvent.VK_F12); + } + } + } + else + { + // press d + enter + release d - causes the right arrow to never be released + Integer m = modified.get(e.getKeyCode()); + if (m != null) + { + modified.remove(e.getKeyCode()); + e.setKeyCode(m); + } + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java similarity index 60% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java index 3aa38460ce..5b38cbdc25 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wasdcamera/WASDCameraPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.wasdcamera; +package net.runelite.client.plugins.keyremapping; import com.google.inject.Provides; import java.awt.Color; @@ -31,15 +31,16 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import api.Client; -import api.GameState; -import api.IconID; -import api.VarClientInt; -import api.VarClientStr; -import api.Varbits; -import api.events.ScriptCallbackEvent; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.IconID; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -50,12 +51,12 @@ import net.runelite.client.ui.JagexColors; import net.runelite.client.util.ColorUtil; @PluginDescriptor( - name = "WASD Camera", - description = "Allows use of WASD keys for camera movement with 'Press Enter to Chat'", - tags = {"enter", "chat"}, + name = "Key Remapping", + description = "Allows use of WASD keys for camera movement with 'Press Enter to Chat', and remapping number keys to F-keys", + tags = {"enter", "chat", "wasd", "camera"}, enabledByDefault = false ) -public class WASDCameraPlugin extends Plugin +public class KeyRemappingPlugin extends Plugin { private static final String PRESS_ENTER_TO_CHAT = "Press Enter to Chat..."; private static final String SCRIPT_EVENT_SET_CHATBOX_INPUT = "setChatboxInput"; @@ -68,13 +69,13 @@ public class WASDCameraPlugin extends Plugin private ClientThread clientThread; @Inject - private ConfigManager configManager; + private KeyRemappingConfig config; @Inject private KeyManager keyManager; @Inject - private WASDCameraListener inputListener; + private KeyRemappingListener inputListener; @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) @@ -83,7 +84,6 @@ public class WASDCameraPlugin extends Plugin @Override protected void startUp() throws Exception { - configManager.setConfiguration("runelite", "entertochatplugin", false); typing = false; keyManager.registerKeyListener(inputListener); @@ -111,9 +111,9 @@ public class WASDCameraPlugin extends Plugin } @Provides - WASDCameraConfig getConfig(ConfigManager configManager) + KeyRemappingConfig getConfig(ConfigManager configManager) { - return configManager.getConfig(WASDCameraConfig.class); + return configManager.getConfig(KeyRemappingConfig.class); } boolean chatboxFocused() @@ -128,7 +128,45 @@ public class WASDCameraPlugin extends Plugin // though the chatbox still has its key listener. Widget worldMapSearch = client.getWidget(WidgetInfo.WORLD_MAP_SEARCH); return worldMapSearch == null || client.getVar(VarClientInt.WORLD_MAP_SEARCH_FOCUSED) != 1; + } + /** + * Check if a dialog is open that will grab numerical input, to prevent F-key remapping + * from triggering. + * + * @return + */ + boolean isDialogOpen() + { + // Most chat dialogs with numerical input are added without the chatbox or its key listener being removed, + // so chatboxFocused() is true. The chatbox onkey script uses the following logic to ignore key presses, + // so we will use it too to not remap F-keys. + return isHidden(WidgetInfo.CHATBOX_MESSAGES) || isHidden(WidgetInfo.CHATBOX_TRANSPARENT_LINES); + } + + private boolean isHidden(WidgetInfo widgetInfo) + { + Widget w = client.getWidget(widgetInfo); + return w == null || w.isSelfHidden(); + } + + @Subscribe + public void onConfigChanged(ConfigChanged configChanged) + { + if (!configChanged.getGroup().equals("keyremapping") || !configChanged.getKey().equals("hideDisplayName")) + { + return; + } + + clientThread.invoke(() -> + { + Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); + if (chatboxInput != null && chatboxInput.getText().endsWith(PRESS_ENTER_TO_CHAT)) + { + chatboxInput.setText(getWaitingText()); + } + } + ); } @Subscribe @@ -142,7 +180,7 @@ public class WASDCameraPlugin extends Plugin { if (chatboxFocused() && !typing) { - chatboxInput.setText(getPlayerNameWithIcon() + ": " + PRESS_ENTER_TO_CHAT); + chatboxInput.setText(getWaitingText()); } } break; @@ -159,31 +197,25 @@ public class WASDCameraPlugin extends Plugin void lockChat() { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent != null && chatboxParent.getOnKeyListener() != null) + Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); + if (chatboxInput != null) { - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) - { - chatboxInput.setText(getPlayerNameWithIcon() + ": " + PRESS_ENTER_TO_CHAT); - } + chatboxInput.setText(getWaitingText()); + // Typed text can be non-empty on plugin start, so clear it now + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); } } void unlockChat() { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent != null) + Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); + if (chatboxInput != null) { - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) + if (client.getGameState() == GameState.LOGGED_IN) { - if (client.getGameState() == GameState.LOGGED_IN) - { - final boolean isChatboxTransparent = client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1; - final Color textColor = isChatboxTransparent ? JagexColors.CHAT_TYPED_TEXT_TRANSPARENT_BACKGROUND : JagexColors.CHAT_TYPED_TEXT_OPAQUE_BACKGROUND; - chatboxInput.setText(getPlayerNameWithIcon() + ": " + ColorUtil.wrapWithColorTag(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT) + "*", textColor)); - } + final boolean isChatboxTransparent = client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1; + final Color textColor = isChatboxTransparent ? JagexColors.CHAT_TYPED_TEXT_TRANSPARENT_BACKGROUND : JagexColors.CHAT_TYPED_TEXT_OPAQUE_BACKGROUND; + chatboxInput.setText(getPlayerNameWithIcon() + ": " + ColorUtil.wrapWithColorTag(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT) + "*", textColor)); } } } @@ -207,4 +239,16 @@ public class WASDCameraPlugin extends Plugin } return icon + client.getLocalPlayer().getName(); } + + private String getWaitingText() + { + if (config.hideDisplayName()) + { + return PRESS_ENTER_TO_CHAT; + } + else + { + return getPlayerNameWithIcon() + ": " + PRESS_ENTER_TO_CHAT; + } + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java index 8741e76ba7..17347b3aac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java @@ -28,13 +28,13 @@ import com.google.common.collect.ImmutableSet; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import static api.ItemID.TEAK_CHEST; -import api.VarPlayer; -import api.Varbits; -import api.events.GameStateChanged; -import api.events.VarbitChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import static net.runelite.api.ItemID.TEAK_CHEST; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Book.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Book.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Book.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Book.java index 16f7694d38..49f6ccf7f9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Book.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Book.java @@ -28,7 +28,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/BookPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/BookPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/BookPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/BookPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Bookcase.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Bookcase.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Bookcase.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Bookcase.java index 85ad504ae5..ee7d7d295d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Bookcase.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Bookcase.java @@ -30,7 +30,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; class Bookcase { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryOverlay.java index dd7c8532b1..5cf7910ee6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryOverlay.java @@ -38,13 +38,13 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; import lombok.AccessLevel; import lombok.Setter; -import api.Client; -import api.Perspective; -import static api.Perspective.getCanvasTilePoly; -import api.Player; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import static net.runelite.api.Perspective.getCanvasTilePoly; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java index f4881d514c..aea8d9b034 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java @@ -32,23 +32,23 @@ import java.util.regex.Pattern; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; -import api.AnimationID; -import api.ChatMessageType; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.MenuAction; -import api.Player; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.ItemContainerChanged; -import api.events.MenuOptionClicked; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.AnimationID; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.MenuAction; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; @@ -179,9 +179,9 @@ public class KourendLibraryPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked menuOpt) { - if (MenuAction.GAME_OBJECT_FIRST_OPTION == menuOpt.getMenuAction() && menuOpt.getMenuTarget().contains("Bookshelf")) + if (MenuAction.GAME_OBJECT_FIRST_OPTION == menuOpt.getMenuAction() && menuOpt.getTarget().contains("Bookshelf")) { - lastBookcaseClick = WorldPoint.fromScene(client, menuOpt.getActionParam(), menuOpt.getWidgetId(), client.getPlane()); + lastBookcaseClick = WorldPoint.fromScene(client, menuOpt.getActionParam0(), menuOpt.getActionParam1(), client.getPlane()); overlay.setHidden(false); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Library.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Library.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Library.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Library.java index 07d95b8926..23afd804a5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/Library.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/Library.java @@ -35,7 +35,7 @@ import java.util.stream.IntStream; import javax.inject.Singleton; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.kourendlibrary.Book.BYRNES_CORONATION_SPEECH; import static net.runelite.client.plugins.kourendlibrary.Book.DARK_MANUSCRIPT_13514; import static net.runelite.client.plugins.kourendlibrary.Book.DARK_MANUSCRIPT_13515; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/LibraryCustomer.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/LibraryCustomer.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/LibraryCustomer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/LibraryCustomer.java index f668f71ebb..04cb4829a1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/LibraryCustomer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/LibraryCustomer.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.kourendlibrary; import java.util.HashMap; import java.util.Map; import lombok.Getter; -import api.NpcID; +import net.runelite.api.NpcID; enum LibraryCustomer { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/SolvedState.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/SolvedState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/kourendlibrary/SolvedState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/SolvedState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickConfig.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickConfig.java index 35b699cba0..a10cee98c3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickConfig.java @@ -74,4 +74,15 @@ public interface LearnToClickConfig extends Config { return false; } + + @ConfigItem( + position = 5, + keyName = "hideOrbs", + name = "Hide Orbs", + description = "Completely hides the world map and special attack orbs" + ) + default boolean hideOrbs() + { + return false; + } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickPlugin.java similarity index 57% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickPlugin.java index 6623bef3af..cea339008b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/learntoclick/LearnToClickPlugin.java @@ -10,13 +10,18 @@ package net.runelite.client.plugins.learntoclick; +import com.google.common.collect.ImmutableList; import com.google.inject.Provides; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.MenuEntry; -import api.events.MenuEntryAdded; -import api.events.MenuShouldLeftClick; +import net.runelite.api.Client; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuShouldLeftClick; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -32,9 +37,13 @@ import org.apache.commons.lang3.ArrayUtils; type = PluginType.PVP, enabledByDefault = false ) + @Slf4j public class LearnToClickPlugin extends Plugin { + private static final ImmutableList ORB_WIDGETS = ImmutableList.of(WidgetInfo.MINIMAP_WORLDMAP_ORB, + WidgetInfo.MINIMAP_SPEC_ORB); + @Inject private LearnToClickConfig config; private boolean forceRightClickFlag; @@ -50,13 +59,44 @@ public class LearnToClickPlugin extends Plugin @Override protected void startUp() throws Exception { - } @Override protected void shutDown() throws Exception { forceRightClickFlag = false; + hideOrbWidgets(false); + } + + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (!event.getGroup().equals("learntoclick") && !event.getKey().equals("hideOrbs")) + { + return; + } + if (config.hideOrbs()) + { + hideOrbWidgets(true); + } + else + { + hideOrbWidgets(false); + } + + } + + @Subscribe + public void onWidgetLoaded(WidgetLoaded event) + { + if (!config.hideOrbs()) + { + return; + } + if (event.getGroupId() == WidgetID.MINIMAP_GROUP_ID) + { + hideOrbWidgets(true); + } } @Subscribe @@ -70,7 +110,10 @@ public class LearnToClickPlugin extends Plugin MenuEntry[] menuEntries = client.getMenuEntries(); for (MenuEntry entry : menuEntries) { - if ((entry.getOption().equals("Floating") && config.shouldRightClickMap()) || (entry.getOption().equals("Hide") && config.shouldRightClickXp()) || (entry.getOption().equals("Show") && config.shouldRightClickXp()) || (entry.getOption().equals("Auto retaliate") && config.shouldRightClickRetaliate())) + if ((entry.getOption().equals("Floating") && config.shouldRightClickMap()) || + (entry.getOption().equals("Hide") && config.shouldRightClickXp()) || (entry.getOption().equals("Show") + && config.shouldRightClickXp()) || (entry.getOption().equals("Auto retaliate") + && config.shouldRightClickRetaliate())) { event.setForceRightClick(true); return; @@ -81,7 +124,9 @@ public class LearnToClickPlugin extends Plugin @Subscribe public void onMenuEntryAdded(MenuEntryAdded event) { - if ((event.getOption().equals("Floating") && config.shouldRightClickMap()) || (event.getOption().equals("Hide") && config.shouldRightClickXp()) || (event.getOption().equals("Show") && config.shouldRightClickXp()) || (event.getOption().equals("Auto retaliate") && config.shouldRightClickRetaliate())) + if ((event.getOption().equals("Floating") && config.shouldRightClickMap()) || (event.getOption().equals("Hide") + && config.shouldRightClickXp()) || (event.getOption().equals("Show") && config.shouldRightClickXp()) || + (event.getOption().equals("Auto retaliate") && config.shouldRightClickRetaliate())) { forceRightClickFlag = true; } @@ -98,6 +143,14 @@ public class LearnToClickPlugin extends Plugin } client.setMenuEntries(entries); } + } + /** + * Toggles hiding the World map and special attack orb widgets + * @param hidden - hides the Widgets if true, un-hides them if false + */ + private void hideOrbWidgets(boolean hidden) + { + ORB_WIDGETS.forEach(widgetInfo -> client.getWidget(widgetInfo).setHidden(hidden)); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanPlugin.java similarity index 86% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanPlugin.java index 149b9364e0..e9eb807ca8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanPlugin.java @@ -24,7 +24,6 @@ */ package net.runelite.client.plugins.lizardmenshaman; -import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.util.HashMap; import java.util.Map; @@ -32,12 +31,14 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.Client; -import api.coords.LocalPoint; -import api.events.AnimationChanged; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; @@ -46,10 +47,11 @@ import net.runelite.client.ui.overlay.OverlayManager; @PluginDescriptor( name = "Lizard Shamans", description = "Configures timer for lizardmen shaman spawns.", - enabledByDefault = false, tags = {"shaman", "lizard", "lizardmen"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) + @Slf4j public class LizardmenShamanPlugin extends Plugin { @@ -93,6 +95,18 @@ public class LizardmenShamanPlugin extends Plugin spawns.clear(); } + @Subscribe + public void onChatMessage(ChatMessage event) + { + if (config.notifyOnSpawn()) + { + if (event.getMessage().contains(MESSAGE)) + { + notifier.notify(MESSAGE); + } + } + } + @Subscribe public void onAnimationChanged(AnimationChanged event) { @@ -101,17 +115,13 @@ public class LizardmenShamanPlugin extends Plugin { return; } - else if (actor.getName().equals(SHAMAN) && actor.getAnimation() == 7157) + + if (actor.getName().equals(SHAMAN) && actor.getAnimation() == 7157) { if (config.showTimer()) { spawns.put(event.getActor().getLocalLocation(), new LizardmenShamanSpawn(8.4, null)); } - - if (config.notifyOnSpawn()) - { - notifier.notify(MESSAGE); - } } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanSpawn.java b/runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanSpawn.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanSpawn.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/LizardmenShamanSpawn.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/ShamanSpawnOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/ShamanSpawnOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/ShamanSpawnOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/ShamanSpawnOverlay.java index ba8b4ecfc8..58f5c6a73a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lizardmenshaman/ShamanSpawnOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lizardmenshaman/ShamanSpawnOverlay.java @@ -30,9 +30,9 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java similarity index 82% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java index 87b7147ea3..b99efb6e62 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java @@ -33,12 +33,12 @@ import java.awt.event.KeyEvent; import java.io.IOException; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.client.events.SessionOpen; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.events.SessionOpen; import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; @@ -54,6 +54,7 @@ public class LoginScreenPlugin extends Plugin implements KeyListener { private static final int MAX_USERNAME_LENGTH = 254; private static final int MAX_PASSWORD_LENGTH = 20; + private static final int MAX_PIN_LENGTH = 6; @Inject private Client client; @@ -163,7 +164,9 @@ public class LoginScreenPlugin extends Plugin implements KeyListener @Override public void keyPressed(KeyEvent e) { - if (!config.pasteEnabled() || client.getGameState() != GameState.LOGIN_SCREEN) + if (!config.pasteEnabled() || ( + client.getGameState() != GameState.LOGIN_SCREEN && + client.getGameState() != GameState.LOGIN_SCREEN_AUTHENTICATOR)) { return; } @@ -182,16 +185,27 @@ public class LoginScreenPlugin extends Plugin implements KeyListener .toString() .trim(); - // 0 is username, 1 is password - if (client.getCurrentLoginField() == 0) + switch (client.getLoginIndex()) { - // Truncate data to maximum username length if necessary - client.setUsername(data.substring(0, Math.min(data.length(), MAX_USERNAME_LENGTH))); - } - else - { - // Truncate data to maximum password length if necessary - client.setPassword(data.substring(0, Math.min(data.length(), MAX_PASSWORD_LENGTH))); + // Username/password form + case 2: + if (client.getCurrentLoginField() == 0) + { + // Truncate data to maximum username length if necessary + client.setUsername(data.substring(0, Math.min(data.length(), MAX_USERNAME_LENGTH))); + } + else + { + // Truncate data to maximum password length if necessary + client.setPassword(data.substring(0, Math.min(data.length(), MAX_PASSWORD_LENGTH))); + } + + break; + // Authenticator form + case 4: + // Truncate data to maximum OTP code length if necessary + client.setOtp(data.substring(0, Math.min(data.length(), MAX_PIN_LENGTH))); + break; } } catch (UnsupportedFlavorException | IOException ex) @@ -206,4 +220,4 @@ public class LoginScreenPlugin extends Plugin implements KeyListener { } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssistOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssistOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssistOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssistOverlay.java index 58d16ef3c1..132c98e33c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssistOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssistOverlay.java @@ -7,11 +7,11 @@ import java.awt.Polygon; import java.text.DecimalFormat; import java.util.Map; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssistPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssistPlugin.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssistPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssistPlugin.java index 24141ded0a..7087ec423f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssistPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssistPlugin.java @@ -3,12 +3,12 @@ package net.runelite.client.plugins.lootassist; import com.google.inject.Provides; import java.util.concurrent.ConcurrentHashMap; import javax.inject.Inject; -import api.Actor; -import api.AnimationID; -import api.Player; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.GameStateChanged; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -23,6 +23,7 @@ import net.runelite.client.ui.overlay.OverlayManager; type = PluginType.PVP, enabledByDefault = false ) + public class LootAssistPlugin extends Plugin { @Inject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssitConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssitConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootAssitConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootAssitConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootPile.java b/runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootPile.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootPile.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootPile.java index a1ba13abcf..32fa145088 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootassist/LootPile.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lootassist/LootPile.java @@ -2,7 +2,7 @@ package net.runelite.client.plugins.lootassist; import lombok.Getter; import lombok.Setter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; class LootPile { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerOverlay.java index ce8bc9ee10..ecfe3dc5da 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerOverlay.java @@ -30,10 +30,10 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; @@ -41,10 +41,10 @@ import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; import net.runelite.client.ui.overlay.components.PanelComponent; -class LootingBagViewerOverlay extends Overlay +public class LootingBagViewerOverlay extends Overlay { private static final int INVENTORY_SIZE = 28; - private static final int PLACEHOLDER_WIDTH = 36; + public static final int PLACEHOLDER_WIDTH = 36; private static final int PLACEHOLDER_HEIGHT = 32; private static final ImageComponent PLACEHOLDER_IMAGE = new ImageComponent(new BufferedImage(PLACEHOLDER_WIDTH, PLACEHOLDER_HEIGHT, BufferedImage.TYPE_4BYTE_ABGR)); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerPlugin.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerPlugin.java index 1b04211ca2..aea700c292 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lootingbagviewer/LootingBagViewerPlugin.java @@ -38,6 +38,7 @@ import net.runelite.client.ui.overlay.OverlayManager; type = PluginType.PVP, enabledByDefault = false ) + public class LootingBagViewerPlugin extends Plugin { @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootRecordSortType.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootRecordSortType.java new file mode 100644 index 0000000000..6dc01e960c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootRecordSortType.java @@ -0,0 +1,54 @@ +package net.runelite.client.plugins.loottracker; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.stream.IntStream; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.loottracker.LootRecordType; + +/** + * + */ +@Slf4j +public enum LootRecordSortType implements Comparator +{ + TIMESTAMP + { + @Override + public int compare(LootTrackerRecord o1, LootTrackerRecord o2) + { + return Long.compare(o1.getTimestamp(), o2.getTimestamp()); + } + }, + TOTAL_VALUE + { + @Override + public int compare(LootTrackerRecord o1, LootTrackerRecord o2) + { + + // We want deaths at the bottom of the list + if (o1.getSubTitle().equals(LootRecordType.DEATH.name())) + { + return Arrays.stream(o1.getItems()).flatMapToInt(lootTrackerItem -> + IntStream.of((int) lootTrackerItem.getPrice() * lootTrackerItem.getQuantity())).sum(); + } + if (o2.getSubTitle().equals(LootRecordType.DEATH.name())) + { + return Arrays.stream(o1.getItems()).flatMapToInt(lootTrackerItem -> + IntStream.of((int) lootTrackerItem.getPrice() * lootTrackerItem.getQuantity())).sum(); + } + int sum = Arrays.stream(o1.getItems()).flatMapToInt(lootTrackerItem -> + IntStream.of((int) lootTrackerItem.getPrice() * lootTrackerItem.getQuantity())).sum(); + return sum + Arrays.stream(o2.getItems()).flatMapToInt(lootTrackerItem -> + IntStream.of((int) lootTrackerItem.getPrice() * lootTrackerItem.getQuantity())).sum(); + } + }, + ITEM_COUNT + { + @Override + public int compare(LootTrackerRecord o1, LootTrackerRecord o2) + { + return Integer.compare(o1.getItems().length, o2.getItems().length); + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index f37be3eb43..b111fde570 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -120,7 +120,8 @@ class LootTrackerBox extends JPanel private long getTotalKills() { return hideIgnoredItems - ? records.stream().filter(r -> !Arrays.stream(r.getItems()).allMatch(LootTrackerItem::isIgnored)).count() + ? records.stream().filter( + r -> !Arrays.stream(r.getItems()).allMatch(LootTrackerItem::isIgnored)).count() : records.size(); } @@ -229,7 +230,7 @@ class LootTrackerBox extends JPanel } } - if (quantity > 0) + if (quantity != 0) { int newQuantity = entry.getQuantity() + quantity; long pricePerItem = entry.getPrice() == 0 ? 0 : (entry.getPrice() / entry.getQuantity()); @@ -263,7 +264,7 @@ class LootTrackerBox extends JPanel imageLabel.setVerticalAlignment(SwingConstants.CENTER); imageLabel.setHorizontalAlignment(SwingConstants.CENTER); - AsyncBufferedImage itemImage = itemManager.getImage(item.getId(), item.getQuantity(), item.getQuantity() > 1); + AsyncBufferedImage itemImage = itemManager.getImage(item.getId(), Math.abs(item.getQuantity()), Math.abs(item.getQuantity()) > 1); if (item.isIgnored()) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java similarity index 59% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java index 597dcfddf9..03179c69b9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java @@ -35,7 +35,9 @@ public interface LootTrackerConfig extends Config @ConfigItem( keyName = "ignoredItems", name = "Ignored items", - description = "Configures which items should be ignored when calculating loot prices." + description = "Configures which items should be ignored when calculating loot prices.", + position = 0, + group = "Filters" ) default String getIgnoredItems() { @@ -80,4 +82,91 @@ public interface LootTrackerConfig extends Config { return true; } + + @ConfigItem( + keyName = "localPersistence", + name = "Local Record Persistence", + description = "Stores/syncs loot records locally in the JSON format. Note: records will not be saved locally" + + " if they are successfully saved online. " + ) + default boolean localPersistence() + { + return true; + } + + @ConfigItem( + keyName = "sortType", + name = "Sorting", + description = "The method for sorting Loot Tracker entries" + ) + default LootRecordSortType sortType() + { + return LootRecordSortType.TIMESTAMP; + } + + @ConfigItem( + keyName = "whitelistEnabled", + name = "NPC Whitelist", + description = "Only track drops from specific NPCs", + position = 1, + group = "Filters", + disabledBy = "blacklistEnabled" + ) + default boolean whitelistEnabled() + { + return false; + } + + @ConfigItem( + keyName = "getWhitelist", + name = "Whitelist", + description = "Comma-separated list of NPCs to track drops from", + position = 2, + group = "Filters", + hidden = true, + unhide = "whitelistEnabled" + ) + default String getWhitelist() + { + return ""; + } + + @ConfigItem( + keyName = "blacklistEnabled", + name = "NPC Blacklist", + description = "Track drops from all NPCs except for specified ones", + position = 3, + group = "Filters", + disabledBy = "whitelistEnabled" + ) + default boolean blacklistEnabled() + { + return false; + } + + @ConfigItem( + keyName = "getBlacklist", + name = "Blacklist", + description = "Comma-separated list of NPCs to not track drops from", + position = 4, + group = "Filters", + hidden = true, + unhide = "blacklistEnabled" + ) + default String getBlacklist() + { + return ""; + } + + @ConfigItem( + keyName = "lootValueMessage", + name = "Loot Value Messages", + description = "Sends a game message with the total value you of your loot when you get a kill", + position = 5 + ) + default boolean sendLootValueMessages() + { + return true; + } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index d9729ee97c..ac2d502ce5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -35,6 +35,7 @@ import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ImageIcon; @@ -43,6 +44,10 @@ import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.border.EmptyBorder; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.GameState; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; @@ -53,6 +58,7 @@ import net.runelite.client.util.ImageUtil; import net.runelite.client.util.StackFormatter; import net.runelite.http.api.loottracker.LootTrackerClient; +@Slf4j class LootTrackerPanel extends PluginPanel { private static final int MAX_LOOT_BOXES = 500; @@ -131,6 +137,11 @@ class LootTrackerPanel extends PluginPanel INVISIBLE_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(invisibleImg, -220)); } + private final JPanel displaySelector; + + @Getter @Setter + private LootRecordSortType lootRecordSortType = LootRecordSortType.TIMESTAMP; + LootTrackerPanel(final LootTrackerPlugin plugin, final ItemManager itemManager, final LootTrackerConfig config) { this.itemManager = itemManager; @@ -289,6 +300,11 @@ class LootTrackerPanel extends PluginPanel overallPanel.add(overallIcon, BorderLayout.WEST); overallPanel.add(overallInfo, BorderLayout.CENTER); + displaySelector = new JPanel(); + displaySelector.setLayout(new GridLayout(1, 1)); + displaySelector.setBorder(new EmptyBorder(2, 10, 10, 10)); + displaySelector.setBackground(ColorScheme.DARKER_GRAY_COLOR); + // Create reset all menu final JMenuItem reset = new JMenuItem("Reset All"); reset.addActionListener(e -> @@ -318,6 +334,7 @@ class LootTrackerPanel extends PluginPanel logsContainer.setLayout(new BoxLayout(logsContainer, BoxLayout.Y_AXIS)); layoutPanel.add(actionsContainer); layoutPanel.add(overallPanel); + layoutPanel.add(displaySelector); layoutPanel.add(logsContainer); // Add error pane @@ -335,10 +352,10 @@ class LootTrackerPanel extends PluginPanel * Creates a subtitle, adds a new entry and then passes off to the render methods, that will decide * how to display this new data. */ - void add(final String eventName, final int actorLevel, LootTrackerItem[] items) + void add(final String eventName, final String localUsername, final int actorLevel, LootTrackerItem[] items) { final String subTitle = actorLevel > -1 ? "(lvl-" + actorLevel + ")" : ""; - final LootTrackerRecord record = new LootTrackerRecord(eventName, subTitle, items, System.currentTimeMillis()); + final LootTrackerRecord record = new LootTrackerRecord( eventName, localUsername, subTitle, items, System.currentTimeMillis()); records.add(record); LootTrackerBox box = buildBox(record); if (box != null) @@ -405,23 +422,36 @@ class LootTrackerPanel extends PluginPanel /** * Rebuilds all the boxes from scratch using existing listed records, depending on the grouping mode. */ - private void rebuild() + public void rebuild() { + logsContainer.removeAll(); boxes.clear(); int start = 0; + records.sort(lootRecordSortType); if (!groupLoot && records.size() > MAX_LOOT_BOXES) { start = records.size() - MAX_LOOT_BOXES; } for (int i = start; i < records.size(); i++) { + + if (this.plugin.client.getGameState().equals(GameState.LOGGED_IN)) + { + if (!(this.plugin.client.getLocalPlayer().getName().equals(records.get(i).getLocalUsername()))) + { + continue; + } + } buildBox(records.get(i)); + } boxes.forEach(LootTrackerBox::rebuild); updateOverall(); logsContainer.revalidate(); logsContainer.repaint(); + + } /** @@ -431,12 +461,21 @@ class LootTrackerPanel extends PluginPanel */ private LootTrackerBox buildBox(LootTrackerRecord record) { + // If this record is not part of current view, return if (!record.matches(currentView)) { return null; } + if (this.plugin.client.getGameState().equals(GameState.LOGGED_IN)) + { + if (!(this.plugin.client.getLocalPlayer().getName().equals(record.getLocalUsername()))) + { + return null; + } + } + // Group all similar loot together if (groupLoot) { @@ -456,7 +495,8 @@ class LootTrackerPanel extends PluginPanel overallPanel.setVisible(true); // Create box - final LootTrackerBox box = new LootTrackerBox(itemManager, record.getTitle(), record.getSubTitle(), hideIgnoredItems, plugin::toggleItem); + final LootTrackerBox box = new LootTrackerBox(itemManager, record.getTitle(), record.getSubTitle(), + hideIgnoredItems, plugin::toggleItem); box.combine(record); // Create popup menu @@ -519,6 +559,14 @@ class LootTrackerPanel extends PluginPanel { continue; } + if (Objects.nonNull(record.getLocalUsername()) && Objects.nonNull(plugin.client.getLocalPlayer())) + { + if (!record.getLocalUsername().equals(plugin.client.getLocalPlayer().getName())) + { + + continue; + } + } int present = record.getItems().length; @@ -542,7 +590,6 @@ class LootTrackerPanel extends PluginPanel overallKillsLabel.setText(htmlLabel("Total count: ", overallKills)); overallGpLabel.setText(htmlLabel("Total value: ", overallGp)); } - private static String htmlLabel(String key, long value) { final String valueStr = StackFormatter.quantityToStackSize(value); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java similarity index 59% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index ba6a0cd29e..bea6d2d477 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -25,13 +25,25 @@ */ package net.runelite.client.plugins.loottracker; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.HashMultiset; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multiset; import com.google.common.collect.Multisets; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonStreamParser; +import com.google.gson.reflect.TypeToken; import com.google.inject.Provides; import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; +import java.nio.file.Files; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; @@ -49,21 +61,26 @@ import javax.swing.SwingUtilities; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.NPC; -import api.Player; -import api.SpriteID; -import api.coords.WorldPoint; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.ItemContainerChanged; -import api.events.WidgetLoaded; -import api.widgets.WidgetID; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemDefinition; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.SpriteID; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.LocalPlayerDeath; +import net.runelite.api.events.PlayerSpawned; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.WidgetID; +import net.runelite.client.RuneLite; import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager; import net.runelite.client.callback.ClientThread; @@ -87,6 +104,7 @@ import net.runelite.client.ui.NavigationButton; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.StackFormatter; import net.runelite.client.util.Text; +import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.loottracker.GameItem; import net.runelite.http.api.loottracker.LootRecord; import net.runelite.http.api.loottracker.LootRecordType; @@ -111,48 +129,52 @@ public class LootTrackerPlugin extends Plugin // Chest loot handling private static final String CHEST_LOOTED_MESSAGE = "You find some treasure in the chest!"; + private static final Pattern LARRAN_LOOTED_PATTERN = Pattern.compile("You have opened Larran's (big|small) chest .*"); private static final Map CHEST_EVENT_TYPES = ImmutableMap.of( 5179, "Brimstone Chest", - 11573, "Crystal Chest" + 11573, "Crystal Chest", + 12093, "Larran's big chest", + 13113, "Larran's small chest" ); - + private static final File LOOT_RECORDS_FILE = new File(RuneLite.RUNELITE_DIR, "lootRecords.json"); + private static final Set RESPAWN_REGIONS = ImmutableSet.of( + 12850, // Lumbridge + 11828, // Falador + 12342, // Edgeville + 11062 // Camelot + ); + // Player deaths + public static HashSet usernameSet = new HashSet(Arrays.stream(new String[]{"All Records"}).collect(Collectors.toList())); + @Inject + public Client client; + @VisibleForTesting + public Collection lootRecords = new ArrayList<>(); + private boolean pvpDeath = false; @Inject private ClientToolbar clientToolbar; - @Inject private ItemManager itemManager; - @Inject private ChatMessageManager chatMessageManager; - @Inject private SpriteManager spriteManager; - @Inject private LootTrackerConfig config; - - @Inject - private Client client; - @Inject private ClientThread clientThread; - @Inject private SessionManager sessionManager; - @Inject private ScheduledExecutorService executor; - private LootTrackerPanel panel; private NavigationButton navButton; private String eventType; - private List ignoredItems = new ArrayList<>(); - private Multiset inventorySnapshot; - @Getter(AccessLevel.PACKAGE) private LootTrackerClient lootTrackerClient; + private BufferedReader bufferedReader; + private JsonStreamParser jsonStreamParser; private static Collection stack(Collection items) { @@ -183,6 +205,13 @@ public class LootTrackerPlugin extends Plugin return list; } + private static Collection toGameItems(Collection items) + { + return items.stream() + .map(item -> new GameItem(item.getId(), item.getQuantity())) + .collect(Collectors.toList()); + } + @Provides LootTrackerConfig provideConfig(ConfigManager configManager) { @@ -209,14 +238,33 @@ public class LootTrackerPlugin extends Plugin lootTrackerClient = null; } + @Subscribe + public void onLocalPlayerDeath(LocalPlayerDeath event) + { + if (client.getVar(Varbits.IN_WILDERNESS) == 1 || WorldType.isPvpWorld(client.getWorldType())) + { + deathInventorySnapshot(); + pvpDeath = true; + } + } + @Subscribe public void onConfigChanged(ConfigChanged event) { if (event.getGroup().equals("loottracker")) { - ignoredItems = Text.fromCSV(config.getIgnoredItems()); - SwingUtilities.invokeLater(panel::updateIgnoredRecords); + if (event.getKey().equals("ignoredItems")) + { + ignoredItems = Text.fromCSV(config.getIgnoredItems()); + SwingUtilities.invokeLater(panel::updateIgnoredRecords); + } + if (event.getKey().equals("sortType")) + { + panel.setLootRecordSortType(config.sortType()); + SwingUtilities.invokeLater(panel::rebuild); + } } + } @Override @@ -238,9 +286,10 @@ public class LootTrackerPlugin extends Plugin clientToolbar.addNavigation(navButton); AccountSession accountSession = sessionManager.getAccountSession(); - if (accountSession != null) + LOOT_RECORDS_FILE.createNewFile(); + bufferedReader = Files.newBufferedReader(LOOT_RECORDS_FILE.toPath()); + if (accountSession != null || config.localPersistence()) { - lootTrackerClient = new LootTrackerClient(accountSession.getUuid()); clientThread.invokeLater(() -> { @@ -253,28 +302,45 @@ public class LootTrackerPlugin extends Plugin executor.submit(() -> { - Collection lootRecords; - if (!config.syncPanel()) + if (config.syncPanel() && lootTrackerClient != null) { - return; + lootTrackerClient = new LootTrackerClient(accountSession.getUuid()); + try + { + lootRecords = lootTrackerClient.get(); + } + catch (IOException e) + { + log.debug("Unable to look up loot", e); + return; + } + log.debug("Loaded {} remote data entries", lootRecords.size()); } - try + if (config.localPersistence()) { - lootRecords = lootTrackerClient.get(); - } - catch (IOException e) - { - log.debug("Unable to look up loot", e); - return; + try + { + lootRecords.addAll(RuneLiteAPI.GSON.fromJson(new FileReader(LOOT_RECORDS_FILE), + new TypeToken>() + { + }.getType())); + } + catch (IOException | NullPointerException e) + { + log.info("Couldn't load any locally stored loots."); + } + if (lootRecords.size() > 0) + { + log.info("Loaded {} locally stored loot records", lootRecords.size()); + } } - log.debug("Loaded {} data entries", lootRecords.size()); - + Collection finalLootRecords = lootRecords; clientThread.invokeLater(() -> { - Collection records = convertToLootTrackerRecord(lootRecords); + Collection records = convertToLootTrackerRecord(finalLootRecords); SwingUtilities.invokeLater(() -> panel.addRecords(records)); }); }); @@ -288,6 +354,7 @@ public class LootTrackerPlugin extends Plugin { clientToolbar.removeNavigation(navButton); lootTrackerClient = null; + lootRecords = new ArrayList(); } @Subscribe @@ -298,30 +365,82 @@ public class LootTrackerPlugin extends Plugin final String name = npc.getName(); final int combat = npc.getCombatLevel(); final LootTrackerItem[] entries = buildEntries(stack(items)); - SwingUtilities.invokeLater(() -> panel.add(name, combat, entries)); + String localUsername = client.getLocalPlayer().getName(); + + if (config.whitelistEnabled()) + { + final String configNpcs = config.getWhitelist().toLowerCase(); + List whitelist = Text.fromCSV(configNpcs); + if (!whitelist.contains(name.toLowerCase())) + { + return; + } + } + else if (config.blacklistEnabled()) + { + final String configNpcs = config.getBlacklist().toLowerCase(); + List blacklist = Text.fromCSV(configNpcs); + if (blacklist.contains(name.toLowerCase())) + { + return; + } + } + + SwingUtilities.invokeLater(() -> panel.add(name, localUsername, combat, entries)); + LootRecord lootRecord = new LootRecord(name, localUsername, LootRecordType.NPC, + toGameItems(items), Instant.now()); if (lootTrackerClient != null && config.saveLoot()) { - LootRecord lootRecord = new LootRecord(name, LootRecordType.NPC, toGameItems(items), Instant.now()); lootTrackerClient.submit(lootRecord); } + if (config.localPersistence()) + { + saveLocalLootRecord(lootRecord); + } + } + + @Subscribe + public void onPlayerSpawned(PlayerSpawned event) + { + if (event.getPlayer().equals(client.getLocalPlayer())) + { + SwingUtilities.invokeLater(() -> panel.rebuild()); + } } @Subscribe public void onPlayerLootReceived(final PlayerLootReceived playerLootReceived) { + if (config.sendLootValueMessages()) + { + if (WorldType.isDeadmanWorld(client.getWorldType()) || WorldType.isHighRiskWorld(client.getWorldType()) || WorldType.isPvpWorld(client.getWorldType()) || client.getVar(Varbits.IN_WILDERNESS) == 1) + { + final String totalValue = StackFormatter.quantityToRSStackSize(playerLootReceived.getItems().stream() + .mapToInt(itemStack -> itemManager.getItemPrice(itemStack.getId()) * itemStack.getQuantity()).sum()); + + chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.CONSOLE).runeLiteFormattedMessage( + new ChatMessageBuilder().append("The total value of your loot is " + totalValue + " GP.") + .build()).build()); + } + } final Player player = playerLootReceived.getPlayer(); final Collection items = playerLootReceived.getItems(); final String name = player.getName(); final int combat = player.getCombatLevel(); final LootTrackerItem[] entries = buildEntries(stack(items)); - SwingUtilities.invokeLater(() -> panel.add(name, combat, entries)); - + String localUsername = client.getLocalPlayer().getName(); + SwingUtilities.invokeLater(() -> panel.add(name, localUsername, combat, entries)); + LootRecord lootRecord = new LootRecord(name, localUsername, LootRecordType.PLAYER, + toGameItems(items), Instant.now()); if (lootTrackerClient != null && config.saveLoot()) { - LootRecord lootRecord = new LootRecord(name, LootRecordType.PLAYER, toGameItems(items), Instant.now()); lootTrackerClient.submit(lootRecord); } + if (config.localPersistence() && lootTrackerClient == null) + { + saveLocalLootRecord(lootRecord); + } } @Subscribe @@ -338,7 +457,7 @@ public class LootTrackerPlugin extends Plugin eventType = "Chambers of Xeric"; container = client.getItemContainer(InventoryID.CHAMBERS_OF_XERIC_CHEST); break; - case (WidgetID.THEATRE_OF_BLOOD_GROUP_ID): + case (WidgetID.THEATRE_OF_BLOOD_REWARD_GROUP_ID): int region = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()).getRegionID(); if (region != THEATRE_OF_BLOOD_REGION) { @@ -384,6 +503,11 @@ public class LootTrackerPlugin extends Plugin .build()); } + if (event.getGroupId() == WidgetID.CHATBOX_GROUP_ID) + { + panel.rebuild(); + } + // Convert container items to array of ItemStack final Collection items = Arrays.stream(container.getItems()) .filter(item -> item.getId() > 0) @@ -397,11 +521,12 @@ public class LootTrackerPlugin extends Plugin } final LootTrackerItem[] entries = buildEntries(stack(items)); - SwingUtilities.invokeLater(() -> panel.add(eventType, -1, entries)); + SwingUtilities.invokeLater(() -> panel.add(eventType, client.getLocalPlayer().getName(), -1, entries)); if (lootTrackerClient != null && config.saveLoot()) { - LootRecord lootRecord = new LootRecord(eventType, LootRecordType.EVENT, toGameItems(items), Instant.now()); + LootRecord lootRecord = new LootRecord(eventType, client.getLocalPlayer().getName(), LootRecordType.EVENT, + toGameItems(items), Instant.now()); lootTrackerClient.submit(lootRecord); } } @@ -416,7 +541,7 @@ public class LootTrackerPlugin extends Plugin final String message = event.getMessage(); - if (message.equals(CHEST_LOOTED_MESSAGE)) + if (message.equals(CHEST_LOOTED_MESSAGE) || LARRAN_LOOTED_PATTERN.matcher(message).matches()) { final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID(); if (!CHEST_EVENT_TYPES.containsKey(regionID)) @@ -470,6 +595,53 @@ public class LootTrackerPlugin extends Plugin @Subscribe public void onItemContainerChanged(ItemContainerChanged event) { + final ItemContainer itemContainer = event.getItemContainer(); + + if (pvpDeath && RESPAWN_REGIONS.contains(client.getLocalPlayer().getWorldLocation().getRegionID())) + { + Multiset snapshot = HashMultiset.create(); + snapshot = inventorySnapshot; + deathInventorySnapshot(); + if (inventorySnapshot != snapshot) + { + inventorySnapshot = snapshot; + ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); + if (inventorySnapshot != null) + { + Multiset currentInventory = HashMultiset.create(); + if (inventory != null) + { + Arrays.stream(client.getItemContainer(InventoryID.INVENTORY).getItems()) + .forEach(item -> currentInventory.add(item.getId(), item.getQuantity())); + } + + final Multiset diff = Multisets.difference(inventorySnapshot, currentInventory); + + List itemsLost = diff.entrySet().stream() + .map(e -> new ItemStack(e.getElement(), (-1 * e.getCount()), client.getLocalPlayer().getLocalLocation())) + .collect(Collectors.toList()); + + final LootTrackerItem[] entries = buildEntries(stack(itemsLost)); + String name = "Death: " + client.getLocalPlayer().getName(); + SwingUtilities.invokeLater(() -> panel.add(name, client.getLocalPlayer().getName(), + client.getLocalPlayer().getCombatLevel(), entries)); + LootRecord lootRecord = new LootRecord(name, client.getLocalPlayer().getName(), LootRecordType.DEATH, + toGameItems(itemsLost), Instant.now()); + if (lootTrackerClient != null && config.saveLoot()) + { + lootTrackerClient.submit(lootRecord); + } + if (config.localPersistence() && lootTrackerClient == null) + { + saveLocalLootRecord(lootRecord); + } + + pvpDeath = false; + inventorySnapshot = null; + } + } + + } if (eventType != null && (CHEST_EVENT_TYPES.containsValue(eventType) || HERBIBOR_EVENT.equals(eventType))) { if (event.getItemContainer() != client.getItemContainer(InventoryID.INVENTORY)) @@ -482,6 +654,58 @@ public class LootTrackerPlugin extends Plugin } } + private void saveLocalLootRecord(LootRecord lootRecord) + { + lootRecords.add(lootRecord); + try + { + BufferedWriter bufferedWriter = Files.newBufferedWriter(LOOT_RECORDS_FILE.toPath()); + + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.setPrettyPrinting(); + Gson gson = gsonBuilder.create(); + bufferedWriter.append(gson.toJson(lootRecords)); + bufferedWriter.close(); + } + catch (IOException e) + { + if (e instanceof FileNotFoundException) + { + try + { + LOOT_RECORDS_FILE.createNewFile(); + } + catch (IOException ex) + { + ex.printStackTrace(); + } + } + e.printStackTrace(); + } + } + + /** + * Takes a snapshot of the local player's inventory and equipment right before respawn. + */ + private void deathInventorySnapshot() + { + final ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); + final ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT); + inventorySnapshot = HashMultiset.create(); + if (inventory != null) + { + + Arrays.stream(inventory.getItems()) + .forEach(item -> inventorySnapshot.add(item.getId(), item.getQuantity())); + } + + if (equipment != null) + { + Arrays.stream(equipment.getItems()) + .forEach(item -> inventorySnapshot.add(item.getId(), item.getQuantity())); + } + } + private void takeInventorySnapshot() { final ItemContainer itemContainer = client.getItemContainer(InventoryID.INVENTORY); @@ -508,11 +732,12 @@ public class LootTrackerPlugin extends Plugin .collect(Collectors.toList()); final LootTrackerItem[] entries = buildEntries(stack(items)); - SwingUtilities.invokeLater(() -> panel.add(chestType, -1, entries)); + SwingUtilities.invokeLater(() -> panel.add(chestType, client.getLocalPlayer().getName(), -1, entries)); if (lootTrackerClient != null && config.saveLoot()) { - LootRecord lootRecord = new LootRecord(chestType, LootRecordType.EVENT, toGameItems(items), Instant.now()); + LootRecord lootRecord = new LootRecord(chestType, client.getLocalPlayer().getName(), + LootRecordType.EVENT, toGameItems(items), Instant.now()); lootTrackerClient.submit(lootRecord); } @@ -542,16 +767,26 @@ public class LootTrackerPlugin extends Plugin return ignoredItems.contains(name); } + @VisibleForTesting private LootTrackerItem buildLootTrackerItem(int itemId, int quantity) { - final ItemDefinition itemComposition = itemManager.getItemDefinition(itemId); - final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemId; - final long price = (long) itemManager.getItemPrice(realItemId) * (long) quantity; - final boolean ignored = ignoredItems.contains(itemComposition.getName()); + final ItemDefinition itemDefinition = itemManager.getItemDefinition(itemId); + final int realItemId = itemDefinition.getNote() != -1 ? itemDefinition.getLinkedNoteId() : itemId; + final long price; + // If it's a death we want to get a coin value for untradeables lost + if (!itemDefinition.isTradeable() && quantity < 0) + { + price = (long) itemDefinition.getPrice() * (long) quantity; + } + else + { + price = (long) itemManager.getItemPrice(realItemId) * (long) quantity; + } + final boolean ignored = ignoredItems.contains(itemDefinition.getName()); return new LootTrackerItem( itemId, - itemComposition.getName(), + itemDefinition.getName(), quantity, price, ignored); @@ -564,14 +799,7 @@ public class LootTrackerPlugin extends Plugin .toArray(LootTrackerItem[]::new); } - private static Collection toGameItems(Collection items) - { - return items.stream() - .map(item -> new GameItem(item.getId(), item.getQuantity())) - .collect(Collectors.toList()); - } - - private Collection convertToLootTrackerRecord(final Collection records) + public Collection convertToLootTrackerRecord(final Collection records) { Collection trackerRecords = new ArrayList<>(); for (LootRecord record : records) @@ -580,7 +808,8 @@ public class LootTrackerPlugin extends Plugin buildLootTrackerItem(itemStack.getId(), itemStack.getQty()) ).toArray(LootTrackerItem[]::new); - trackerRecords.add(new LootTrackerRecord(record.getEventId(), "", drops, -1)); + trackerRecords.add(new LootTrackerRecord(record.getEventId(), record.getUsername(), + "", drops, -1)); } return trackerRecords; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerRecord.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerRecord.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerRecord.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerRecord.java index a47dc0c07f..a92ff0009f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerRecord.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerRecord.java @@ -24,13 +24,16 @@ */ package net.runelite.client.plugins.loottracker; +import com.google.gson.annotations.SerializedName; import lombok.Value; @Value class LootTrackerRecord { private final String title; + private String localUsername; private final String subTitle; + @SerializedName("item_records") private final LootTrackerItem[] items; private final long timestamp; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java index e7661842ea..41caa93ebd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java @@ -25,9 +25,9 @@ package net.runelite.client.plugins.lowmemory; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/MaxHitPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/MaxHitPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/MaxHitPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/MaxHitPlugin.java index 77895a5e56..2315d2e2ca 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/MaxHitPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/MaxHitPlugin.java @@ -25,15 +25,15 @@ package net.runelite.client.plugins.maxhit; import javax.inject.Inject; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.events.ConfigChanged; -import api.events.ItemContainerChanged; -import api.events.VarbitChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -48,6 +48,7 @@ import net.runelite.client.plugins.maxhit.calculators.RangeMaxHitCalculator; type = PluginType.UTILITY, enabledByDefault = false ) + public class MaxHitPlugin extends Plugin { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/AttackStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/AttackStyle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/AttackStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/AttackStyle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/WeaponType.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/WeaponType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/WeaponType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/attackstyle/WeaponType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java index 7e8120ce94..8b14e3d988 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java @@ -24,12 +24,12 @@ */ package net.runelite.client.plugins.maxhit.calculators; -import api.Client; -import api.Item; -import api.Skill; -import api.Varbits; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.Skill; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.plugins.maxhit.config.EquipmentBonusConfig; import net.runelite.client.plugins.maxhit.config.SpellBaseDamageConfig; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculator.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculator.java index 2ab160dc5c..c868d3b25a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculator.java @@ -26,11 +26,11 @@ package net.runelite.client.plugins.maxhit.calculators; import java.util.ArrayList; import java.util.function.BiFunction; -import api.Client; -import api.Item; -import api.VarPlayer; -import api.Varbits; -import api.widgets.Widget; +import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; import net.runelite.client.plugins.maxhit.attackstyle.AttackStyle; import net.runelite.client.plugins.maxhit.attackstyle.WeaponType; import net.runelite.client.plugins.maxhit.config.CustomFormulaConfig; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MeleeMaxHitCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MeleeMaxHitCalculator.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MeleeMaxHitCalculator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MeleeMaxHitCalculator.java index f3a29bbce4..d3f6d78a0b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/MeleeMaxHitCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MeleeMaxHitCalculator.java @@ -24,11 +24,11 @@ */ package net.runelite.client.plugins.maxhit.calculators; -import api.Client; -import api.Item; -import api.Skill; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.Skill; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.plugins.maxhit.attackstyle.AttackStyle; import net.runelite.client.plugins.maxhit.config.EquipmentBonusConfig; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/RangeMaxHitCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/RangeMaxHitCalculator.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/RangeMaxHitCalculator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/RangeMaxHitCalculator.java index e88314c492..0b397e76d5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/calculators/RangeMaxHitCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/RangeMaxHitCalculator.java @@ -24,11 +24,11 @@ */ package net.runelite.client.plugins.maxhit.calculators; -import api.Client; -import api.Item; -import api.Skill; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.Skill; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; public class RangeMaxHitCalculator extends MeleeMaxHitCalculator { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/CustomFormulaConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/CustomFormulaConfig.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/CustomFormulaConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/CustomFormulaConfig.java index ab702a0697..51ec9c6234 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/CustomFormulaConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/CustomFormulaConfig.java @@ -28,10 +28,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.BiFunction; -import api.Client; -import api.EquipmentInventorySlot; -import api.ItemID; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.ItemID; +import net.runelite.api.Skill; import net.runelite.client.plugins.maxhit.calculators.MaxHitCalculator; import net.runelite.client.plugins.maxhit.equipment.EquipmentItemset; import net.runelite.client.plugins.maxhit.equipment.EquipmentSlotItem; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/EquipmentBonusConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/EquipmentBonusConfig.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/EquipmentBonusConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/EquipmentBonusConfig.java index 7dab67f64a..86915c66a8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/EquipmentBonusConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/EquipmentBonusConfig.java @@ -30,9 +30,9 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import api.Client; -import api.EquipmentInventorySlot; -import api.ItemID; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.ItemID; import net.runelite.client.plugins.maxhit.calculators.MaxHitCalculator; import net.runelite.client.plugins.maxhit.equipment.EquipmentCombatBonus; import net.runelite.client.plugins.maxhit.equipment.EquipmentItemset; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/PrayerBonusConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/PrayerBonusConfig.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/PrayerBonusConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/PrayerBonusConfig.java index 661fe9c3fb..fda776f170 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/PrayerBonusConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/PrayerBonusConfig.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.maxhit.config; -import api.Varbits; +import net.runelite.api.Varbits; import net.runelite.client.plugins.maxhit.calculators.MaxHitCalculator; public enum PrayerBonusConfig diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/SpellBaseDamageConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/SpellBaseDamageConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/config/SpellBaseDamageConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/config/SpellBaseDamageConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentCombatBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentCombatBonus.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentCombatBonus.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentCombatBonus.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentHelper.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentHelper.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentHelper.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentHelper.java index 5e86d46f35..e13dee215c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentHelper.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentHelper.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.maxhit.equipment; -import api.EquipmentInventorySlot; -import api.Item; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.Item; public class EquipmentHelper { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentItemset.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentItemset.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentItemset.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentItemset.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentSlotItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentSlotItem.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentSlotItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentSlotItem.java index c542a45096..53833123cb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentSlotItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/equipment/EquipmentSlotItem.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.maxhit.equipment; import java.util.ArrayList; -import api.EquipmentInventorySlot; +import net.runelite.api.EquipmentInventorySlot; public class EquipmentSlotItem { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/AutocastSpellRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/AutocastSpellRequirement.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/AutocastSpellRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/AutocastSpellRequirement.java index cd14494b27..e6e771281e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/AutocastSpellRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/AutocastSpellRequirement.java @@ -25,8 +25,8 @@ package net.runelite.client.plugins.maxhit.requirements; import java.util.ArrayList; -import api.Client; -import api.Varbits; +import net.runelite.api.Client; +import net.runelite.api.Varbits; import net.runelite.client.plugins.maxhit.config.SpellBaseDamageConfig; public class AutocastSpellRequirement implements Requirement diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemRequirement.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemRequirement.java index 4b4c2353f9..d0ed360f43 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemRequirement.java @@ -24,10 +24,10 @@ */ package net.runelite.client.plugins.maxhit.requirements; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; import net.runelite.client.plugins.maxhit.equipment.EquipmentHelper; import net.runelite.client.plugins.maxhit.equipment.EquipmentSlotItem; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemSetRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemSetRequirement.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemSetRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemSetRequirement.java index 81a73aef0e..31b322c02d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemSetRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/EquipmentItemSetRequirement.java @@ -24,10 +24,10 @@ */ package net.runelite.client.plugins.maxhit.requirements; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; import net.runelite.client.plugins.maxhit.equipment.EquipmentHelper; import net.runelite.client.plugins.maxhit.equipment.EquipmentItemset; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/Requirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/Requirement.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/Requirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/Requirement.java index 02f78d4517..48e9cc677a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/Requirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/Requirement.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.maxhit.requirements; -import api.Client; +import net.runelite.api.Client; public interface Requirement { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellBookRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellBookRequirement.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellBookRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellBookRequirement.java index a5d3bc2738..d59723577e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellBookRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellBookRequirement.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.maxhit.requirements; -import api.Client; -import api.Varbits; +import net.runelite.api.Client; +import net.runelite.api.Varbits; import net.runelite.client.plugins.maxhit.config.SpellBaseDamageConfig; public class SpellBookRequirement implements Requirement diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellRequirement.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellRequirement.java rename to runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellRequirement.java index f5cc08c7f0..4084044048 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/requirements/SpellRequirement.java @@ -24,8 +24,8 @@ */ package net.runelite.client.plugins.maxhit.requirements; -import api.Client; -import api.Varbits; +import net.runelite.api.Client; +import net.runelite.api.Varbits; import net.runelite.client.plugins.maxhit.config.SpellBaseDamageConfig; public class SpellRequirement implements Requirement diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java index e71a3a0be7..e6497432aa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java @@ -41,15 +41,22 @@ import net.runelite.client.plugins.menuentryswapper.util.MaxCapeMode; import net.runelite.client.plugins.menuentryswapper.util.NecklaceOfPassageMode; import net.runelite.client.plugins.menuentryswapper.util.ObeliskMode; import net.runelite.client.plugins.menuentryswapper.util.OccultAltarMode; +import net.runelite.client.plugins.menuentryswapper.util.QuestCapeMode; import net.runelite.client.plugins.menuentryswapper.util.RingOfWealthMode; import net.runelite.client.plugins.menuentryswapper.util.SkillsNecklaceMode; import net.runelite.client.plugins.menuentryswapper.util.SlayerRingMode; import net.runelite.client.plugins.menuentryswapper.util.XericsTalismanMode; +import net.runelite.client.plugins.menuentryswapper.util.teleEquippedMode; +import net.runelite.client.plugins.menuentryswapper.util.CharterOption; @ConfigGroup("menuentryswapper") public interface MenuEntrySwapperConfig extends Config { + //------------------------------------------------------------// + // Banking + //------------------------------------------------------------// + @ConfigItem( keyName = "withdrawOne", name = "Withdraw/Deposit One", @@ -194,13 +201,15 @@ public interface MenuEntrySwapperConfig extends Config return ""; } + //------------------------------------------------------------// + // Equipment Swapper //------------------------------------------------------------// @ConfigItem( keyName = "swapMax", name = "Swap Max Cape", description = "Enables swapping max cape options in worn interface.", - position = 11, + position = 0, group = "Equipment swapper" ) default boolean swapMax() @@ -208,11 +217,37 @@ public interface MenuEntrySwapperConfig extends Config return false; } + @ConfigItem( + keyName = "teleEquippedCape", + name = "Teleport Equipped Cape", + description = "Makes Teleport/Tele to POH the left click option on equip screen", + position = 1, + group = "Equipment swapper" + ) + default boolean teleEquippedCape() + { + return false; + } + + @ConfigItem( + keyName = "telecapeMode", + name = "ModeTeleCape", + description = "", + position = 2, + group = "Equipment swapper", + hidden = true, + unhide = "teleEquippedCape" + ) + default teleEquippedMode telecapeMode() + { + return teleEquippedMode.TELEPORT; + } + @ConfigItem( keyName = "maxMode", name = "Mode", description = "", - position = 12, + position = 3, group = "Equipment swapper", hidden = true, unhide = "swapMax" @@ -226,7 +261,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapArdougneCape", name = "Swap Ardougne Cape", description = "Enables swapping of 'Teleport' and 'Wear'.", - position = 13, + position = 4, group = "Equipment swapper" ) default boolean getSwapArdougneCape() @@ -238,7 +273,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapConstructionCape", name = "Swap Construction Cape", description = "Enables swapping of 'Teleport' and 'Wear'.", - position = 14, + position = 5, group = "Equipment swapper" ) default boolean getSwapConstructionCape() @@ -250,7 +285,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapCraftingCape", name = "Swap Crafting Cape", description = "Enables swapping of 'Teleport' and 'Wear'.", - position = 15, + position = 6, group = "Equipment swapper" ) default boolean getSwapCraftingCape() @@ -262,7 +297,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapMagicCape", name = "Swap Magic Cape", description = "Enables swapping of 'Spellbook' and 'Wear'.", - position = 16, + position = 7, group = "Equipment swapper" ) default boolean getSwapMagicCape() @@ -274,7 +309,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapExplorersRing", name = "Swap Explorer's Ring", description = "Enables swapping of 'Spellbook' and 'Wear'.", - position = 17, + position = 8, group = "Equipment swapper" ) default boolean getSwapExplorersRing() @@ -286,21 +321,49 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapAdmire", name = "Admire", description = "Swap 'Admire' with 'Teleport', 'Spellbook' and 'Perks' (max cape) for mounted skill capes.", - position = 18, + position = 9, group = "Equipment swapper" ) default boolean swapAdmire() { return true; } + + @ConfigItem( + keyName = "swapQuestCape", + name = "Swap Quest Cape", + description = "Enables swapping Quest cape options in worn interface.", + position = 10, + group = "Equipment swapper" + ) + default boolean swapQuestCape() + { + return false; + } + @ConfigItem( + keyName = "questCapeMode", + name = "Mode", + description = "", + position = 11, + group = "Equipment swapper", + hidden = true, + unhide = "swapQuestCape" + ) + default QuestCapeMode questCapeMode() + { + return QuestCapeMode.TELEPORT; + } + + //------------------------------------------------------------// + // Miscellaneous //------------------------------------------------------------// @ConfigItem( keyName = "customSwaps", name = "Custom Swaps", description = "Add custom swaps here, 1 per line. Syntax: option, target : option, target
    Note that the first entry should be the left click one!", - position = 19, + position = 0, group = "Miscellaneous", parse = true, clazz = Parse.class, @@ -315,7 +378,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "shiftClickCustomization", name = "Customizable Shift-click", description = "Allows customization of shift-clicks on items.", - position = 20, + position = 1, group = "Miscellaneous" ) default boolean shiftClickCustomization() @@ -323,11 +386,23 @@ public interface MenuEntrySwapperConfig extends Config return true; } + @ConfigItem( + keyName = "swapCoalBag", + name = "Swap Coal Bag Empty", + description = "Makes Empty the left click option when in a bank", + position = 2, + group = "Miscellaneous" + ) + default boolean swapCoalBag() + { + return true; + } + @ConfigItem( keyName = "swapBirdhouseEmpty", name = "Birdhouse", description = "Swap 'Interact' with 'Empty' for birdhouses on Fossil Island.", - position = 21, + position = 3, group = "Miscellaneous" ) default boolean swapBirdhouseEmpty() @@ -339,7 +414,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBones", name = "Bury", description = "Swap 'Bury' with 'Use' on Bones.", - position = 22, + position = 4, group = "Miscellaneous" ) default boolean swapBones() @@ -351,7 +426,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapChase", name = "Chase", description = "Allows to left click your cat to chase rats.", - position = 23, + position = 5, group = "Miscellaneous" ) default boolean swapChase() @@ -363,7 +438,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapHarpoon", name = "Harpoon", description = "Swap 'Cage', 'Big Net' with 'Harpoon' on Fishing spots.", - position = 24, + position = 6, group = "Miscellaneous" ) default boolean swapHarpoon() @@ -375,7 +450,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapOccult", name = "Occult Altar", description = "Swap 'Venerate' with 'Ancient', 'Lunar', or 'Arceuus' on an Altar of the Occult.", - position = 25, + position = 7, group = "Miscellaneous" ) default boolean swapOccult() @@ -387,7 +462,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "occultalter", name = "Mode", description = "", - position = 26, + position = 8, group = "Miscellaneous", hidden = true, unhide = "swapOccult" @@ -401,7 +476,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapHomePortal", name = "Home", description = "Swap 'Enter' with 'Home', 'Build' or 'Friend's house' on Portal.", - position = 27, + position = 9, group = "Miscellaneous" ) default boolean swapHomePortal() @@ -413,7 +488,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "home", name = "Mode", description = "", - position = 28, + position = 10, group = "Miscellaneous", hidden = true, unhide = "swapHomePortal" @@ -427,7 +502,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPrivate", name = "Private", description = "Swap 'Shared' with 'Private' on the Chambers of Xeric storage units.", - position = 29, + position = 11, group = "Miscellaneous" ) default boolean swapPrivate() @@ -439,7 +514,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPick", name = "Pick", description = "Swap 'Pick' with 'Pick-lots' of the Gourd tree in the Chambers of Xeric.", - position = 30, + position = 12, group = "Miscellaneous" ) default boolean swapPick() @@ -451,7 +526,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapQuick", name = "Quick Pass/Open/Start/Travel", description = "Swap 'Pass' with 'Quick-Pass', 'Open' with 'Quick-Open', 'Ring' with 'Quick-Start' and 'Talk-to' with 'Quick-Travel'.", - position = 31, + position = 13, group = "Miscellaneous" ) default boolean swapQuick() @@ -463,7 +538,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBoxTrap", name = "Reset", description = "Swap 'Check' with 'Reset' on box traps.", - position = 32, + position = 14, group = "Miscellaneous" ) default boolean swapBoxTrap() @@ -475,7 +550,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "rockCake", name = "Rock Cake Guzzle", description = "Enables Left Click 'Guzzle' on the Dwarven Rock Cake.", - position = 33, + position = 15, group = "Miscellaneous" ) default boolean rockCake() @@ -487,7 +562,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapRogueschests", name = "Rogues Chests", description = "Swap Rogues Chests from 'Open' to 'Search for traps'.", - position = 34, + position = 16, group = "Miscellaneous" ) default boolean swapRogueschests() @@ -499,7 +574,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapClimbUpDown", name = "Climb", description = "Swap 'Climb-Up'/'Climb-Down' depending on Shift or Control key.", - position = 35, + position = 17, group = "Miscellaneous" ) default boolean swapClimbUpDown() @@ -511,7 +586,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapStun", name = "Stun Hoop Snakes", description = "Swap 'Attack' with 'Stun'.", - position = 36, + position = 18, group = "Miscellaneous" ) default boolean swapStun() @@ -523,7 +598,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSearch", name = "Search", description = "Swap 'Close', 'Shut' with 'Search' on chests, cupboards, etc.", - position = 37, + position = 19, group = "Miscellaneous" ) default boolean swapSearch() @@ -535,7 +610,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapHardWoodGrove", name = "Hardwood Grove", description = "Swap 'Quick-Pay(100)' and 'Send-Parcel' at Hardwood Grove.", - position = 38, + position = 20, group = "Miscellaneous" ) default boolean swapHardWoodGrove() @@ -548,7 +623,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "removeObjects", name = "Remove Objects", description = "Removes interaction with the listed objects.", - position = 39, + position = 21, group = "Miscellaneous" ) default boolean getRemoveObjects() @@ -560,7 +635,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "removedObjects", name = "Objects", description = "Objects listed here will have all interaction be removed.", - position = 40, + position = 22, group = "Miscellaneous", hidden = true, unhide = "removeObjects" @@ -571,38 +646,38 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapslayer", - name = "Swap Slayer Ring", - description = "", - position = 41, - group = "Teleportation" - ) - default boolean getSlayerRing() + keyName = "swapImps", + name = "Impling Jars", + description = "Don't open implings if bank has a clue.", + position = 23, + group = "Miscellaneous" +) +default boolean swapImps() { return false; } - @ConfigItem( - keyName = "slayerringmode", - name = "Mode", - description = "", - position = 42, - group = "Teleportation", - hidden = true, - unhide = "swapslayer" - ) - default SlayerRingMode getSlayerRingMode() +@ConfigItem( + keyName = "charterOption", + name = "Trader Crew", + description = "Configure whether you want Charter or Trade to be the first option of Trader Crewmembers.", + position = 24, + group = "Miscellaneous" +) +default CharterOption charterOption() { - return SlayerRingMode.CHECK; + return CharterOption.TRADE; } + //------------------------------------------------------------// + // Shop / Stores //------------------------------------------------------------// @ConfigItem( keyName = "swapBuyOne", name = "Swappable Buy One", description = "", - position = 43, + position = 0, group = "Shop / stores" ) default boolean getSwapBuyOne() @@ -615,7 +690,7 @@ public interface MenuEntrySwapperConfig extends Config name = "Items", description = "", group = "Shop / stores", - position = 44, + position = 1, hidden = true, unhide = "swapBuyOne" ) @@ -628,7 +703,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBuyFive", name = "Swappable Buy Five", description = "", - position = 45, + position = 2, group = "Shop / stores" ) default boolean getSwapBuyFive() @@ -640,7 +715,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "buyFiveItems", name = "Items", description = "", - position = 46, + position = 3, group = "Shop / stores", hidden = true, unhide = "swapBuyFive" @@ -654,7 +729,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBuyTen", name = "Swappable Buy Ten", description = "", - position = 47, + position = 4, group = "Shop / stores" ) default boolean getSwapBuyTen() @@ -666,7 +741,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "buyTenItems", name = "Items", description = "", - position = 48, + position = 5, group = "Shop / stores", hidden = true, unhide = "swapBuyTen" @@ -680,7 +755,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBuyFifty", name = "Swappable Buy Fifty", description = "", - position = 49, + position = 6, group = "Shop / stores" ) default boolean getSwapBuyFifty() @@ -692,7 +767,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "buyFiftyItems", name = "Items", description = "", - position = 50, + position = 7, group = "Shop / stores", hidden = true, unhide = "swapBuyFifty" @@ -706,7 +781,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellOne", name = "Swappable Sell One", description = "", - position = 51, + position = 8, group = "Shop / stores" ) default boolean getSwapSellOne() @@ -718,7 +793,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellOneItems", name = "Items", description = "", - position = 52, + position = 9, group = "Shop / stores", hidden = true, unhide = "swapSellOne" @@ -732,7 +807,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellFive", name = "Swappable Sell Five", description = "", - position = 53, + position = 10, group = "Shop / stores" ) default boolean getSwapSellFive() @@ -744,7 +819,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellFiveItems", name = "Items", description = "", - position = 54, + position = 11, group = "Shop / stores", hidden = true, unhide = "swapSellFive" @@ -758,7 +833,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellTen", name = "Swappable Sell Ten", description = "", - position = 55, + position = 12, group = "Shop / stores" ) default boolean getSwapSellTen() @@ -770,7 +845,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellTenItems", name = "Items", description = "", - position = 56, + position = 13, group = "Shop / stores", hidden = true, unhide = "swapSellTen" @@ -784,7 +859,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellFifty", name = "Swappable Sell Fifty", description = "", - position = 57, + position = 14, group = "Shop / stores" ) default boolean getSwapSellFifty() @@ -796,7 +871,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellFiftyItems", name = "Items", description = "", - position = 58, + position = 15, group = "Shop / stores", hidden = true, unhide = "swapSellFifty" @@ -807,56 +882,32 @@ public interface MenuEntrySwapperConfig extends Config } //------------------------------------------------------------// - -/* @ConfigItem( - keyName = "easyConstruction", - name = "Easy Construction", - description = "Makes 'Remove'/'Build' the default option for listed item ID's in build mode.
    Tip: Use dev tools \"'Game Objects\" to find out the ID!", - position = 59, - group = "Skilling" - ) - default boolean getEasyConstruction() - { - return false; - } + // Skilling + //------------------------------------------------------------// @ConfigItem( - keyName = "constructionItems", - name = "Construction Items", - description = "Makes 'Remove'/'Build' the default option for listed item ID's in build mode.
    Tip: Use dev tools \"Game Objects\" to find out the ID, and separate values with a ','", - position = 60, - group = "Skilling", - hidden = true, - unhide = "easyConstruction" - ) - default String getConstructionItems() - { - return ""; - }*/ - - @ConfigItem( - keyName = "getTempConstruction", + keyName = "getEasyConstruction", name = "Easy Construction", description = "Makes 'Remove'/'Build' the default option for listed items.", - position = 59, + position = 0, group = "Skilling" ) - default boolean getTempConstruction() + default boolean getEasyConstruction() { return true; } @ConfigItem( - keyName = "getTempConstructionItems", + keyName = "getEasyConstructionItems", name = "Build Items", description = "", - position = 60, + position = 1, group = "Skilling", hidden = true, - unhide = "getTempConstruction" + unhide = "getEasyConstruction" ) - default String getTempConstructionItems() + default String getEasyConstructionItems() { return ""; } @@ -865,7 +916,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSmithing", name = "Swap Smithing", description = "Enables swapping of 'Smith-1' and 'Smith-all' options.", - position = 61, + position = 2, group = "Skilling" ) default boolean getSwapSmithing() @@ -877,7 +928,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapTanning", name = "Swap Tanning", description = "Enables swapping of 'Tan-1' and 'Tan-all' options.", - position = 62, + position = 3, group = "Skilling" ) default boolean getSwapTanning() @@ -889,7 +940,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSawmill", name = "Swap Sawmill Operator", description = "Makes 'Buy-plank' the default option on the Sawmill Operator.", - position = 63, + position = 4, group = "Skilling" ) default boolean getSwapSawmill() @@ -901,7 +952,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSawmillPlanks", name = "Swap Buy Planks", description = "Makes 'Buy All' the default option when buying planks.", - position = 64, + position = 5, group = "Skilling" ) default boolean getSwapSawmillPlanks() @@ -913,7 +964,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPuroPuro", name = "Swap Puro-Puro Wheat", description = "", - position = 65, + position = 6, group = "Skilling" ) default boolean getSwapPuro() @@ -921,13 +972,15 @@ public interface MenuEntrySwapperConfig extends Config return false; } + //------------------------------------------------------------// + // Talk-To //------------------------------------------------------------// @ConfigItem( keyName = "swapAssignment", name = "Assignment", description = "Swap 'Talk-to' with 'Assignment' for Slayer Masters. This will take priority over swapping Trade.", - position = 66, + position = 0, group = "Talk-To" ) default boolean swapAssignment() @@ -936,13 +989,13 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapBanker", - name = "Bank", - description = "Swap 'Talk-to' with 'Bank' on Bank NPCs.
    Example: Banker.", - position = 67, + keyName = "swapBankExchange", + name = "Bank/Exchange", + description = "Swap Talk-to with Bank or Exchange on NPC
    Example: Banker, Grand Exchange Clerk, Tool Leprechaun, Void Knight", + position = 1, group = "Talk-To" ) - default boolean swapBank() + default boolean swapBankExchange() { return true; } @@ -951,7 +1004,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapContract", name = "Contract", description = "Swap 'Talk-to' with 'Contract' on Guildmaster Jane.", - position = 68, + position = 2, group = "Talk-To" ) default boolean swapContract() @@ -959,71 +1012,24 @@ public interface MenuEntrySwapperConfig extends Config return true; } - @ConfigItem( - keyName = "claimDynamite", - name = "Claim Dynamite", - description = "Swap 'Talk-to' with 'Claim Dynamite' on Thirus.", - position = 69, - group = "Talk-To" - ) - default boolean claimDynamite() - { - return true; - } @ConfigItem( - keyName = "claimSlime", - name = "Claim Slime", - description = "Swap 'Talk-to' with 'Claim Slime' from Morytania diaries.", - position = 70, + keyName = "swapInteract", + name = "Interact", + description = "Swap options for generic interactions on NPCs
    Example: Decant for Bob Barter, Repairs for Dark Mage, Claim Slime for Robin, Claim Dynamite", + position = 3, group = "Talk-To" ) - default boolean claimSlime() - { - return true; - } - - @ConfigItem( - keyName = "swapDarkMage", - name = "Repairs", - description = "Swap 'Talk-to' with 'Repairs' for Dark Mage.", - position = 71, - group = "Talk-To" - ) - default boolean swapDarkMage() - { - return true; - } - - @ConfigItem( - keyName = "swapDecant", - name = "Decant", - description = "Swap 'Talk-to' with 'Decant' for Bob Barter and Murky Matt at the Grand Exchange.", - position = 72, - group = "Talk-To" - ) - default boolean swapDecant() + default boolean swapInteract() { return false; } - @ConfigItem( - keyName = "swapExchange", - name = "Exchange", - description = "Swap 'Talk-to' with 'Exchange' on various NPCs.
    Example: Grand Exchange Clerk, Tool Leprechaun, Void Knight.", - position = 73, - group = "Talk-To" - ) - default boolean swapExchange() - { - return true; - } - @ConfigItem( keyName = "swapPickpocket", - name = "Pickpocket on H.A.M.", - description = "Swap 'Talk-to' with 'Pickpocket' on H.A.M members.", - position = 74, + name = "Pickpocket", + description = "Swap Talk-to with Pickpocket on NPC
    Example: Man, Woman", + position = 4, group = "Talk-To" ) default boolean swapPickpocket() @@ -1035,7 +1041,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPay", name = "Pay", description = "Swap 'Talk-to' with 'Pay' on various NPCs.
    Example: Elstan, Heskel, Fayeth.", - position = 75, + position = 5, group = "Talk-To" ) default boolean swapPay() @@ -1047,7 +1053,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapAbyssTeleport", name = "Teleport to Abyss", description = "Swap 'Talk-to' with 'Teleport' for the Mage of Zamorak.", - position = 76, + position = 6, group = "Talk-To" ) default boolean swapAbyssTeleport() @@ -1059,7 +1065,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapTrade", name = "Trade", description = "Swap 'Talk-to' with 'Trade' on various NPCs.
    Example: Shop keeper, Shop assistant.", - position = 77, + position = 7, group = "Talk-To" ) default boolean swapTrade() @@ -1071,7 +1077,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapTravel", name = "Travel", description = "Swap 'Talk-to' with 'Travel', 'Take-boat', 'Pay-fare', 'Charter' on various NPCs.
    Example: Squire, Monk of Entrana, Customs officer, Trader Crewmember.", - position = 78, + position = 8, group = "Talk-To" ) default boolean swapTravel() @@ -1080,25 +1086,13 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapDream", - name = "Dream", - description = "Swap 'Talk-to' with 'Dream' for Dominic Onion.", - position = 79, + keyName = "swapMinigame", + name = "Minigames", + description = "Swap Talk-to with Start-Minigame, Story, Dream on NPC
    Example: Guardian mummy, Juna, Dominic Onion", + position = 9, group = "Talk-To" ) - default boolean swapDream() - { - return true; - } - - @ConfigItem( - keyName = "swapStory", - name = "Story", - description = "Swap 'Talk-to' with 'Story' for Juna at Tears of Guthix.", - position = 80, - group = "Talk-To" - ) - default boolean swapStory() + default boolean swapMinigame() { return true; } @@ -1107,7 +1101,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPlank", name = "Buy Planks", description = "Swap 'Talk-to' with 'Buy-planks' at the Lumber Yard.", - position = 81, + position = 10, group = "Talk-To" ) default boolean swapPlank() @@ -1119,7 +1113,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapMetamorphosis", name = "Metamorphosis", description = "Swap 'Talk-to' with 'Metamorphosis' for Baby Chinchompa pet.", - position = 82, + position = 11, group = "Talk-To" ) default boolean swapMetamorphosis() @@ -1128,24 +1122,26 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapEscort", - name = "Escort", - description = "Swap 'Talk-to' with 'Escort' for the Temple Trekking mini-game.", - position = 83, + keyName = "swapEnchant", + name = "Enchant", + description = "Swap Talk-to with Enchant for Eluned", + position = 12, group = "Talk-To" ) - default boolean swapEscort() + default boolean swapEnchant() { return true; } + //------------------------------------------------------------// + // Teleportation //------------------------------------------------------------// @ConfigItem( keyName = "swapFairyRing", name = "Fairy Ring", description = "Swap 'Zanaris' with 'Last-destination' or 'Configure' on Fairy rings.", - position = 84, + position = 0, group = "Teleportation" ) default boolean swapFairyRing() @@ -1157,7 +1153,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "fairyring", name = "Mode", description = "", - position = 85, + position = 1, group = "Teleportation", hidden = true, unhide = "swapFairyRing" @@ -1171,7 +1167,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapObelisk", name = "Obelisk", description = "Swap the options on wilderness obelisks between 'Activate', 'Set destination' or 'Teleport to destination'.", - position = 86, + position = 2, group = "Teleportation" ) default boolean swapObelisk() @@ -1183,7 +1179,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "obelisk", name = "Mode", description = "", - position = 87, + position = 3, group = "Teleportation", hidden = true, unhide = "swapObelisk" @@ -1197,7 +1193,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapTeleportItem", name = "Teleport Items", description = "Swap 'Wear' or 'Wield' with 'Rub' or 'Teleport' on teleport items.
    Example: Amulet of glory, Explorer's ring, Chronicle.", - position = 88, + position = 4, group = "Teleportation" ) default boolean swapTeleportItem() @@ -1209,7 +1205,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapWildernessLever", name = "Wilderness Lever", description = "Swap the wilderness lever left click to be Edgeville/Ardougne.", - position = 89, + position = 5, group = "Teleportation" ) default boolean swapWildernessLever() @@ -1221,7 +1217,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapNexus", name = "Portal Nexus", description = "Makes the teleport menu have priority over the left click destination on the portal nexus.", - position = 90, + position = 6, group = "Teleportation" ) default boolean swapNexus() @@ -1233,7 +1229,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapGamesNecklace", name = "Swap Games Necklace", description = "Swap the left click 'remove' option with the desired teleport location on a worn Games Necklace.", - position = 91, + position = 7, group = "Teleportation" ) default boolean getGamesNecklace() @@ -1245,7 +1241,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "gamesNecklaceMode", name = "Mode", description = "", - position = 92, + position = 8, group = "Teleportation", hidden = true, unhide = "swapGamesNecklace" @@ -1259,7 +1255,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapDuelingRing", name = "Swap Dueling Ring", description = "Swap the left click 'remove' option with the desired teleport location on a worn Ring of Dueling.", - position = 93, + position = 9, group = "Teleportation" ) default boolean getDuelingRing() @@ -1271,7 +1267,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "duelingRingMode", name = "Mode", description = "", - position = 94, + position = 10, group = "Teleportation", hidden = true, unhide = "swapDuelingRing" @@ -1285,7 +1281,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapGlory", name = "Swap Glory", description = "Swap the left click 'remove' option with the desired teleport location on a worn Amulet of Glory / Amulet of Eternal Glory.", - position = 95, + position = 11, group = "Teleportation" ) default boolean getGlory() @@ -1297,7 +1293,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "gloryMode", name = "Mode", description = "", - position = 96, + position = 12, group = "Teleportation", hidden = true, unhide = "swapGlory" @@ -1311,7 +1307,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSkill", name = "Swap Skill", description = "Swap the left click 'remove' option with the desired teleport location on a worn Skills Necklace.", - position = 97, + position = 13, group = "Teleportation" ) default boolean getSkillsNecklace() @@ -1323,7 +1319,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "skillsnecklacemode", name = "Mode", description = "", - position = 98, + position = 14, group = "Teleportation", hidden = true, unhide = "swapSkill" @@ -1337,7 +1333,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPassage", name = "Swap Passage", description = "Swap the left click 'remove' option with the desired teleport location on a worn Necklace of Passage.", - position = 99, + position = 15, group = "Teleportation" ) default boolean getNecklaceofPassage() @@ -1349,7 +1345,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "necklaceofpassagemode", name = "Mode", description = "", - position = 100, + position = 16, group = "Teleportation", hidden = true, unhide = "swapPassage" @@ -1363,7 +1359,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapDigsite", name = "Swap Digsite", description = "Swap the left click 'remove' option with the desired teleport location on a worn Digsite Pendant.", - position = 101, + position = 17, group = "Teleportation" ) default boolean getDigsitePendant() @@ -1375,7 +1371,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "digsitependantmode", name = "Mode", description = "", - position = 102, + position = 18, group = "Teleportation", hidden = true, unhide = "swapDigsite" @@ -1389,7 +1385,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapCombat", name = "Swap Combat", description = "Swap the left click 'remove' option with the desired teleport location on a worn Combat Bracelet.", - position = 103, + position = 19, group = "Teleportation" ) default boolean getCombatBracelet() @@ -1401,7 +1397,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "combatbraceletmode", name = "Mode", description = "", - position = 104, + position = 20, group = "Teleportation", hidden = true, unhide = "swapCombat" @@ -1415,7 +1411,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapburning", name = "Swap Burning", description = "Swap the left click 'remove' option with the desired teleport location on a worn Burning Amulet.", - position = 105, + position = 21, group = "Teleportation" ) default boolean getBurningAmulet() @@ -1427,7 +1423,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "burningamuletmode", name = "Mode", description = "", - position = 106, + position = 22, group = "Teleportation", hidden = true, unhide = "swapburning" @@ -1441,7 +1437,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapxeric", name = "Swap Xeric's", description = "Swap the left click 'remove' option with the desired teleport location on a worn Xeric's Talisman.", - position = 107, + position = 23, group = "Teleportation" ) default boolean getXericsTalisman() @@ -1453,7 +1449,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "xericstalismanmode", name = "Mode", description = "", - position = 108, + position = 24, group = "Teleportation", hidden = true, unhide = "swapxeric" @@ -1467,7 +1463,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapwealth", name = "Swap Wealth", description = "Swap the left click 'remove' option with the desired teleport location on a worn Ring of Wealth.", - position = 109, + position = 25, group = "Teleportation" ) default boolean getRingofWealth() @@ -1479,7 +1475,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "ringofwealthmode", name = "Mode", description = "", - position = 110, + position = 26, group = "Teleportation", hidden = true, unhide = "swapwealth" @@ -1489,13 +1485,41 @@ public interface MenuEntrySwapperConfig extends Config return RingOfWealthMode.GRAND_EXCHANGE; } + @ConfigItem( + keyName = "swapslayer", + name = "Swap Slayer Ring", + description = "", + position = 27, + group = "Teleportation" + ) + default boolean getSlayerRing() + { + return false; + } + + @ConfigItem( + keyName = "slayerringmode", + name = "Mode", + description = "", + position = 28, + group = "Teleportation", + hidden = true, + unhide = "swapslayer" + ) + default SlayerRingMode getSlayerRingMode() + { + return SlayerRingMode.CHECK; + } + + //------------------------------------------------------------// + // Right Click Options //------------------------------------------------------------// @ConfigItem( keyName = "hideExamine", name = "Hide Examine", description = "Hides the 'Examine' option from the right click menu.", - position = 111, + position = 0, group = "Right Click Options" ) default boolean hideExamine() @@ -1507,7 +1531,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideTradeWith", name = "Hide Trade With", description = "Hides the 'Trade with' option from the right click menu.", - position = 112, + position = 1, group = "Right Click Options" ) default boolean hideTradeWith() @@ -1519,7 +1543,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideReport", name = "Hide Report", description = "Hides the 'Report' option from the right click menu.", - position = 113, + position = 2, group = "Right Click Options" ) default boolean hideReport() @@ -1531,7 +1555,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideLookup", name = "Hide Lookup", description = "Hides the 'Lookup' option from the right click menu.", - position = 114, + position = 3, group = "Right Click Options" ) default boolean hideLookup() @@ -1543,7 +1567,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideNet", name = "Hide Net", description = "Hides the 'Net' option from the right click menu.", - position = 115, + position = 4, group = "Right Click Options" ) default boolean hideNet() @@ -1555,7 +1579,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideBait", name = "Hide Bait", description = "Hides the 'Bait' option from the right click menu.", - position = 116, + position = 5, group = "Right Click Options" ) default boolean hideBait() @@ -1563,17 +1587,107 @@ public interface MenuEntrySwapperConfig extends Config return false; } + //------------------------------------------------------------// + // Untradeables + //------------------------------------------------------------// + @ConfigItem( - keyName = "swapImps", - name = "Impling Jars", - description = "Don't open implings if bank has a clue.", - position = 117, - group = "Miscellaneous" + keyName = "hideDestroyRunepouch", + name = "Hide Destroy on Rune Pouch", + description = "Hides the 'Destroy' option when right clicking a Rune pouch.", + position = 0, + group = "Untradeables" ) - default boolean swapImps() + default boolean hideDestroyRunepouch() + { + return false; + } + + @ConfigItem( + keyName = "hideDestroyCoalbag", + name = "Hide Destroy on Coal bag", + description = "Hides the 'Destroy' option when right clicking a Coal bag.", + position = 1, + group = "Untradeables" + ) + default boolean hideDestroyCoalbag() + { + return false; + } + + @ConfigItem( + keyName = "hideDestroyHerbsack", + name = "Hide Destroy on Herb sack", + description = "Hides the 'Destroy' option when right clicking a Herb sack.", + position = 2, + group = "Untradeables" + ) + default boolean hideDestroyHerbsack() + { + return false; + } + + @ConfigItem( + keyName = "hideDestroyBoltpouch", + name = "Hide Destroy on Bolt pouch", + description = "Hides the 'Destroy' option when right clicking a Bolt pouch.", + position = 3, + group = "Untradeables" + ) + default boolean hideDestroyBoltpouch() + { + return false; + } + + @ConfigItem( + keyName = "hideDestroyGembag", + name = "Hide Destroy on Gem bag", + description = "Hides the 'Destroy' option when right clicking a Gem bag.", + position = 4, + group = "Untradeables" + ) + default boolean hideDestroyGembag() + { + return false; + } + + @ConfigItem( + keyName = "hideDropRunecraftingPouch", + name = "Hide Drop on RC pouches", + description = "Hides the 'Drop' option when right clicking a Small, Medium, Large, or Giant pouch.", + position = 5, + group = "Untradeables" + ) + default boolean hideDropRunecraftingPouch() { return false; } //------------------------------------------------------------// + // PVM + //------------------------------------------------------------// + + @ConfigItem( + keyName = "removeFreezePlayerToB", + name = "Remove freeze in ToB", + description = "Removes the freeze option for ice barrage, ice blitz, entangle etc. in ToB", + position = 0 + ) + + default boolean getRemoveFreezePlayerToB() + { + return true; + } + + @ConfigItem( + keyName = "removeFreezePlayerCoX", + name = "Remove freeze in CoX", + description = "Removes the freeze option for ice barrage, ice blitz, entangle etc. in CoX", + position = 1 + ) + + default boolean getRemoveFreezePlayerCoX() + { + return true; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java similarity index 81% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 97e5c64a79..f7f04ddef9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -32,6 +32,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -41,29 +42,30 @@ import java.util.Set; import javax.inject.Inject; import lombok.Getter; import lombok.Setter; -import api.Client; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.MenuAction; -import static api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; -import static api.MenuAction.WALK; -import api.MenuEntry; -import api.NPC; -import api.Player; -import static api.Varbits.BUILDING_MODE; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.FocusChanged; -import api.events.GameStateChanged; -import api.events.MenuEntryAdded; -import api.events.MenuOpened; -import api.events.MenuOptionClicked; -import api.events.PostItemDefinition; -import api.events.VarbitChanged; -import api.events.WidgetMenuOptionClicked; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.MenuAction; +import static net.runelite.api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; +import static net.runelite.api.MenuAction.WALK; +import net.runelite.api.MenuEntry; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Varbits; +import static net.runelite.api.Varbits.BUILDING_MODE; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOpened; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.PostItemDefinition; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetMenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -80,6 +82,7 @@ import net.runelite.client.plugins.menuentryswapper.util.FairyRingMode; import net.runelite.client.plugins.menuentryswapper.util.HouseMode; import net.runelite.client.plugins.menuentryswapper.util.ObeliskMode; import net.runelite.client.plugins.menuentryswapper.util.OccultAltarMode; +import net.runelite.client.plugins.menuentryswapper.util.CharterOption; import static net.runelite.client.util.MenuUtil.swap; import net.runelite.client.util.MiscUtils; import net.runelite.client.util.Text; @@ -92,6 +95,7 @@ import org.apache.commons.lang3.ArrayUtils; type = PluginType.UTILITY, enabledByDefault = false ) + public class MenuEntrySwapperPlugin extends Plugin { private static final String CONFIGURE = "Configure"; @@ -102,9 +106,17 @@ public class MenuEntrySwapperPlugin extends Plugin private static final String CONFIG_GROUP = "shiftclick"; private static final String ITEM_KEY_PREFIX = "item_"; private static final int PURO_PURO_REGION_ID = 10307; + private static final String WALK_HERE = "WALK HERE"; + private static final String CANCEL = "CANCEL"; + private static final String CAST_OPTIONS_ATTACK = "CAST"; + public static final HashSet CAST_OPTIONS_KEYWORDS = new HashSet<>(); + static + { + CAST_OPTIONS_KEYWORDS.add(CAST_OPTIONS_ATTACK); + } private MenuEntry[] entries; - private final Set leftClickConstructionIDs = new HashSet<>(); + private final Set leftClickConstructionItems = new HashSet<>(); private boolean buildingMode; private static final WidgetMenuOption FIXED_INVENTORY_TAB_CONFIGURE = new WidgetMenuOption(CONFIGURE, @@ -180,8 +192,7 @@ public class MenuEntrySwapperPlugin extends Plugin public void startUp() { addSwaps(); - //todo re-enable when fixed. - /*loadConstructionIDs(config.getConstructionItems());*/ + loadConstructionItems(config.getEasyConstructionItems()); if (config.shiftClickCustomization()) { @@ -195,8 +206,7 @@ public class MenuEntrySwapperPlugin extends Plugin public void shutDown() { disableCustomization(); - //todo re-enable when fixed. - /*loadConstructionIDs("");*/ + loadConstructionItems(""); loadCustomSwaps(""); // Removes all custom swaps removeSwaps(); } @@ -208,9 +218,8 @@ public class MenuEntrySwapperPlugin extends Plugin { return; } - //todo re-enable when fixed. - /*loadConstructionIDs(config.getConstructionItems());*/ + loadConstructionItems(config.getEasyConstructionItems()); removeSwaps(); addSwaps(); @@ -305,9 +314,8 @@ public class MenuEntrySwapperPlugin extends Plugin { return; } - //todo re-enable when fixed. - /*loadConstructionIDs(config.getConstructionItems());*/ + loadConstructionItems(config.getEasyConstructionItems()); } @Subscribe @@ -367,25 +375,40 @@ public class MenuEntrySwapperPlugin extends Plugin continue; } - int identifier = entry.getIdentifier(); - - Player[] players = client.getCachedPlayers(); - Player player = null; - - if (identifier >= 0 && identifier < players.length) + if (option.contains("destroy")) { - player = players[identifier]; + if (config.hideDestroyRunepouch() && entry.getTarget().contains("Rune pouch")) + { + continue; + } + if (config.hideDestroyCoalbag() && entry.getTarget().contains("Coal bag")) + { + continue; + } + if (config.hideDestroyHerbsack() && entry.getTarget().contains("Herb sack")) + { + continue; + } + if (config.hideDestroyBoltpouch() && entry.getTarget().contains("Bolt pouch")) + { + continue; + } + if (config.hideDestroyGembag() && entry.getTarget().contains("Gem bag")) + { + continue; + } } - if (player == null) + if (option.contains("drop")) { - menu_entries.add(entry); - continue; - } - - if ((option.contains("attack") || option.contains("cast")) && (player.isFriend() || player.isClanMember())) - { - continue; + if (config.hideDropRunecraftingPouch() && ( + entry.getTarget().contains("Small pouch") + || entry.getTarget().contains("Medium pouch") + || entry.getTarget().contains("Large pouch") + || entry.getTarget().contains("Giant pouch"))) + { + continue; + } } menu_entries.add(entry); @@ -457,20 +480,20 @@ public class MenuEntrySwapperPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (event.getMenuAction() != MenuAction.RUNELITE || event.getWidgetId() != WidgetInfo.INVENTORY.getId()) + if (event.getMenuAction() != MenuAction.RUNELITE || event.getActionParam1() != WidgetInfo.INVENTORY.getId()) { return; } - int itemId = event.getId(); + int itemId = event.getIdentifier(); if (itemId == -1) { return; } - String option = event.getMenuOption(); - String target = event.getMenuTarget(); + String option = event.getOption(); + String target = event.getTarget(); ItemDefinition itemComposition = client.getItemDefinition(itemId); if (option.equals(RESET) && target.equals(MENU_TARGET)) @@ -519,6 +542,7 @@ public class MenuEntrySwapperPlugin extends Plugin return; } + final String pOptionToReplace = Text.removeTags(event.getOption()).toUpperCase(); final int eventId = event.getIdentifier(); final String option = Text.standardize(event.getOption()); final String target = Text.standardize(event.getTarget()); @@ -588,7 +612,10 @@ public class MenuEntrySwapperPlugin extends Plugin } } - if (option.contains("buy")) + if ((option.contains("buy") || option.contains("value")) && Arrays.stream(entries).anyMatch(menuEntry -> + { + return menuEntry.getOption().toLowerCase().contains("buy"); + })) { if (config.getSwapBuyOne() && !config.getBuyOneItems().equals("")) { @@ -634,7 +661,10 @@ public class MenuEntrySwapperPlugin extends Plugin } } } - else if (option.contains("sell")) + else if ((option.contains("sell") || option.contains("value")) && Arrays.stream(entries).anyMatch(menuEntry -> + { + return menuEntry.getOption().toLowerCase().contains("sell"); + })) { if (config.getSwapSellOne() && !config.getSellOneItems().equals("")) { @@ -711,8 +741,10 @@ public class MenuEntrySwapperPlugin extends Plugin { if (event.getType() == WALK.getId()) { - MenuEntry menuEntry = entries[entries.length - 1]; + MenuEntry[] menuEntries = client.getMenuEntries(); + MenuEntry menuEntry = menuEntries[menuEntries.length - 1]; menuEntry.setType(MenuAction.WALK.getId() + MENU_ACTION_DEPRIORITIZE_OFFSET); + client.setMenuEntries(menuEntries); } else if (option.equalsIgnoreCase("examine")) { @@ -837,7 +869,7 @@ public class MenuEntrySwapperPlugin extends Plugin } } } - else if (target.equals("magpie impling jar") || (target.equals("nature impling jar"))) + else if (target.equals("magpie impling jar") || (target.equals("nature impling jar")) || (target.equals("ninja impling jar"))) { if (client.getItemContainer(InventoryID.INVENTORY) != null) { @@ -875,25 +907,43 @@ public class MenuEntrySwapperPlugin extends Plugin } } + //If the option is already to walk there, or cancel we don't need to swap it with anything + if (!pOptionToReplace.equals(CANCEL) && !pOptionToReplace.equals(WALK_HERE)) + { + Player[] players = client.getCachedPlayers(); + int identifier = event.getIdentifier(); + + if (identifier >= 0 && identifier < players.length) + { + Player player = players[identifier]; + if (player != null) + { + if (((config.getRemoveFreezePlayerCoX() && client.getVar(Varbits.IN_RAID) == 1) + || (config.getRemoveFreezePlayerToB() && client.getVar(Varbits.THEATRE_OF_BLOOD) == 2)) + && (player.isFriend() || player.isClanMember()) + && CAST_OPTIONS_KEYWORDS.contains(pOptionToReplace)) + { + addswap(pOptionToReplace); + } + } + } + } + if (option.equals("talk-to")) { - if (config.swapPickpocket() && target.contains("h.a.m.")) + if (config.swapPickpocket()) { swap(client, "pickpocket", option, target, true); } - if (config.swapAbyssTeleport() && target.contains("mage of zamorak")) - { - swap(client, "teleport", option, target, true); - } - if (config.swapHardWoodGrove() && target.contains("rionasta")) { swap(client, "send-parcel", option, target, true); } - if (config.swapBank()) + if (config.swapBankExchange()) { swap(client, "bank", option, target, true); + swap(client, "exchange", option, target, true); } if (config.swapContract()) @@ -901,14 +951,14 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "contract", option, target, true); } - if (config.swapExchange()) - { - swap(client, "exchange", option, target, true); - } - - if (config.swapDarkMage()) + if (config.swapInteract()) { swap(client, "repairs", option, target, true); + swap(client, "claim-slime", option, target, true); + swap(client, "decant", option, target, true); + swap(client, "claim", option, target, true); + swap(client, "heal", option, target, true); + swap(client, "help", option, target, true); } // make sure assignment swap is higher priority than trade swap for slayer masters @@ -922,20 +972,19 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "buy-plank", option, target, true); } - if (config.swapTrade()) + if (config.swapTrade() && (!(target.equals("trader crewmember") || target.equals("trader stan")) || config.charterOption().equals(CharterOption.TRADE))) { swap(client, "trade", option, target, true); swap(client, "trade-with", option, target, true); + swap(client, "shop", option, target, true); } - if (config.claimSlime() && target.equals("robin")) + if (config.swapMinigame()) { - swap(client, "claim-slime", option, target, true); - } - - if (config.claimDynamite() && target.contains("Thirus")) - { - swap(client, "claim-dynamite", option, target, true); + swap(client, "story", option, target, true); + swap(client, "escort", option, target, true); + swap(client, "dream", option, target, true); + swap(client, "start-minigame", option, target, true); } if (config.swapTravel()) @@ -950,6 +999,16 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "rellekka", option, target, true); swap(client, "follow", option, target, true); swap(client, "transport", option, target, true); + + if (config.swapAbyssTeleport() && target.contains("mage of zamorak")) + { + swap(client, "teleport", option, target, true); + } + + if (!(target.equals("trader crewmember") || target.equals("trader stan")) || config.charterOption().equals(CharterOption.CHARTER)) + { + swap(client, "charter", option, target, true); + } } if (config.swapPay()) @@ -958,30 +1017,16 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "pay (", option, target, false); } - if (config.swapDream()) - { - swap(client, "dream", option, target, true); - } - - if (config.swapDecant()) - { - swap(client, "decant", option, target, true); - } - if (config.swapQuick()) { swap(client, "quick-travel", option, target, true); } - if (config.swapStory()) + if (config.swapEnchant()) { - swap(client, "story", option, target, true); + swap(client, "enchant", option, target, true); } - if (config.swapEscort()) - { - swap(client, "escort", option, target, true); - } } else if (config.swapWildernessLever() && target.equals("lever") && option.equals("ardougne")) @@ -999,18 +1044,9 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "stun", option, target, true); } - else if (config.swapTravel() && option.equals("pass") && target.equals("energy barrier")) + else if (config.swapTravel() && (option.equals("pass") || option.equals("open"))) { - swap(client, "pay-toll(2-ecto)", option, target, true); - } - - else if (config.swapTravel() && option.equals("open") && target.equals("gate")) - { - swap(client, "pay-toll(10gp)", option, target, true); - } - else if (config.swapHardWoodGrove() && option.equals("open") && target.equals("hardwood grove doors")) - { - swap(client, "quick-pay(100)", option, target, true); + swap(client, "pay-toll", option, target, false); } else if (config.swapTravel() && option.equals("inspect") && target.equals("trapdoor")) { @@ -1131,7 +1167,14 @@ public class MenuEntrySwapperPlugin extends Plugin { swap(client, "quick-open", option, target, true); } - + else if (config.swapQuick() && option.equals("enter")) + { + swap(client, "quick-enter", option, target, true); + } + else if (config.swapQuick() && option.equals("leave tomb")) + { + swap(client, "quick-leave", option, target, true); + } else if (config.swapAdmire() && option.equals("admire")) { swap(client, "teleport", option, target, true); @@ -1176,17 +1219,14 @@ public class MenuEntrySwapperPlugin extends Plugin } // Put all item-related swapping after shift-click - else if (config.swapTeleportItem() && option.equals("wear")) + else if (config.swapTeleportItem() && (option.equals("wear") || option.equals("wield"))) { swap(client, "rub", option, target, true); swap(client, "teleport", option, target, true); } - else if (option.equals("wield")) + else if (config.swapCoalBag() && option.contains("deposit") && target.equals("coal bag")) { - if (config.swapTeleportItem()) - { - swap(client, "teleport", option, target, true); - } + swap(client, "empty", option, target, true); } else if (config.swapBones() && option.equals("bury")) { @@ -1196,37 +1236,6 @@ public class MenuEntrySwapperPlugin extends Plugin { swap(client, "teleport menu", option, target, true); } - - if (config.getTempConstruction() && buildingMode && !Strings.isNullOrEmpty(config.getTempConstructionItems())) - { - if (event.getType() == WALK.getId()) - { - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry menuEntry = menuEntries[menuEntries.length - 1]; - menuEntry.setType(MenuAction.WALK.getId() + MENU_ACTION_DEPRIORITIZE_OFFSET); - client.setMenuEntries(menuEntries); - } - - swap(client, "Build", option, target); - - MenuEntry[] entries = client.getMenuEntries(); - for (int i = entries.length - 1; i >= 0; i--) - { - for (String temp : config.getTempConstructionItems().split(",")) - { - if (temp.equalsIgnoreCase(Text.removeTags(entries[i].getTarget()))) - { - if (!entries[i].getOption().equalsIgnoreCase("remove")) - { - entries = ArrayUtils.remove(entries, i); - i--; - } - } - } - } - - client.setMenuEntries(entries); - } } @Subscribe @@ -1283,7 +1292,17 @@ public class MenuEntrySwapperPlugin extends Plugin if (!Strings.isNullOrEmpty(config)) { - Map split = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(config); + StringBuilder sb = new StringBuilder(); + + for (String str : config.split("\n")) + { + if (!str.startsWith("//")) + { + sb.append(str + "\n"); + } + } + + Map split = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(sb); for (Map.Entry entry : split.entrySet()) { @@ -1346,6 +1365,12 @@ public class MenuEntrySwapperPlugin extends Plugin menuManager.addSwap("remove", "burning amulet", config.getBurningAmuletMode().toString()); } + if (config.teleEquippedCape()) + { + menuManager.addSwap("remove", "tele to poh", config.telecapeMode().toString()); + menuManager.addSwap("remove", "teleport", config.telecapeMode().toString()); + } + if (config.getCombatBracelet()) { menuManager.addSwap("remove", "combat bracelet", config.getCombatBraceletMode().toString()); @@ -1402,6 +1427,10 @@ public class MenuEntrySwapperPlugin extends Plugin { menuManager.addSwap("remove", "max cape", config.maxMode().toString()); } + if (config.swapQuestCape()) + { + menuManager.addSwap("remove", "quest point cape", config.questCapeMode().toString()); + } } private void removeSwaps() @@ -1418,6 +1447,9 @@ public class MenuEntrySwapperPlugin extends Plugin menuManager.removeSwaps("slayer ring"); menuManager.removeSwaps("xeric's talisman"); menuManager.removeSwaps("ring of wealth"); + menuManager.removeSwaps("max cape"); + menuManager.removeSwaps("quest point cape"); + } private void delete(int target) @@ -1447,25 +1479,24 @@ public class MenuEntrySwapperPlugin extends Plugin return location.getRegionID() == PURO_PURO_REGION_ID; } } - //todo re-enable when fixed. -/* private void loadConstructionIDs(String from) + private void loadConstructionItems(String from) { if (client.getGameState() != GameState.LOGGED_IN - || Strings.isNullOrEmpty(from) && leftClickConstructionIDs.isEmpty()) + || Strings.isNullOrEmpty(from) && leftClickConstructionItems.isEmpty()) { return; } - if (!leftClickConstructionIDs.isEmpty()) + if (!leftClickConstructionItems.isEmpty()) { - for (int i : leftClickConstructionIDs) + for (String s : leftClickConstructionItems) { - menuManager.toggleLeftClick("build", i, true); - menuManager.toggleLeftClick("remove", i, true); + menuManager.removePriorityEntry("build", s); + menuManager.removePriorityEntry("remove", s); } - leftClickConstructionIDs.clear(); + leftClickConstructionItems.clear(); } if (config.getEasyConstruction() && @@ -1474,21 +1505,18 @@ public class MenuEntrySwapperPlugin extends Plugin { for (String s : Text.fromCSV(from)) { - int id = Integer.parseInt(s.replaceAll("[^0-9]", "")); - - if (leftClickConstructionIDs.contains(id)) + if (leftClickConstructionItems.contains(s)) { continue; } - if (menuManager.toggleLeftClick("build", id, false) - || menuManager.toggleLeftClick("remove", id, false)) - { - leftClickConstructionIDs.add(id); - } + menuManager.addPriorityEntry("build", s); + menuManager.addPriorityEntry("remove", s); + + leftClickConstructionItems.add(s); } } - }*/ + } void startShift() { @@ -1519,4 +1547,47 @@ public class MenuEntrySwapperPlugin extends Plugin { menuManager.removePriorityEntry("climb-down"); } + +/** + * Swaps menu entries if the entries could be found. This places Walk Here where the top level menu option was. + * @param pOptionToReplace The String containing the Menu Option that needs to be replaced. IE: "Attack", "Chop Down". + */ + private void addswap(String pOptionToReplace) + { + MenuEntry[] entries = client.getMenuEntries(); + Integer walkHereEntry = searchIndex(entries, WALK_HERE); + Integer entryToReplace = searchIndex(entries, pOptionToReplace); + + if (walkHereEntry != null + && entryToReplace != null) + { + MenuEntry walkHereMenuEntry = entries[walkHereEntry]; + entries[walkHereEntry] = entries[entryToReplace]; + entries[entryToReplace] = walkHereMenuEntry; + client.setMenuEntries(entries); + } + } + +/** + * Finds the index of the menu that contains the verbiage we are looking for. + * @param pMenuEntries The list of {@link MenuEntry}s. + * @param pMenuEntryToSearchFor The Option in the menu to search for. + * @return The index location or null if it was not found. + */ + private Integer searchIndex(MenuEntry[] pMenuEntries, String pMenuEntryToSearchFor) + { + Integer indexLocation = 0; + + for (MenuEntry menuEntry : pMenuEntries) + { + String entryOption = Text.removeTags(menuEntry.getOption()).toUpperCase(); + + if (entryOption.equals(pMenuEntryToSearchFor)) + { + return indexLocation; + } + indexLocation++; + } + return null; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java new file mode 100644 index 0000000000..d4e9785f5f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2019, Owain van Brakel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.menuentryswapper; + +import com.google.common.base.Splitter; + +public class Parse +{ + public static boolean parse(String value) + { + try + { + StringBuilder sb = new StringBuilder(); + + for (String str : value.split("\n")) + { + if (!str.startsWith("//")) + { + sb.append(str + "\n"); + } + } + + Splitter NEWLINE_SPLITTER = Splitter + .on("\n") + .omitEmptyStrings() + .trimResults(); + + NEWLINE_SPLITTER.withKeyValueSeparator(':').split(sb); + return true; + } + catch (IllegalArgumentException ex) + { + return false; + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/BurningAmuletMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/BurningAmuletMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/BurningAmuletMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/BurningAmuletMode.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CharterOption.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CharterOption.java new file mode 100644 index 0000000000..668d993dcb --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CharterOption.java @@ -0,0 +1,20 @@ +package net.runelite.client.plugins.menuentryswapper.util; + +public enum CharterOption +{ + TRADE("Trade"), + CHARTER("Charter"); + + private final String name; + + CharterOption(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return name; + } +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CombatBraceletMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CombatBraceletMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CombatBraceletMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CombatBraceletMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DigsitePendantMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DigsitePendantMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DigsitePendantMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DigsitePendantMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DuelingRingMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DuelingRingMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DuelingRingMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/DuelingRingMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/FairyRingMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/FairyRingMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/FairyRingMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/FairyRingMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GamesNecklaceMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GamesNecklaceMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GamesNecklaceMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GamesNecklaceMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GloryMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GloryMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GloryMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/GloryMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/HouseMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/HouseMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/HouseMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/HouseMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/MaxCapeMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/MaxCapeMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/MaxCapeMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/MaxCapeMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/NecklaceOfPassageMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/NecklaceOfPassageMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/NecklaceOfPassageMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/NecklaceOfPassageMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/ObeliskMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/ObeliskMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/ObeliskMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/ObeliskMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/OccultAltarMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/OccultAltarMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/OccultAltarMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/OccultAltarMode.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/QuestCapeMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/QuestCapeMode.java new file mode 100644 index 0000000000..813787bd10 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/QuestCapeMode.java @@ -0,0 +1,20 @@ +package net.runelite.client.plugins.menuentryswapper.util; + +public enum QuestCapeMode +{ + TRIM("Trim"), + TELEPORT ("Teleport"); + + private final String name; + + QuestCapeMode(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return name; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/RingOfWealthMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/RingOfWealthMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/RingOfWealthMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/RingOfWealthMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SkillsNecklaceMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SkillsNecklaceMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SkillsNecklaceMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SkillsNecklaceMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SlayerRingMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SlayerRingMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SlayerRingMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/SlayerRingMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/XericsTalismanMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/XericsTalismanMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/menuentryswapper/util/XericsTalismanMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/XericsTalismanMode.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/teleEquippedMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/teleEquippedMode.java new file mode 100644 index 0000000000..9f22bcbc3e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/teleEquippedMode.java @@ -0,0 +1,20 @@ +package net.runelite.client.plugins.menuentryswapper.util; + +public enum teleEquippedMode +{ + TELE_TO_POH("Tele to POH"), + TELEPORT("teleport"); + + private final String name; + + teleEquippedMode(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return name; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java new file mode 100644 index 0000000000..148d7e4255 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * Copyright (c) 2018, oplosthee + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.metronome; + +import com.google.inject.Provides; +import javax.inject.Inject; +import net.runelite.api.SoundEffectVolume; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.FloatControl; +import java.io.File; +import net.runelite.api.Client; +import net.runelite.api.SoundEffectID; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; + +@PluginDescriptor( + name = "Metronome", + description = "Play sounds in a customisable pattern", + tags = {"skilling", "tick", "timers"}, + enabledByDefault = false +) +public class MetronomePlugin extends Plugin +{ + @Inject + private Client client; + + @Inject + private MetronomePluginConfiguration config; + + private int tickCounter = 0; + private int tockCounter = 0; + private Clip tickClip; + private Clip tockClip; + + @Provides + MetronomePluginConfiguration provideConfig(ConfigManager configManager) + { + return configManager.getConfig(MetronomePluginConfiguration.class); + } + + private Clip GetAudioClip(String path) + { + File audioFile = new File(path); + if (audioFile.exists()) + { + AudioInputStream audioStream = null; + try + { + audioStream = AudioSystem.getAudioInputStream(audioFile); + } + catch (Exception e) + { + return null; + } + AudioFormat audioFormat = audioStream.getFormat(); + DataLine.Info audioInfo = new DataLine.Info(Clip.class, audioFormat); + try + { + Clip audioClip = AudioSystem.getClip(); + audioClip.open(audioStream); + FloatControl gainControl = (FloatControl) audioClip.getControl(FloatControl.Type.MASTER_GAIN); + float gainValue = (((float) config.volume()) * 40f / 100f) - 35f; + gainControl.setValue(gainValue); + return audioClip; + } + catch (Exception e) + { + return null; + } + } + return null; + } + + @Override + protected void startUp() + { + tickClip = GetAudioClip(config.tickPath()); + tockClip = GetAudioClip(config.tockPath()); + } + + @Override + protected void shutDown() + { + if (tickClip != null) + { + tickClip.close(); + } + if (tockClip != null) + { + tockClip.close(); + } + } + + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (event.getKey().equals("volume")) + { + float gainValue = (((float) config.volume()) * 40f / 100f) - 35f; + FloatControl gainControlTick = (FloatControl) tickClip.getControl(FloatControl.Type.MASTER_GAIN); + gainControlTick.setValue(gainValue); + FloatControl gainControlTock = (FloatControl) tockClip.getControl(FloatControl.Type.MASTER_GAIN); + gainControlTock.setValue(gainValue); + } + if (event.getKey().equals("tickSoundFilePath")) + { + if (tickClip != null) + { + tickClip.close(); + } + tickClip = GetAudioClip(config.tickPath()); + } + if (event.getKey().equals("tockSoundFilePath")) + { + if (tockClip != null) + { + tockClip.close(); + } + tockClip = GetAudioClip(config.tockPath()); + } + } + + @Subscribe + public void onGameTick(GameTick tick) + { + if (config.tickCount() == 0) + { + return; + } + + if ((++tickCounter + config.tickOffset()) % config.tickCount() == 0) + { + if (++tockCounter % config.tockNumber() == 0 & config.enableTock()) + { + if (tockClip == null) + { + client.playSoundEffect(SoundEffectID.GE_DECREMENT_PLOP, SoundEffectVolume.MEDIUM_HIGH); + } + else + { + if (tockClip.isRunning()) + { + tockClip.stop(); + } + tockClip.setFramePosition(0); + tockClip.start(); + } + } + else + { + if (tickClip == null) + { + client.playSoundEffect(SoundEffectID.GE_DECREMENT_PLOP, SoundEffectVolume.MEDIUM_HIGH); + } + else + { + if (tickClip.isRunning()) + { + tickClip.stop(); + } + tickClip.setFramePosition(0); + tickClip.start(); + } + } + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePluginConfiguration.java b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePluginConfiguration.java new file mode 100644 index 0000000000..27cca4ccec --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePluginConfiguration.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * Copyright (c) 2018, oplosthee + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.metronome; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Range; + +@ConfigGroup("metronome") +public interface MetronomePluginConfiguration extends Config +{ + @ConfigItem( + keyName = "tickCount", + name = "Tick count", + description = "Configures the number of game ticks between metronome sounds" + ) + default int tickCount() + { + return 1; + } + + @ConfigItem( + keyName = "enableTock", + name = "Enable tock (alternating) sound", + description = "Toggles whether to play \"tock\" sounds" + ) + default boolean enableTock() + { + return false; + } + + @ConfigItem( + keyName = "tockNumber", + name = "Tock every nth \"tick\"", + description = "Configures how many \"ticks\" between each \"tock\"" + ) + default int tockNumber() + { + return 2; + } + + @ConfigItem( + keyName = "tickOffset", + name = "Offset", + description = "Amount of ticks to offset the metronome (only useful for \"tocks\")" + ) + default int tickOffset() + { + return 0; + } + + @ConfigItem( + keyName = "tickSoundFilePath", + name = "Tick .wav file path", + description = "The path to the file to be used for \"tick\" sounds (short .wav only)" + ) + default String tickPath() + { + return ""; + } + + @ConfigItem( + keyName = "tockSoundFilePath", + name = "Tock .wav file path", + description = "The path to the file to be used for \"tock\" sounds (short .wav only)" + ) + default String tockPath() + { + return ""; + } + + @Range( + min = 0, + max = 100 + ) + @ConfigItem( + keyName = "volume", + name = "Volume modification", + description = "Configures tick/tock volume; only effects custom sounds." + ) + default int volume() + { + return 35; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java index a3120203bd..33e15bb3bd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java @@ -25,8 +25,8 @@ package net.runelite.client.plugins.minimap; import java.awt.Color; -import api.Client; -import api.Sprite; +import net.runelite.api.Client; +import net.runelite.api.Sprite; public class MinimapDot { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java index 05207bcbfe..d68e6f56f4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java @@ -28,14 +28,14 @@ import com.google.inject.Provides; import java.awt.Color; import java.util.Arrays; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.Sprite; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.WidgetHiddenChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Sprite; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningCoalBagOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningCoalBagOverlay.java new file mode 100644 index 0000000000..2acbf90aa8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningCoalBagOverlay.java @@ -0,0 +1,63 @@ +/* + * Copyright 2019 Jarred Vardy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.mining; + +import java.awt.Color; +import java.awt.Graphics2D; +import javax.inject.Inject; +import net.runelite.api.ItemID; +import net.runelite.api.Point; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.overlay.WidgetItemOverlay; + +public class MiningCoalBagOverlay extends WidgetItemOverlay +{ + private final MiningPlugin plugin; + private final MiningConfig config; + + @Inject + MiningCoalBagOverlay(MiningPlugin plugin, MiningConfig config) + { + showOnInventory(); + this.plugin = plugin; + this.config = config; + } + + @Override + public void renderItemOverlay(Graphics2D graphics, int itemId, WidgetItem itemWidget) + { + if (!config.showCoalBagOverlay() || (itemId != ItemID.COAL_BAG && itemId != ItemID.COAL_BAG_12019)) + { + return; + } + + graphics.setFont(FontManager.getRunescapeSmallFont()); + graphics.setColor(Color.WHITE); + Point location = itemWidget.getCanvasLocation(); + + graphics.drawString(config.amountOfCoalInCoalBag() + "", location.getX(), location.getY() + 14); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/metronome/MetronomePluginConfiguration.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningConfig.java similarity index 66% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/metronome/MetronomePluginConfiguration.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningConfig.java index cb2ff60889..1d01ce3707 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/metronome/MetronomePluginConfiguration.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningConfig.java @@ -1,56 +1,62 @@ -/* - * Copyright (c) 2018, SomeoneWithAnInternetConnection - * Copyright (c) 2018, oplosthee - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.metronome; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup("metronome") -public interface MetronomePluginConfiguration extends Config -{ - @ConfigItem( - keyName = "tickCount", - name = "Tick count", - description = "Configures the tick on which a sound will be played", - position = 2 - ) - default int tickCount() - { - return 1; - } - - @ConfigItem( - keyName = "enableTock", - name = "Enable tock (alternating) sound", - description = "Toggles whether to play two alternating sounds", - position = 3 - ) - default boolean enableTock() - { - return false; - } -} +/* + * Copyright 2019 Jarred Vardy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.mining; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("mining") +public interface MiningConfig extends Config +{ + @ConfigItem( + keyName = "showCoalBagOverlay", + name = "Show coal bag overlay", + description = "Overlays how much coal is inside of your coal bag" + ) + default boolean showCoalBagOverlay() + { + return true; + } + + @ConfigItem( + keyName = "amountOfCoalInCoalBag", + name = "", + description = "To store coal amount between sessions", + hidden = true + ) + default int amountOfCoalInCoalBag() + { + return 0; + } + + @ConfigItem( + keyName = "amountOfCoalInCoalBag", + name = "", + description = "Overload to set coal amount", + hidden = true + ) + void amountOfCoalInCoalBag(int amount); +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java new file mode 100644 index 0000000000..3ce12efcf7 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.mining; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.time.Instant; +import java.util.Iterator; +import java.util.List; +import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.ProgressPieComponent; + +class MiningOverlay extends Overlay +{ + // Range of Motherlode vein respawn time not 100% confirmed but based on observation + @Getter(AccessLevel.PACKAGE) + public static final int ORE_VEIN_MAX_RESPAWN_TIME = 123; + private static final int ORE_VEIN_MIN_RESPAWN_TIME = 90; + private static final float ORE_VEIN_RANDOM_PERCENT_THRESHOLD = (float) ORE_VEIN_MIN_RESPAWN_TIME / ORE_VEIN_MAX_RESPAWN_TIME; + private static final Color DARK_GREEN = new Color(0, 100, 0); + + private final Client client; + private final MiningPlugin plugin; + + @Inject + private MiningOverlay(Client client, MiningPlugin plugin) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_SCENE); + this.plugin = plugin; + this.client = client; + } + + @Override + public Dimension render(Graphics2D graphics) + { + List respawns = plugin.getRespawns(); + if (respawns.isEmpty()) + { + return null; + } + + Instant now = Instant.now(); + for (Iterator it = respawns.iterator(); it.hasNext();) + { + Color pieFillColor = Color.YELLOW; + Color pieBorderColor = Color.ORANGE; + RockRespawn rockRespawn = it.next(); + float percent = (now.toEpochMilli() - rockRespawn.getStartTime().toEpochMilli()) / (float) rockRespawn.getRespawnTime(); + WorldPoint worldPoint = rockRespawn.getWorldPoint(); + LocalPoint loc = LocalPoint.fromWorld(client, worldPoint); + if (loc == null || percent > 1.0f) + { + it.remove(); + continue; + } + + Point point = Perspective.localToCanvas(client, loc, client.getPlane(), rockRespawn.getZOffset()); + if (point == null) + { + it.remove(); + continue; + } + + // Recolour pie on motherlode veins during the portion of the timer where they may respawn + if (rockRespawn.getRock() == Rock.ORE_VEIN && percent > ORE_VEIN_RANDOM_PERCENT_THRESHOLD) + { + pieFillColor = Color.GREEN; + pieBorderColor = DARK_GREEN; + } + + ProgressPieComponent ppc = new ProgressPieComponent(); + ppc.setBorderColor(pieBorderColor); + ppc.setFill(pieFillColor); + ppc.setPosition(point); + ppc.setProgress(percent); + ppc.render(graphics); + } + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningPlugin.java new file mode 100644 index 0000000000..f8f4ae7bc7 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningPlugin.java @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2019, Adam + * Copyright (c) 2018, Anthony + * Copyright (c) 2019, Jarred Vardy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.mining; + +import com.google.inject.Provides; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.MenuAction; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26665; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26666; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26667; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26668; +import static net.runelite.api.ObjectID.EMPTY_WALL; +import static net.runelite.api.ObjectID.ORE_VEIN_26661; +import static net.runelite.api.ObjectID.ORE_VEIN_26662; +import static net.runelite.api.ObjectID.ORE_VEIN_26663; +import static net.runelite.api.ObjectID.ORE_VEIN_26664; +import net.runelite.api.WallObject; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.*; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.OverlayManager; + +@Slf4j +@PluginDescriptor( + name = "Mining", + description = "Show ore respawn timers and coal bag overlay", + tags = {"overlay", "skilling", "timers", "coal", "coalbag", "coal bag"}, + enabledByDefault = false +) +public class MiningPlugin extends Plugin +{ + private static final int ROCK_DISTANCE = 14; + private static final int MINING_GUILD_REGION = 12183; + + private static final Pattern COAL_BAG_EMPTY_MESSAGE = Pattern.compile("^The coal bag is (now )?empty\\.$"); + private static final Pattern COAL_BAG_ONE_MESSAGE = Pattern.compile("^The coal bag contains one piece of coal\\.$"); + private static final Pattern COAL_BAG_AMOUNT_MESSAGE = Pattern.compile("^The coal bag contains (\\d+) pieces of coal\\.$"); + + private static final int MAX_INVENTORY_SPACE = 28; + private static final int FULL_COAL_BAG_AMOUNT = 27; + + private static final String FILL_OPTION = "fill"; + private static final String EMPTY_OPTION = "empty"; + + + @Inject + private Client client; + + @Inject + private OverlayManager overlayManager; + + @Inject + private MiningOverlay miningOverlay; + + @Inject + private MiningCoalBagOverlay coalBagOverlay; + + @Inject + private MiningConfig config; + + @Getter(AccessLevel.PACKAGE) + private final List respawns = new ArrayList<>(); + private boolean recentlyLoggedIn; + + @Override + protected void startUp() + { + overlayManager.add(miningOverlay); + overlayManager.add(coalBagOverlay); + } + + @Override + protected void shutDown() throws Exception + { + overlayManager.remove(miningOverlay); + overlayManager.remove(coalBagOverlay); + respawns.clear(); + } + + @Provides + MiningConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(MiningConfig.class); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + switch (event.getGameState()) + { + case LOADING: + case HOPPING: + respawns.clear(); + break; + case LOGGED_IN: + // After login rocks that are depleted will be changed, + // so wait for the next game tick before watching for + // rocks to deplete + recentlyLoggedIn = true; + break; + } + } + + @Subscribe + public void onGameTick(GameTick gameTick) + { + recentlyLoggedIn = false; + } + + @Subscribe + public void onGameObjectDespawned(GameObjectDespawned event) + { + if (client.getGameState() != GameState.LOGGED_IN || recentlyLoggedIn) + { + return; + } + + final GameObject object = event.getGameObject(); + + Rock rock = Rock.getRock(object.getId()); + if (rock != null) + { + RockRespawn rockRespawn = new RockRespawn(rock, object.getWorldLocation(), Instant.now(), (int) rock.getRespawnTime(inMiningGuild()).toMillis(), rock.getZOffset()); + respawns.add(rockRespawn); + } + } + + @Subscribe + public void onWallObjectSpawned(WallObjectSpawned event) + { + if (client.getGameState() != GameState.LOGGED_IN) + { + return; + } + + final WallObject object = event.getWallObject(); + + switch (object.getId()) + { + case EMPTY_WALL: + { + Rock rock = Rock.AMETHYST; + RockRespawn rockRespawn = new RockRespawn(rock, object.getWorldLocation(), Instant.now(), (int) rock.getRespawnTime(inMiningGuild()).toMillis(), rock.getZOffset()); + respawns.add(rockRespawn); + break; + } + case DEPLETED_VEIN_26665: // Depleted motherlode vein + case DEPLETED_VEIN_26666: // Depleted motherlode vein + case DEPLETED_VEIN_26667: // Depleted motherlode vein + case DEPLETED_VEIN_26668: // Depleted motherlode vein + { + Rock rock = Rock.ORE_VEIN; + RockRespawn rockRespawn = new RockRespawn(rock, object.getWorldLocation(), Instant.now(), (int) rock.getRespawnTime(inMiningGuild()).toMillis(), rock.getZOffset()); + respawns.add(rockRespawn); + break; + } + case ORE_VEIN_26661: // Motherlode vein + case ORE_VEIN_26662: // Motherlode vein + case ORE_VEIN_26663: // Motherlode vein + case ORE_VEIN_26664: // Motherlode vein + { + // If the vein respawns before the timer is up, remove it + final WorldPoint point = object.getWorldLocation(); + respawns.removeIf(rockRespawn -> rockRespawn.getWorldPoint().equals(point)); + break; + } + } + } + + @Subscribe + public void onMenuOptionClicked(MenuOptionClicked event) + { + //TODO: should work hopefully + if (event.getMenuAction() != MenuAction.RUNELITE || event.getActionParam1() != WidgetInfo.INVENTORY.getId()) + { + return; + } + + ItemContainer inventoryItemContainer = client.getItemContainer(InventoryID.INVENTORY); + Item[] inventoryItems = inventoryItemContainer.getItems(); + + switch (event.getOption().toLowerCase()) + { + case FILL_OPTION: + int coalInInventoryCount = (int) Arrays.stream(inventoryItems).filter(i -> i.getId() == ItemID.COAL).count(); + updateAmountOfCoalInBag(coalInInventoryCount); + break; + + case EMPTY_OPTION: + int emptyInventorySpaceCount = (int) Arrays.stream(inventoryItems).filter(i -> i.getId() != -1).count(); + int difference = MAX_INVENTORY_SPACE - emptyInventorySpaceCount; + updateAmountOfCoalInBag(-difference); + break; + } + } + + @Subscribe + public void onChatMessage(ChatMessage event) + { + if (event.getType() != ChatMessageType.GAMEMESSAGE) + { + return; + } + + String chatMsg = event.getMessage(); + if (COAL_BAG_EMPTY_MESSAGE.matcher(chatMsg).find()) + { + updateAmountOfCoalInBag(0); + } + else if (COAL_BAG_ONE_MESSAGE.matcher(chatMsg).find()) + { + updateAmountOfCoalInBag(1); + } + else + { + Matcher matcher = COAL_BAG_AMOUNT_MESSAGE.matcher(chatMsg); + if (matcher.find()) + { + updateAmountOfCoalInBag(Integer.parseInt(matcher.group(1)) - config.amountOfCoalInCoalBag()); + } + } + } + + /** + * Update the player's count of coal in their Coal Bag + * + * @param delta How much to add/subtract from the amount. + * Supply a negative number to subtract, or positive number to add. + */ + protected void updateAmountOfCoalInBag(int delta) + { + // check for upper/lower bounds of amount of coal in a bag + // 0 <= X <= 27 + config.amountOfCoalInCoalBag(Math.max(0, Math.min(FULL_COAL_BAG_AMOUNT, config.amountOfCoalInCoalBag() + delta))); + } + + private boolean inMiningGuild() + { + return client.getLocalPlayer().getWorldLocation().getRegionID() == MINING_GUILD_REGION; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mining/Rock.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/Rock.java new file mode 100644 index 0000000000..19207b7fd6 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/Rock.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.mining; + +import com.google.common.collect.ImmutableMap; +import java.time.Duration; +import java.util.Map; +import lombok.AccessLevel; +import lombok.Getter; +import static net.runelite.api.ObjectID.ROCKS_10943; +import static net.runelite.api.ObjectID.ROCKS_11161; +import static net.runelite.api.ObjectID.ROCKS_11360; +import static net.runelite.api.ObjectID.ROCKS_11361; +import static net.runelite.api.ObjectID.ROCKS_11364; +import static net.runelite.api.ObjectID.ROCKS_11365; +import static net.runelite.api.ObjectID.ROCKS_11366; +import static net.runelite.api.ObjectID.ROCKS_11367; +import static net.runelite.api.ObjectID.ROCKS_11368; +import static net.runelite.api.ObjectID.ROCKS_11369; +import static net.runelite.api.ObjectID.ROCKS_11370; +import static net.runelite.api.ObjectID.ROCKS_11371; +import static net.runelite.api.ObjectID.ROCKS_11372; +import static net.runelite.api.ObjectID.ROCKS_11373; +import static net.runelite.api.ObjectID.ROCKS_11374; +import static net.runelite.api.ObjectID.ROCKS_11375; +import static net.runelite.api.ObjectID.ROCKS_11376; +import static net.runelite.api.ObjectID.ROCKS_11377; +import static net.runelite.api.ObjectID.ROCKS_11386; +import static net.runelite.api.ObjectID.ROCKS_11387; +import static net.runelite.api.ObjectID.ASH_PILE; + +enum Rock +{ + TIN(Duration.ofMillis(2400), 0, ROCKS_11360, ROCKS_11361), + COPPER(Duration.ofMillis(2400), 0, ROCKS_10943, ROCKS_11161), + IRON(Duration.ofMillis(5400), 0, ROCKS_11364, ROCKS_11365) + { + @Override + Duration getRespawnTime(boolean inMiningGuild) + { + return inMiningGuild ? Duration.ofMillis(2400) : super.respawnTime; + } + }, + COAL(Duration.ofMillis(29400), 0, ROCKS_11366, ROCKS_11367) + { + @Override + Duration getRespawnTime(boolean inMiningGuild) + { + return inMiningGuild ? Duration.ofMillis(14400) : super.respawnTime; + } + }, + SILVER(Duration.ofMinutes(1), 0, ROCKS_11368, ROCKS_11369), + SANDSTONE(Duration.ofMillis(5400), 0, ROCKS_11386), + GOLD(Duration.ofMinutes(1), 0, ROCKS_11370, ROCKS_11371), + GRANITE(Duration.ofMillis(5400), 0, ROCKS_11387), + MITHRIL(Duration.ofMinutes(2), 0, ROCKS_11372, ROCKS_11373) + { + @Override + Duration getRespawnTime(boolean inMiningGuild) + { + return inMiningGuild ? Duration.ofMinutes(1) : super.respawnTime; + } + }, + ADAMANTITE(Duration.ofMinutes(4), 0, ROCKS_11374, ROCKS_11375) + { + @Override + Duration getRespawnTime(boolean inMiningGuild) + { + return inMiningGuild ? Duration.ofMinutes(2) : super.respawnTime; + } + }, + RUNITE(Duration.ofMinutes(12), 0, ROCKS_11376, ROCKS_11377) + { + @Override + Duration getRespawnTime(boolean inMiningGuild) + { + return inMiningGuild ? Duration.ofMinutes(6) : super.respawnTime; + } + }, + ORE_VEIN(Duration.ofSeconds(MiningOverlay.ORE_VEIN_MAX_RESPAWN_TIME), 150), + AMETHYST(Duration.ofSeconds(75), 120), + ASH_VEIN(Duration.ofSeconds(30), 0, ASH_PILE); + + private static final Map ROCKS; + + static + { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + for (Rock rock : values()) + { + for (int id : rock.ids) + { + builder.put(id, rock); + } + } + ROCKS = builder.build(); + } + + private final Duration respawnTime; + @Getter(AccessLevel.PACKAGE) + private final int zOffset; + private final int[] ids; + + Rock(Duration respawnTime, int zOffset, int... ids) + { + this.respawnTime = respawnTime; + this.zOffset = zOffset; + this.ids = ids; + } + + Duration getRespawnTime(boolean inMiningGuild) + { + return respawnTime; + } + + static Rock getRock(int id) + { + return ROCKS.get(id); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/FontStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/RockRespawn.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/FontStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mining/RockRespawn.java index 9b5c1a1ea7..daedda8f34 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/coxhelper/FontStyle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/RockRespawn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, ganom + * Copyright (c) 2019, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,6 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -21,26 +22,20 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.coxhelper; +package net.runelite.client.plugins.mining; -import java.awt.Font; +import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Getter; +import net.runelite.api.coords.WorldPoint; -@Getter @AllArgsConstructor -public enum FontStyle +@Getter +class RockRespawn { - BOLD("Bold", Font.BOLD), - ITALIC("Italic", Font.ITALIC), - PLAIN("Plain", Font.PLAIN); - - private String name; - private int font; - - @Override - public String toString() - { - return getName(); - } -} \ No newline at end of file + private final Rock rock; + private final WorldPoint worldPoint; + private final Instant startTime; + private final int respawnTime; + private final int zOffset; +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java index 10d41810e4..bc4f4269ec 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java @@ -121,4 +121,25 @@ public interface MotherlodeConfig extends Config { return true; } + + @ConfigItem( + keyName = "notifyOnIdle", + name = "Idle notification", + description = "Sends a notification when the player stops mining" + ) + default boolean notifyOnIdle() + { + return false; + } + + @ConfigItem( + keyName = "showTargetVein", + name = "Show vein currently being mined", + description = "Highlights the vein currently being mined" + ) + default boolean showTargetVein() + { + return false; + } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java similarity index 83% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java index 7eb68f8726..7b95147aeb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java @@ -29,14 +29,15 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class MotherlodeGemOverlay extends Overlay { @@ -82,38 +83,31 @@ public class MotherlodeGemOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.getChildren().add(TitleComponent.builder().text("Gems found").build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (diamondsFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Diamonds:") - .right(Integer.toString(diamondsFound)) - .build()); + tableComponent.addRow("Diamonds:", Integer.toString(diamondsFound)); } if (rubiesFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Rubies:") - .right(Integer.toString(rubiesFound)) - .build()); + tableComponent.addRow("Rubies:", Integer.toString(rubiesFound)); } if (emeraldsFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Emeralds:") - .right(Integer.toString(emeraldsFound)) - .build()); + tableComponent.addRow("Emeralds:", Integer.toString(emeraldsFound)); } if (sapphiresFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Sapphires:") - .right(Integer.toString(sapphiresFound)) - .build()); + tableComponent.addRow("Sapphires:", Integer.toString(sapphiresFound)); } + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java similarity index 78% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java index 9f3af1625f..3533537987 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java @@ -29,9 +29,10 @@ import java.awt.Graphics2D; import javax.inject.Inject; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class MotherlodeOreOverlay extends Overlay { @@ -76,54 +77,41 @@ public class MotherlodeOreOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.getChildren().add(TitleComponent.builder().text("Ores found").build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (nuggetsFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Nuggets:") - .right(Integer.toString(nuggetsFound)) - .build()); + tableComponent.addRow("Nuggets:", Integer.toString(nuggetsFound)); } if (coalFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Coal:") - .right(Integer.toString(coalFound)) - .build()); + tableComponent.addRow("Coal:", Integer.toString(coalFound)); } if (goldFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Gold:") - .right(Integer.toString(goldFound)) - .build()); + tableComponent.addRow("Gold:", Integer.toString(goldFound)); } if (mithrilFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Mithril:") - .right(Integer.toString(mithrilFound)) - .build()); + tableComponent.addRow("Mithril:", Integer.toString(mithrilFound)); } if (adamantiteFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Adamantite:") - .right(Integer.toString(adamantiteFound)) - .build()); + tableComponent.addRow("Adamantite:", Integer.toString(adamantiteFound)); } if (runiteFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Runite:") - .right(Integer.toString(runiteFound)) - .build()); + tableComponent.addRow("Runite:", Integer.toString(runiteFound)); } + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java similarity index 69% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java index b16f0efb60..c43e012bfb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java @@ -24,40 +24,22 @@ */ package net.runelite.client.plugins.motherlode; -import com.google.common.collect.ImmutableSet; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; -import java.util.Set; import javax.inject.Inject; -import static api.AnimationID.MINING_MOTHERLODE_ADAMANT; -import static api.AnimationID.MINING_MOTHERLODE_BLACK; -import static api.AnimationID.MINING_MOTHERLODE_BRONZE; -import static api.AnimationID.MINING_MOTHERLODE_DRAGON; -import static api.AnimationID.MINING_MOTHERLODE_DRAGON_ORN; -import static api.AnimationID.MINING_MOTHERLODE_INFERNAL; -import static api.AnimationID.MINING_MOTHERLODE_IRON; -import static api.AnimationID.MINING_MOTHERLODE_MITHRIL; -import static api.AnimationID.MINING_MOTHERLODE_RUNE; -import static api.AnimationID.MINING_MOTHERLODE_STEEL; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class MotherlodeOverlay extends Overlay { - private static final Set MINING_ANIMATION_IDS = ImmutableSet.of( - MINING_MOTHERLODE_BRONZE, MINING_MOTHERLODE_IRON, MINING_MOTHERLODE_STEEL, - MINING_MOTHERLODE_BLACK, MINING_MOTHERLODE_MITHRIL, MINING_MOTHERLODE_ADAMANT, - MINING_MOTHERLODE_RUNE, MINING_MOTHERLODE_DRAGON, MINING_MOTHERLODE_DRAGON_ORN, - MINING_MOTHERLODE_INFERNAL - ); - private final Client client; private final MotherlodePlugin plugin; private final MotherlodeSession motherlodeSession; @@ -102,7 +84,7 @@ class MotherlodeOverlay extends Overlay if (config.showMiningState()) { - if (MINING_ANIMATION_IDS.contains(client.getLocalPlayer().getAnimation())) + if (plugin.isMining()) { panelComponent.getChildren().add(TitleComponent.builder() .text("Mining") @@ -118,15 +100,13 @@ class MotherlodeOverlay extends Overlay } } - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt mined:") - .right(Integer.toString(session.getTotalMined())) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt/hr:") - .right(session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : "") - .build()); + tableComponent.addRow("Pay-dirt mined:", Integer.toString(session.getTotalMined())); + tableComponent.addRow("Pay-dirt/hr:", session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : ""); + + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java similarity index 62% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java index 9f0bce2ef0..0e23e85a19 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java @@ -40,36 +40,62 @@ import java.util.Set; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.GameObject; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; -import static api.ObjectID.ORE_VEIN_26661; -import static api.ObjectID.ORE_VEIN_26662; -import static api.ObjectID.ORE_VEIN_26663; -import static api.ObjectID.ORE_VEIN_26664; -import static api.ObjectID.ROCKFALL; -import static api.ObjectID.ROCKFALL_26680; -import api.Perspective; -import api.Varbits; -import api.WallObject; -import api.coords.LocalPoint; -import api.events.ChatMessage; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.ItemContainerChanged; -import api.events.VarbitChanged; -import api.events.WallObjectChanged; -import api.events.WallObjectDespawned; -import api.events.WallObjectSpawned; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.AnimationID; +import static net.runelite.api.AnimationID.IDLE; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_3A; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_ADAMANT; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BLACK; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BRONZE; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON_ORN; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_INFERNAL; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_IRON; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_MITHRIL; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_RUNE; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_STEEL; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.MenuAction; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26665; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26666; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26667; +import static net.runelite.api.ObjectID.DEPLETED_VEIN_26668; +import static net.runelite.api.ObjectID.ORE_VEIN_26661; +import static net.runelite.api.ObjectID.ORE_VEIN_26662; +import static net.runelite.api.ObjectID.ORE_VEIN_26663; +import static net.runelite.api.ObjectID.ORE_VEIN_26664; +import static net.runelite.api.ObjectID.ROCKFALL; +import static net.runelite.api.ObjectID.ROCKFALL_26680; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Varbits; +import net.runelite.api.WallObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WallObjectChanged; +import net.runelite.api.events.WallObjectDespawned; +import net.runelite.api.events.WallObjectSpawned; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -88,6 +114,7 @@ public class MotherlodePlugin extends Plugin { private static final Set MOTHERLODE_MAP_REGIONS = ImmutableSet.of(14679, 14680, 14681, 14935, 14936, 14937, 15191, 15192, 15193); private static final Set MINE_SPOTS = ImmutableSet.of(ORE_VEIN_26661, ORE_VEIN_26662, ORE_VEIN_26663, ORE_VEIN_26664); + private static final Set DEPLETED_SPOTS = ImmutableSet.of(DEPLETED_VEIN_26665, DEPLETED_VEIN_26666, DEPLETED_VEIN_26667, DEPLETED_VEIN_26668); private static final Set MLM_ORE_TYPES = ImmutableSet.of(ItemID.RUNITE_ORE, ItemID.ADAMANTITE_ORE, ItemID.MITHRIL_ORE, ItemID.GOLD_ORE, ItemID.COAL, ItemID.GOLDEN_NUGGET); private static final Set ROCK_OBSTACLES = ImmutableSet.of(ROCKFALL, ROCKFALL_26680); @@ -99,6 +126,10 @@ public class MotherlodePlugin extends Plugin private static final int UPPER_FLOOR_HEIGHT = -500; + // The motherlode mining animation has gaps in it during which the animation switches to IDLE + // so a minimum threshold is required before the idle animation will be registered as not mining + private static final Duration ANIMATION_IDLE_DELAY = Duration.ofMillis(1800); + @Inject private OverlayManager overlayManager; @@ -126,6 +157,9 @@ public class MotherlodePlugin extends Plugin @Inject private ClientThread clientThread; + @Inject + private Notifier notifier; + @Getter(AccessLevel.PACKAGE) private boolean inMlm; @@ -146,6 +180,14 @@ public class MotherlodePlugin extends Plugin @Getter(AccessLevel.PACKAGE) private final Set rocks = new HashSet<>(); + @Getter(AccessLevel.PACKAGE) + private boolean isMining; + @Getter(AccessLevel.PACKAGE) + private WorldPoint targetVeinLocation = null; + private boolean playerHasReachedTargetVein; + private int lastAnimation = AnimationID.IDLE; + private Instant lastAnimating; + @Provides MotherlodeConfig getConfig(ConfigManager configManager) { @@ -278,6 +320,161 @@ public class MotherlodePlugin extends Plugin } } + @Subscribe + public void onMenuOptionClicked(MenuOptionClicked menu) + { + if (!inMlm) + { + return; + } + + if (MINE_SPOTS.contains(menu.getIdentifier()) && menu.getMenuAction() == MenuAction.GAME_OBJECT_FIRST_OPTION) + { + resetIdleChecks(); + int veinX = menu.getActionParam0(); + int veinY = menu.getActionParam1(); + targetVeinLocation = WorldPoint.fromScene(client, veinX, veinY, client.getPlane()); + } + } + + @Subscribe + public void onGameTick(GameTick event) + { + if (!inMlm) + { + return; + } + + checkDistanceToTargetVein(); + checkAnimationIdle(); + } + + private void checkDistanceToTargetVein() + { + if (targetVeinLocation == null) + { + return; + } + + float distanceFromTargetVein = client.getLocalPlayer().getWorldLocation().distanceToHypotenuse(targetVeinLocation); + // Player must reach the target vein first before we begin checking for the player moving away from it + if (!playerHasReachedTargetVein && distanceFromTargetVein == 1) + { + isMining = true; + playerHasReachedTargetVein = true; + } + else if (playerHasReachedTargetVein && distanceFromTargetVein > 1) + { + isMining = false; + resetIdleChecks(); + } + } + + @Subscribe + public void onAnimationChanged (AnimationChanged event) + { + if (!inMlm) + { + return; + } + + Player localPlayer = client.getLocalPlayer(); + if (localPlayer != event.getActor()) + { + return; + } + + int animation = localPlayer.getAnimation(); + + switch (animation) + { + case MINING_MOTHERLODE_BRONZE: + case MINING_MOTHERLODE_IRON: + case MINING_MOTHERLODE_STEEL: + case MINING_MOTHERLODE_BLACK: + case MINING_MOTHERLODE_MITHRIL: + case MINING_MOTHERLODE_ADAMANT: + case MINING_MOTHERLODE_RUNE: + case MINING_MOTHERLODE_DRAGON: + case MINING_MOTHERLODE_DRAGON_ORN: + case MINING_MOTHERLODE_INFERNAL: + case MINING_MOTHERLODE_3A: + lastAnimation = animation; + lastAnimating = Instant.now(); + break; + case IDLE: + lastAnimating = Instant.now(); + break; + default: + // On unknown animation simply assume the animation is invalid + lastAnimation = IDLE; + lastAnimating = null; + } + } + + private void checkAnimationIdle() + { + if (lastAnimation == IDLE) + { + return; + } + + final int animation = client.getLocalPlayer().getAnimation(); + + if (animation == IDLE) + { + if (lastAnimating != null && Instant.now().compareTo(lastAnimating.plus(ANIMATION_IDLE_DELAY)) >= 0) + { + lastAnimation = IDLE; + lastAnimating = null; + isMining = false; + resetIdleChecks(); + sendIdleNotification(); + } + } + else + { + lastAnimating = Instant.now(); + } + } + + @Subscribe + public void onWidgetLoaded(WidgetLoaded event) + { + if (!inMlm || targetVeinLocation == null) + { + return; + } + + int widgetID = event.getGroupId(); + + if (widgetID == WidgetID.MOTHERLODE_MINE_FULL_INVENTORY_GROUP_ID || widgetID == WidgetID.LEVEL_UP_GROUP_ID) + { + isMining = false; + resetIdleChecks(); + sendIdleNotification(); + } + } + + private void resetIdleChecks() + { + isMining = false; + lastAnimation = IDLE; + lastAnimating = null; + playerHasReachedTargetVein = false; + targetVeinLocation = null; + } + + private void sendIdleNotification() + { + if (!config.notifyOnIdle()) + { + return; + } + + notifier.notify(client.getLocalPlayer().getName() + " has stopped mining!"); + } + @Subscribe public void onWallObjectSpawned(WallObjectSpawned event) { @@ -287,10 +484,17 @@ public class MotherlodePlugin extends Plugin } WallObject wallObject = event.getWallObject(); - if (MINE_SPOTS.contains(wallObject.getId())) + int wallObjectId = wallObject.getId(); + if (MINE_SPOTS.contains(wallObjectId)) { veins.add(wallObject); } + else if (DEPLETED_SPOTS.contains(wallObjectId) && wallObject.getWorldLocation().equals(targetVeinLocation)) + { + isMining = false; + resetIdleChecks(); + sendIdleNotification(); + } } @Subscribe diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java similarity index 76% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java index 0a6c98fd6e..bcd4d2946e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java @@ -32,19 +32,21 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.GameObject; -import api.Perspective; -import api.Player; -import api.Point; -import api.Skill; -import api.WallObject; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Skill; +import net.runelite.api.WallObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.util.ImageUtil; class MotherlodeRocksOverlay extends Overlay { @@ -55,6 +57,9 @@ class MotherlodeRocksOverlay extends Overlay private final MotherlodeConfig config; private final BufferedImage miningIcon; + private final BufferedImage targetMiningIcon; + private static final Color miningIconOldColor = new Color(117, 123, 124); + private static final Color miningIconNewColor = new Color(0, 150, 0); @Inject MotherlodeRocksOverlay(Client client, MotherlodePlugin plugin, MotherlodeConfig config, SkillIconManager iconManager) @@ -66,6 +71,7 @@ class MotherlodeRocksOverlay extends Overlay this.config = config; miningIcon = iconManager.getSkillImage(Skill.MINING); + targetMiningIcon = ImageUtil.recolorImage(miningIcon, miningIconNewColor, Color -> Color.getRGB() == miningIconOldColor.getRGB()); } @Override @@ -86,7 +92,6 @@ class MotherlodeRocksOverlay extends Overlay private void renderTiles(Graphics2D graphics, Player local) { LocalPoint localLocation = local.getLocalLocation(); - if (config.showVeins()) { for (WallObject vein : plugin.getVeins()) @@ -97,7 +102,16 @@ class MotherlodeRocksOverlay extends Overlay // Only draw veins on the same level if (plugin.isUpstairs(localLocation) == plugin.isUpstairs(vein.getLocalLocation())) { - renderVein(graphics, vein); + if (WorldPoint.fromLocal(client, location).equals(plugin.getTargetVeinLocation()) + && plugin.isMining() + && config.showTargetVein()) + { + renderVein(graphics, vein, true); + } + else + { + renderVein(graphics, vein, false); + } } } } @@ -115,17 +129,20 @@ class MotherlodeRocksOverlay extends Overlay } } } - } - private void renderVein(Graphics2D graphics, WallObject vein) + private void renderVein(Graphics2D graphics, WallObject vein, Boolean shouldRecolor) { Point canvasLoc = Perspective.getCanvasImageLocation(client, vein.getLocalLocation(), miningIcon, 150); - if (canvasLoc != null) + if (canvasLoc != null && !shouldRecolor) { graphics.drawImage(miningIcon, canvasLoc.getX(), canvasLoc.getY(), null); } + else if (canvasLoc != null) + { + graphics.drawImage(targetMiningIcon, canvasLoc.getX(), canvasLoc.getY(), null); + } } private void renderRock(Graphics2D graphics, GameObject rock) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java index 0c10043f3a..2b53ff5bee 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java @@ -30,18 +30,20 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Varbits; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentConstants; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class MotherlodeSackOverlay extends Overlay { @@ -76,6 +78,9 @@ class MotherlodeSackOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.setBackgroundColor(ComponentConstants.STANDARD_BACKGROUND_COLOR); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (sack != null) { sack.setHidden(true); @@ -87,10 +92,7 @@ class MotherlodeSackOverlay extends Overlay panelComponent.setBackgroundColor(DANGER); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt in sack:") - .right(String.valueOf(client.getVar(Varbits.SACK_NUMBER))) - .build()); + tableComponent.addRow("Pay-dirt in sack:", String.valueOf(client.getVar(Varbits.SACK_NUMBER))); } if (config.showDepositsLeft()) @@ -110,15 +112,12 @@ class MotherlodeSackOverlay extends Overlay } } - panelComponent.getChildren().add(LineComponent.builder() - .left("Deposits left:") - .leftColor(color) - .right(depositsLeft == null ? "N/A" : String.valueOf(depositsLeft)) - .rightColor(color) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("Deposits left:", color), ColorUtil.prependColorTag(depositsLeft == null ? "N/A" : String.valueOf(depositsLeft), color)); } } + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSession.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSession.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSession.java rename to runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSession.java index 0f177ca4ef..e4d00cfda6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSession.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSession.java @@ -30,7 +30,7 @@ import javax.inject.Singleton; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.ItemID; +import net.runelite.api.ItemID; @Slf4j @Singleton diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightConfig.java similarity index 73% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightConfig.java index 9b9d19b750..35369bc140 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightConfig.java @@ -33,6 +33,17 @@ public interface MouseHighlightConfig extends Config { @ConfigItem( position = 0, + keyName = "mainTooltip", + name = "Main Tooltips", + description = "Whether or not tooltips are shown on things other than interfaces or the chatbox" + ) + default boolean mainTooltip() + { + return true; + } + + @ConfigItem( + position = 1, keyName = "uiTooltip", name = "Interface Tooltips", description = "Whether or not tooltips are shown on interfaces" @@ -43,7 +54,7 @@ public interface MouseHighlightConfig extends Config } @ConfigItem( - position = 1, + position = 2, keyName = "chatboxTooltip", name = "Chatbox Tooltips", description = "Whether or not tooltips are shown over the chatbox" @@ -53,15 +64,36 @@ public interface MouseHighlightConfig extends Config return true; } - @ConfigItem(position = 2, keyName = "hideSpells", name = "Spellbook", description = "Hides vanilla client tooltips in the spellbook") + @ConfigItem( + position = 3, + keyName = "hideSpells", + name = "Spellbook", + description = "Hides vanilla client tooltips in the spellbook" + ) default boolean shouldHideSpells() { return false; } - @ConfigItem(position = 3, keyName = "hideCombat", name = "Combat", description = "Hides vanilla client tooltips in the combat menu") + @ConfigItem( + position = 4, + keyName = "hideCombat", + name = "Combat", + description = "Hides vanilla client tooltips in the combat menu" + ) default boolean shouldHideCombat() { return false; } + + @ConfigItem( + position = 5, + keyName = "rightclickoptionTooltip", + name = "Right Click Option Tooltips", + description = "Whether or not tooltips are shown for options that right-click only." + ) + default boolean isRightClickTooltipEnabled() + { + return true; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java index aee58b0343..79700ce096 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java @@ -28,12 +28,12 @@ import com.google.common.base.Strings; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.MenuAction; -import api.MenuEntry; -import api.VarClientInt; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.VarClientInt; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.tooltip.Tooltip; @@ -75,9 +75,8 @@ class MouseHighlightOverlay extends Overlay String option = menuEntry.getOption(); int type = menuEntry.getType(); - if (type == MenuAction.RUNELITE_OVERLAY.getId() || type == MenuAction.EXAMINE_ITEM_BANK_EQ.getId()) + if (shouldNotRenderMenuAction(type)) { - // These are always right click only return null; } @@ -126,6 +125,11 @@ class MouseHighlightOverlay extends Overlay } } + if (widget == null && !config.mainTooltip()) + { + return null; + } + // If this varc is set, a tooltip is already being displayed int tooltipDisplayed = client.getVar(VarClientInt.TOOLTIP_VISIBLE); if (tooltipDisplayed == 1) @@ -136,4 +140,15 @@ class MouseHighlightOverlay extends Overlay tooltipManager.addFront(new Tooltip(option + (Strings.isNullOrEmpty(target) ? "" : " " + target))); return null; } + + private boolean shouldNotRenderMenuAction(int type) + { + return type == MenuAction.RUNELITE_OVERLAY.getId() + || (!config.isRightClickTooltipEnabled() && isMenuActionRightClickOnly(type)); + } + + private boolean isMenuActionRightClickOnly(int type) + { + return type == MenuAction.EXAMINE_ITEM_BANK_EQ.getId(); + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightPlugin.java index d9080f5c3c..85f95aa6bd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightPlugin.java @@ -26,14 +26,14 @@ package net.runelite.client.plugins.mousehighlight; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTAConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/MTAConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTAConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/MTAConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTAInventoryOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/MTAInventoryOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTAInventoryOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/MTAInventoryOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTAPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/MTAPlugin.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTAPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/MTAPlugin.java index c881af4306..5b7d6bffa1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTAPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/MTAPlugin.java @@ -28,7 +28,7 @@ import com.google.inject.Provides; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTARoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/MTARoom.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTARoom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/MTARoom.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTASceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/MTASceneOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/MTASceneOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/MTASceneOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyItem.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyItem.java index 17e2ce527f..d690b7f16b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyItem.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.mta.alchemy; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; public enum AlchemyItem { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java index bab91dd77e..ff8224238f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java @@ -33,38 +33,38 @@ import java.util.Arrays; import java.util.Objects; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameObject; -import api.GameState; -import static api.ObjectID.CUPBOARD_23678; -import static api.ObjectID.CUPBOARD_23679; -import static api.ObjectID.CUPBOARD_23680; -import static api.ObjectID.CUPBOARD_23681; -import static api.ObjectID.CUPBOARD_23682; -import static api.ObjectID.CUPBOARD_23683; -import static api.ObjectID.CUPBOARD_23684; -import static api.ObjectID.CUPBOARD_23685; -import static api.ObjectID.CUPBOARD_23686; -import static api.ObjectID.CUPBOARD_23687; -import static api.ObjectID.CUPBOARD_23688; -import static api.ObjectID.CUPBOARD_23689; -import static api.ObjectID.CUPBOARD_23690; -import static api.ObjectID.CUPBOARD_23691; -import static api.ObjectID.CUPBOARD_23692; -import static api.ObjectID.CUPBOARD_23693; -import api.Perspective; -import api.Player; -import api.Point; -import api.coords.WorldPoint; -import api.events.ChatMessage; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; -import api.widgets.WidgetItem; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import static net.runelite.api.ObjectID.CUPBOARD_23678; +import static net.runelite.api.ObjectID.CUPBOARD_23679; +import static net.runelite.api.ObjectID.CUPBOARD_23680; +import static net.runelite.api.ObjectID.CUPBOARD_23681; +import static net.runelite.api.ObjectID.CUPBOARD_23682; +import static net.runelite.api.ObjectID.CUPBOARD_23683; +import static net.runelite.api.ObjectID.CUPBOARD_23684; +import static net.runelite.api.ObjectID.CUPBOARD_23685; +import static net.runelite.api.ObjectID.CUPBOARD_23686; +import static net.runelite.api.ObjectID.CUPBOARD_23687; +import static net.runelite.api.ObjectID.CUPBOARD_23688; +import static net.runelite.api.ObjectID.CUPBOARD_23689; +import static net.runelite.api.ObjectID.CUPBOARD_23690; +import static net.runelite.api.ObjectID.CUPBOARD_23691; +import static net.runelite.api.ObjectID.CUPBOARD_23692; +import static net.runelite.api.ObjectID.CUPBOARD_23693; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.mta.MTAConfig; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/Cupboard.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/Cupboard.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/Cupboard.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/Cupboard.java index 49b37e4ae5..3467e3a188 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/alchemy/Cupboard.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/Cupboard.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.mta.alchemy; -import api.GameObject; +import net.runelite.api.GameObject; class Cupboard { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java index ec106a3254..ce82dc00cc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java @@ -28,17 +28,17 @@ import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.Item; -import api.ItemID; -import api.Player; -import api.Tile; -import api.coords.WorldPoint; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.ItemDespawned; -import api.events.ItemSpawned; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Item; +import net.runelite.api.ItemID; +import net.runelite.api.Player; +import net.runelite.api.Tile; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemDespawned; +import net.runelite.api.events.ItemSpawned; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.mta.MTAConfig; import net.runelite.client.plugins.mta.MTARoom; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java index 8f7bfea523..6661b141ff 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java @@ -26,17 +26,17 @@ package net.runelite.client.plugins.mta.graveyard; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import static api.ItemID.ANIMALS_BONES; -import static api.ItemID.ANIMALS_BONES_6905; -import static api.ItemID.ANIMALS_BONES_6906; -import static api.ItemID.ANIMALS_BONES_6907; -import api.Player; -import api.events.GameTick; -import api.events.ItemContainerChanged; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import static net.runelite.api.ItemID.ANIMALS_BONES; +import static net.runelite.api.ItemID.ANIMALS_BONES_6905; +import static net.runelite.api.ItemID.ANIMALS_BONES_6906; +import static net.runelite.api.ItemID.ANIMALS_BONES_6907; +import net.runelite.api.Player; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.mta.MTAConfig; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/telekinetic/Maze.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/Maze.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/telekinetic/Maze.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/Maze.java index fe37fdbe7b..bef5c1d201 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/telekinetic/Maze.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/Maze.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.mta.telekinetic; -import api.coords.LocalPoint; +import net.runelite.api.coords.LocalPoint; public enum Maze { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java index 50ff98b388..ae797b74cd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java @@ -39,28 +39,28 @@ import java.util.Set; import java.util.Stack; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.GroundObject; -import api.NPC; -import api.NpcID; -import api.NullObjectID; -import api.Perspective; -import api.Projectile; -import api.ProjectileID; -import api.WallObject; -import api.coords.Angle; -import api.coords.Direction; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.GroundObjectSpawned; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.WallObjectSpawned; -import api.widgets.WidgetID; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.GroundObject; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.NullObjectID; +import net.runelite.api.Perspective; +import net.runelite.api.Projectile; +import net.runelite.api.ProjectileID; +import net.runelite.api.WallObject; +import net.runelite.api.coords.Angle; +import net.runelite.api.coords.Direction; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.WallObjectSpawned; +import net.runelite.api.widgets.WidgetID; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.mta.MTAConfig; import net.runelite.client.plugins.mta.MTARoom; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java rename to runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java index b60034485d..044e9bdb36 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, Woox + * Copyright (c) 2019, Enza-Denino * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,15 +31,16 @@ import java.awt.Shape; import java.awt.geom.Area; import java.util.ArrayList; import java.util.List; -import api.Constants; +import net.runelite.api.Constants; public class MapLocations { - private static final List[] MULTICOMBAT = new List[Constants.MAX_Z]; - private static final List[] NOT_MULTICOMBAT = new List[Constants.MAX_Z]; - private static final List[] ROUGH_WILDERNESS = new List[Constants.MAX_Z]; - private static final List[] DEADMAN_SAFE_ZONES = new List[Constants.MAX_Z]; - private static final List[] PVP_WORLD_SAFE_ZONES = new List[Constants.MAX_Z]; + private static final List[] MULTICOMBAT = new List[Constants.MAX_Z]; + private static final List[] NOT_MULTICOMBAT = new List[Constants.MAX_Z]; + private static final List[] ROUGH_WILDERNESS = new List[Constants.MAX_Z]; + private static final List[] WILDERNESS_LEVEL_LINES = new List[Constants.MAX_Z]; + private static final List[] DEADMAN_SAFE_ZONES = new List[Constants.MAX_Z]; + private static final List[] PVP_WORLD_SAFE_ZONES = new List[Constants.MAX_Z]; private static Area getArea(List shapes) { @@ -87,6 +89,16 @@ public class MapLocations return getArea(ROUGH_WILDERNESS[plane], view); } + public static Area getWildernessLevelLines(int plane) + { + return getArea(WILDERNESS_LEVEL_LINES[plane]); + } + + public static Area getWildernessLevelLines(Rectangle view, int plane) + { + return getArea(WILDERNESS_LEVEL_LINES[plane], view); + } + public static Area getDeadmanSafeZones(int plane) { return getArea(DEADMAN_SAFE_ZONES[plane]); @@ -107,33 +119,28 @@ public class MapLocations return getArea(PVP_WORLD_SAFE_ZONES[plane], view); } + private static void initializeWithEmptyLists(List[] array) + { + for (int i = 0; i < array.length; i++) + { + array[i] = new ArrayList<>(); + } + } + static { - for (int i = 0; i < MULTICOMBAT.length; i++) - { - MULTICOMBAT[i] = new ArrayList<>(); - } - for (int i = 0; i < NOT_MULTICOMBAT.length; i++) - { - NOT_MULTICOMBAT[i] = new ArrayList<>(); - } - for (int i = 0; i < ROUGH_WILDERNESS.length; i++) - { - ROUGH_WILDERNESS[i] = new ArrayList<>(); - } - for (int i = 0; i < DEADMAN_SAFE_ZONES.length; i++) - { - DEADMAN_SAFE_ZONES[i] = new ArrayList<>(); - } - for (int i = 0; i < PVP_WORLD_SAFE_ZONES.length; i++) - { - PVP_WORLD_SAFE_ZONES[i] = new ArrayList<>(); - } + initializeWithEmptyLists(MULTICOMBAT); + initializeWithEmptyLists(NOT_MULTICOMBAT); + initializeWithEmptyLists(ROUGH_WILDERNESS); + initializeWithEmptyLists(WILDERNESS_LEVEL_LINES); + initializeWithEmptyLists(DEADMAN_SAFE_ZONES); + initializeWithEmptyLists(PVP_WORLD_SAFE_ZONES); defineMulticombatAreas(); defineDeadmanSafeZones(); definePvpSafeZones(); defineWilderness(); + defineWildernessLevelLines(); } private static void defineMulticombatAreas() @@ -3441,6 +3448,33 @@ public class MapLocations 3264, 9918); } + private static void defineWildernessLevelLines() + { + int wildyLeftX = 2944; + int wildyRightX = 3392; + int wildyBottomY = 3525; + int wildyTopY = 3971; + + // define wilderness level lines at ground level + int accumulatedY = 0; + for (int level = 1; level <= 56; level++) + { + int levelTiles = level == 1 ? 3 : 8; + // only draw every 2 levels, otherwise lines on two adjacent levels will collide + // and it will not show up + if (level % 2 != 0) + { + addPolygonTo(WILDERNESS_LEVEL_LINES, + wildyLeftX, wildyBottomY + accumulatedY, + wildyRightX, wildyBottomY + accumulatedY, + wildyRightX, wildyBottomY + accumulatedY + levelTiles, + wildyLeftX, wildyBottomY + accumulatedY + levelTiles); + } + accumulatedY += levelTiles; + } + } + + private static void addPolygonTo(List[] shapes, int... coords) { Polygon poly = new Polygon(); @@ -3476,4 +3510,4 @@ public class MapLocations shapes[i].add(poly); } } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsConfig.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsConfig.java index 27aed88be3..da14992e01 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsConfig.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, Woox + * Copyright (c) 2019, Enza-Denino * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -66,14 +67,14 @@ public interface MultiIndicatorsConfig extends Config } @ConfigItem( - keyName = "collisionDetection", - name = "Collision detection", - description = "Only show lines where they can be walked through", + keyName = "wildernessLevelLines", + name = "Wilderness level lines", + description = "Show wilderness level lines", position = 4 ) - default boolean collisionDetection() + default boolean showWildernessLevelLines() { - return false; + return true; } @ConfigItem( @@ -108,4 +109,16 @@ public interface MultiIndicatorsConfig extends Config { return Color.GREEN; } + + @ConfigItem( + keyName = "wildernessLevelLinesColor", + name = "Wilderness level lines color", + description = "Choose color to use for marking wilderness level lines", + position = 8 + ) + default Color wildernessLevelLinesColor() + { + return Color.WHITE; + } + } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsMinimapOverlay.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsMinimapOverlay.java index 038f8e5a07..b0c1187745 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsMinimapOverlay.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, Woox + * Copyright (c) 2019, Enza-Denino * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,11 +31,12 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.GeneralPath; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.geometry.Geometry; + +import net.runelite.api.geometry.Geometry; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -101,6 +103,7 @@ public class MultiIndicatorsMinimapOverlay extends Overlay GeneralPath multicombatPath = plugin.getMulticombatPathToDisplay()[client.getPlane()]; GeneralPath pvpPath = plugin.getPvpPathToDisplay()[client.getPlane()]; + GeneralPath wildernessLevelLinesPath = plugin.getWildernessLevelLinesPathToDisplay()[client.getPlane()]; if (config.multicombatZoneVisibility() != ZoneVisibility.HIDE && multicombatPath != null) { @@ -110,6 +113,10 @@ public class MultiIndicatorsMinimapOverlay extends Overlay { renderPath(graphics, pvpPath, getTransparentColorVersion(config.safeZoneColor())); } + if (config.showWildernessLevelLines() && wildernessLevelLinesPath != null) + { + renderPath(graphics, wildernessLevelLinesPath, getTransparentColorVersion(config.wildernessLevelLinesColor())); + } return null; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsOverlay.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsOverlay.java index 0bf2a2f94c..d9268121f0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsOverlay.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, Woox + * Copyright (c) 2019, Enza-Denino * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,11 +32,11 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.GeneralPath; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.geometry.Geometry; +import net.runelite.api.geometry.Geometry; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -98,6 +99,7 @@ public class MultiIndicatorsOverlay extends Overlay { GeneralPath multicombatPath = plugin.getMulticombatPathToDisplay()[client.getPlane()]; GeneralPath pvpPath = plugin.getPvpPathToDisplay()[client.getPlane()]; + GeneralPath wildernessLevelLinesPath = plugin.getWildernessLevelLinesPathToDisplay()[client.getPlane()]; if (config.multicombatZoneVisibility() != ZoneVisibility.HIDE && multicombatPath != null) { @@ -107,6 +109,10 @@ public class MultiIndicatorsOverlay extends Overlay { renderPath(graphics, pvpPath, getTransparentColorVersion(config.safeZoneColor())); } + if (config.showWildernessLevelLines() && wildernessLevelLinesPath != null) + { + renderPath(graphics, wildernessLevelLinesPath, getTransparentColorVersion(config.wildernessLevelLinesColor())); + } return null; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsPlugin.java similarity index 75% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsPlugin.java index 4415b4abba..c20fa25810 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MultiIndicatorsPlugin.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, Woox + * Copyright (c) 2019, Enza-Denino * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,38 +28,41 @@ package net.runelite.client.plugins.multiindicators; import com.google.inject.Provides; import java.awt.Rectangle; import java.awt.geom.GeneralPath; +import java.time.temporal.ChronoUnit; import java.util.Arrays; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.Constants; -import api.GameState; -import api.ObjectDefinition; -import api.Perspective; -import api.Tile; -import api.WallObject; -import api.WorldType; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.geometry.Geometry; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameState; +import net.runelite.api.ObjectDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; +import net.runelite.api.WorldType; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.geometry.Geometry; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; +import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.OverlayManager; @PluginDescriptor( name = "Multi-Lines", description = "Show borders of multicombat and PvP safezones", tags = {"multicombat", "lines", "pvp", "deadman", "safezones", "bogla"}, - enabledByDefault = false, - type = PluginType.PVP + type = PluginType.PVP, + enabledByDefault = false ) + public class MultiIndicatorsPlugin extends Plugin { @Inject @@ -85,6 +89,9 @@ public class MultiIndicatorsPlugin extends Plugin @Getter private GeneralPath[] pvpPathToDisplay; + @Getter + private GeneralPath[] wildernessLevelLinesPathToDisplay; + @Getter private boolean inPvp; @@ -105,8 +112,7 @@ public class MultiIndicatorsPlugin extends Plugin overlayManager.add(overlay); overlayManager.add(minimapOverlay); - multicombatPathToDisplay = new GeneralPath[Constants.MAX_Z]; - pvpPathToDisplay = new GeneralPath[Constants.MAX_Z]; + initializePaths(); clientThread.invokeLater(() -> { @@ -123,8 +129,37 @@ public class MultiIndicatorsPlugin extends Plugin overlayManager.remove(overlay); overlayManager.remove(minimapOverlay); + uninitializePaths(); + } + + private void initializePaths() + { + multicombatPathToDisplay = new GeneralPath[Constants.MAX_Z]; + pvpPathToDisplay = new GeneralPath[Constants.MAX_Z]; + wildernessLevelLinesPathToDisplay = new GeneralPath[Constants.MAX_Z]; + } + + private void uninitializePaths() + { multicombatPathToDisplay = null; pvpPathToDisplay = null; + wildernessLevelLinesPathToDisplay = null; + } + + // sometimes the lines get offset (seems to happen when there is a delay + // due to map reloading when walking/running "Loading - please wait") + // resetting the lines generation logic fixes this + @Schedule( + period = 1800, + unit = ChronoUnit.MILLIS + ) + public void update() + { + if (client.getGameState() == GameState.LOGGED_IN) + { + findLinesInScene(); + } + } private void transformWorldToLocal(float[] coords) @@ -133,7 +168,6 @@ public class MultiIndicatorsPlugin extends Plugin coords[0] = lp.getX() - Perspective.LOCAL_TILE_SIZE / 2; coords[1] = lp.getY() - Perspective.LOCAL_TILE_SIZE / 2; } - private boolean isOpenableAt(WorldPoint wp) { int sceneX = wp.getX() - client.getBaseX(); @@ -152,6 +186,7 @@ public class MultiIndicatorsPlugin extends Plugin } ObjectDefinition objectComposition = client.getObjectDefinition(wallObject.getId()); + if (objectComposition == null) { return false; @@ -239,7 +274,7 @@ public class MultiIndicatorsPlugin extends Plugin lines = Geometry.clipPath(lines, MapLocations.getRoughWilderness(i)); } lines = Geometry.splitIntoSegments(lines, 1); - if (config.collisionDetection()) + if (useCollisionLogic()) { lines = Geometry.filterPath(lines, this::collisionFilter); } @@ -266,7 +301,7 @@ public class MultiIndicatorsPlugin extends Plugin { safeZonePath = Geometry.clipPath(safeZonePath, sceneRect); safeZonePath = Geometry.splitIntoSegments(safeZonePath, 1); - if (config.collisionDetection()) + if (useCollisionLogic()) { safeZonePath = Geometry.filterPath(safeZonePath, this::collisionFilter); } @@ -274,6 +309,35 @@ public class MultiIndicatorsPlugin extends Plugin } pvpPathToDisplay[i] = safeZonePath; } + + // Generate wilderness level lines + for (int i = 0; i < wildernessLevelLinesPathToDisplay.length; i++) + { + currentPlane = i; + + GeneralPath wildernessLevelLinesPath = null; + if (config.showWildernessLevelLines()) + { + wildernessLevelLinesPath = new GeneralPath(MapLocations.getWildernessLevelLines(sceneRect, i)); + } + if (wildernessLevelLinesPath != null) + { + wildernessLevelLinesPath = Geometry.clipPath(wildernessLevelLinesPath, sceneRect); + wildernessLevelLinesPath = Geometry.splitIntoSegments(wildernessLevelLinesPath, 1); + if (useCollisionLogic()) + { + wildernessLevelLinesPath = Geometry.filterPath(wildernessLevelLinesPath, this::collisionFilter); + } + wildernessLevelLinesPath = Geometry.transformPath(wildernessLevelLinesPath, this::transformWorldToLocal); + } + wildernessLevelLinesPathToDisplay[i] = wildernessLevelLinesPath; + } + } + + private boolean useCollisionLogic() + { + // currently prevents overlay lines from showing up if this is ever enabled right now + return false; } @Subscribe @@ -282,7 +346,8 @@ public class MultiIndicatorsPlugin extends Plugin if (event.getKey().equals("collisionDetection") || event.getKey().equals("multicombatZoneVisibility") || event.getKey().equals("deadmanSafeZones") || - event.getKey().equals("pvpSafeZones")) + event.getKey().equals("pvpSafeZones") || + event.getKey().equals("wildernessLevelLines")) { findLinesInScene(); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/ZoneVisibility.java b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/ZoneVisibility.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/ZoneVisibility.java rename to runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/ZoneVisibility.java index b024a93846..c3e9a8fcf4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/multiindicators/ZoneVisibility.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/ZoneVisibility.java @@ -40,4 +40,4 @@ public enum ZoneVisibility { return visibility; } -} \ No newline at end of file +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/musicindicator/MusicIndicatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/musicindicator/MusicIndicatorPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/musicindicator/MusicIndicatorPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/musicindicator/MusicIndicatorPlugin.java index 96857447b6..694fc83698 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/musicindicator/MusicIndicatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/musicindicator/MusicIndicatorPlugin.java @@ -32,14 +32,14 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import javax.inject.Inject; -import api.ChatMessageType; -import api.Client; -import api.EnumDefinition; -import api.EnumID; -import api.VarPlayer; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.VarbitChanged; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.EnumDefinition; +import net.runelite.api.EnumID; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; @@ -52,8 +52,10 @@ import net.runelite.client.plugins.PluginType; @PluginDescriptor( name = "Music Track Indicator", description = "Show chat notifications when unlocking music tracks", - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + public class MusicIndicatorPlugin extends Plugin { private static final List MUSIC_TRACK_VARPS = ImmutableList.of( diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java index b8c680f5cd..ab38b515f9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java @@ -31,21 +31,21 @@ import java.util.stream.Collectors; import javax.inject.Inject; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Client; -import api.GameState; -import api.ScriptID; -import api.SoundEffectID; -import api.SpriteID; -import api.VarClientInt; -import api.events.GameStateChanged; -import api.events.VarClientIntChanged; -import api.events.WidgetLoaded; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; -import api.widgets.WidgetPositionMode; -import api.widgets.WidgetType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.ScriptID; +import net.runelite.api.SoundEffectID; +import net.runelite.api.SpriteID; +import net.runelite.api.VarClientInt; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.chatbox.ChatboxPanelManager; @@ -75,7 +75,7 @@ public class MusicListPlugin extends Plugin private Collection tracks; - private MusicState currentMusicFilter; + private MusicState currentMusicFilter = MusicState.ALL; @Override protected void startUp() @@ -100,6 +100,7 @@ public class MusicListPlugin extends Plugin { if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN) { + // Reset music filter on logout currentMusicFilter = MusicState.ALL; tracks = null; } @@ -110,6 +111,10 @@ public class MusicListPlugin extends Plugin { if (widgetLoaded.getGroupId() == WidgetID.MUSIC_GROUP_ID) { + tracks = null; + // Reset filter state as the widget has been reloaded. + // It is too early here to call updateFilter() + currentMusicFilter = MusicState.ALL; addMusicButtons(); } } @@ -123,6 +128,8 @@ public class MusicListPlugin extends Plugin return; } + header.deleteAllChildren(); + //Creation of the search and toggle status buttons musicSearchButton = header.createChild(-1, WidgetType.GRAPHIC); musicSearchButton.setSpriteId(SpriteID.GE_SEARCH); @@ -138,7 +145,7 @@ public class MusicListPlugin extends Plugin musicSearchButton.revalidate(); musicFilterButton = header.createChild(-1, WidgetType.GRAPHIC); - musicFilterButton.setSpriteId(SpriteID.MINIMAP_ORB_HITPOINTS); + musicFilterButton.setSpriteId(SpriteID.MINIMAP_ORB_PRAYER); musicFilterButton.setOriginalWidth(15); musicFilterButton.setOriginalHeight(15); musicFilterButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/AbsorptionCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/AbsorptionCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/AbsorptionCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/AbsorptionCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java index 641640b757..c297ce0866 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java @@ -27,20 +27,22 @@ package net.runelite.client.plugins.nightmarezone; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.ItemID; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Varbits; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.StackFormatter; @@ -102,10 +104,10 @@ class NightmareZoneOverlay extends Overlay renderAbsorptionCounter(); panelComponent.getChildren().clear(); - panelComponent.getChildren().add(LineComponent.builder() - .left("Points: ") - .right(StackFormatter.formatNumber(client.getVar(Varbits.NMZ_POINTS))) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Points:", StackFormatter.formatNumber(client.getVar(Varbits.NMZ_POINTS))); + tableComponent.addRow("Total:", StackFormatter.formatNumber(client.getVar(VarPlayer.NMZ_REWARD_POINTS) + client.getVar(Varbits.NMZ_POINTS))); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java index 516617ca07..3d038163d7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java @@ -27,14 +27,14 @@ package net.runelite.client.plugins.nightmarezone; import com.google.inject.Provides; import java.util.Arrays; import javax.inject.Inject; -import api.ChatMessageType; -import api.Client; -import api.Varbits; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/notes/NotesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/notes/NotesConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/notes/NotesPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/notes/NotesPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/MemorizedNpc.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/MemorizedNpc.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/MemorizedNpc.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/MemorizedNpc.java index f920a90454..09531c4cfc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/MemorizedNpc.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/MemorizedNpc.java @@ -28,9 +28,9 @@ import java.util.ArrayList; import java.util.List; import lombok.Getter; import lombok.Setter; -import api.NPC; -import api.NPCDefinition; -import api.coords.WorldPoint; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.coords.WorldPoint; class MemorizedNpc { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsInput.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsInput.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsInput.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsInput.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java index a644945adf..34d89e1944 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java @@ -42,24 +42,24 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.GraphicID; -import api.GraphicsObject; -import api.MenuAction; -import static api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; -import api.MenuEntry; -import api.NPC; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.FocusChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.GraphicsObjectCreated; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.GraphicID; +import net.runelite.api.GraphicsObject; +import net.runelite.api.MenuAction; +import static net.runelite.api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; +import net.runelite.api.MenuEntry; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.GraphicsObjectCreated; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -286,13 +286,13 @@ public class NpcIndicatorsPlugin extends Plugin public void onMenuOptionClicked(MenuOptionClicked click) { if (click.getMenuAction() != MenuAction.RUNELITE - || (!click.getMenuOption().equals(TAG) - && !click.getMenuOption().equals(UNTAG))) + || (!click.getOption().equals(TAG) + && !click.getOption().equals(UNTAG))) { return; } - final int id = click.getId(); + final int id = click.getIdentifier(); final boolean removed = npcTags.remove(id); final NPC[] cachedNPCs = client.getCachedNPCs(); final NPC npc = cachedNPCs[id]; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java index 9b71e86eca..2e46b11bd7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java @@ -29,9 +29,9 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java index 0e35df8f08..7fd4cff995 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java @@ -35,14 +35,14 @@ import java.text.NumberFormat; import java.time.Instant; import java.util.Locale; import javax.inject.Inject; -import api.Client; -import api.Constants; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -194,7 +194,7 @@ public class NpcSceneOverlay extends Overlay break; } - if (config.drawNames()) + if (config.drawNames() && actor.getName() != null) { String npcName = Text.removeTags(actor.getName()); Point textLocation = actor.getCanvasTextLocation(graphics, npcName, actor.getLogicalHeight() + 40); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/AggressionTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/AggressionTimer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/AggressionTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/AggressionTimer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java index 264e2db025..2090fca5c2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.npcunaggroarea; +import net.runelite.api.geometry.Geometry; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; @@ -32,11 +33,10 @@ import java.awt.Rectangle; import java.awt.geom.GeneralPath; import java.time.Instant; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.geometry.Geometry; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java index 0e33b8204b..d7aede1a4f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.npcunaggroarea; +import net.runelite.api.geometry.Geometry; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.inject.Provides; @@ -39,20 +40,19 @@ import java.util.List; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Constants; -import api.ItemID; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcSpawned; -import api.geometry.Geometry; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.ItemID; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java new file mode 100644 index 0000000000..5e57404903 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2019, Owain van Brakel + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.plugins.objectindicators; + +import java.awt.Color; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Range; +import net.runelite.client.config.Stub; + +@ConfigGroup("objectindicators") +public interface ObjectIndicatorsConfig extends Config +{ + @ConfigItem( + keyName = "overlayStub", + name = "Overlay Style", + description = "", + position = 0 + ) + default Stub overlayStub() + { + return new Stub(); + } + + @ConfigItem( + position = 1, + keyName = "objectMarkerRenderStyle", + name = "Highlight Style", + description = "Highlight setting", + parent = "overlayStub" + ) + default RenderStyle objectMarkerRenderStyle() + { + return RenderStyle.OUTLINE; + } + + + @ConfigItem( + position = 2, + keyName = "objectMarkerOutlineRenderStyle", + name = "Outline Style", + description = "Highlight outline setting", + parent = "overlayStub", + hidden = true, + unhide = "objectMarkerRenderStyle", + unhideValue = "OUTLINE" + ) + default OutlineRenderStyle objectMarkerOutlineRenderStyle() + { + return OutlineRenderStyle.NORMAL_OUTLINE; + } + + @ConfigItem( + keyName = "colorStub", + name = "Colors", + description = "", + position = 3 + ) + default Stub colorStub() + { + return new Stub(); + } + + @ConfigItem( + position = 4, + keyName = "markerColor", + name = "Marker color", + description = "Configures the outer color of object marker", + parent = "colorStub" + ) + default Color objectMarkerColor() + { + return Color.YELLOW; + } + + @Range( + max = 100 + ) + @ConfigItem( + position = 5, + keyName = "objectMarkerAlpha", + name = "Alpha", + description = "Configures the opacity/alpha of object marker", + parent = "colorStub" + ) + default int objectMarkerAlpha() + { + return 100; + } +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java similarity index 51% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java index 6fe05fe97f..a4e9aee7e9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2019, Owain van Brakel * Copyright (c) 2018, Tomas Slusny * All rights reserved. * @@ -24,33 +25,40 @@ */ package net.runelite.client.plugins.objectindicators; -import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; +import java.awt.geom.Area; +import static java.lang.Math.floor; import javax.inject.Inject; -import api.Client; -import api.DecorativeObject; -import api.GameObject; -import api.TileObject; +import net.runelite.api.Client; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameObject; +import net.runelite.api.TileObject; +import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.OverlayUtil; class ObjectIndicatorsOverlay extends Overlay { + private static final Color TRANSPARENT = new Color(0, 0, 0, 0); + private final Client client; private final ObjectIndicatorsConfig config; private final ObjectIndicatorsPlugin plugin; + private final ModelOutlineRenderer modelOutliner; @Inject - private ObjectIndicatorsOverlay(Client client, ObjectIndicatorsConfig config, ObjectIndicatorsPlugin plugin) + private ObjectIndicatorsOverlay(Client client, ObjectIndicatorsConfig config, ObjectIndicatorsPlugin plugin, ModelOutlineRenderer modelOutliner) { this.client = client; this.config = config; this.plugin = plugin; + this.modelOutliner = modelOutliner; setPosition(OverlayPosition.DYNAMIC); setPriority(OverlayPriority.LOW); setLayer(OverlayLayer.ABOVE_SCENE); @@ -66,46 +74,70 @@ class ObjectIndicatorsOverlay extends Overlay continue; } - final Polygon polygon; - Polygon polygon2 = null; + Color color = config.objectMarkerColor(); + int opacity = (int) floor(config.objectMarkerAlpha() * 2.55); + Color objectColor = new Color(color.getRed(), color.getGreen(), color.getBlue(), opacity); - if (object instanceof GameObject) + switch (config.objectMarkerRenderStyle()) { - polygon = ((GameObject) object).getConvexHull(); - } - else if (object instanceof DecorativeObject) - { - polygon = ((DecorativeObject) object).getConvexHull(); - polygon2 = ((DecorativeObject) object).getConvexHull2(); - } - else - { - polygon = object.getCanvasTilePoly(); - } + case OUTLINE: + switch (config.objectMarkerOutlineRenderStyle()) + { + case THIN_OUTLINE: + modelOutliner.drawOutline(object, 1, objectColor); + break; - if (polygon != null) - { - renderPoly(graphics, polygon, config.markerColor(), config.stroke(), config.alpha()); - } + case NORMAL_OUTLINE: + modelOutliner.drawOutline(object, 2, objectColor); + break; - if (polygon2 != null) - { - renderPoly(graphics, polygon2, config.markerColor(), config.stroke(), config.alpha()); + case THIN_GLOW: + modelOutliner.drawOutline(object, 4, objectColor, TRANSPARENT); + break; + + case GLOW: + modelOutliner.drawOutline(object, 8, objectColor, TRANSPARENT); + break; + } + break; + case HULL: + final Polygon polygon; + Polygon polygon2 = null; + + if (object instanceof GameObject) + { + polygon = ((GameObject) object).getConvexHull(); + } + else if (object instanceof DecorativeObject) + { + polygon = ((DecorativeObject) object).getConvexHull(); + polygon2 = ((DecorativeObject) object).getConvexHull2(); + } + else + { + polygon = object.getCanvasTilePoly(); + } + + if (polygon != null) + { + OverlayUtil.renderPolygon(graphics, polygon, objectColor); + } + + if (polygon2 != null) + { + OverlayUtil.renderPolygon(graphics, polygon2, objectColor); + } + break; + case CLICKBOX: + Area clickbox = object.getClickbox(); + if (clickbox != null) + { + OverlayUtil.renderHoverableArea(graphics, object.getClickbox(), client.getMouseCanvasPosition(), TRANSPARENT, objectColor, objectColor.darker()); + } + break; } } return null; } - - private void renderPoly(Graphics2D graphics, Polygon polygon, Color color, int stroke, int alpha) - { - if (polygon != null) - { - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 255)); - graphics.setStroke(new BasicStroke(stroke)); - graphics.draw(polygon); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha)); - graphics.fill(polygon); - } - } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java index 185788cea8..adb0cb4bc5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java @@ -41,26 +41,26 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import static api.Constants.REGION_SIZE; -import api.DecorativeObject; -import api.GameObject; -import api.GameState; -import api.MenuAction; -import api.MenuEntry; -import api.ObjectDefinition; -import api.Scene; -import api.Tile; -import api.TileObject; -import api.coords.WorldPoint; -import api.events.DecorativeObjectDespawned; -import api.events.DecorativeObjectSpawned; -import api.events.FocusChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; +import net.runelite.api.Client; +import static net.runelite.api.Constants.REGION_SIZE; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.ObjectDefinition; +import net.runelite.api.Scene; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.DecorativeObjectDespawned; +import net.runelite.api.events.DecorativeObjectSpawned; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.KeyListener; @@ -272,20 +272,20 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener public void onMenuOptionClicked(MenuOptionClicked event) { if (event.getMenuAction() != MenuAction.RUNELITE - || (!event.getMenuOption().equals(MARK) - && !event.getMenuOption().equals(UNMARK))) + || (!event.getOption().equals(MARK) + && !event.getOption().equals(UNMARK))) { return; } Scene scene = client.getScene(); Tile[][][] tiles = scene.getTiles(); - final int x = event.getActionParam(); - final int y = event.getWidgetId(); + final int x = event.getActionParam0(); + final int y = event.getActionParam1(); final int z = client.getPlane(); final Tile tile = tiles[z][x][y]; - TileObject object = findTileObject(tile, event.getId()); + TileObject object = findTileObject(tile, event.getIdentifier()); if (object == null) { return; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectPoint.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/objectindicators/ObjectPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectPoint.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/OutlineRenderStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/OutlineRenderStyle.java new file mode 100644 index 0000000000..2ed550f2b1 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/OutlineRenderStyle.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019, Owain van Brakel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.plugins.objectindicators; + +public enum OutlineRenderStyle +{ + THIN_OUTLINE, + NORMAL_OUTLINE, + THIN_GLOW, + GLOW +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/RenderStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/RenderStyle.java new file mode 100644 index 0000000000..4ef9af24ca --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/RenderStyle.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2019, Owain van Brakel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.plugins.objectindicators; + +public enum RenderStyle +{ + CLICKBOX, + HULL, + OUTLINE +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/HitpointsDisplayStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/HitpointsDisplayStyle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/HitpointsDisplayStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/HitpointsDisplayStyle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java index df4627633f..9ca6337427 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java @@ -32,12 +32,12 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import javax.inject.Inject; -import api.Actor; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.NPC; -import api.Player; -import api.Varbits; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Varbits; import net.runelite.client.game.HiscoreManager; import net.runelite.client.game.NPCManager; import net.runelite.client.ui.overlay.Overlay; @@ -65,7 +65,7 @@ class OpponentInfoOverlay extends Overlay private final PanelComponent panelComponent = new PanelComponent(); - private Integer lastMaxHealth; + private int lastMaxHealth; private int lastRatio = 0; private int lastHealthScale = 0; private String opponentName; @@ -111,7 +111,7 @@ class OpponentInfoOverlay extends Overlay lastHealthScale = opponent.getHealth(); opponentName = Text.removeTags(opponent.getName()); - lastMaxHealth = null; + lastMaxHealth = -1; if (opponent instanceof NPC) { lastMaxHealth = npcManager.getHealth(((NPC) opponent).getId()); @@ -167,7 +167,7 @@ class OpponentInfoOverlay extends Overlay final HitpointsDisplayStyle displayStyle = opponentInfoConfig.hitpointsDisplayStyle(); if ((displayStyle == HitpointsDisplayStyle.HITPOINTS || displayStyle == HitpointsDisplayStyle.BOTH) - && lastMaxHealth != null) + && lastMaxHealth != -1) { // This is the reverse of the calculation of healthRatio done by the server // which is: healthRatio = 1 + (healthScale - 1) * health / maxHealth (if health > 0, 0 otherwise) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java index 43c8a0267d..6e36665a8b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java @@ -32,13 +32,13 @@ import java.util.EnumSet; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.Actor; -import api.Client; -import api.GameState; -import api.WorldType; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.InteractingChanged; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.WorldType; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.InteractingChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java index 60c2fb5905..867e0e6004 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java @@ -29,20 +29,22 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Actor; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Player; -import api.Skill; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Player; +import net.runelite.api.Skill; import net.runelite.client.game.HiscoreManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; import net.runelite.client.util.Text; import net.runelite.http.api.hiscore.HiscoreResult; import net.runelite.http.api.hiscore.HiscoreSkill; @@ -74,8 +76,9 @@ class PlayerComparisonOverlay extends Overlay HiscoreSkill.PRAYER }; - private static final String LEFT_COLUMN_HEADER = "Skill"; - private static final String RIGHT_COLUMN_HEADER = "You/Them"; + private static final String SKILL_COLUMN_HEADER = "Skill"; + private static final String PLAYER_COLUMN_HEADER = "You"; + private static final String OPPONENT_COLUMN_HEADER = "Them"; private final Client client; private final OpponentInfoPlugin opponentInfoPlugin; @@ -140,13 +143,12 @@ class PlayerComparisonOverlay extends Overlay .color(HIGHLIGHT_COLOR) .build()); - panelComponent.getChildren().add( - LineComponent.builder() - .left(LEFT_COLUMN_HEADER) - .leftColor(HIGHLIGHT_COLOR) - .right(RIGHT_COLUMN_HEADER) - .rightColor(HIGHLIGHT_COLOR) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.CENTER, TableAlignment.RIGHT); + tableComponent.addRow( + ColorUtil.prependColorTag(SKILL_COLUMN_HEADER, HIGHLIGHT_COLOR), + ColorUtil.prependColorTag(PLAYER_COLUMN_HEADER, HIGHLIGHT_COLOR), + ColorUtil.prependColorTag(OPPONENT_COLUMN_HEADER, HIGHLIGHT_COLOR)); for (int i = 0; i < COMBAT_SKILLS.length; ++i) { @@ -163,13 +165,13 @@ class PlayerComparisonOverlay extends Overlay final int playerSkillLevel = client.getRealSkillLevel(skill); final int opponentSkillLevel = opponentSkill.getLevel(); - panelComponent.getChildren().add( - LineComponent.builder() - .left(hiscoreSkill.getName()) - .right(playerSkillLevel + "/" + opponentSkillLevel) - .rightColor(comparisonStatColor(playerSkillLevel, opponentSkillLevel)) - .build()); + tableComponent.addRow( + hiscoreSkill.getName(), + ColorUtil.prependColorTag(Integer.toString(playerSkillLevel), comparisonStatColor(playerSkillLevel, opponentSkillLevel)), + ColorUtil.prependColorTag(Integer.toString(opponentSkillLevel), comparisonStatColor(opponentSkillLevel, playerSkillLevel))); } + + panelComponent.getChildren().add(tableComponent); } private static Color comparisonStatColor(int a, int b) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/PartyConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java index 920a06e3c8..9134c1f8d1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java @@ -30,10 +30,9 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.util.Iterator; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.plugins.party.data.PartyTilePingData; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; @@ -60,18 +59,6 @@ class PartyPingOverlay extends Overlay return null; } - // Update selected scene tile - if (!client.isMenuOpen()) - { - Point p = client.getMouseCanvasPosition(); - p = new Point( - p.getX() - client.getViewportXOffset(), - p.getY() - client.getViewportYOffset()); - - client.setCheckClick(true); - client.setMouseCanvasHoverPosition(p); - } - synchronized (plugin.getPendingTilePings()) { final Iterator iterator = plugin.getPendingTilePings().iterator(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java index 887b487ce5..2d7bddc3a6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java @@ -40,19 +40,19 @@ import javax.inject.Inject; import javax.inject.Named; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.MenuAction; -import api.MenuEntry; -import api.Skill; -import api.SoundEffectID; -import api.Tile; -import api.coords.WorldPoint; -import api.events.CommandExecuted; -import api.events.FocusChanged; -import api.events.GameTick; -import api.events.MenuOptionClicked; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Skill; +import net.runelite.api.SoundEffectID; +import net.runelite.api.Tile; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.CommandExecuted; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.MenuOptionClicked; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPluginService.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPluginService.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPluginService.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPluginService.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPluginServiceImpl.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPluginServiceImpl.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyPluginServiceImpl.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPluginServiceImpl.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java index f9c0628a9c..693b23cb89 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java @@ -32,7 +32,7 @@ import java.awt.Rectangle; import java.util.Map; import java.util.UUID; import javax.inject.Inject; -import api.MenuAction; +import net.runelite.api.MenuAction; import net.runelite.client.plugins.party.data.PartyData; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayMenuEntry; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java index 07ef7f32bc..a2ae27835b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.party; import java.awt.Graphics; import java.awt.image.BufferedImage; -import api.Point; -import api.coords.WorldPoint; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; import net.runelite.client.util.ImageUtil; import net.runelite.client.ws.PartyMember; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/data/PartyData.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyData.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/data/PartyData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyData.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/data/PartyTilePingData.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyTilePingData.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/data/PartyTilePingData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyTilePingData.java index 3aa4f5d349..467e69dd2a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/data/PartyTilePingData.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyTilePingData.java @@ -28,7 +28,7 @@ import java.awt.Color; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @RequiredArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/LocationUpdate.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/messages/LocationUpdate.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/LocationUpdate.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/messages/LocationUpdate.java index 65dc87955c..f5bf7131ce 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/LocationUpdate.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/messages/LocationUpdate.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.party.messages; import lombok.EqualsAndHashCode; import lombok.Value; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.http.api.ws.messages.party.PartyMemberMessage; @Value diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/SkillUpdate.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/messages/SkillUpdate.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/SkillUpdate.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/messages/SkillUpdate.java index 38dce9a968..10f5810b0f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/SkillUpdate.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/messages/SkillUpdate.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.party.messages; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Skill; +import net.runelite.api.Skill; import net.runelite.http.api.ws.messages.party.PartyMemberMessage; @AllArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/TilePing.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/messages/TilePing.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/TilePing.java rename to runelite-client/src/main/java/net/runelite/client/plugins/party/messages/TilePing.java index f91feb3481..fb4f812a81 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/party/messages/TilePing.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/messages/TilePing.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.party.messages; import lombok.EqualsAndHashCode; import lombok.Value; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.http.api.ws.messages.party.PartyMemberMessage; @Value diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/Performance.java b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/Performance.java new file mode 100644 index 0000000000..cc81fa1bfb --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/Performance.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2019, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.performancestats; + +import lombok.Getter; +import lombok.Setter; +import net.runelite.http.api.ws.messages.party.PartyMemberMessage; + +@Getter +class Performance extends PartyMemberMessage +{ + private static final double TICK_LENGTH = 0.6; + + @Setter + String username; + + double damageDealt = 0; + double highestHitDealt = 0; + + double damageTaken = 0; + double highestHitTaken = 0; + + int lastActivityTick = -1; + @Setter + double ticksSpent = 0; + + void addDamageDealt(double a, int currentTick) + { + damageDealt += a; + if (a > highestHitDealt) + { + highestHitDealt = a; + } + + this.lastActivityTick = currentTick; + } + + void addDamageTaken(double a, int currentTick) + { + damageTaken += a; + if (a > highestHitTaken) + { + highestHitTaken = a; + } + + this.lastActivityTick = currentTick; + } + + void incrementTicksSpent() + { + ticksSpent++; + } + + void reset() + { + damageDealt = 0; + highestHitDealt = 0; + damageTaken = 0; + highestHitTaken = 0; + lastActivityTick = -1; + ticksSpent = 0; + } + + double getSecondsSpent() + { + return Math.round(this.ticksSpent * TICK_LENGTH); + } + + double getDPS() + { + return Math.round( (this.damageDealt / this.getSecondsSpent()) * 100) / 100.00; + } + + String getHumanReadableSecondsSpent() + { + final double secondsSpent = getSecondsSpent(); + if (secondsSpent <= 60) + { + return String.format("%2.0f", secondsSpent) + "s"; + } + + final double s = secondsSpent % 3600 % 60; + final double m = Math.floor(secondsSpent % 3600 / 60); + final double h = Math.floor(secondsSpent / 3600); + + return h < 1 ? String.format("%2.0f:%02.0f", m, s) : String.format("%2.0f:%02.0f:%02.0f", h, m, s); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/FightCaveConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsConfig.java similarity index 78% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/FightCaveConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsConfig.java index f1e5457f7a..1c6aea301d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/fightcave/FightCaveConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Jordan Atwood + * Copyright (c) 2019, TheStonedTurtle * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,22 +22,23 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.fightcave; +package net.runelite.client.plugins.performancestats; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; -@ConfigGroup("fightcave") -public interface FightCaveConfig extends Config +@ConfigGroup("performancestats") +public interface PerformanceStatsConfig extends Config { @ConfigItem( - keyName = "waveDisplay", - name = "Wave display", - description = "Shows monsters that will spawn on the selected wave(s)." + position = 0, + keyName = "submitTimeout", + name = "Submit Timeout (seconds)", + description = "Submits after this many seconds of inactivity" ) - default WaveDisplayMode waveDisplay() + default int submitTimeout() { - return WaveDisplayMode.BOTH; + return 30; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsOverlay.java new file mode 100644 index 0000000000..c2d2961034 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsOverlay.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.performancestats; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import javax.inject.Inject; +import net.runelite.api.MenuAction; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.ComponentConstants; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; + +public class PerformanceStatsOverlay extends Overlay +{ + private static final String TARGET = "Performance Stats"; + private static final String[] COLUMNS = { + "Player", "Dealt", "Taken", "DPS", "Elapsed" + }; + + private final PerformanceStatsPlugin tracker; + private final PanelComponent panelComponent = new PanelComponent(); + private final TableComponent tableComponent = new TableComponent(); + + @Inject + PerformanceStatsOverlay(PerformanceStatsPlugin tracker) + { + super(tracker); + setPosition(OverlayPosition.TOP_RIGHT); + setPriority(OverlayPriority.LOW); + this.tracker = tracker; + + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, "Pause", TARGET)); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, "Reset", TARGET)); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, "Submit", TARGET)); + + panelComponent.setPreferredSize(new Dimension(350, 0)); + panelComponent.setBackgroundColor(ComponentConstants.STANDARD_BACKGROUND_COLOR); + + tableComponent.setDefaultAlignment(TableAlignment.CENTER); + tableComponent.setColumns(COLUMNS); + + panelComponent.getChildren().add(tableComponent); + } + + @Override + public String getName() + { + return TARGET; + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!tracker.isEnabled()) + { + return null; + } + + final Performance performance = tracker.getPerformance(); + graphics.setColor(Color.WHITE); + + tableComponent.getRows().clear(); + + final String[] rowElements = createRowElements(performance); + tableComponent.addRow(rowElements); + + for (Performance p : tracker.getPartyDataMap().values()) + { + if (p.getMemberId().equals(performance.getMemberId())) + { + continue; + } + + final String[] eles = createRowElements(p); + tableComponent.addRow(eles); + } + + return panelComponent.render(graphics); + } + + private String[] createRowElements(Performance performance) + { + return new String[] + { + performance.getUsername(), + String.valueOf((int) Math.round(performance.getDamageDealt())) + " | " + String.valueOf((int) Math.round(performance.getHighestHitDealt())), + String.valueOf((int) Math.round(performance.getDamageTaken())) + " | " + String.valueOf((int) Math.round(performance.getHighestHitTaken())), + String.valueOf(performance.getDPS()), + performance.getHumanReadableSecondsSpent() + }; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsPlugin.java new file mode 100644 index 0000000000..fa3e7fd530 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/performancestats/PerformanceStatsPlugin.java @@ -0,0 +1,452 @@ +/* + * Copyright (c) 2018, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.performancestats; + +import com.google.inject.Provides; +import java.text.DecimalFormat; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import javax.inject.Inject; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Skill; +import net.runelite.api.WorldType; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.client.chat.ChatColorType; +import net.runelite.client.chat.ChatMessageBuilder; +import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.chat.QueuedMessage; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.OverlayMenuClicked; +import net.runelite.client.events.PartyChanged; +import net.runelite.client.game.NPCManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.Text; +import net.runelite.client.ws.PartyMember; +import net.runelite.client.ws.PartyService; +import net.runelite.client.ws.WSClient; +import net.runelite.http.api.ws.messages.party.UserPart; +import net.runelite.http.api.ws.messages.party.UserSync; + +@PluginDescriptor( + name = "Performance Stats", + description = "Displays your current performance stats", + tags = {"performance", "stats", "dps", "damage", "combat"}, + type = PluginType.UTILITY, + enabledByDefault = false +) +@Slf4j +public class PerformanceStatsPlugin extends Plugin +{ + // For every damage point dealt 1.33 experience is given to the player's hitpoints (base rate) + private static final double HITPOINT_RATIO = 1.33; + private static final double DMM_MULTIPLIER_RATIO = 10; + + private static final double GAME_TICK_SECONDS = 0.6; + private static final DecimalFormat numberFormat = new DecimalFormat("#,###"); + + @Inject + private Client client; + + @Inject + private ChatMessageManager chatMessageManager; + + @Inject + private PerformanceStatsConfig config; + + @Inject + private PerformanceStatsOverlay performanceTrackerOverlay; + + @Inject + private OverlayManager overlayManager; + + @Inject + private NPCManager npcManager; + + @Inject + private PartyService partyService; + + @Inject + private WSClient wsClient; + + @Getter + private boolean enabled = false; + @Getter + private boolean paused = false; + @Getter + private final Performance performance = new Performance(); + + // Keep track of actor last tick as sometimes getInteracting can return null when hp xp event is triggered + // as the player clicked away at the perfect time + private Actor oldTarget; + private double hpExp; + private boolean hopping; + private int pausedTicks = 0; + + // Party System + @Getter + private final Map partyDataMap = Collections.synchronizedMap(new HashMap<>()); + + @Provides + PerformanceStatsConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(PerformanceStatsConfig.class); + } + + @Override + protected void startUp() + { + overlayManager.add(performanceTrackerOverlay); + wsClient.registerMessage(Performance.class); + } + + @Override + protected void shutDown() + { + overlayManager.remove(performanceTrackerOverlay); + wsClient.unregisterMessage(Performance.class); + disable(); + reset(); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + switch (event.getGameState()) + { + case LOGIN_SCREEN: + disable(); + break; + case HOPPING: + hopping = true; + break; + } + } + + @Subscribe + public void onHitsplatApplied(HitsplatApplied e) + { + if (isPaused()) + { + return; + } + + if (e.getActor().equals(client.getLocalPlayer())) + { + // Auto enables when hitsplat is applied to player + if (!isEnabled()) + { + enable(); + } + + performance.addDamageTaken(e.getHitsplat().getAmount(), client.getTickCount()); + } + } + + @Subscribe + public void onExperienceChanged(ExperienceChanged c) + { + if (isPaused() || hopping) + { + return; + } + + if (c.getSkill().equals(Skill.HITPOINTS)) + { + final double oldExp = hpExp; + hpExp = client.getSkillExperience(Skill.HITPOINTS); + + // Ignore initial login + if (client.getTickCount() < 2) + { + return; + } + + final double diff = hpExp - oldExp; + if (diff < 1) + { + return; + } + + // Auto enables when player receives hp exp + if (!isEnabled()) + { + enable(); + } + + final double damageDealt = calculateDamageDealt(diff); + performance.addDamageDealt(damageDealt, client.getTickCount()); + } + } + + @Subscribe + public void onScriptCallbackEvent(ScriptCallbackEvent e) + { + // Handles Fake XP drops (Ironman in PvP, DMM Cap, 200m xp, etc) + if (isPaused()) + { + return; + } + + if (!"fakeXpDrop".equals(e.getEventName())) + { + return; + } + + final int[] intStack = client.getIntStack(); + final int intStackSize = client.getIntStackSize(); + + final int skillId = intStack[intStackSize - 2]; + final Skill skill = Skill.values()[skillId]; + if (skill.equals(Skill.HITPOINTS)) + { + // Auto enables when player would have received hp exp + if (!isEnabled()) + { + enable(); + } + + final int exp = intStack[intStackSize - 1]; + performance.addDamageDealt(calculateDamageDealt(exp), client.getTickCount()); + } + } + + @Subscribe + public void onGameTick(GameTick t) + { + oldTarget = client.getLocalPlayer().getInteracting(); + + if (!isEnabled()) + { + return; + } + + if (isPaused()) + { + pausedTicks++; + return; + } + + performance.incrementTicksSpent(); + hopping = false; + + final int timeout = config.submitTimeout(); + if (timeout > 0) + { + final double tickTimeout = timeout / GAME_TICK_SECONDS; + final int activityDiff = (client.getTickCount() - pausedTicks) - performance.getLastActivityTick(); + if (activityDiff > tickTimeout) + { + // offset the tracker time to account for idle timeout + // Leave an additional tick to pad elapsed time + final double offset = tickTimeout - GAME_TICK_SECONDS; + performance.setTicksSpent(performance.getTicksSpent() - offset); + + submit(); + } + } + + final String name = client.getLocalPlayer().getName(); + performance.setUsername(Text.removeTags(name)); + sendPerformance(); + } + + @Subscribe + public void onOverlayMenuClicked(OverlayMenuClicked c) + { + if (!c.getOverlay().equals(performanceTrackerOverlay)) + { + return; + } + + switch (c.getEntry().getOption()) + { + case "Pause": + togglePaused(); + break; + case "Reset": + reset(); + break; + case "Submit": + submit(); + break; + } + } + + private void enable() + { + this.enabled = true; + hpExp = client.getSkillExperience(Skill.HITPOINTS); + } + + private void disable() + { + this.enabled = false; + } + + private void togglePaused() + { + this.paused = !this.paused; + } + + private void reset() + { + this.enabled = false; + this.paused = false; + + this.performance.reset(); + pausedTicks = 0; + } + + private void submit() + { + final String message = createPerformanceMessage(performance); + + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.GAMEMESSAGE) + .runeLiteFormattedMessage(message) + .build()); + + reset(); + } + + /** + * Calculates damage dealt based on HP xp gained accounting for multipliers such as DMM mode + * @param diff HP xp gained + * @return damage dealt + */ + private double calculateDamageDealt(double diff) + { + double damageDealt = diff / HITPOINT_RATIO; + // DeadMan mode has an XP modifier + if (client.getWorldType().contains(WorldType.DEADMAN)) + { + damageDealt = damageDealt / DMM_MULTIPLIER_RATIO; + } + + // Some NPCs have an XP modifier, account for it here. + Actor a = client.getLocalPlayer().getInteracting(); + if (!(a instanceof NPC)) + { + // If we are interacting with nothing we may have clicked away at the perfect time fall back to last tick + if (!(oldTarget instanceof NPC)) + { + log.warn("Couldn't find current or past target for experienced gain..."); + return damageDealt; + } + + a = oldTarget; + } + + final int npcId = ((NPC) a).getId(); + return damageDealt / npcManager.getXpModifier(npcId); + } + + private String createPerformanceMessage(final Performance p) + { + // Expected result: Damage Dealt: ## (Max: ##), Damage Taken: ## (Max: ##), Time Spent: ##:## (DPS: ##.##) + return new ChatMessageBuilder() + .append(ChatColorType.NORMAL) + .append("Damage dealt: ") + .append(ChatColorType.HIGHLIGHT) + .append(numberFormat.format(p.getDamageDealt())) + .append(ChatColorType.NORMAL) + .append(" (Max: ") + .append(ChatColorType.HIGHLIGHT) + .append(numberFormat.format(p.getHighestHitDealt())) + .append(ChatColorType.NORMAL) + .append("), Damage Taken: ") + .append(ChatColorType.HIGHLIGHT) + .append(numberFormat.format(p.getDamageTaken())) + .append(ChatColorType.NORMAL) + .append(" (Max: ") + .append(ChatColorType.HIGHLIGHT) + .append(numberFormat.format(p.getHighestHitTaken())) + .append(ChatColorType.NORMAL) + .append("), Time Spent: ") + .append(ChatColorType.HIGHLIGHT) + .append(p.getHumanReadableSecondsSpent()) + .append(ChatColorType.NORMAL) + .append(" (DPS: ") + .append(ChatColorType.HIGHLIGHT) + .append(String.valueOf(p.getDPS())) + .append(ChatColorType.NORMAL) + .append(")") + .build(); + } + + private void sendPerformance() + { + final PartyMember me = partyService.getLocalMember(); + if (me != null && me.getMemberId() != null) + { + performance.setMemberId(me.getMemberId()); + wsClient.send(performance); + } + } + + @Subscribe + public void onPerformance(final Performance performance) + { + partyDataMap.put(performance.getMemberId(), performance); + } + + @Subscribe + public void onUserSync(final UserSync event) + { + if (isEnabled()) + { + sendPerformance(); + } + } + + @Subscribe + public void onUserPart(final UserPart event) + { + partyDataMap.remove(event.getMemberId()); + } + + @Subscribe + public void onPartyChanged(final PartyChanged event) + { + // Reset party + partyDataMap.clear(); + } + +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/Game.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/Game.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/Game.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/Game.java index ff96feac5b..6e9e4274bd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/Game.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/Game.java @@ -32,10 +32,10 @@ import java.util.Collection; import java.util.List; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.NPC; -import api.coords.WorldPoint; -import api.events.GameTick; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameTick; @Slf4j public class Game diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/GangplankOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/GangplankOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/GangplankOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/GangplankOverlay.java index 812cfd2cd6..db8abe87b7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/GangplankOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/GangplankOverlay.java @@ -31,10 +31,10 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Player; -import api.Point; -import api.Tile; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Tile; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/HintArrowOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/HintArrowOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/HintArrowOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/HintArrowOverlay.java index c92ea7c840..90c81228a1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/HintArrowOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/HintArrowOverlay.java @@ -30,9 +30,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightContext.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightContext.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightContext.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightContext.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightOverlay.java index 8c6dda1e7d..bb8e94c175 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/NpcHighlightOverlay.java @@ -32,10 +32,10 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.util.HashMap; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.NPC; -import api.Perspective; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; import net.runelite.client.plugins.pestcontrol.config.NpcHighlightStyle; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlNpc.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlNpc.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlNpc.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlNpc.java index 2a0cc267af..e1b9ef143e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlNpc.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlNpc.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.pestcontrol; import com.google.common.collect.ImmutableSet; import java.util.Set; import lombok.Getter; -import api.NpcID; +import net.runelite.api.NpcID; @Getter public class PestControlNpc diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java index 0ff2f9e4e2..d3095afd5a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java @@ -35,25 +35,25 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.ItemID; -import api.Tile; -import api.TileObject; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.GroundObjectChanged; -import api.events.GroundObjectDespawned; -import api.events.GroundObjectSpawned; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.ItemID; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; @@ -73,6 +73,8 @@ import net.runelite.client.util.Text; ) public class PestControlPlugin extends Plugin { + private static final int VOID_KNIGHTS_OUTPOST = 10537; + private final int NOVICE_GANGPLANK = 14315; // Combat 40+ (3 points) private final int INTERMEDIATE_GANGPLANK = 25631; // Combat 70+ (4 points) private final int VETERAN_GANGPLANK = 25632; // Combat 100+ (5 points) @@ -394,7 +396,7 @@ public class PestControlPlugin extends Plugin } // Get points from dialog after purchase - Widget pestControlDialog = client.getWidget(WidgetInfo.PEST_CONTROL_DIALOG_TEXT); + Widget pestControlDialog = client.getWidget(WidgetInfo.MINIGAME_DIALOG_TEXT); if (pestControlDialog != null) { String pestControlDialogText = Text.sanitizeMultilineText(pestControlDialog.getText()); @@ -662,6 +664,10 @@ public class PestControlPlugin extends Plugin boolean isOnPestControlMainIsland() { - return client.getLocalPlayer().getWorldLocation().getRegionID() == 10537; + if (client.getLocalPlayer() != null) + { + return client.getLocalPlayer().getWorldLocation().getRegionID() == VOID_KNIGHTS_OUTPOST; + } + return false; } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlRepairObject.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlRepairObject.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlRepairObject.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlRepairObject.java index 86c79a43e8..f3a8d457dd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlRepairObject.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlRepairObject.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.pestcontrol; import com.google.common.collect.ImmutableSet; import java.util.Set; import lombok.Getter; -import api.ObjectID; +import net.runelite.api.ObjectID; @Getter public class PestControlRepairObject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PointsInfoboxCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PointsInfoboxCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PointsInfoboxCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PointsInfoboxCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/Portal.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/Portal.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/Portal.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/Portal.java index da1694ce3f..2ad85a24ea 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/Portal.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/Portal.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.pestcontrol; import lombok.Getter; import lombok.Setter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Getter @Setter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalColor.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalColor.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalColor.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalColor.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalRotation.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalRotation.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalRotation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalRotation.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalState.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalWeaknessOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalWeaknessOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalWeaknessOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalWeaknessOverlay.java index 0ae9fce830..e24363ec28 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/PortalWeaknessOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PortalWeaknessOverlay.java @@ -31,13 +31,13 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.ItemID; -import api.Perspective; -import api.Point; -import api.Skill; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Skill; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.overlay.Overlay; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/RepairOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/RepairOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/RepairOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/RepairOverlay.java index 5154df38f9..a0ee3bf09f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/RepairOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/RepairOverlay.java @@ -30,15 +30,15 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.Area; -import api.Client; -import api.Constants; -import api.GameObject; -import api.GroundObject; -import api.Player; -import api.Point; -import api.Scene; -import api.Tile; -import api.WallObject; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameObject; +import net.runelite.api.GroundObject; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Scene; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/TimerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/TimerOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/TimerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/TimerOverlay.java index 26c3102b42..be45fc728e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/TimerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/TimerOverlay.java @@ -29,10 +29,10 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.time.Duration; -import api.Client; -import api.Point; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetOverlay.java index d957f01137..38c1582e32 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetOverlay.java @@ -33,9 +33,9 @@ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetPortal.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetPortal.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetPortal.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetPortal.java index bc38c70b9c..7570cfb87f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetPortal.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/WidgetPortal.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.pestcontrol; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; -import api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetInfo; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/config/HighlightPortalOption.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/config/HighlightPortalOption.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/config/HighlightPortalOption.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/config/HighlightPortalOption.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/config/NpcHighlightStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/config/NpcHighlightStyle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pestcontrol/config/NpcHighlightStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/config/NpcHighlightStyle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsConfig.java similarity index 66% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsConfig.java index ed11f0cc5b..44da3efac0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsConfig.java @@ -24,22 +24,33 @@ package net.runelite.client.plugins.pileindicators; +import java.awt.Color; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; import net.runelite.client.config.Range; - -import java.awt.*; +import net.runelite.client.config.Stub; @ConfigGroup("pileindicators") public interface PileIndicatorsConfig extends Config { @ConfigItem( - position = 0, + keyName = "playerPilesStub", + name = "Player Piles", + description = "", + position = 0 + ) + default Stub playerPilesStub() + { + return new Stub(); + } + + @ConfigItem( + position = 1, keyName = "enablePlayers", name = "Enable Player Piling", description = "Enable the option to highlight players when they pile.", - group = "1. Player Piles" + parent = "playerPilesStub" ) default boolean enablePlayers() { @@ -47,11 +58,11 @@ public interface PileIndicatorsConfig extends Config } @ConfigItem( - position = 1, + position = 2, keyName = "wildyOnlyPlayer", name = "Wilderness Only", description = "Show player piling only when in the Wilderness.", - group = "1. Player Piles" + parent = "playerPilesStub" ) default boolean wildyOnlyPlayer() { @@ -60,22 +71,10 @@ public interface PileIndicatorsConfig extends Config @ConfigItem( position = 3, - keyName = "enableNPCS", - name = "Enable NPC Piling", - description = "Enable the option to highlight NPCs when they pile.", - group = "2. NPC Piles" - ) - default boolean enableNPCS() - { - return false; - } - - @ConfigItem( - position = 2, keyName = "playerPileColor", name = "Player Pile Color", description = "Color used for player piles.", - group = "1. Player Piles" + parent = "playerPilesStub" ) default Color playerPileColor() { @@ -83,11 +82,34 @@ public interface PileIndicatorsConfig extends Config } @ConfigItem( - position = 4, + keyName = "npcPilesStub", + name = "NPC Piles", + description = "", + position = 4 + ) + default Stub npcPilesStub() + { + return new Stub(); + } + + @ConfigItem( + position = 5, + keyName = "enableNPCS", + name = "Enable NPC Piling", + description = "Enable the option to highlight NPCs when they pile.", + parent = "npcPilesStub" + ) + default boolean enableNPCS() + { + return false; + } + + @ConfigItem( + position = 6, keyName = "npcPileColor", name = "NPC Pile Color", description = "Color used for NPC piles.", - group = "2. NPC Piles" + parent = "npcPilesStub" ) default Color npcPileColor() { @@ -95,26 +117,48 @@ public interface PileIndicatorsConfig extends Config } @ConfigItem( - position = 5, + keyName = "mixedPilesStub", + name = "Mixed Piles", + description = "", + position = 7 + ) + default Stub mixedPilesStub() + { + return new Stub(); + } + + @ConfigItem( + position = 8, keyName = "mixedPileColor", name = "Mixed Pile Color", description = "Color used for mixed piles.", - group = "3. Mixed Piles" + parent = "mixedPilesStub" ) default Color mixedPileColor() { return new Color(255, 0, 255); } + @ConfigItem( + keyName = "pilesSizeStub", + name = "Pile size", + description = "", + position = 9 + ) + default Stub pilesSizeStub() + { + return new Stub(); + } + @Range( min = 2 ) @ConfigItem( - position = 6, + position = 10, keyName = "minimumPileSize", name = "Minimum Pile Size", description = "Any pile under this size will not show up. (Minimum: 2)", - group = "4. Pile Size" + parent = "pilesSizeStub" ) default int minimumPileSize() { @@ -122,14 +166,50 @@ public interface PileIndicatorsConfig extends Config } @ConfigItem( - position = 7, + keyName = "miscellaneousStub", + name = "Miscellaneous", + description = "", + position = 11 + ) + default Stub miscellaneousStub() + { + return new Stub(); + } + + @ConfigItem( + position = 12, keyName = "numberOnly", name = "Display Number Only", description = "Shorten \"PILE SIZE: 1\" to \"1\"", - group = "5. Miscellaneous" + parent = "miscellaneousStub" ) default boolean numberOnly() { return false; } + + @ConfigItem( + position = 13, + keyName = "drawPileTile", + name = "Draw Pile Tile", + description = "Draws the tile of the pile for best visibility.", + parent = "miscellaneousStub" + ) + default boolean drawPileTile() + { + return true; + } + + @ConfigItem( + position = 14, + keyName = "drawPileHull", + name = "Draw Pile Convex Hull", + description = "Draws the hull of the pile for best visibility.", + parent = "miscellaneousStub" + ) + default boolean drawPileHull() + { + return false; + } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsOverlay.java similarity index 75% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsOverlay.java index f4d0e466c0..1479c1f2fa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsOverlay.java @@ -24,13 +24,17 @@ package net.runelite.client.plugins.pileindicators; -import api.Actor; -import api.Client; -import net.runelite.client.ui.overlay.*; +import net.runelite.api.Actor; +import net.runelite.api.Client; import javax.inject.Inject; import java.awt.*; import java.util.ArrayList; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.OverlayUtil; public class PileIndicatorsOverlay extends Overlay { @@ -65,22 +69,21 @@ public class PileIndicatorsOverlay extends Overlay PileType pileType = plugin.getPileType(actorArrayList); Color pileColor = plugin.getColorByPileType(pileType); - try + try { Actor actorToRender = actorArrayList.get(0); //guaranteed to have at least two players - final String text; - if (config.numberOnly()) + final String pileTypeStr = pileType == PileType.PLAYER_PILE ? "PLAYER" : pileType == PileType.NPC_PILE ? "NPC" : pileType == PileType.MIXED_PILE ? "MIXED" : ""; + final String text = config.numberOnly() ? "" + actorArrayList.size() : (pileTypeStr + " PILE SIZE: " + actorArrayList.size()); + if (config.drawPileTile()) { - text = "" + actorArrayList.size(); + OverlayUtil.renderPolygon(graphics, actorToRender.getCanvasTilePoly(), pileColor); } - else + if (config.drawPileHull()) { - text = "PILE SIZE: " + actorArrayList.size(); + OverlayUtil.renderPolygon(graphics, actorToRender.getConvexHull(), pileColor); } - - OverlayUtil.renderPolygon(graphics, actorToRender.getCanvasTilePoly(), pileColor); OverlayUtil.renderTextLocation(graphics, actorToRender.getCanvasTextLocation(graphics, text, 40), text, pileColor); - } + } catch (Exception ignored) { } @@ -89,4 +92,5 @@ public class PileIndicatorsOverlay extends Overlay return null; } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsPlugin.java index 35c4c86813..2afa035caa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileIndicatorsPlugin.java @@ -27,7 +27,11 @@ package net.runelite.client.plugins.pileindicators; import com.google.inject.Binder; import com.google.inject.Provides; import lombok.extern.slf4j.Slf4j; -import api.*; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Varbits; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -39,15 +43,16 @@ import javax.inject.Singleton; import java.awt.*; import java.util.ArrayList; -@Singleton -@Slf4j @PluginDescriptor( name = "Pile Indicators", description = "Highlight and count how many npcs/players are stacked on each other.", tags = {"overlay", "pile", "stack", "pvp", "pvm", "pve"}, - enabledByDefault = false, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + +@Singleton +@Slf4j public class PileIndicatorsPlugin extends Plugin { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileType.java b/runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pileindicators/PileType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pileindicators/PileType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java index 49338dd56c..47ce1fd775 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java @@ -25,11 +25,10 @@ package net.runelite.client.plugins.playerindicators; import java.awt.Color; -import api.ClanMemberRank; +import net.runelite.api.ClanMemberRank; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; -import net.runelite.client.config.Range; @ConfigGroup("playerindicators") public interface PlayerIndicatorsConfig extends Config @@ -365,46 +364,6 @@ public interface PlayerIndicatorsConfig extends Config return Color.WHITE; } - @ConfigItem( - position = 27, - keyName = "highlightPile", - name = "Highlight Pile", - description = "Highlights Pile Onscreen", - group = "Callers" - ) - default boolean highlightPile() - { - return false; - } - - @ConfigItem( - position = 29, - keyName = "drawPileHull", - name = "Draws the hull of the pile.", - description = "Draws the hull of the pile for best visibility.", - group = "Callers" - ) - default boolean drawPileHull() - { - return false; - } - - @Range( - min = 1, - max = 10 - ) - @ConfigItem( - position = 30, - keyName = "pileColor", - name = "Pile Color", - description = "Color of Indicated Pile", - group = "Callers" - ) - default Color pileColor() - { - return Color.WHITE; - } - @ConfigItem( position = 27, keyName = "unchargedGlory", diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java index 32494eab7c..e356d9b5f2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java @@ -30,9 +30,9 @@ import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; -import api.Player; -import api.Point; -import api.SkullIcon; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.SkullIcon; import net.runelite.client.plugins.friendtagging.FriendTaggingPlugin; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -80,7 +80,7 @@ public class PlayerIndicatorsMinimapOverlay extends Overlay name += tag; - api.Point minimapLocation = actor.getMinimapLocation(); + net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); if (minimapLocation != null) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java index 50c360e6db..bd9d0bed03 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java @@ -31,13 +31,13 @@ import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; -import api.ClanMemberRank; -import api.Client; -import api.ItemDefinition; -import api.Player; -import api.Point; -import api.SkullIcon; -import api.kit.KitType; +import net.runelite.api.ClanMemberRank; +import net.runelite.api.Client; +import net.runelite.api.ItemDefinition; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.SkullIcon; +import net.runelite.api.kit.KitType; import net.runelite.client.game.ClanManager; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.friendtagging.FriendTaggingPlugin; @@ -172,10 +172,6 @@ public class PlayerIndicatorsOverlay extends Overlay { name = "[C] " + name; } - if (config.highlightPile() && playerIndicatorsPlugin.isPile(actor)) - { - name = "[P] " + name; - } if (config.showCombatLevel()) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java index 989085264e..12358a2273 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java @@ -29,33 +29,30 @@ import java.awt.Color; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Objects; import javax.inject.Inject; -import api.Actor; -import api.ClanMember; -import api.ClanMemberRank; -import static api.ClanMemberRank.UNRANKED; -import api.Client; -import static api.MenuAction.FOLLOW; -import static api.MenuAction.ITEM_USE_ON_PLAYER; -import static api.MenuAction.PLAYER_EIGTH_OPTION; -import static api.MenuAction.PLAYER_FIFTH_OPTION; -import static api.MenuAction.PLAYER_FIRST_OPTION; -import static api.MenuAction.PLAYER_FOURTH_OPTION; -import static api.MenuAction.PLAYER_SECOND_OPTION; -import static api.MenuAction.PLAYER_SEVENTH_OPTION; -import static api.MenuAction.PLAYER_SIXTH_OPTION; -import static api.MenuAction.PLAYER_THIRD_OPTION; -import static api.MenuAction.RUNELITE; -import static api.MenuAction.SPELL_CAST_ON_PLAYER; -import static api.MenuAction.TRADE; -import api.MenuEntry; -import api.Player; -import api.events.ClanMemberJoined; -import api.events.ClanMemberLeft; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.MenuEntryAdded; +import net.runelite.api.ClanMember; +import net.runelite.api.ClanMemberRank; +import static net.runelite.api.ClanMemberRank.UNRANKED; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.FOLLOW; +import static net.runelite.api.MenuAction.ITEM_USE_ON_PLAYER; +import static net.runelite.api.MenuAction.PLAYER_EIGTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIFTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIRST_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FOURTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SECOND_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SEVENTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SIXTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_THIRD_OPTION; +import static net.runelite.api.MenuAction.RUNELITE; +import static net.runelite.api.MenuAction.SPELL_CAST_ON_PLAYER; +import static net.runelite.api.MenuAction.TRADE; +import net.runelite.api.MenuEntry; +import net.runelite.api.Player; +import net.runelite.api.events.ClanMemberJoined; +import net.runelite.api.events.ClanMemberLeft; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.MenuEntryAdded; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ClanManager; @@ -128,35 +125,6 @@ public class PlayerIndicatorsPlugin extends Plugin } } - @Subscribe - public void onGameTick(GameTick gameTick) - { - if (config.highlightPile() && callers != null) - { - for (Player p : client.getPlayers()) - { - for (String name : callers) - { - Actor pile; - String finalName = name.toLowerCase().replace("_", " "); - if (p.getName().toLowerCase().replace("_", " ").equals(finalName)) - { - pile = p.getInteracting(); - if (pile != null) - { - pileList.set(callers.indexOf(name), pile.getName()); - //pileList.add(pile.getName()); - } - else - { - pileList.set(callers.indexOf(name), ""); - } - } - } - } - } - } - @Subscribe public void onClanMemberJoined(ClanMemberJoined event) { @@ -213,14 +181,6 @@ public class PlayerIndicatorsPlugin extends Plugin return false; } - boolean isPile(Player player) - { - if (Objects.nonNull(pileList) && pileList.size() > 0) - { - return pileList.contains(player.getName()); - } - return false; - } @Subscribe public void onMenuEntryAdded(MenuEntryAdded menuEntryAdded) @@ -281,7 +241,7 @@ public class PlayerIndicatorsPlugin extends Plugin { color = config.getTeamMemberColor(); } - else if (!player.isClanMember() && !player.isFriend() && !PvPUtil.isAttackable(client, player)) + else if (config.highlightNonClanMembers() && !player.isClanMember() && !player.isFriend() && !PvPUtil.isAttackable(client, player)) { color = config.getNonClanMemberColor(); } @@ -328,10 +288,6 @@ public class PlayerIndicatorsPlugin extends Plugin { color = config.callerColor(); } - if (config.colorPlayerMenu() && config.highlightPile() && this.isPile(player)) - { - color = config.pileColor(); - } if (image != -1 || color != null) { MenuEntry[] menuEntries = client.getMenuEntries(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java index d07bb1cd60..51717af33f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java @@ -28,8 +28,8 @@ import java.awt.Color; import java.util.function.BiConsumer; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import api.Player; +import net.runelite.api.Client; +import net.runelite.api.Player; import net.runelite.client.util.PvPUtil; @Singleton @@ -50,8 +50,7 @@ public class PlayerIndicatorsService public void forEachPlayer(final BiConsumer consumer) { if (!config.highlightOwnPlayer() && !config.drawClanMemberNames() - && !config.highlightFriends() && !config.highlightNonClanMembers() && !config.highlightTargets() - && !config.highlightPile() && !config.highlightCallers() && !config.highlightTeamMembers()) + && !config.highlightFriends() && !config.highlightNonClanMembers() && !config.highlightTargets() && !config.highlightCallers() && !config.highlightTeamMembers()) { return; } @@ -107,11 +106,6 @@ public class PlayerIndicatorsService { consumer.accept(player, config.callerColor()); } - if (config.highlightPile() && playerIndicatorsPlugin.isPile(player) - && !player.isClanMember()) - { - consumer.accept(player, config.pileColor()); - } } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java similarity index 81% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java index bf69efda5f..5ae7299db6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java @@ -25,8 +25,6 @@ package net.runelite.client.plugins.playerindicators; -import java.awt.BasicStroke; -import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; @@ -58,18 +56,6 @@ public class PlayerIndicatorsTileOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (config.drawPileHull()) - { - playerIndicatorsService.forEachPlayer((player, color) -> - { - if (playerIndicatorsPlugin.isPile(player)) - { - Polygon objectClickbox = player.getConvexHull(); - - renderPoly(graphics, config.pileColor(), objectClickbox); - } - }); - } if (!config.drawTiles() /*&& !config.drawPlayerHull()*/) { return null; @@ -89,15 +75,4 @@ public class PlayerIndicatorsTileOverlay extends Overlay return null; } - private void renderPoly(Graphics2D graphics, Color color, Polygon polygon) - { - if (polygon != null) - { - graphics.setColor(color); - graphics.setStroke(new BasicStroke(2)); - graphics.draw(polygon); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); - graphics.fill(polygon); - } - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerNameLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerNameLocation.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerindicators/PlayerNameLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerNameLocation.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoCustomIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoCustomIndicator.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoCustomIndicator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoCustomIndicator.java index 6059c158ac..bcb25d5577 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoCustomIndicator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoCustomIndicator.java @@ -28,9 +28,9 @@ import java.awt.Color; import java.awt.Image; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Client; -import api.Skill; -import api.VarPlayer; +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; import net.runelite.client.ui.overlay.infobox.InfoBox; import net.runelite.client.util.ColorUtil; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoPlugin.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoPlugin.java index 56ed360ef7..2f414f22d0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerinfo/PlayerInfoPlugin.java @@ -28,9 +28,9 @@ import com.google.inject.Provides; import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import api.GameState; -import api.SpriteID; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.SpriteID; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.game.SkillIconManager; @@ -48,6 +48,7 @@ import net.runelite.client.ui.overlay.infobox.InfoBoxManager; type = PluginType.UTILITY, enabledByDefault = false ) + @Singleton public class PlayerInfoPlugin extends Plugin { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java index 1759771b02..9d742a5280 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java @@ -30,9 +30,9 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.inject.Inject; -import api.GameState; -import api.events.ConfigChanged; -import api.events.GameStateChanged; +import net.runelite.api.GameState; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java index dadb893f88..16c8d4edc3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java @@ -30,9 +30,9 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/IncenseBurner.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/IncenseBurner.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/IncenseBurner.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poh/IncenseBurner.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohConfig.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poh/PohConfig.java index 956618bcc2..9496352800 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohConfig.java @@ -114,7 +114,7 @@ public interface PohConfig extends Config @ConfigItem( keyName = "showJewelleryBox", name = "Show Jewellery Box", - description = "Configures whether or not the Jewllery box is displayed" + description = "Configures whether or not the jewellery box is displayed" ) default boolean showJewelleryBox() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java new file mode 100644 index 0000000000..db671698fa --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2018, Seth + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.poh; + +import com.google.common.collect.ImmutableMap; +import java.awt.image.BufferedImage; +import java.util.Map; +import lombok.Getter; +import static net.runelite.api.NullObjectID.NULL_13615; +import static net.runelite.api.NullObjectID.NULL_13618; +import static net.runelite.api.NullObjectID.NULL_13620; +import static net.runelite.api.NullObjectID.NULL_13622; +import static net.runelite.api.NullObjectID.NULL_13625; +import static net.runelite.api.NullObjectID.NULL_13627; +import static net.runelite.api.NullObjectID.NULL_13629; +import static net.runelite.api.NullObjectID.NULL_13632; +import static net.runelite.api.NullObjectID.NULL_13634; +import static net.runelite.api.NullObjectID.NULL_29228; +import static net.runelite.api.NullObjectID.NULL_29229; +import static net.runelite.api.ObjectID.ALTAR_13179; +import static net.runelite.api.ObjectID.ALTAR_13180; +import static net.runelite.api.ObjectID.ALTAR_13181; +import static net.runelite.api.ObjectID.ALTAR_13182; +import static net.runelite.api.ObjectID.ALTAR_13183; +import static net.runelite.api.ObjectID.ALTAR_13184; +import static net.runelite.api.ObjectID.ALTAR_13185; +import static net.runelite.api.ObjectID.ALTAR_13186; +import static net.runelite.api.ObjectID.ALTAR_13187; +import static net.runelite.api.ObjectID.ALTAR_13188; +import static net.runelite.api.ObjectID.ALTAR_13189; +import static net.runelite.api.ObjectID.ALTAR_13190; +import static net.runelite.api.ObjectID.ALTAR_13191; +import static net.runelite.api.ObjectID.ALTAR_13192; +import static net.runelite.api.ObjectID.ALTAR_13193; +import static net.runelite.api.ObjectID.ALTAR_13194; +import static net.runelite.api.ObjectID.ALTAR_13196; +import static net.runelite.api.ObjectID.ALTAR_13197; +import static net.runelite.api.ObjectID.ALTAR_13198; +import static net.runelite.api.ObjectID.ALTAR_13199; +import static net.runelite.api.ObjectID.ALTAR_OF_THE_OCCULT; +import static net.runelite.api.ObjectID.AMULET_OF_GLORY; +import static net.runelite.api.ObjectID.ANCIENT_ALTAR; +import static net.runelite.api.ObjectID.ANNAKARL_PORTAL; +import static net.runelite.api.ObjectID.ANNAKARL_PORTAL_29349; +import static net.runelite.api.ObjectID.ANNAKARL_PORTAL_29357; +import static net.runelite.api.ObjectID.ARDOUGNE_PORTAL; +import static net.runelite.api.ObjectID.ARDOUGNE_PORTAL_13626; +import static net.runelite.api.ObjectID.ARDOUGNE_PORTAL_13633; +import static net.runelite.api.ObjectID.ARMOUR_REPAIR_STAND; +import static net.runelite.api.ObjectID.BASIC_JEWELLERY_BOX; +import static net.runelite.api.ObjectID.CARRALLANGAR_PORTAL; +import static net.runelite.api.ObjectID.CARRALLANGAR_PORTAL_33437; +import static net.runelite.api.ObjectID.CARRALLANGAR_PORTAL_33440; +import static net.runelite.api.ObjectID.CATHERBY_PORTAL; +import static net.runelite.api.ObjectID.CATHERBY_PORTAL_33435; +import static net.runelite.api.ObjectID.CATHERBY_PORTAL_33438; +import static net.runelite.api.ObjectID.DARK_ALTAR; +import static net.runelite.api.ObjectID.DIGSITE_PENDANT; +import static net.runelite.api.ObjectID.DIGSITE_PENDANT_33417; +import static net.runelite.api.ObjectID.DIGSITE_PENDANT_33418; +import static net.runelite.api.ObjectID.DIGSITE_PENDANT_33420; +import static net.runelite.api.ObjectID.FALADOR_PORTAL; +import static net.runelite.api.ObjectID.FALADOR_PORTAL_13624; +import static net.runelite.api.ObjectID.FALADOR_PORTAL_13631; +import static net.runelite.api.ObjectID.FANCY_JEWELLERY_BOX; +import static net.runelite.api.ObjectID.FANCY_REJUVENATION_POOL; +import static net.runelite.api.ObjectID.FISHING_GUILD_PORTAL; +import static net.runelite.api.ObjectID.FISHING_GUILD_PORTAL_29351; +import static net.runelite.api.ObjectID.FISHING_GUILD_PORTAL_29359; +import static net.runelite.api.ObjectID.GHORROCK_PORTAL; +import static net.runelite.api.ObjectID.GHORROCK_PORTAL_33436; +import static net.runelite.api.ObjectID.GHORROCK_PORTAL_33439; +import static net.runelite.api.ObjectID.KHARYRLL_PORTAL; +import static net.runelite.api.ObjectID.KHARYRLL_PORTAL_29346; +import static net.runelite.api.ObjectID.KHARYRLL_PORTAL_29354; +import static net.runelite.api.ObjectID.KOUREND_PORTAL; +import static net.runelite.api.ObjectID.KOUREND_PORTAL_29353; +import static net.runelite.api.ObjectID.KOUREND_PORTAL_29361; +import static net.runelite.api.ObjectID.LUMBRIDGE_PORTAL; +import static net.runelite.api.ObjectID.LUMBRIDGE_PORTAL_13623; +import static net.runelite.api.ObjectID.LUMBRIDGE_PORTAL_13630; +import static net.runelite.api.ObjectID.LUNAR_ALTAR; +import static net.runelite.api.ObjectID.LUNAR_ISLE_PORTAL; +import static net.runelite.api.ObjectID.LUNAR_ISLE_PORTAL_29347; +import static net.runelite.api.ObjectID.LUNAR_ISLE_PORTAL_29355; +import static net.runelite.api.ObjectID.MARIM_PORTAL; +import static net.runelite.api.ObjectID.MARIM_PORTAL_29352; +import static net.runelite.api.ObjectID.MARIM_PORTAL_29360; +import static net.runelite.api.ObjectID.OBELISK_31554; +import static net.runelite.api.ObjectID.ORNATE_JEWELLERY_BOX; +import static net.runelite.api.ObjectID.ORNATE_REJUVENATION_POOL; +import static net.runelite.api.ObjectID.POOL_OF_REJUVENATION; +import static net.runelite.api.ObjectID.POOL_OF_RESTORATION; +import static net.runelite.api.ObjectID.POOL_OF_REVITALISATION; +import static net.runelite.api.ObjectID.PORTAL_4525; +import static net.runelite.api.ObjectID.PORTAL_NEXUS; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33355; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33356; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33357; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33358; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33359; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33360; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33361; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33362; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33363; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33364; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33365; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33366; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33367; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33368; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33369; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33370; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33371; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33372; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33373; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33374; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33375; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33376; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33377; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33378; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33379; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33380; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33381; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33382; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33383; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33384; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33385; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33386; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33387; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33388; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33389; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33390; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33391; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33392; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33393; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33394; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33395; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33396; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33397; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33398; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33399; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33400; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33401; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33402; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33403; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33404; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33405; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33406; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33407; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33408; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33409; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33410; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33423; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33424; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33425; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33426; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33427; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33428; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33429; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33430; +import static net.runelite.api.ObjectID.PORTAL_NEXUS_33431; +import static net.runelite.api.ObjectID.SENNTISTEN_PORTAL; +import static net.runelite.api.ObjectID.SENNTISTEN_PORTAL_29348; +import static net.runelite.api.ObjectID.SENNTISTEN_PORTAL_29356; +import static net.runelite.api.ObjectID.SPIRIT_TREE_29227; +import static net.runelite.api.ObjectID.TROLL_STRONGHOLD_PORTAL; +import static net.runelite.api.ObjectID.TROLL_STRONGHOLD_PORTAL_33180; +import static net.runelite.api.ObjectID.TROLL_STRONGHOLD_PORTAL_33181; +import static net.runelite.api.ObjectID.WATERBIRTH_ISLAND_PORTAL; +import static net.runelite.api.ObjectID.WATERBIRTH_ISLAND_PORTAL_29350; +import static net.runelite.api.ObjectID.WATERBIRTH_ISLAND_PORTAL_29358; +import static net.runelite.api.ObjectID.XERICS_TALISMAN; +import static net.runelite.api.ObjectID.XERICS_TALISMAN_33412; +import static net.runelite.api.ObjectID.XERICS_TALISMAN_33413; +import static net.runelite.api.ObjectID.XERICS_TALISMAN_33414; +import static net.runelite.api.ObjectID.XERICS_TALISMAN_33415; +import static net.runelite.api.ObjectID.XERICS_TALISMAN_33419; +import net.runelite.client.util.ImageUtil; + +public enum PohIcons +{ + EXITPORTAL("exitportal", PORTAL_4525), + VARROCK("varrock", NULL_13615, NULL_13622, NULL_13629), + FALADOR("falador", FALADOR_PORTAL, FALADOR_PORTAL_13624, FALADOR_PORTAL_13631), + LUMBRIDGE("lumbridge", LUMBRIDGE_PORTAL, LUMBRIDGE_PORTAL_13623, LUMBRIDGE_PORTAL_13630), + ARDOUGNE("ardougne", ARDOUGNE_PORTAL, ARDOUGNE_PORTAL_13626, ARDOUGNE_PORTAL_13633), + YANILLE("yanille", NULL_13620, NULL_13627, NULL_13634), + CAMELOT("camelot", NULL_13618, NULL_13625, NULL_13632), + LUNARISLE("lunarisle", LUNAR_ISLE_PORTAL, LUNAR_ISLE_PORTAL_29347, LUNAR_ISLE_PORTAL_29355), + WATERBIRTH("waterbirth", WATERBIRTH_ISLAND_PORTAL, WATERBIRTH_ISLAND_PORTAL_29350, WATERBIRTH_ISLAND_PORTAL_29358), + FISHINGGUILD("fishingguild", FISHING_GUILD_PORTAL, FISHING_GUILD_PORTAL_29351, FISHING_GUILD_PORTAL_29359), + SENNTISTEN("senntisten", SENNTISTEN_PORTAL, SENNTISTEN_PORTAL_29348, SENNTISTEN_PORTAL_29356), + KHARYLL("kharyll", KHARYRLL_PORTAL, KHARYRLL_PORTAL_29346, KHARYRLL_PORTAL_29354), + ANNAKARL("annakarl", ANNAKARL_PORTAL, ANNAKARL_PORTAL_29349, ANNAKARL_PORTAL_29357), + KOUREND("kourend", KOUREND_PORTAL, KOUREND_PORTAL_29353, KOUREND_PORTAL_29361), + MARIM("marim", MARIM_PORTAL, MARIM_PORTAL_29352, MARIM_PORTAL_29360), + TROLLSTRONGHOLD("trollheim", TROLL_STRONGHOLD_PORTAL, TROLL_STRONGHOLD_PORTAL_33180, TROLL_STRONGHOLD_PORTAL_33181), + GHORROCK("ghorrock", GHORROCK_PORTAL, GHORROCK_PORTAL_33436, GHORROCK_PORTAL_33439), + CARRALLANGAR("carrallangar", CARRALLANGAR_PORTAL, CARRALLANGAR_PORTAL_33437, CARRALLANGAR_PORTAL_33440), + CATHERBY("catherby", CATHERBY_PORTAL, CATHERBY_PORTAL_33435, CATHERBY_PORTAL_33438), + ALTAR("altar", + ALTAR_13179, ALTAR_13180, ALTAR_13181, ALTAR_13182, ALTAR_13183, ALTAR_13184, ALTAR_13185, ALTAR_13186, + ALTAR_13187, ALTAR_13188, ALTAR_13189, ALTAR_13190, ALTAR_13191, ALTAR_13192, ALTAR_13193, ALTAR_13194, + ALTAR_13196, ALTAR_13197, ALTAR_13198, ALTAR_13199 + ), + POOLS("pool", POOL_OF_RESTORATION, POOL_OF_REVITALISATION, POOL_OF_REJUVENATION, FANCY_REJUVENATION_POOL, ORNATE_REJUVENATION_POOL), + GLORY("glory", AMULET_OF_GLORY), + REPAIR("repair", ARMOUR_REPAIR_STAND), + SPELLBOOKALTAR("spellbook", ANCIENT_ALTAR, LUNAR_ALTAR, DARK_ALTAR, ALTAR_OF_THE_OCCULT), + JEWELLERYBOX("jewellery", BASIC_JEWELLERY_BOX, FANCY_JEWELLERY_BOX, ORNATE_JEWELLERY_BOX), + MAGICTRAVEL("transportation", SPIRIT_TREE_29227, NULL_29228, NULL_29229, OBELISK_31554), + PORTALNEXUS("portalnexus", + PORTAL_NEXUS, PORTAL_NEXUS_33355, PORTAL_NEXUS_33356, PORTAL_NEXUS_33357, PORTAL_NEXUS_33358, PORTAL_NEXUS_33359, PORTAL_NEXUS_33360, + PORTAL_NEXUS_33361, PORTAL_NEXUS_33362, PORTAL_NEXUS_33363, PORTAL_NEXUS_33364, PORTAL_NEXUS_33365, PORTAL_NEXUS_33366, PORTAL_NEXUS_33367, + PORTAL_NEXUS_33368, PORTAL_NEXUS_33369, PORTAL_NEXUS_33370, PORTAL_NEXUS_33371, PORTAL_NEXUS_33372, PORTAL_NEXUS_33373, PORTAL_NEXUS_33374, + PORTAL_NEXUS_33375, PORTAL_NEXUS_33376, PORTAL_NEXUS_33377, PORTAL_NEXUS_33378, PORTAL_NEXUS_33379, PORTAL_NEXUS_33380, PORTAL_NEXUS_33381, + PORTAL_NEXUS_33382, PORTAL_NEXUS_33383, PORTAL_NEXUS_33384, PORTAL_NEXUS_33385, PORTAL_NEXUS_33386, PORTAL_NEXUS_33387, PORTAL_NEXUS_33388, + PORTAL_NEXUS_33389, PORTAL_NEXUS_33390, PORTAL_NEXUS_33391, PORTAL_NEXUS_33392, PORTAL_NEXUS_33393, PORTAL_NEXUS_33394, PORTAL_NEXUS_33395, + PORTAL_NEXUS_33396, PORTAL_NEXUS_33397, PORTAL_NEXUS_33398, PORTAL_NEXUS_33399, PORTAL_NEXUS_33400, PORTAL_NEXUS_33401, PORTAL_NEXUS_33402, + PORTAL_NEXUS_33403, PORTAL_NEXUS_33404, PORTAL_NEXUS_33405, PORTAL_NEXUS_33406, PORTAL_NEXUS_33407, PORTAL_NEXUS_33408, PORTAL_NEXUS_33409, + PORTAL_NEXUS_33410, PORTAL_NEXUS_33423, PORTAL_NEXUS_33424, PORTAL_NEXUS_33425, PORTAL_NEXUS_33426, PORTAL_NEXUS_33427, PORTAL_NEXUS_33428, + PORTAL_NEXUS_33429, PORTAL_NEXUS_33430, PORTAL_NEXUS_33431 + ), + XERICSTALISMAN("xericstalisman", + XERICS_TALISMAN, XERICS_TALISMAN_33412, XERICS_TALISMAN_33413, XERICS_TALISMAN_33414, XERICS_TALISMAN_33415, XERICS_TALISMAN_33419 + ), + DIGSITEPENDANT("digsitependant", + DIGSITE_PENDANT, DIGSITE_PENDANT_33417, DIGSITE_PENDANT_33418, DIGSITE_PENDANT_33420 + ); + + private static final Map minimapIcons; + + @Getter + private final String imageResource; + @Getter + private final int[] Ids; + + private BufferedImage image; + + static + { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + + for (PohIcons icon : values()) + { + for (Integer spotId : icon.getIds()) + { + builder.put(spotId, icon); + } + } + + minimapIcons = builder.build(); + } + + PohIcons(String imageResource, int... ids) + { + this.imageResource = imageResource; + this.Ids = ids; + } + + public static PohIcons getIcon(int id) + { + return minimapIcons.get(id); + } + + public BufferedImage getImage() + { + if (image != null) + { + return image; + } + + image = ImageUtil.getResourceStreamFromClass(getClass(), getImageResource() + ".png"); + + return image; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java index 290ac3b900..9d048e584e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java @@ -31,9 +31,9 @@ import java.util.Collections; import java.util.List; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.Perspective; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -80,7 +80,7 @@ public class PohOverlay extends Overlay if (icon != null && iconList.contains(icon)) { - api.Point minimapLoc = Perspective.getMiniMapImageLocation(client, object.getLocalLocation(), icon.getImage()); + net.runelite.api.Point minimapLoc = Perspective.getMiniMapImageLocation(client, object.getLocalLocation(), icon.getImage()); if (minimapLoc != null) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java index eedc6fdc80..be70c9689d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java @@ -36,25 +36,25 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.AnimationID; -import api.Client; -import api.Constants; -import api.DecorativeObject; -import api.GameObject; -import api.GameState; -import api.ObjectID; -import api.Player; -import api.Tile; -import api.TileObject; -import api.coords.LocalPoint; -import api.events.AnimationChanged; -import api.events.ConfigChanged; -import api.events.DecorativeObjectDespawned; -import api.events.DecorativeObjectSpawned; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.ObjectID; +import net.runelite.api.Player; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.DecorativeObjectDespawned; +import net.runelite.api.events.DecorativeObjectSpawned; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.HiscoreManager; @@ -206,7 +206,7 @@ public class PohPlugin extends Plugin if (actor == client.getLocalPlayer()) { - int level = client.getRealSkillLevel(api.Skill.FIREMAKING); + int level = client.getRealSkillLevel(net.runelite.api.Skill.FIREMAKING); updateBurner(incenseBurner, level); } else if (actorName != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poison/ActorPoisonInfo.java b/runelite-client/src/main/java/net/runelite/client/plugins/poison/ActorPoisonInfo.java new file mode 100644 index 0000000000..dc9754be81 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poison/ActorPoisonInfo.java @@ -0,0 +1,31 @@ +package net.runelite.client.plugins.poison; + +import lombok.Data; + +@Data +class ActorPoisonInfo +{ + /** + * Plain and simple, the last poison damage this actor received + */ + private int lastDamage; + + /** + * What the poison varp for this actor would be. -1 if unknown + * This should always be known if the actor is venomed + */ + private int accurateDamage; + + /** + * How many ticks after the tickcount is divisible by 30 the poison will hit. + * + * For instance, if something gets hit by poison on tick 607 this will be 7, as 607 % 30 == 7. + * With this info you know all the times to expect a poison hit + */ + private int cycle; + + /** + * This is to be able to remove the overlay if someone doesn't get hit + */ + private int lastDamageTick; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonActorOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonActorOverlay.java new file mode 100644 index 0000000000..020cf2e869 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonActorOverlay.java @@ -0,0 +1,143 @@ +package net.runelite.client.plugins.poison; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.util.Map; +import javax.inject.Inject; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.SpriteID; +import net.runelite.api.coords.LocalPoint; +import static net.runelite.client.plugins.poison.PoisonPlugin.POISON_TICK_TICKS; +import static net.runelite.client.plugins.poison.PoisonPlugin.VENOM_THRESHOLD; +import static net.runelite.client.plugins.poison.PoisonPlugin.nextDamage; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayUtil; + +public class PoisonActorOverlay extends Overlay +{ + private final PoisonPlugin plugin; + private final Client client; + private int fontSize; + private Font font; + + @Inject + PoisonActorOverlay(PoisonPlugin plugin, Client client) + { + this.plugin = plugin; + this.client = client; + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_SCENE); + } + + @Override + public Dimension render(Graphics2D g) + { + final Map actors = plugin.getPoisonedActors(); + + if (actors.isEmpty()) + { + return null; + } + + final int tickCount = client.getTickCount(); + final int modTickCount = tickCount % 30; + + if (font == null) + { + font = g.getFont().deriveFont(fontSize * 2.0f); + } + + g.setFont(font); + + for (Map.Entry entry : actors.entrySet()) + { + Actor a = entry.getKey(); + + if (a == null) + { + continue; + } + + ActorPoisonInfo i = entry.getValue(); + + int accurateDamage = i.getAccurateDamage(); + int damage; + + if (accurateDamage != -1) + { + damage = nextDamage(accurateDamage); + } + else + { + damage = i.getLastDamage(); + } + + boolean venomed = accurateDamage >= VENOM_THRESHOLD; + + String timeLeft = getTimeLeft(modTickCount, i.getCycle()); + + renderOverlayFor(g, a, damage, timeLeft, venomed); + } + + return null; + } + + private String getTimeLeft(int tickCount, int cycle) + { + if (tickCount > cycle) + { + cycle += POISON_TICK_TICKS; + } + + int timeLeftMillis = (cycle - tickCount) * Constants.GAME_TICK_LENGTH; + + return String.valueOf(timeLeftMillis / 1000); + } + + private void renderOverlayFor(Graphics2D g, Actor actor, int damage, String timeLeft, boolean venomed) + { + BufferedImage splat = plugin.getSplat(venomed ? SpriteID.HITSPLAT_DARK_GREEN_VENOM : SpriteID.HITSPLAT_GREEN_POISON, damage); + + LocalPoint localLocation = actor.getLocalLocation(); + if (localLocation == null) + { + return; + } + + Point overlayLocation = Perspective.getCanvasImageLocation(client, localLocation, splat, 0); + + if (overlayLocation == null) + { + return; + } + + int textOffset = splat.getHeight() - (splat.getHeight() - fontSize) / 2; + + Point textLocation = new Point(overlayLocation.getX() + splat.getWidth() + 3, overlayLocation.getY() + textOffset); + + g.drawImage(splat, overlayLocation.getX(), overlayLocation.getY(), null); + OverlayUtil.renderTextLocation(g, textLocation, timeLeft, Color.WHITE); + } + + void setFontSize(int size) + { + if (font != null) + { + fontSize = size; + font = font.deriveFont(fontSize * 2.0f); + } + else + { + fontSize = size; + } + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonConfig.java similarity index 78% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonConfig.java index 6c723d4f71..3f86cf9395 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonConfig.java @@ -52,4 +52,37 @@ public interface PoisonConfig extends Config { return true; } + + @ConfigItem( + keyName = "showPlayers", + name = "Show for players", + description = "Show poison timers for other players", + position = 1 + ) + default boolean showForPlayers() + { + return false; + } + + @ConfigItem( + keyName = "showNpcs", + name = "Show for NPCs", + description = "Show poison timers for NPCs", + position = 2 + ) + default boolean showForNpcs() + { + return false; + } + + @ConfigItem( + keyName = "fontsize", + name = "Font size", + description = "The size the time left text for other players/npc's will be", + position = 3 + ) + default int fontSize() + { + return 8; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonInfobox.java b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonInfobox.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonInfobox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonInfobox.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonOverlay.java index 521987e652..758811f292 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonOverlay.java @@ -28,10 +28,10 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.inject.Inject; -import api.Client; -import api.Point; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java similarity index 71% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java index 2c5973bb3e..ff39332758 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java @@ -34,14 +34,24 @@ import java.text.MessageFormat; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.Map; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.GameState; -import api.SpriteID; -import api.VarPlayer; -import api.events.ConfigChanged; -import api.events.VarbitChanged; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Hitsplat; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.SpriteID; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.PlayerDespawned; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -62,8 +72,10 @@ import net.runelite.client.util.ImageUtil; public class PoisonPlugin extends Plugin { private static final int POISON_TICK_MILLIS = 18000; - private static final int VENOM_THRESHOLD = 1000000; + static final int VENOM_THRESHOLD = 1000000; + private static final int VENOM_UTILITY = 999997; private static final int VENOM_MAXIMUM_DAMAGE = 20; + static final int POISON_TICK_TICKS = 30; private static final BufferedImage HEART_DISEASE; private static final BufferedImage HEART_POISON; @@ -97,8 +109,12 @@ public class PoisonPlugin extends Plugin @Inject private PoisonConfig config; + @Inject + private PoisonActorOverlay actorOverlay; + @Getter private int lastDamage; + private boolean envenomed; private PoisonInfobox infobox; private Instant nextPoisonTick; @@ -107,6 +123,9 @@ public class PoisonPlugin extends Plugin private BufferedImage heart; private int nextTickCount; + @Getter + private Map poisonedActors = new HashMap<>(); + @Provides PoisonConfig getConfig(ConfigManager configManager) { @@ -116,8 +135,14 @@ public class PoisonPlugin extends Plugin @Override protected void startUp() throws Exception { + actorOverlay.setFontSize(config.fontSize()); overlayManager.add(poisonOverlay); + if (config.showForNpcs() || config.showForPlayers()) + { + overlayManager.add(actorOverlay); + } + if (client.getGameState() == GameState.LOGGED_IN) { clientThread.invoke(this::checkHealthIcon); @@ -140,6 +165,7 @@ public class PoisonPlugin extends Plugin nextPoisonTick = null; lastValue = 0; lastDiseaseValue = 0; + overlayManager.remove(actorOverlay); clientThread.invoke(this::resetHealthIcon); } @@ -193,6 +219,92 @@ public class PoisonPlugin extends Plugin } } + @Subscribe + private void onHitsplatApplied(HitsplatApplied event) + { + Hitsplat.HitsplatType type = event.getHitsplat().getHitsplatType(); + + if (type != Hitsplat.HitsplatType.POISON && type != Hitsplat.HitsplatType.VENOM) + { + return; + } + + Actor actor = event.getActor(); + + if (actor == client.getLocalPlayer() || + actor instanceof NPC && !config.showForNpcs() || + actor instanceof Player && !config.showForPlayers()) + { + return; + } + + int tickCount = client.getTickCount(); + int damage = event.getHitsplat().getAmount(); + + ActorPoisonInfo info = poisonedActors.get(actor); + + if (info == null) + { + info = new ActorPoisonInfo(); + info.setAccurateDamage(-1); + info.setLastDamage(damage); + + poisonedActors.put(actor, info); + } + + if (info.getAccurateDamage() != -1) + { + int accurateDamage = info.getAccurateDamage(); + accurateDamage -= 1; + + if (accurateDamage == 0) + { + poisonedActors.remove(actor); + return; + } + + info.setAccurateDamage(accurateDamage); + } + + if (type == Hitsplat.HitsplatType.VENOM) + { + info.setAccurateDamage(damage / 2 + VENOM_UTILITY + 1); + } + else if (info.getLastDamage() != damage) + { + // The damage changed so we know the accurate value! + // This may of course not be 100% accurate + // (if someone gets repoisoned for instance) + info.setAccurateDamage(damage * 5 - 1); + + info.setLastDamage(damage); + } + + info.setCycle(tickCount % POISON_TICK_TICKS); + info.setLastDamageTick(tickCount); + } + + @Subscribe + private void onGameTick(GameTick event) + { + int tickCount = client.getTickCount(); + + // Remove the actor if the last damage tick was over 35 ticks ago. + poisonedActors.values().removeIf(info -> info.getLastDamageTick() + POISON_TICK_TICKS + 5 < tickCount); + } + + @Subscribe + private void onNpcDespawned(NpcDespawned event) + { + poisonedActors.remove(event.getNpc()); + } + + @Subscribe + private void onPlayerDespawned(PlayerDespawned event) + { + poisonedActors.remove(event.getPlayer()); + } + @Subscribe public void onConfigChanged(ConfigChanged event) { @@ -215,9 +327,38 @@ public class PoisonPlugin extends Plugin { clientThread.invoke(this::resetHealthIcon); } + + if (event.getKey().startsWith("show")) + { + overlayManager.remove(actorOverlay); + + if (!config.showForPlayers() && !config.showForNpcs()) + { + poisonedActors.clear(); + } + else + { + if (!config.showForNpcs()) + { + poisonedActors.entrySet().removeIf(a -> a instanceof NPC); + } + + if (!config.showForPlayers()) + { + poisonedActors.entrySet().removeIf(a -> a instanceof Player); + } + + overlayManager.add(actorOverlay); + } + } + + if (event.getKey().equals("fontsize")) + { + actorOverlay.setFontSize(config.fontSize()); + } } - private static int nextDamage(int poisonValue) + static int nextDamage(int poisonValue) { int damage; @@ -225,7 +366,7 @@ public class PoisonPlugin extends Plugin { //Venom Damage starts at 6, and increments in twos; //The VarPlayer increments in values of 1, however. - poisonValue -= VENOM_THRESHOLD - 3; + poisonValue -= VENOM_UTILITY; damage = poisonValue * 2; //Venom Damage caps at 20, but the VarPlayer keeps increasing if (damage > VENOM_MAXIMUM_DAMAGE) @@ -241,7 +382,7 @@ public class PoisonPlugin extends Plugin return damage; } - private BufferedImage getSplat(int id, int damage) + BufferedImage getSplat(int id, int damage) { //Get a copy of the hitsplat to get a clean one each time final BufferedImage rawSplat = spriteManager.getSprite(id, 0); @@ -339,7 +480,7 @@ public class PoisonPlugin extends Plugin { heart = newHeart; client.getWidgetSpriteCache().reset(); - client.getSpriteOverrides().put(SpriteID.MINIMAP_ORB_HITPOINTS_ICON, ImageUtil.getImageSpritePixels(heart, client)); + client.getSpriteOverrides().put(SpriteID.MINIMAP_ORB_HITPOINTS_ICON, ImageUtil.getImageSprite(heart, client)); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PlayerContainer.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PlayerContainer.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PlayerContainer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PlayerContainer.java index 8c19d754e7..68f78ab065 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PlayerContainer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PlayerContainer.java @@ -24,7 +24,7 @@ package net.runelite.client.plugins.prayagainstplayer; -import api.Player; +import net.runelite.api.Player; /** * Contains a player object diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlay.java index 1b9fff7321..a0ba2445cc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlay.java @@ -31,11 +31,11 @@ import java.awt.Polygon; import java.awt.image.BufferedImage; import java.util.ConcurrentModificationException; import javax.inject.Inject; -import api.Client; -import api.ItemDefinition; -import api.Player; -import api.Point; -import api.kit.KitType; +import net.runelite.api.Client; +import net.runelite.api.ItemDefinition; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.kit.KitType; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlayPrayerTab.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlayPrayerTab.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlayPrayerTab.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlayPrayerTab.java index 3a1a76a068..885bdd2e7d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlayPrayerTab.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerOverlayPrayerTab.java @@ -31,10 +31,10 @@ import java.awt.Polygon; import java.awt.Rectangle; import java.util.ConcurrentModificationException; import javax.inject.Inject; -import api.Client; -import api.Player; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerPlugin.java index 9fad5b18f3..bc0598a4c9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/PrayAgainstPlayerPlugin.java @@ -33,16 +33,16 @@ import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import java.util.ArrayList; import javax.inject.Inject; -import api.AnimationID; -import api.Client; -import api.GameState; -import api.Player; -import api.SpriteID; -import api.events.AnimationChanged; -import api.events.GameStateChanged; -import api.events.InteractingChanged; -import api.events.PlayerDespawned; -import api.events.PlayerSpawned; +import net.runelite.api.AnimationID; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.SpriteID; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.PlayerDespawned; +import net.runelite.api.events.PlayerSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.SpriteManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/WeaponType.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/WeaponType.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/WeaponType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/WeaponType.java index c930135f61..d312a0ee8c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayagainstplayer/WeaponType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayagainstplayer/WeaponType.java @@ -24,10 +24,10 @@ package net.runelite.client.plugins.prayagainstplayer; -import api.Client; -import api.ItemDefinition; -import api.Player; -import api.kit.KitType; +import net.runelite.api.Client; +import net.runelite.api.ItemDefinition; +import net.runelite.api.Player; +import net.runelite.api.kit.KitType; enum WeaponType { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java index c8fb624b99..18d28da696 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java @@ -30,12 +30,12 @@ import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import api.Perspective; -import api.Player; -import api.Point; -import api.Skill; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Skill; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java index 6955438b3f..c9b590a4d2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java @@ -34,13 +34,13 @@ import java.time.Instant; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Setter; -import api.Client; -import api.Constants; -import api.Point; -import api.Prayer; -import api.Skill; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.Point; +import net.runelite.api.Prayer; +import net.runelite.api.Skill; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickLocation.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickLocation.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java index 8d5d053546..6a9bfbfd61 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java @@ -29,9 +29,9 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import javax.inject.Inject; -import api.Client; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerItems.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerItems.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerItems.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerItems.java index e6d1d9353a..6037701014 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerItems.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerItems.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.AllArgsConstructor; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java index 93f299be2c..2755703f8f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java @@ -31,15 +31,15 @@ import java.time.Instant; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.Constants; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.Prayer; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.ItemContainerChanged; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.Prayer; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.SpriteManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerRestoreType.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerRestoreType.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerRestoreType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerRestoreType.java index 5af9a8c2b9..d30b790a9e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerRestoreType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerRestoreType.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.prayer; import com.google.common.collect.ImmutableMap; import java.util.Map; -import api.ItemID; +import net.runelite.api.ItemID; enum PrayerRestoreType { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerType.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerType.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerType.java index 3f0b530b23..6ef41a7676 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayer/PrayerType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerType.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.prayer; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Prayer; -import api.SpriteID; +import net.runelite.api.Prayer; +import net.runelite.api.SpriteID; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertOverlay.java index 12a04603c4..617cd3e611 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertOverlay.java @@ -21,11 +21,11 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.itemstats.stats.Stat; import net.runelite.client.plugins.itemstats.stats.Stats; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertPlugin.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertPlugin.java index da1fc659ab..abeaef0e54 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayeralert/PrayerAlertPlugin.java @@ -31,6 +31,7 @@ import net.runelite.client.ui.overlay.OverlayManager; type = PluginType.UTILITY, enabledByDefault = false ) + public class PrayerAlertPlugin extends Plugin { @Inject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilePanel.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilePanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilePanel.java index 128b1b89ea..eb43d74f59 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilePanel.java @@ -40,8 +40,8 @@ import javax.swing.SwingUtilities; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; +import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.client.ui.ColorScheme; import net.runelite.client.util.ImageUtil; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesPanel.java index 551a0a3578..dd420dcadb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesPanel.java @@ -60,7 +60,7 @@ import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesPlugin.java index 7f9d190025..3eb6f00bfc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/profiles/ProfilesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/profiles/ProfilesPlugin.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.profiles; import com.google.inject.Provides; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.events.ConfigChanged; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -41,8 +41,10 @@ import net.runelite.client.util.ImageUtil; name = "Account Switcher", description = "Allow for a allows you to easily switch between multiple OSRS Accounts", tags = {"profile", "account", "login", "log in", "pklite"}, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + public class ProfilesPlugin extends Plugin { @Inject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java index 32b033ffd6..2308a9adc9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java @@ -37,14 +37,14 @@ import java.util.Arrays; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import static api.SpriteID.MINIMAP_DESTINATION_FLAG; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import static net.runelite.api.SpriteID.MINIMAP_DESTINATION_FLAG; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver; import static net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver.BLANK_TILE_VALUE; @@ -127,7 +127,7 @@ public class PuzzleSolverOverlay extends Overlay return null; } - api.Point puzzleBoxLocation = puzzleBox.getCanvasLocation(); + net.runelite.api.Point puzzleBoxLocation = puzzleBox.getCanvasLocation(); String infoString = "Solving.."; @@ -305,7 +305,7 @@ public class PuzzleSolverOverlay extends Overlay int y = puzzleBoxLocation.getY() + blankY * PUZZLE_TILE_SIZE + PUZZLE_TILE_SIZE / 2 - arrow.getHeight() / 2; - OverlayUtil.renderImageLocation(graphics, new api.Point(x, y), arrow); + OverlayUtil.renderImageLocation(graphics, new net.runelite.api.Point(x, y), arrow); lastBlankX = blankX; lastBlankY = blankY; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverPlugin.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverPlugin.java index 367ede95a9..d0d194cf1f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverPlugin.java @@ -30,22 +30,22 @@ import java.awt.Color; import java.util.Arrays; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.events.GameTick; -import api.events.MenuOptionClicked; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_A; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_B; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_C; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_D; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_E; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_F; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_G; -import static api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_H; -import static api.widgets.WidgetInfo.TO_GROUP; +import net.runelite.api.Client; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_A; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_B; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_C; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_D; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_E; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_F; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_G; +import static net.runelite.api.widgets.WidgetInfo.LIGHT_BOX_BUTTON_H; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -138,7 +138,7 @@ public class PuzzleSolverPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked menuOptionClicked) { - int widgetId = menuOptionClicked.getWidgetId(); + int widgetId = menuOptionClicked.getActionParam1(); if (TO_GROUP(widgetId) != WidgetID.LIGHT_BOX_GROUP_ID) { return; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/VarrockMuseumAnswer.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/VarrockMuseumAnswer.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/VarrockMuseumAnswer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/VarrockMuseumAnswer.java index c02281190b..0e4307d550 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/VarrockMuseumAnswer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/VarrockMuseumAnswer.java @@ -29,9 +29,9 @@ import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.Client; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; @Getter @RequiredArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/Combination.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/Combination.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/Combination.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/Combination.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightBox.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightBox.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolution.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolution.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolution.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolution.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolver.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolver.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolver.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxState.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSolver.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSolver.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSolver.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleState.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleState.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleState.java index 677d07927e..74d346cd29 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleState.java @@ -216,6 +216,5 @@ public class PuzzleState } return y1 == y2 && absX == 1; - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSwapPattern.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSwapPattern.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSwapPattern.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/PuzzleSwapPattern.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/Heuristic.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/Heuristic.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/Heuristic.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/Heuristic.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/ManhattanDistance.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/ManhattanDistance.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/ManhattanDistance.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/heuristics/ManhattanDistance.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStar.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStar.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStar.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStar.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStarMM.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStarMM.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStarMM.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStarMM.java index f8c49bf49d..331c883a18 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStarMM.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/IDAStarMM.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.puzzlesolver.solver.pathfinding; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import api.Point; +import net.runelite.api.Point; import static net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver.BLANK_TILE_VALUE; import static net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver.DIMENSION; import net.runelite.client.plugins.puzzlesolver.solver.PuzzleState; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/Pathfinder.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/Pathfinder.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/Pathfinder.java rename to runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/solver/pathfinding/Pathfinder.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/CycleCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/AttackMode.java similarity index 82% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/CycleCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/AttackMode.java index e6c026fe05..95ac199470 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/CycleCounter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/AttackMode.java @@ -22,16 +22,24 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.batools; +package net.runelite.client.plugins.pvptools; -import java.awt.image.BufferedImage; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.ui.overlay.infobox.Counter; - -class CycleCounter extends Counter +public enum AttackMode { - CycleCounter(BufferedImage img, Plugin plugin, int tick) + CLAN("Clan"), + FRIENDS("Friends"), + BOTH("Both"); + + private final String name; + + AttackMode(String name) { - super(img, plugin, tick); + this.name = name; + } + + @Override + public String toString() + { + return name; } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/CurrentPlayersJFrame.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/CurrentPlayersJFrame.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/CurrentPlayersJFrame.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/CurrentPlayersJFrame.java index ed562f6e70..19daf25e0f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/CurrentPlayersJFrame.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/CurrentPlayersJFrame.java @@ -22,7 +22,7 @@ import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.FontManager; public class CurrentPlayersJFrame extends JFrame diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/MissingPlayersJFrame.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/MissingPlayersJFrame.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/MissingPlayersJFrame.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/MissingPlayersJFrame.java index 94b7a8cf04..08831d0fca 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/MissingPlayersJFrame.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/MissingPlayersJFrame.java @@ -22,7 +22,7 @@ import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.FontManager; public class MissingPlayersJFrame extends JFrame diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PlayerCountOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PlayerCountOverlay.java new file mode 100644 index 0000000000..1952838914 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PlayerCountOverlay.java @@ -0,0 +1,77 @@ +/* + * ****************************************************************************** + * * Copyright (c) 2019 RuneLitePlus + * * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. + * * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: + * * ST0NEWALL#9112 + * * RuneLitePlus Discord: https://discord.gg/Q7wFtCe + * * RuneLitePlus website: https://runelitepl.us + * ***************************************************************************** + */ + +package net.runelite.client.plugins.pvptools; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.util.Arrays; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.ui.overlay.components.table.TableElement; +import net.runelite.client.ui.overlay.components.table.TableRow; +import org.apache.commons.lang3.ArrayUtils; + +public class PlayerCountOverlay extends Overlay +{ + private static int[] CLAN_WARS_REGIONS = {9520, 13135, 13134, 13133, 13131, 13130, 13387, 13386}; + + private final PvpToolsPlugin pvpToolsPlugin; + private final PvpToolsConfig config; + private final Client client; + + + @Inject + public PlayerCountOverlay(PvpToolsPlugin pvpToolsPlugin, PvpToolsConfig pvpToolsConfig, Client client) + { + this.pvpToolsPlugin = pvpToolsPlugin; + this.config = pvpToolsConfig; + this.client = client; + setLayer(OverlayLayer.ABOVE_WIDGETS); + setPriority(OverlayPriority.HIGHEST); + setPosition(OverlayPosition.TOP_LEFT); + this.setPreferredPosition(OverlayPosition.TOP_LEFT); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (config.countPlayers()) + { + if ((client.getVar(Varbits.IN_WILDERNESS) == 1) || WorldType.isPvpWorld(client.getWorldType()) + || ArrayUtils.contains(CLAN_WARS_REGIONS, client.getMapRegions()[0]) || + WorldType.isDeadmanWorld(client.getWorldType())) + { + // Make this stop showing up when its not relevant + TableComponent tableComponent = new TableComponent(); + TableElement[] firstRowElements = { + TableElement.builder().content("Friendly").color(Color.GREEN).build(), + TableElement.builder().content(String.valueOf(pvpToolsPlugin.getFriendlyPlayerCount())).build()}; + TableRow firstRow = TableRow.builder().elements(Arrays.asList(firstRowElements)).build(); + TableElement[] secondRowElements = { + TableElement.builder().content("Enemy").color(Color.RED).build(), + TableElement.builder().content(String.valueOf(pvpToolsPlugin.getEnemyPlayerCount())).build()}; + TableRow secondRow = TableRow.builder().elements(Arrays.asList(secondRowElements)).build(); + tableComponent.addRows(firstRow, secondRow); + return tableComponent.render(graphics); + } + } + return null; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsConfig.java similarity index 71% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsConfig.java index 9b4e65ddb2..c5d5d8c383 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsConfig.java @@ -21,7 +21,7 @@ public interface PvpToolsConfig extends Config keyName = "countPlayers", name = "Count Players", description = "When in PvP zones, counts the attackable players in and not in player's CC", - position = 3 + position = 0 ) default boolean countPlayers() { @@ -32,7 +32,7 @@ public interface PvpToolsConfig extends Config keyName = "countOverHeads", name = "Count Enemy Overheads", description = "Counts the number of each protection prayer attackable targets not in your CC are currently using", - position = 4 + position = 1 ) default boolean countOverHeads() { @@ -43,7 +43,7 @@ public interface PvpToolsConfig extends Config keyName = "fallInHelper", name = "Fall In Helper", description = "Hides all non-friendly player entities other than the one that is attacking you.", - position = 5 + position = 2 ) default boolean fallInHelper() { @@ -54,7 +54,7 @@ public interface PvpToolsConfig extends Config keyName = "hotkey", name = "Fall In Hotkey", description = "Turns the fall in helper on or off when you press this hotkey", - position = 6 + position = 3 ) default Keybind hotkey() { @@ -65,18 +65,84 @@ public interface PvpToolsConfig extends Config keyName = "renderSelfHotkey", name = "Render Self Hotkey", description = "Toggles renderself when you press the hotkey", - position = 7 + position = 4 ) default Keybind renderSelf() { return Keybind.NOT_SET; } + @ConfigItem( + keyName = "hideAttack", + name = "Hide attack", + description = "Hides the attack option for clanmates, friends, or both", + position = 5, + group = "Right-Click Attack Options" + ) + default boolean hideAttack() + { + return false; + } + + @ConfigItem( + keyName = "hideAttackMode", + name = "Mode", + description = "", + position = 6, + group = "Right-Click Attack Options", + hidden = true, + unhide = "hideAttack" + ) + default AttackMode hideAttackMode() + { + return AttackMode.FRIENDS; + } + + @ConfigItem( + keyName = "hideCast", + name = "Hide cast", + description = "Hides the cast option for clanmates, friends, or both", + position = 7, + group = "Right-Click Attack Options" + ) + default boolean hideCast() + { + return false; + } + + @ConfigItem( + keyName = "hideCastMode", + name = "Mode", + description = "", + position = 8, + group = "Right-Click Attack Options", + hidden = true, + unhide = "hideCast" + ) + default AttackMode hideCastMode() + { + return AttackMode.FRIENDS; + } + + @ConfigItem( + keyName = "hideCastIgnored", + name = "Ignored spells", + description = "Spells that should not be hidden from being cast, separated by a comma", + position = 9, + group = "Right-Click Attack Options", + hidden = true, + unhide = "hideCast" + ) + default String hideCastIgnored() + { + return "cure other, energy transfer, heal other, vengeance other"; + } + @ConfigItem( keyName = "attackOptionsClan", name = "Move CC Attack Option", description = "Moves the attack option for people in the same CC", - position = 8, + position = 10, group = "Right-Click Attack Options" ) default boolean attackOptionsClan() @@ -88,7 +154,7 @@ public interface PvpToolsConfig extends Config keyName = "attackOptionsFriend", name = "Move Friend Attack Options", description = "Moves the attack option for people on your friends list", - position = 9, + position = 11, group = "Right-Click Attack Options" ) default boolean attackOptionsFriend() @@ -100,7 +166,7 @@ public interface PvpToolsConfig extends Config keyName = "levelRangeAttackOptions", name = "Moves Other Attack Options", description = "Moves the attack option for people that are outside your level range", - position = 10, + position = 12, group = "Right-Click Attack Options" ) default boolean levelRangeAttackOptions() @@ -112,7 +178,7 @@ public interface PvpToolsConfig extends Config keyName = "riskCalculator", name = "Risk Calculator", description = "Enables a panel in the PvP Tools Panel that shows the players current risk", - position = 14 + position = 13 ) default boolean riskCalculatorEnabled() { @@ -123,7 +189,7 @@ public interface PvpToolsConfig extends Config keyName = "missingPlayers", name = "Missing CC Players", description = "Adds a button to the PvP Tools panel that opens a window showing which CC members are not at the current players location", - position = 15 + position = 14 ) default boolean missingPlayersEnabled() { @@ -134,7 +200,7 @@ public interface PvpToolsConfig extends Config keyName = "currentPlayers", name = "Current CC Players", description = "Adds a button to the PvP Tools panel that opens a window showing which CC members currently at the players location", - position = 16 + position = 15 ) default boolean currentPlayersEnabled() { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsOverlay.java index 8ddcb4b0da..7d042374ac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsOverlay.java @@ -15,8 +15,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; -import api.Client; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.Point; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java similarity index 69% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java index 32a6499660..4a7c393f31 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java @@ -1,10 +1,12 @@ /* - * Copyright (c) 2019. PKLite - All Rights Reserved - * Unauthorized modification, distribution, or possession of this source file, via any medium is strictly prohibited. - * Proprietary and confidential. Refer to PKLite License file for more information on - * full terms of this copyright and to determine what constitutes authorized use. - * Written by PKLite(ST0NEWALL, others) , 2019 - * + * ****************************************************************************** + * * Copyright (c) 2019 RuneLitePlus + * * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. + * * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: + * * ST0NEWALL#9112 + * * RuneLitePlus Discord: https://discord.gg/Q7wFtCe + * * RuneLitePlus website: https://runelitepl.us + * ***************************************************************************** */ package net.runelite.client.plugins.pvptools; @@ -13,8 +15,10 @@ import com.google.inject.Provides; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; +import java.util.Arrays; import java.util.ArrayList; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import java.util.NavigableMap; import java.util.Objects; @@ -25,22 +29,24 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import api.ClanMember; -import api.Client; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.MenuEntry; -import api.Player; -import api.SkullIcon; -import api.events.ConfigChanged; -import api.events.FocusChanged; -import api.events.GameStateChanged; -import api.events.ItemContainerChanged; -import api.events.MenuEntryAdded; -import api.events.PlayerDespawned; -import api.events.PlayerSpawned; +import net.runelite.api.ClanMember; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.MenuEntry; +import net.runelite.api.Player; +import net.runelite.api.SkullIcon; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOpened; +import net.runelite.api.events.PlayerDespawned; +import net.runelite.api.events.PlayerSpawned; +import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.AsyncBufferedImage; @@ -60,18 +66,24 @@ import net.runelite.client.util.PvPUtil; import static net.runelite.client.util.StackFormatter.quantityToRSDecimalStack; import net.runelite.client.util.Text; import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; @PluginDescriptor( name = "PvP Tools", description = "Enable the PvP Tools panel", tags = {"panel", "pvp", "pk", "pklite", "renderself"}, - type = PluginType.PVP + type = PluginType.PVP, + enabledByDefault = false ) + public class PvpToolsPlugin extends Plugin { @Inject PvpToolsOverlay pvpToolsOverlay; + @Inject + PlayerCountOverlay playerCountOverlay; + boolean fallinHelperEnabled = false; private PvpToolsPanel panel; private MissingPlayersJFrame missingPlayersJFrame; @@ -95,8 +107,22 @@ public class PvpToolsPlugin extends Plugin @Inject private ItemManager itemManager; + @Inject + private ChatMessageManager chatMessageManager; + private PvpToolsPlugin uhPvpToolsPlugin = this; + private static final String WALK_HERE = "WALK HERE"; + private static final String CANCEL = "CANCEL"; + private static final String CAST = "CAST"; + private static final String ATTACK_OPTIONS_ATTACK = "ATTACK"; + public static final HashSet ATTACK_OPTIONS_KEYWORDS = new HashSet<>(); + static + { + ATTACK_OPTIONS_KEYWORDS.add(CAST); + ATTACK_OPTIONS_KEYWORDS.add(ATTACK_OPTIONS_ATTACK); + } + /** * ActionListener for the missing cc members and refresh buttons */ @@ -161,12 +187,18 @@ public class PvpToolsPlugin extends Plugin { public void hotkeyPressed() { - // client.toggleRenderSelf(); + client.setRenderSelf(!client.getRenderSelf()); } }; private int[] overheadCount = new int[]{0, 0, 0}; + private List ignoredSpells = new ArrayList(); + @Getter + private int enemyPlayerCount = 0; + @Getter + private int friendlyPlayerCount = 0; + private List getMissingMembers() { CopyOnWriteArrayList ccMembers = ClanChatPlugin.getClanMembers(); @@ -222,6 +254,7 @@ public class PvpToolsPlugin extends Plugin protected void startUp() throws Exception { overlayManager.add(pvpToolsOverlay); + overlayManager.add(playerCountOverlay); keyManager.registerKeyListener(fallinHotkeyListener); keyManager.registerKeyListener(renderselfHotkeyListener); @@ -251,12 +284,15 @@ public class PvpToolsPlugin extends Plugin { panel.currentPlayers.setVisible(true); } + + ignoredSpells = Arrays.asList(config.hideCastIgnored().toLowerCase().split("\\s*,\\s*")); } @Override protected void shutDown() throws Exception { overlayManager.remove(pvpToolsOverlay); + overlayManager.remove(playerCountOverlay); keyManager.unregisterKeyListener(fallinHotkeyListener); keyManager.unregisterKeyListener(renderselfHotkeyListener); clientToolbar.removeNavigation(navButton); @@ -311,6 +347,9 @@ public class PvpToolsPlugin extends Plugin panel.currentPlayers.setVisible(true); } break; + case "hideCastIgnored": + ignoredSpells = Arrays.asList(config.hideCastIgnored().toLowerCase().split("\\s*,\\s*")); + break; default: break; } @@ -374,10 +413,18 @@ public class PvpToolsPlugin extends Plugin { if (config.attackOptionsFriend() || config.attackOptionsClan() || config.levelRangeAttackOptions()) { + final String pOptionToReplace = Text.removeTags(menuEntryAdded.getOption()).toUpperCase(); + if (client.getGameState() != GameState.LOGGED_IN) { return; } + + if (pOptionToReplace.equals(CANCEL) || pOptionToReplace.equals(WALK_HERE)) + { + return; + } + Player[] players = client.getCachedPlayers(); Player player = null; int identifier = menuEntryAdded.getIdentifier(); @@ -389,44 +436,75 @@ public class PvpToolsPlugin extends Plugin { return; } + + if (attackHotKeyPressed && config.attackOptionsClan() || config.attackOptionsFriend() || config.levelRangeAttackOptions()) { if (config.attackOptionsFriend() && player.isFriend()) { - moveEntry(); + swap(pOptionToReplace); } - if (config.attackOptionsClan() && player.isClanMember()) + else if (config.attackOptionsClan() && player.isClanMember()) { - moveEntry(); + swap(pOptionToReplace); } - if (config.levelRangeAttackOptions() && !PvPUtil.isAttackable(client, player)) + else if (config.levelRangeAttackOptions() && !PvPUtil.isAttackable(client, player)) { - moveEntry(); + swap(pOptionToReplace); } } } } - private void moveEntry() + @Subscribe + public void onMenuOpened(MenuOpened event) { - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry lastEntry = menuEntries[menuEntries.length - 1]; + Player localPlayer = client.getLocalPlayer(); - if (lastEntry.getOption().contains("attack".toLowerCase())) + if (localPlayer == null) { - ArrayUtils.shift(menuEntries, 1); - //ArrayUtils.add(menuEntries, menuEntries.length - 2); - //menuEntries = ArrayUtils.remove(menuEntries, menuEntries.length - 1); - //menuEntrySwapperPlugin.swap("attack", option, mtarget, false); TODO: Make sure to use menuutil when uncommenting this - } - if (lastEntry.getOption().equals("Attack")) - { - ArrayUtils.shift(menuEntries, 1); + return; } - client.setMenuEntries(menuEntries); + List menu = new ArrayList<>(); + for (MenuEntry entry : event.getMenuEntries()) + { + String option = Text.removeTags(entry.getOption()).toLowerCase(); + String target = Text.removeTags(entry.getTarget()).toLowerCase(); + + int identifier = entry.getIdentifier(); + + Player[] players = client.getCachedPlayers(); + Player player = null; + + if (identifier >= 0 && identifier < players.length) + { + player = players[identifier]; + } + + if (player == null) + { + menu.add(entry); + continue; + } + + if (option.contains("attack") && config.hideAttack() && shouldHide(config.hideAttackMode(), player)) + { + continue; + } + + else if (option.contains("cast") && config.hideCast() && shouldHide(config.hideCastMode(), player) + && !ignoredSpells.contains(StringUtils.substringBefore(target, " ->"))) + { + continue; + } + + menu.add(entry); + } + + client.setMenuEntries(menu.toArray(new MenuEntry[0])); } @Subscribe @@ -438,6 +516,7 @@ public class PvpToolsPlugin extends Plugin } } + /** * Enables or disables the fall in helper feature */ @@ -471,35 +550,37 @@ public class PvpToolsPlugin extends Plugin panel.numMeleeJLabel.repaint(); } - /** - * - */ + private void updatePlayers() { + friendlyPlayerCount = 0; + enemyPlayerCount = 0; if (config.countPlayers()) { - int cc = 0; - int other = 0; for (Player p : client.getPlayers()) { if (Objects.nonNull(p)) { + if (p.equals(client.getLocalPlayer())) + { + continue; + } if (PvPUtil.isAttackable(client, p)) { if (p.isClanMember()) { - cc++; + friendlyPlayerCount++; } else { - other++; + enemyPlayerCount++; } } } } - panel.numOther.setText(htmlLabel("Other Player Count: ", String.valueOf(other))); - panel.numCC.setText(htmlLabel("Friendly Player Count: ", String.valueOf(cc))); + panel.numOther.setText(htmlLabel("Other Player Count: ", String.valueOf(enemyPlayerCount))); + panel.numCC.setText(htmlLabel("Friendly Player Count: ", String.valueOf(friendlyPlayerCount))); panel.numCC.repaint(); panel.numOther.repaint(); } @@ -626,4 +707,80 @@ public class PvpToolsPlugin extends Plugin panel.biggestItemLabel.repaint(); } + /** + * Swaps menu entries if the entries could be found. This places Walk Here where the top level menu option was. + * @param pOptionToReplace The String containing the Menu Option that needs to be replaced. IE: "Attack", "Chop Down". + */ + private void swap(String pOptionToReplace) + { + MenuEntry[] entries = client.getMenuEntries(); + Integer walkHereEntry = searchIndex(entries, WALK_HERE); + Integer entryToReplace = searchIndex(entries, pOptionToReplace); + + if (walkHereEntry != null + && entryToReplace != null) + { + MenuEntry walkHereMenuEntry = entries[walkHereEntry]; + entries[walkHereEntry] = entries[entryToReplace]; + entries[entryToReplace] = walkHereMenuEntry; + client.setMenuEntries(entries); + } + } + + /** + * Finds the index of the menu that contains the verbiage we are looking for. + * @param pMenuEntries The list of {@link MenuEntry}s. + * @param pMenuEntryToSearchFor The Option in the menu to search for. + * @return The index location or null if it was not found. + */ + private Integer searchIndex(MenuEntry[] pMenuEntries, String pMenuEntryToSearchFor) + { + Integer indexLocation = 0; + + for (MenuEntry menuEntry : pMenuEntries) + { + String entryOption = Text.removeTags(menuEntry.getOption()).toUpperCase(); + + if (entryOption.equals(pMenuEntryToSearchFor)) + { + return indexLocation; + } + indexLocation++; + } + return null; + } + + /** + * Given an AttackMode, checks whether or not a player should be hidden. + * @param mode The {@link AttackMode} the player should be checked against. + * @param player The player that should be checked. + * @return True if the player should be hidden, false otherwise. + */ + private boolean shouldHide(AttackMode mode, Player player) + { + switch (mode) + { + case CLAN: + if (player.isClanMember()) + { + return true; + } + break; + case FRIENDS: + if (player.isFriend()) + { + return true; + } + break; + case BOTH: + if (player.isClanMember() || player.isFriend()) + { + return true; + } + break; + } + + return false; + } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/skull.png b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/skull.png similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pvptools/skull.png rename to runelite-client/src/main/java/net/runelite/client/plugins/pvptools/skull.png diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderConfig.java similarity index 73% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderConfig.java index 4b3038762c..19204ca5e1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderConfig.java @@ -31,8 +31,20 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup("pyramidplunder") public interface PyramidPlunderConfig extends Config { + @ConfigItem( - position = 1, + position = 1, + keyName = "showPlunderStatus", + name = "Show session stats", + description = "Configures whether to display pyramid plunder session stats" + ) + default boolean showPlunderStatus() + { + return true; + } + + @ConfigItem( + position = 2, keyName = "highlightDoors", name = "Highlights doors", description = "Highlights the four doors in each room" @@ -43,7 +55,7 @@ public interface PyramidPlunderConfig extends Config } @ConfigItem( - position = 2, + position = 3, keyName = "highlightSpearTrap", name = "Highlights spear traps", description = "Highlights the spear traps in each room" @@ -54,7 +66,7 @@ public interface PyramidPlunderConfig extends Config } @ConfigItem( - position = 3, + position = 4, keyName = "showTimer", name = "Display numerical timer", description = "Displays a numerical timer instead of the default timer" @@ -63,4 +75,38 @@ public interface PyramidPlunderConfig extends Config { return true; } + + @ConfigItem( + position = 5, + keyName = "hideWidget", + name = "Hide default widget", + description = "Hide the default widget" + ) + default boolean hideWidget() + { + return true; + } + + @ConfigItem( + position = 6, + keyName = "firstWarningTime", + name = "First warning time", + description = "Recolor time left(s)" + ) + default int firstWarningTime() + { + return 90; + } + + @ConfigItem( + position = 7, + keyName = "secondWarningTime", + name = "Second warning time", + description = "Recolor time left(s)" + ) + default int secondWarningTime() + { + return 30; + } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java similarity index 58% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java index 373ef91fa0..7db6dcca33 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java @@ -28,20 +28,33 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.Area; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Locale; import java.util.Map; import javax.inject.Inject; -import api.Client; -import api.ObjectDefinition; -import api.Point; -import api.Tile; -import api.TileObject; -import api.coords.LocalPoint; + +import net.runelite.api.Client; +import net.runelite.api.ObjectDefinition; +import net.runelite.api.Point; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.Varbits; +import net.runelite.api.coords.LocalPoint; import static net.runelite.client.plugins.pyramidplunder.PyramidPlunderPlugin.CLOSED_DOOR; import static net.runelite.client.plugins.pyramidplunder.PyramidPlunderPlugin.OPENED_DOOR; import static net.runelite.client.plugins.pyramidplunder.PyramidPlunderPlugin.TRAP; + +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.util.ColorUtil; public class PyramidPlunderOverlay extends Overlay { @@ -50,13 +63,26 @@ public class PyramidPlunderOverlay extends Overlay private static final Color COLOR_SPEAR_TRAP = Color.ORANGE; private final Client client; + private final PyramidPlunderConfig config; private final PyramidPlunderPlugin plugin; + private final PanelComponent panelComponent = new PanelComponent(); + + private static final int MAX_TICK_COUNT = 500; + private static final double TICK_LENGTH = 0.6; + + private static final NumberFormat TIME_LEFT_FORMATTER = DecimalFormat.getInstance(Locale.US); + + static + { + ((DecimalFormat) TIME_LEFT_FORMATTER).applyPattern("#0.0"); + } @Inject - private PyramidPlunderOverlay(Client client, PyramidPlunderPlugin plugin) + private PyramidPlunderOverlay(Client client, PyramidPlunderConfig config, PyramidPlunderPlugin plugin) { this.client = client; this.plugin = plugin; + this.config = config; setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.ABOVE_SCENE); } @@ -78,7 +104,7 @@ public class PyramidPlunderOverlay extends Overlay Tile tile = entry.getValue(); if (tile.getPlane() == client.getPlane() && - object.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) + object.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) { int objectID = object.getId(); if (object.getId() == CLOSED_DOOR || object.getId() == OPENED_DOOR) @@ -125,6 +151,65 @@ public class PyramidPlunderOverlay extends Overlay } } + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + if (config.showPlunderStatus()) + { + final Widget widget = client.getWidget(WidgetInfo.PYRAMID_PLUNDER_DATA); + if (widget == null) + { + return null; + } + + toggleDefaultWidget(config.hideWidget()); + + panelComponent.getChildren().clear(); + + panelComponent.getChildren().add(TitleComponent.builder() + .text("Pyramid Plunder") + .build()); + + //Calculate time based on current pp timer tick + final int currentTick = client.getVar(Varbits.PYRAMID_PLUNDER_TIMER); + final double baseTick = (MAX_TICK_COUNT - currentTick) * TICK_LENGTH; + final double timeLeft = Math.max(0.0, baseTick); + final String timeLeftStr = TIME_LEFT_FORMATTER.format(timeLeft); + + tableComponent.addRow("Time left:", ColorUtil.prependColorTag(timeLeftStr, getColor(currentTick))); + tableComponent.addRow("Room:", client.getVar(Varbits.PYRAMID_PLUNDER_ROOM) + "/8"); + + panelComponent.getChildren().add(tableComponent); + + return panelComponent.render(graphics); + } return null; } + + void toggleDefaultWidget(boolean hide) + { + final Widget widget = client.getWidget(WidgetInfo.PYRAMID_PLUNDER_DATA); + + if (widget == null) + { + return; + } + + widget.setHidden(hide); + } + + private Color getColor(int timeLeft) + { + if (timeLeft < config.secondWarningTime()) + { + return Color.RED; + } + else if (timeLeft < config.firstWarningTime()) + { + return Color.YELLOW; + } + + return Color.WHITE; + } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderPlugin.java similarity index 82% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderPlugin.java index 1bdd36e49b..37534fc80a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderPlugin.java @@ -33,36 +33,36 @@ import java.util.Map; import java.util.Set; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import static api.Constants.GAME_TICK_LENGTH; -import static api.ItemID.PHARAOHS_SCEPTRE; -import static api.ObjectID.GRAND_GOLD_CHEST; -import static api.ObjectID.OPENED_GOLD_CHEST; -import static api.ObjectID.SARCOPHAGUS_21255; -import static api.ObjectID.SARCOPHAGUS_21256; -import static api.ObjectID.SPEARTRAP_21280; -import static api.ObjectID.TOMB_DOOR_20948; -import static api.ObjectID.TOMB_DOOR_20949; -import static api.ObjectID.URN_21261; -import static api.ObjectID.URN_21262; -import static api.ObjectID.URN_21263; -import static api.ObjectID.URN_21265; -import static api.ObjectID.URN_21266; -import static api.ObjectID.URN_21267; -import api.Player; -import api.Tile; -import api.TileObject; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.VarbitChanged; -import api.events.WallObjectChanged; -import api.events.WallObjectDespawned; -import api.events.WallObjectSpawned; +import net.runelite.api.Client; +import static net.runelite.api.Constants.GAME_TICK_LENGTH; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE; +import static net.runelite.api.ObjectID.GRAND_GOLD_CHEST; +import static net.runelite.api.ObjectID.OPENED_GOLD_CHEST; +import static net.runelite.api.ObjectID.SARCOPHAGUS_21255; +import static net.runelite.api.ObjectID.SARCOPHAGUS_21256; +import static net.runelite.api.ObjectID.SPEARTRAP_21280; +import static net.runelite.api.ObjectID.TOMB_DOOR_20948; +import static net.runelite.api.ObjectID.TOMB_DOOR_20949; +import static net.runelite.api.ObjectID.URN_21261; +import static net.runelite.api.ObjectID.URN_21262; +import static net.runelite.api.ObjectID.URN_21263; +import static net.runelite.api.ObjectID.URN_21265; +import static net.runelite.api.ObjectID.URN_21266; +import static net.runelite.api.ObjectID.URN_21267; +import net.runelite.api.Player; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WallObjectChanged; +import net.runelite.api.events.WallObjectDespawned; +import net.runelite.api.events.WallObjectSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderTimer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderTimer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java index ec674cdbb8..62583460bb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java @@ -35,22 +35,22 @@ import javax.inject.Inject; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; -import api.Client; -import api.GameState; -import api.ScriptID; -import api.SoundEffectID; -import api.SpriteID; -import api.VarClientInt; -import api.Varbits; -import api.events.GameStateChanged; -import api.events.ScriptCallbackEvent; -import api.events.VarClientIntChanged; -import api.events.VarbitChanged; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetPositionMode; -import api.widgets.WidgetType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.ScriptID; +import net.runelite.api.SoundEffectID; +import net.runelite.api.SpriteID; +import net.runelite.api.VarClientInt; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.chatbox.ChatboxPanelManager; @@ -134,6 +134,8 @@ public class QuestListPlugin extends Plugin Widget header = client.getWidget(WidgetInfo.QUESTLIST_BOX); if (header != null) { + header.deleteAllChildren(); + questSearchButton = header.createChild(-1, WidgetType.GRAPHIC); questSearchButton.setSpriteId(SpriteID.GE_SEARCH); questSearchButton.setOriginalWidth(18); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/Parse.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/Parse.java new file mode 100644 index 0000000000..9e40aa3a3f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/Parse.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, Owain van Brakel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.raids; + +import com.google.common.base.Splitter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class Parse +{ + public static boolean parse(String value) + { + final ArrayList rooms = new ArrayList<>(); + Collections.addAll(rooms, "tekton", "muttadiles", "guardians", "vespula", "shamans", "vasa", "vanguards", "mystics", "crabs", "ice demon", "tightrope", "thieving", "unknown"); + + List enteredRooms = Splitter + .on(",") + .trimResults() + .omitEmptyStrings() + .splitToList(value); + + for (String room : enteredRooms) + { + if (!rooms.contains(room.toLowerCase())) + { + return false; + } + } + + return true; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/Raid.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/Raid.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java index a0baabe691..69feb04fca 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/Raid.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java @@ -40,7 +40,7 @@ public class Raid @Getter private Layout layout; - public void updateLayout(Layout layout) + void updateLayout(Layout layout) { if (layout == null) { @@ -83,7 +83,7 @@ public class Raid return rooms[position]; } - public void setRoom(RaidRoom room, int position) + void setRoom(RaidRoom room, int position) { if (position < rooms.length) { @@ -91,7 +91,7 @@ public class Raid } } - public RaidRoom[] getCombatRooms() + RaidRoom[] getCombatRooms() { List combatRooms = new ArrayList<>(); @@ -111,12 +111,34 @@ public class Raid return combatRooms.toArray(new RaidRoom[combatRooms.size()]); } - public String getRotationString() + String getRotationString() { return Joiner.on(",").join(Arrays.stream(getCombatRooms()).map(r -> r.getBoss().getName()).toArray()); } - public String toCode() + private RaidRoom[] getAllRooms() + { + List getAllRooms = new ArrayList<>(); + + for (Room room : layout.getRooms()) + { + if (room == null) + { + continue; + } + + getAllRooms.add(rooms[room.getPosition()]); + } + + return getAllRooms.toArray(new RaidRoom[0]); + } + + String getFullRotationString() + { + return Joiner.on(",").join(Arrays.stream(getAllRooms()).toArray()); + } + + String toCode() { StringBuilder builder = new StringBuilder(); @@ -135,7 +157,7 @@ public class Raid return builder.toString(); } - public String toRoomString() + String toRoomString() { final StringBuilder sb = new StringBuilder(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidRoom.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidRoom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidRoom.java index a1d6061d32..aa2fd9e162 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidRoom.java @@ -27,11 +27,50 @@ package net.runelite.client.plugins.raids; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import api.Tile; +import net.runelite.api.Tile; public class RaidRoom { - public static final int ROOM_MAX_SIZE = 32; + static final int ROOM_MAX_SIZE = 32; + @Getter + private final Tile base; + @Getter + @Setter + private Type type; + @Getter + @Setter + private Boss boss; + @Getter + @Setter + private Puzzle puzzle; + @Getter + @Setter + private RaidRoom previousRoom; + @Getter + @Setter + private RaidRoom nextRoom; + + RaidRoom(Tile base, Type type) + { + this.base = base; + this.type = type; + } + + @Override + public String toString() + { + switch (type) + { + case COMBAT: + return " " + type.getName() + " - " + boss.getName(); + + case PUZZLE: + return " " + type.getName() + " - " + puzzle.getName(); + + default: + return " " + type.getName(); + } + } @AllArgsConstructor public enum Type @@ -119,49 +158,4 @@ public class RaidRoom return null; } } - - @Getter - private final Tile base; - - @Getter - @Setter - private Type type; - - @Getter - @Setter - private Boss boss; - - @Getter - @Setter - private Puzzle puzzle; - - @Getter - @Setter - private RaidRoom previousRoom; - - @Getter - @Setter - private RaidRoom nextRoom; - - public RaidRoom(Tile base, Type type) - { - this.base = base; - this.type = type; - } - - @Override - public String toString() - { - switch (type) - { - case COMBAT: - return "RaidRoom (type: " + type.getName() + ", " + boss.getName() + ")"; - - case PUZZLE: - return "RaidRoom (type: " + type.getName() + ", " + puzzle.getName() + ")"; - - default: - return "RaidRoom (type: " + type.getName() + ")"; - } - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java index b5200a5612..47805b8f39 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java @@ -58,6 +58,18 @@ public interface RaidsConfig extends Config return true; } + @ConfigItem( + position = 2, + parent = "scouterConfig", + keyName = "hideBackground", + name = "Hide Scouter Background", + description = "Removes the scouter background, and makes it transparent." + ) + default boolean hideBackground() + { + return true; + } + @ConfigItem( position = 2, parent = "scouterConfig", @@ -184,32 +196,6 @@ public interface RaidsConfig extends Config @ConfigItem( position = 12, parent = "scouterConfig", - keyName = "colorTightrope", - name = "Color tightrope", - description = "Colors tightrope a separate color" - ) - default boolean colorTightrope() - { - return true; - } - - @ConfigItem( - position = 13, - parent = "scouterConfig", - keyName = "tightropeColor", - name = "Tightrope color", - description = "The color of tightropes", - hidden = true, - unhide = "colorTightrope" - ) - default Color tightropeColor() - { - return Color.MAGENTA; - } - - @ConfigItem( - position = 14, - parent = "scouterConfig", keyName = "layoutMessage", name = "Send raid layout message when entering raid", description = "Sends game message with raid layout on entering new raid" @@ -223,16 +209,83 @@ public interface RaidsConfig extends Config keyName = "roomConfig", name = "Room Config", description = "", - position = 15 + position = 13 ) default Stub roomConfig() { return new Stub(); } + @ConfigItem( + position = 14, + parent = "roomConfig", + keyName = "colorTightrope", + name = "Color tightrope", + description = "Colors tightrope a separate color" + ) + default boolean colorTightrope() + { + return true; + } + + @ConfigItem( + position = 15, + parent = "roomConfig", + keyName = "tightropeColor", + name = "Tightrope color", + description = "The color of tightropes", + hidden = true, + unhide = "colorTightrope" + ) + default Color tightropeColor() + { + return Color.MAGENTA; + } + @ConfigItem( position = 16, parent = "roomConfig", + keyName = "crabHandler", + name = "Color crabs", + description = "If your crabs are good, it will color them to your set color." + + "
    If they are bad crabs, it will be set to RED" + ) + default boolean crabHandler() + { + return false; + } + + @ConfigItem( + position = 17, + parent = "roomConfig", + keyName = "goodCrabColor", + name = "Good Crab color", + description = "The color of good crabs", + hidden = true, + unhide = "crabHandler" + ) + default Color goodCrabColor() + { + return new Color(255, 155, 245); + } + + @ConfigItem( + position = 17, + parent = "roomConfig", + keyName = "rareCrabColor", + name = "Rare Crab color", + description = "The color of rare crabs", + hidden = true, + unhide = "crabHandler" + ) + default Color rareCrabColor() + { + return new Color(255, 200, 0); + } + + @ConfigItem( + position = 18, + parent = "roomConfig", keyName = "enableRotationWhitelist", name = "Enable rotation whitelist", description = "Enable the rotation whitelist" @@ -243,7 +296,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 17, + position = 19, parent = "roomConfig", keyName = "whitelistedRotations", name = "Whitelisted rotations", @@ -257,7 +310,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 18, + position = 20, parent = "roomConfig", keyName = "enableLayoutWhitelist", name = "Enable layout whitelist", @@ -269,7 +322,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 19, + position = 21, parent = "roomConfig", keyName = "whitelistedLayouts", name = "Whitelisted layouts", @@ -283,7 +336,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 20, + position = 22, parent = "roomConfig", keyName = "showScavsFarms", name = "Show scavengers and farming", @@ -295,7 +348,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 21, + position = 23, parent = "roomConfig", keyName = "scavsBeforeIce", name = "Show last scavs for Ice Demon", @@ -307,7 +360,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 22, + position = 24, parent = "roomConfig", keyName = "scavsBeforeOlm", name = "Show last scavs for Olm", @@ -319,7 +372,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 23, + position = 25, parent = "roomConfig", keyName = "scavPrepColor", name = "Last scavs color", @@ -331,11 +384,14 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 24, + position = 26, parent = "roomConfig", keyName = "whitelistedRooms", name = "Whitelisted rooms", - description = "Display whitelisted rooms in green on the overlay. Separate with comma (full name)" + description = "Display whitelisted rooms in green on the overlay. Separate with comma (full name)", + parse = true, + clazz = Parse.class, + method = "parse" ) default String whitelistedRooms() { @@ -343,11 +399,14 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 25, + position = 27, parent = "roomConfig", keyName = "blacklistedRooms", name = "Blacklisted rooms", - description = "Display blacklisted rooms in red on the overlay. Separate with comma (full name)" + description = "Display blacklisted rooms in red on the overlay. Separate with comma (full name)", + parse = true, + clazz = Parse.class, + method = "parse" ) default String blacklistedRooms() { @@ -358,7 +417,7 @@ public interface RaidsConfig extends Config keyName = "hideRooms", name = "Hide Rooms", description = "", - position = 26 + position = 28 ) default Stub hideRooms() { @@ -366,7 +425,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 27, + position = 29, parent = "hideRooms", keyName = "hideRopeless", name = "Hide no Tightrope raids", @@ -378,7 +437,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 28, + position = 30, parent = "hideRooms", keyName = "hideVanguards", name = "Hide Vanguard raids", @@ -390,7 +449,7 @@ public interface RaidsConfig extends Config } @ConfigItem( - position = 29, + position = 31, parent = "hideRooms", keyName = "hideUnknownCombat", name = "Hide Unknown combat raids", @@ -400,4 +459,15 @@ public interface RaidsConfig extends Config { return false; } + + @ConfigItem( + position = 32, + keyName = "partyDisplay", + name = "Party Info Display", + description = "Display an overlay that shows information about the current party" + ) + default boolean partyDisplay() + { + return false; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java similarity index 70% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java index 077c64f017..2bfa3e41be 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java @@ -37,10 +37,10 @@ import java.util.Set; import javax.inject.Inject; import lombok.Getter; import lombok.Setter; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.SpriteID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.SpriteID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.raids.solver.Room; @@ -49,11 +49,14 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; @@ -63,30 +66,24 @@ public class RaidsOverlay extends Overlay private static final int BORDER_OFFSET = 2; private static final int ICON_SIZE = 32; private static final int SMALL_ICON_SIZE = 21; - //might need to edit these if they are not standard private static final int TITLE_COMPONENT_HEIGHT = 20; private static final int LINE_COMPONENT_HEIGHT = 16; - - private Client client; - private RaidsPlugin plugin; - private RaidsConfig config; private final PanelComponent panelComponent = new PanelComponent(); private final ItemManager itemManager; private final SpriteManager spriteManager; private final PanelComponent panelImages = new PanelComponent(); - + private Client client; + private RaidsPlugin plugin; + private RaidsConfig config; @Setter private boolean sharable = false; - + @Getter @Setter private boolean scoutOverlayShown = false; - @Getter private boolean scouterActive = false; - @Getter private int width; - @Getter private int height; @@ -115,6 +112,15 @@ public class RaidsOverlay extends Overlay scouterActive = false; panelComponent.getChildren().clear(); + if (config.hideBackground()) + { + panelComponent.setBackgroundColor(null); + } + else + { + panelComponent.setBackgroundColor(ComponentConstants.STANDARD_BACKGROUND_COLOR); + } + if (plugin.getRaid() == null || plugin.getRaid().getLayout() == null) { panelComponent.getChildren().add(TitleComponent.builder() @@ -142,7 +148,6 @@ public class RaidsOverlay extends Overlay { color = Color.RED; } - int combatCount = 0; int roomCount = 0; List iceRooms = new ArrayList<>(); @@ -156,110 +161,128 @@ public class RaidsOverlay extends Overlay boolean unknownCombat = false; String puzzles = ""; String roomName = ""; - if (config.enhanceScouterTitle() || config.scavsBeforeIce() || sharable) + for (Room layoutRoom : plugin.getRaid().getLayout().getRooms()) { - for (Room layoutRoom : plugin.getRaid().getLayout().getRooms()) - { - int position = layoutRoom.getPosition(); - RaidRoom room = plugin.getRaid().getRoom(position); + int position = layoutRoom.getPosition(); + RaidRoom room = plugin.getRaid().getRoom(position); - if (room == null) - { - continue; - } - - switch (room.getType()) - { - case COMBAT: - combatCount++; - roomName = room.getBoss().getName(); - switch (RaidRoom.Boss.fromString(roomName)) - { - case VANGUARDS: - vanguards = true; - break; - case UNKNOWN: - unknownCombat = true; - break; - } - break; - case PUZZLE: - roomName = room.getPuzzle().getName(); - switch (RaidRoom.Puzzle.fromString(roomName)) - { - case CRABS: - crabs = true; - break; - case ICE_DEMON: - iceDemon = true; - iceRooms.add(roomCount); - break; - case THIEVING: - thieving = true; - break; - case TIGHTROPE: - tightrope = true; - break; - } - break; - case SCAVENGERS: - scavRooms.add(roomCount); - break; - } - roomCount++; - } - if (tightrope) + if (room == null) { - puzzles = crabs ? "cr" : iceDemon ? "ri" : thieving ? "tr" : "?r"; + continue; } - if ((config.hideVanguards() && vanguards) || (config.hideRopeless() && !tightrope) || (config.hideUnknownCombat() && unknownCombat)) + switch (room.getType()) { - panelComponent.getChildren().add(TitleComponent.builder() - .text("Bad Raid!") - .color(Color.RED) - .build()); - - return panelComponent.render(graphics); - } - - scouterActive = true; - displayLayout = (config.enhanceScouterTitle() ? "" + combatCount + "c " + puzzles + " " : "") + displayLayout; - - for (Integer i : iceRooms) - { - int prev = 0; - for (Integer s : scavRooms) - { - if (s > i) + case COMBAT: + combatCount++; + roomName = room.getBoss().getName(); + switch (RaidRoom.Boss.fromString(roomName)) { - break; + case VANGUARDS: + vanguards = true; + break; + case UNKNOWN: + unknownCombat = true; + break; } - prev = s; - } - scavsBeforeIceRooms.add(prev); + break; + case PUZZLE: + roomName = room.getPuzzle().getName(); + switch (RaidRoom.Puzzle.fromString(roomName)) + { + case CRABS: + crabs = true; + break; + case ICE_DEMON: + iceDemon = true; + iceRooms.add(roomCount); + break; + case THIEVING: + thieving = true; + break; + case TIGHTROPE: + tightrope = true; + break; + } + break; + case SCAVENGERS: + scavRooms.add(roomCount); + break; } + roomCount++; + } + if (tightrope) + { + puzzles = crabs ? "cr" : iceDemon ? "ri" : thieving ? "tr" : "?r"; + } + + if ((config.hideVanguards() && vanguards) || (config.hideRopeless() && !tightrope) || (config.hideUnknownCombat() && unknownCombat)) + { + panelComponent.getChildren().add(TitleComponent.builder() + .text("Bad Raid!") + .color(Color.RED) + .build()); + + return panelComponent.render(graphics); + } + + scouterActive = true; + displayLayout = (config.enhanceScouterTitle() ? "" + combatCount + "c " + puzzles + " " : "") + displayLayout; + + for (Integer i : iceRooms) + { + int prev = 0; + for (Integer s : scavRooms) + { + if (s > i) + { + break; + } + prev = s; + } + scavsBeforeIceRooms.add(prev); } int lastScavs = scavRooms.get(scavRooms.size() - 1); + panelComponent.getChildren().add(TitleComponent.builder() .text(displayLayout) .color(color) .build()); + + if (plugin.recordRaid() != null) + { + panelComponent.getChildren().add(TitleComponent.builder() + .text("Record Raid") + .color(Color.GREEN) + .build()); + panelComponent.setBackgroundColor(new Color(0, 255, 0, 10)); + } + else + { + if (config.hideBackground()) + { + panelComponent.setBackgroundColor(null); + } + else + { + panelComponent.setBackgroundColor(ComponentConstants.STANDARD_BACKGROUND_COLOR); + } + } + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + color = Color.ORANGE; if (sharable || config.alwaysShowWorldAndCC()) { String clanOwner = Text.removeTags(client.getWidget(WidgetInfo.CLAN_CHAT_OWNER).getText()); if (clanOwner.equals("None")) { - clanOwner = "Open CC tab..."; + clanOwner = "Open CC Tab"; color = Color.RED; } - panelComponent.getChildren().add(LineComponent.builder() - .left("W" + client.getWorld()) - .right("" + clanOwner) - .leftColor(Color.ORANGE) - .rightColor(color) - .build()); + + tableComponent.addRow(ColorUtil.prependColorTag("W" + client.getWorld(), Color.ORANGE), ColorUtil.prependColorTag("" + clanOwner, color)); } int bossMatches = 0; @@ -308,11 +331,7 @@ public class RaidsOverlay extends Overlay } } - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : room.getType().getName()) - .right(bossName) - .rightColor(color) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : room.getType().getName(), ColorUtil.prependColorTag(bossName, color)); break; @@ -335,53 +354,54 @@ public class RaidsOverlay extends Overlay { color = config.tightropeColor(); } + if (config.crabHandler() && puzzleNameLC.equals("crabs")) + { + if (plugin.getGoodCrabs() == null) + { + color = Color.RED; + } + else + { + switch (plugin.getGoodCrabs()) + { + case "Good Crabs": + color = config.goodCrabColor(); + break; + case "Rare Crabs": + color = config.rareCrabColor(); + break; + } + } + } - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : room.getType().getName()) - .right(puzzleName) - .rightColor(color) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : room.getType().getName(), ColorUtil.prependColorTag(puzzleName, color)); break; case FARMING: if (config.showScavsFarms()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("") - .right(room.getType().getName()) - .rightColor(new Color(181, 230, 29)) //yellow green - .build()); + tableComponent.addRow("", ColorUtil.prependColorTag(room.getType().getName(), new Color(181, 230, 29))); } break; case SCAVENGERS: if (config.scavsBeforeOlm() && roomCount == lastScavs) { - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : "OlmPrep") - .right("Scavs") - .rightColor(config.scavPrepColor()) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : "OlmPrep", ColorUtil.prependColorTag("Scavs", config.scavPrepColor())); } else if (config.scavsBeforeIce() && scavsBeforeIceRooms.contains(roomCount)) { - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : "IcePrep") - .right("Scavs") - .rightColor(config.scavPrepColor()) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : "IcePrep", ColorUtil.prependColorTag("Scavs", config.scavPrepColor())); } else if (config.showScavsFarms()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("") - .right("Scavs") - .rightColor(new Color(181, 230, 29)) //yellow green - .build()); + tableComponent.addRow("", ColorUtil.prependColorTag("Scavs", new Color(181, 230, 29))); } break; } roomCount++; } + panelComponent.getChildren().add(tableComponent); + Dimension panelDims = panelComponent.render(graphics); width = (int) panelDims.getWidth(); height = (int) panelDims.getHeight(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java similarity index 86% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java index f927e3a2be..0f4e8c916b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java @@ -27,19 +27,18 @@ package net.runelite.client.plugins.raids; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; -import java.lang.reflect.Method; import javax.inject.Inject; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; -import api.Client; -import api.GameState; +import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.client.callback.ClientThread; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; -public class RaidsPanel extends PluginPanel +class RaidsPanel extends PluginPanel { @Inject private Client client; @@ -78,26 +77,9 @@ public class RaidsPanel extends PluginPanel JPanel scoutFrame = new JPanel(); reloadButton.addActionListener((ActionEvent e) -> { - - if ((client.getGameState() == GameState.LOGGED_IN)) { - try - { - //look for client.gameStateChanged(-1); in src files to find - Method m = client.getClass().getClassLoader().loadClass("ba").getDeclaredMethod("ec", int.class, byte.class); - m.setAccessible(true); - m.invoke(null, 40, (byte) 3); - - } - catch (ReflectiveOperationException f) - { - throw new RuntimeException(f); - } - } - else - { - //TODO: User is still in a dc, or not logged in. Possibly provide a meaningful message somewhere. + client.setGameState(40); } }); reloadScouter.addActionListener((ActionEvent e) -> diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPartyOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPartyOverlay.java new file mode 100644 index 0000000000..85295b7083 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPartyOverlay.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2019, Bjornenalfa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.raids; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.util.Set; +import javax.inject.Inject; +import net.runelite.api.ClanMember; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; + +public class RaidsPartyOverlay extends Overlay +{ + static final String PARTY_OVERLAY_RESET = "Reset missing"; + static final String PARTY_OVERLAY_REFRESH = "Refresh party"; + private final PanelComponent panelComponent = new PanelComponent(); + private final PanelComponent panel = new PanelComponent(); + @Inject + private Client client; + @Inject + private RaidsPlugin plugin; + + @Inject + private RaidsPartyOverlay(RaidsPlugin plugin) + { + super(plugin); + setPosition(OverlayPosition.TOP_RIGHT); + setPriority(OverlayPriority.HIGH); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Raids party overlay")); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, PARTY_OVERLAY_RESET, "Raids party overlay")); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, PARTY_OVERLAY_REFRESH, "Raids party overlay")); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!plugin.isInRaidChambers()) + { + return null; + } + + if (client.getClanChatCount() == 0) + { + // Player left clan chat + return null; + } + + boolean inLobby = client.getVar(VarPlayer.IN_RAID_PARTY) != -1; // -1 if raid started + + int partySize = client.getVar(Varbits.RAID_PARTY_SIZE); + + int playerCount = client.getPlayers().size(); + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + + String partyCountString; + + Color countColor = Color.WHITE; + if (inLobby) + { + partyCountString = String.format("%d/%d", playerCount, partySize); + // While we are in the lobby compare to players visible on the screen + if (partySize <= playerCount) + { + countColor = Color.GREEN; + } + else + { + countColor = Color.RED; + } + } + else + { + // If raid has started then we compare the current party size to what it was when we started + partyCountString = String.format("%d/%d", partySize, plugin.getStartPlayerCount()); + if (plugin.getMissingPartyMembers().size() > 0) + { + countColor = Color.RED; // Somebody is missing + } + } + + panel.getChildren().clear(); + + tableComponent.addRow("Party size:", ColorUtil.prependColorTag(partyCountString, countColor)); + + if (inLobby) + { + int world = client.getWorld(); + int wrongWorldClanMembers = 0; + int clanMemberCount = 0; + for (ClanMember clanMember : client.getClanMembers()) + { + if (clanMember != null) + { + if (clanMember.getWorld() != world) + { + wrongWorldClanMembers++; + } + else + { + clanMemberCount++; + } + } + } + + // Show amount of people on the right world but not at the raids area + Color notInPartyColor = Color.GREEN; + int notInParty = clanMemberCount - partySize; + + if (notInParty > 0) + { + notInPartyColor = Color.WHITE; + } + + tableComponent.addRow("Not at raids:", ColorUtil.prependColorTag(String.valueOf(notInParty), notInPartyColor)); + + + // Show amount of clan members that are not in the right world. + Color wrongWorldColor; + if (wrongWorldClanMembers == 0) + { + wrongWorldColor = Color.GREEN; + } + else + { + wrongWorldColor = Color.WHITE; + } + + tableComponent.addRow("Wrong world:", ColorUtil.prependColorTag(String.valueOf(wrongWorldClanMembers), wrongWorldColor)); + + } + else + { + Set missingPartyMembers = plugin.getMissingPartyMembers(); + if (missingPartyMembers.size() > 0) + { + + + tableComponent.addRow("Missing players:", ""); + + for (String member : missingPartyMembers) + { + tableComponent.addRow(ColorUtil.prependColorTag(member, Color.RED), ""); + } + } + } + + panelComponent.getChildren().add(tableComponent); + + return panel.render(graphics); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java similarity index 67% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index d1159a56c2..4ea46f01cd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -25,6 +25,8 @@ */ package net.runelite.client.plugins.raids; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import com.google.inject.Binder; import com.google.inject.Provides; import java.awt.image.BufferedImage; @@ -33,34 +35,37 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.concurrent.ScheduledExecutorService; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.InstanceTemplates; -import api.ItemID; -import api.NullObjectID; -import static api.Perspective.SCENE_SIZE; -import api.Point; -import api.SpriteID; -import static api.SpriteID.TAB_QUESTS_BROWN_RAIDING_PARTY; -import api.Tile; -import api.VarPlayer; -import api.Varbits; -import api.events.ChatMessage; -import api.events.ClientTick; -import api.events.ConfigChanged; -import api.events.VarbitChanged; -import api.events.WidgetHiddenChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InstanceTemplates; +import net.runelite.api.ItemID; +import net.runelite.api.MenuAction; +import net.runelite.api.NullObjectID; +import static net.runelite.api.Perspective.SCENE_SIZE; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.SpriteID; +import static net.runelite.api.SpriteID.TAB_QUESTS_BROWN_RAIDING_PARTY; +import net.runelite.api.Tile; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ClientTick; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; @@ -68,9 +73,9 @@ import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.QueuedMessage; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.OverlayMenuClicked; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; -import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; @@ -78,9 +83,9 @@ import net.runelite.client.plugins.raids.solver.Layout; import net.runelite.client.plugins.raids.solver.LayoutSolver; import net.runelite.client.plugins.raids.solver.RotationSolver; import net.runelite.client.ui.ClientToolbar; -import net.runelite.client.ui.DrawManager; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.WidgetOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ui.overlay.tooltip.Tooltip; @@ -90,102 +95,117 @@ import net.runelite.client.util.Text; import org.apache.commons.lang3.StringUtils; @PluginDescriptor( - name = "Chambers Of Xeric", + name = "CoX Scouter", description = "Show helpful information for the Chambers of Xeric raid", - tags = {"combat", "raid", "overlay", "pve", "pvm", "bosses", "cox", "olm"}, - type = PluginType.PVM + tags = {"combat", "raid", "overlay", "pve", "pvm", "bosses", "cox", "olm", "scout"}, + type = PluginType.PVM, + enabledByDefault = false ) + @Slf4j public class RaidsPlugin extends Plugin { + static final DecimalFormat POINTS_FORMAT = new DecimalFormat("#,###"); private static final int LOBBY_PLANE = 3; private static final String RAID_START_MESSAGE = "The raid has begun!"; private static final String LEVEL_COMPLETE_MESSAGE = "level complete!"; private static final String RAID_COMPLETE_MESSAGE = "Congratulations - your raid is complete!"; - private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###.##"); - static final DecimalFormat POINTS_FORMAT = new DecimalFormat("#,###"); private static final String SPLIT_REGEX = "\\s*,\\s*"; + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###.##"); private static final Pattern ROTATION_REGEX = Pattern.compile("\\[(.*?)]"); - private static final int LINE_COMPONENT_HEIGHT = 16; - - @Inject - private ItemManager itemManager; - private static final Pattern LEVEL_COMPLETE_REGEX = Pattern.compile("(.+) level complete! Duration: ([0-9:]+)"); private static final Pattern RAID_COMPLETE_REGEX = Pattern.compile("Congratulations - your raid is complete! Duration: ([0-9:]+)"); - - @Inject - private ChatMessageManager chatMessageManager; - - @Inject - private InfoBoxManager infoBoxManager; - - @Inject - private Client client; - - @Inject - private DrawManager drawManager; - - @Inject - private ScheduledExecutorService executor; - - @Inject - private RaidsConfig config; - - @Inject - private OverlayManager overlayManager; - - @Inject - private RaidsOverlay overlay; - - @Inject - private RaidsPointsOverlay pointsOverlay; - - @Inject - private LayoutSolver layoutSolver; - - @Inject - private SpriteManager spriteManager; - - @Inject - private ClientThread clientThread; - - @Inject - private KeyManager keyManager; - - @Inject - private TooltipManager tooltipManager; - + private static final ImmutableSet GOOD_CRABS_FIRST = ImmutableSet.of( + "FSCCP.PCSCF - #WNWSWN#ESEENW", //both good crabs + "SCSPF.CCSPF - #ESWWNW#ESENES", //both good crabs + "SPCFC.CSPCF - #WWNEEE#WSWNWS", //both good crabs + "SCFCP.CSCFS - #ENEESW#ENWWSW", //good crabs + "SCPFC.CCSSF - #NEESEN#WSWWNE", //good crabs + "SCFPC.CSPCF - #WSWWNE#WSEENE" //good crabs first rare crabs second + ); + private static final ImmutableSet GOOD_CRABS_SECOND = ImmutableSet.of( + "SCFCP.CCSPF - #ESEENW#ESWWNW", //bad crabs first good crabs second + "SCPFC.CSPSF - #WWSEEE#NWSWWN", //bad crabs first good crabs second + "SFCCS.PCPSF - #ENWWSW#ENESEN", //bad crabs first good crabs second + "SPCFC.SCCPF - #ESENES#WWWNEE", //bad crabs first good crabs second + "SPSFP.CCCSF - #NWSWWN#ESEENW", //bad crabs first good crabs second + "FSCCP.PCSCF - #ENWWWS#NEESEN" //bad crabs first good crabs second + ); + private static final ImmutableSet RARE_CRABS_FIRST = ImmutableSet.of( + "SCPFC.CSPCF - #NEEESW#WWNEEE", //rare crabs first good crabs second + "SCPFC.PCSCF - #WNEEES#NWSWNW", //rare crabs first bad crabs second + "SCPFC.CCPSF - #NWWWSE#WNEESE" //both rare crabs + ); + private static final ImmutableSet RARE_CRABS_SECOND = ImmutableSet.of( + "FSCPC.CSCPF - #WNWWSE#EENWWW", //bad crabs first rare crabs second + "SCFPC.PCCSF - #WSEENE#WWWSEE", //bad crabs first rare crabs second + "SCFPC.SCPCF - #NESENE#WSWWNE", //bad crabs first rare crabs second + "SFCCP.CSCPF - #WNEESE#NWSWWN", //bad crabs first rare crabs second + "SCFPC.CSPCF - #WSWWNE#WSEENE" //good crabs first rare crabs second + ); + private static final String TRIPLE_PUZZLE = "SFCCPC.PCSCPF - #WSEENES#WWWNEEE"; //good crabs first rare crabs second rare crabs third + private static final Pattern PUZZLES = Pattern.compile("Puzzle - (\\w+)"); @Getter private final ArrayList roomWhitelist = new ArrayList<>(); - @Getter private final ArrayList roomBlacklist = new ArrayList<>(); - @Getter private final ArrayList rotationWhitelist = new ArrayList<>(); - @Getter private final ArrayList layoutWhitelist = new ArrayList<>(); - @Getter private final Map> recommendedItemsList = new HashMap<>(); - - @Getter - private Raid raid; - - @Getter - private boolean inRaidChambers; - + @Inject + private ChatMessageManager chatMessageManager; + @Inject + private InfoBoxManager infoBoxManager; + @Inject + private Client client; + @Inject + private RaidsConfig config; + @Inject + private OverlayManager overlayManager; + @Inject + private RaidsOverlay overlay; + @Inject + private RaidsPointsOverlay pointsOverlay; + @Inject + private RaidsPartyOverlay partyOverlay; + @Inject + private LayoutSolver layoutSolver; + @Inject + private SpriteManager spriteManager; + @Inject + private ClientThread clientThread; + @Inject + private TooltipManager tooltipManager; @Inject private ClientToolbar clientToolbar; - private RaidsPanel panel; + @Inject + private ItemManager itemManager; + @Getter + private Raid raid; + @Getter + private boolean inRaidChambers; + @Getter + private String goodCrabs; + @Getter + private int startPlayerCount; + @Getter + private List partyMembers = new ArrayList<>(); + @Getter + private List startingPartyMembers = new ArrayList<>(); + @Getter + private Set missingPartyMembers = new HashSet<>(); + @Getter + private String layoutFullCode; + @Getter + private boolean raidStarted; private int upperTime = -1; private int middleTime = -1; private int lowerTime = -1; private int raidTime = -1; private WidgetOverlay widgetOverlay; private String tooltip; - public boolean canShow; private NavigationButton navButton; private RaidsTimer timer; @@ -206,10 +226,14 @@ public class RaidsPlugin extends Plugin { overlayManager.add(overlay); overlayManager.add(pointsOverlay); + if (config.partyDisplay()) + { + overlayManager.add(partyOverlay); + } updateLists(); clientThread.invokeLater(() -> checkRaidPresence(true)); widgetOverlay = overlayManager.getWidgetOverlay(WidgetInfo.RAIDS_POINTS_INFOBOX); - panel = injector.getInstance(RaidsPanel.class); + RaidsPanel panel = injector.getInstance(RaidsPanel.class); panel.init(config); final BufferedImage icon = ImageUtil.getResourceStreamFromClass(this.getClass(), "instancereloadhelper.png"); navButton = NavigationButton.builder() @@ -227,12 +251,11 @@ public class RaidsPlugin extends Plugin overlayManager.remove(overlay); overlayManager.remove(pointsOverlay); clientToolbar.removeNavigation(navButton); + if (config.partyDisplay()) + { + overlayManager.remove(partyOverlay); + } infoBoxManager.removeInfoBox(timer); - inRaidChambers = false; - widgetOverlay = null; - raid = null; - timer = null; - final Widget widget = client.getWidget(WidgetInfo.RAIDS_POINTS_INFOBOX); if (widget != null) { @@ -255,6 +278,18 @@ public class RaidsPlugin extends Plugin return; } + if (event.getKey().equals("partyDisplay")) + { + if (config.partyDisplay()) + { + overlayManager.add(partyOverlay); + } + else + { + overlayManager.remove(partyOverlay); + } + } + updateLists(); clientThread.invokeLater(() -> checkRaidPresence(true)); } @@ -279,6 +314,10 @@ public class RaidsPlugin extends Plugin public void onVarbitChanged(VarbitChanged event) { checkRaidPresence(false); + if (config.partyDisplay()) + { + updatePartyMembers(false); + } } @Subscribe @@ -289,10 +328,28 @@ public class RaidsPlugin extends Plugin String message = Text.removeTags(event.getMessage()); Matcher matcher; - if (config.raidsTimer() && message.startsWith(RAID_START_MESSAGE)) + if (message.startsWith(RAID_START_MESSAGE)) { - timer = new RaidsTimer(spriteManager.getSprite(TAB_QUESTS_BROWN_RAIDING_PARTY, 0), this, Instant.now()); - infoBoxManager.addInfoBox(timer); + if (config.raidsTimer()) + { + timer = new RaidsTimer(spriteManager.getSprite(TAB_QUESTS_BROWN_RAIDING_PARTY, 0), this, Instant.now()); + infoBoxManager.addInfoBox(timer); + raidStarted = true; + } + if (config.partyDisplay()) + { + // Base this on visible players since party size shows people outside the lobby + // and they did not get to come on the raid + List players = client.getPlayers(); + startPlayerCount = players.size(); + + partyMembers.clear(); + startingPartyMembers.clear(); + missingPartyMembers.clear(); + + startingPartyMembers.addAll(Lists.transform(players, Player::getName)); + partyMembers.addAll(startingPartyMembers); + } } if (timer != null && message.contains(LEVEL_COMPLETE_MESSAGE)) @@ -413,7 +470,95 @@ public class RaidsPlugin extends Plugin } } - public void checkRaidPresence(boolean force) + @Subscribe + public void onOverlayMenuClicked(OverlayMenuClicked event) + { + OverlayMenuEntry entry = event.getEntry(); + if (entry.getMenuAction() == MenuAction.RUNELITE_OVERLAY && + entry.getTarget().equals("Raids party overlay")) + { + switch (entry.getOption()) + { + case RaidsPartyOverlay.PARTY_OVERLAY_RESET: + startingPartyMembers.clear(); + updatePartyMembers(true); + missingPartyMembers.clear(); + break; + case RaidsPartyOverlay.PARTY_OVERLAY_REFRESH: + updatePartyMembers(true); + break; + default: + break; + } + } + } + + private void updatePartyMembers(boolean force) + { + int partySize = client.getVar(Varbits.RAID_PARTY_SIZE); + if (partySize <= 0) + { + return; + } + + if (startingPartyMembers.size() == partySize && !force) + { + // Skip update if the part is as big as when we started + missingPartyMembers.clear(); // Clear missing members in case someone came back + return; + } + + // Only update while in raid + if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1 || force) + { + Widget[] widgets; + try + { + widgets = client.getWidget(WidgetInfo.RAIDING_PARTY).getStaticChildren()[2].getStaticChildren()[3].getDynamicChildren(); + } + catch (NullPointerException e) + { + return; // Raid widget not loaded + } + + partyMembers.clear(); + for (Widget widget : widgets) + { + if (widget == null || widget.getText() == null) + { + continue; + } + + String name = widget.getName(); + + if (name.length() > 1) + { + partyMembers.add(name.substring(name.indexOf('>') + 1, name.indexOf('<', 1))); + } + } + + // If we don't have any starting members, update starting members + if (startingPartyMembers.size() == 0 || force) + { + missingPartyMembers.clear(); + startingPartyMembers.clear(); + startingPartyMembers.addAll(partyMembers); + } + else + { + + // Check if anyone left + if (startingPartyMembers.size() > partyMembers.size()) + { + missingPartyMembers.clear(); + missingPartyMembers.addAll(startingPartyMembers); + missingPartyMembers.removeAll(partyMembers); + } + } + } + } + + void checkRaidPresence(boolean force) { if (client.getGameState() != GameState.LOGGED_IN) { @@ -445,21 +590,44 @@ public class RaidsPlugin extends Plugin return; } + layoutFullCode = layout.getCode(); raid.updateLayout(layout); RotationSolver.solve(raid.getCombatRooms()); - overlay.setScoutOverlayShown(true); + setOverlayStatus(true); sendRaidLayoutMessage(); + Matcher puzzleMatch = PUZZLES.matcher(raid.getFullRotationString()); + final List puzzles = new ArrayList<>(); + while (puzzleMatch.find()) + { + puzzles.add(puzzleMatch.group()); + } + if (raid.getFullRotationString().contains("Crabs")) + { + switch (puzzles.size()) + { + case 1: + goodCrabs = handleCrabs(puzzles.get(0)); + break; + case 2: + goodCrabs = handleCrabs(puzzles.get(0), puzzles.get(1)); + break; + case 3: + goodCrabs = handleCrabs(puzzles.get(0), puzzles.get(1), puzzles.get(2)); + break; + } + } } else if (!config.scoutOverlayAtBank()) { - overlay.setScoutOverlayShown(false); + setOverlayStatus(false); } } // If we left party raid was started or we left raid if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1 && (!inRaidChambers || !config.scoutOverlayInRaid())) { - overlay.setScoutOverlayShown(false); + setOverlayStatus(false); + raidStarted = false; } } @@ -483,6 +651,25 @@ public class RaidsPlugin extends Plugin .append(raidData) .build()) .build()); + + if (recordRaid() != null) + { + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.FRIENDSCHATNOTIFICATION) + .runeLiteFormattedMessage(new ChatMessageBuilder() + .append(ChatColorType.HIGHLIGHT) + .append("You have scouted a record raid, whilst this is a very good raid to do you will probably end up profiting more by selling this raid to a team looking for it.") + .build()) + .build()); + + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.FRIENDSCHATNOTIFICATION) + .runeLiteFormattedMessage(new ChatMessageBuilder() + .append(ChatColorType.HIGHLIGHT) + .append("The following are some places you can sell this raid: Scout Trading in We do Raids discord, and Buying Cox Rotations in Oblivion discord.") + .build()) + .build()); + } } private void updateInfoBoxState() @@ -830,6 +1017,10 @@ public class RaidsPlugin extends Plugin lowerTime = -1; raidTime = -1; tooltip = null; + inRaidChambers = false; + widgetOverlay = null; + raidStarted = false; + timer = null; } private int timeToSeconds(String s) @@ -911,4 +1102,74 @@ public class RaidsPlugin extends Plugin builder.append("
    Olm: ").append(secondsToTime(raidTime - lowerTime)); tooltip = builder.toString(); } + + private String handleCrabs(String firstGroup) + { + if (firstGroup.contains("Crabs") && GOOD_CRABS_FIRST.contains(layoutFullCode)) + { + return "Good Crabs"; + } + if (firstGroup.contains("Crabs") && RARE_CRABS_FIRST.contains(layoutFullCode)) + { + return "Rare Crabs"; + } + return null; + } + + private String handleCrabs(String firstGroup, String secondGroup) + { + if (firstGroup.contains("Crabs") && GOOD_CRABS_FIRST.contains(layoutFullCode)) + { + return "Good Crabs"; + } + if (secondGroup.contains("Crabs") && GOOD_CRABS_SECOND.contains(layoutFullCode)) + { + return "Good Crabs"; + } + if (firstGroup.contains("Crabs") && RARE_CRABS_FIRST.contains(layoutFullCode)) + { + return "Rare Crabs"; + } + if (secondGroup.contains("Crabs") && RARE_CRABS_SECOND.contains(layoutFullCode)) + { + return "Rare Crabs"; + } + return null; + } + + private String handleCrabs(String firstGroup, String secondGroup, String thirdGroup) + { + if (firstGroup.contains("Crabs")) + { + return "Good Crabs"; + } + if (secondGroup.contains("Crabs")) + { + return "Rare Crabs"; + } + if (thirdGroup.contains("Crabs")) + { + return "Rare Crabs"; + } + return null; + } + + String recordRaid() + { + if (raid.getRotationString().toLowerCase().equals("vasa,tekton,vespula") + && raid.getFullRotationString().toLowerCase().contains("crabs") + && raid.getFullRotationString().toLowerCase().contains("tightrope")) + { + if (goodCrabs != null) + { + return goodCrabs; + } + } + return null; + } + + private void setOverlayStatus(boolean bool) + { + overlay.setScoutOverlayShown(bool); + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java similarity index 74% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java index 79b7a28444..baedb561d7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java @@ -29,28 +29,21 @@ import java.awt.Graphics2D; import java.text.NumberFormat; import java.util.Locale; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Varbits; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Varbits; import static net.runelite.client.plugins.raids.RaidsPlugin.POINTS_FORMAT; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class RaidsPointsOverlay extends Overlay { - @Inject - private Client client; - - @Inject - private RaidsPlugin plugin; - - private final PanelComponent panel = new PanelComponent(); - private static final NumberFormat UNIQUE_FORMAT = NumberFormat.getPercentInstance(Locale.ENGLISH); static @@ -59,6 +52,12 @@ public class RaidsPointsOverlay extends Overlay UNIQUE_FORMAT.setMinimumFractionDigits(2); } + private final PanelComponent panel = new PanelComponent(); + @Inject + private Client client; + @Inject + private RaidsPlugin plugin; + @Inject private RaidsPointsOverlay(RaidsPlugin plugin) { @@ -82,40 +81,21 @@ public class RaidsPointsOverlay extends Overlay double uniqueChance = totalPoints / 867500f; panel.getChildren().clear(); - panel.getChildren().add(LineComponent.builder() - .left("Total:") - .right(POINTS_FORMAT.format(totalPoints)) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panel.getChildren().add(LineComponent.builder() - .left(client.getLocalPlayer().getName() + ":") - .right(POINTS_FORMAT.format(personalPoints)) - .build()); + tableComponent.addRow("Total:", POINTS_FORMAT.format(totalPoints)); + tableComponent.addRow(client.getLocalPlayer().getName() + ":", POINTS_FORMAT.format(personalPoints)); if (partySize > 1) { - panel.getChildren().add(LineComponent.builder() - .left("Party size:") - .right(String.valueOf(partySize)) - .build()); + tableComponent.addRow("Party size:", String.valueOf(partySize)); } - panel.getChildren().add(LineComponent.builder() - .left("Unique:") - .right(UNIQUE_FORMAT.format(uniqueChance)) - .build()); - //TODO this is annoyingly bugged, personalpoints returns null for some reason -/* - if (partySize > 1) - { - double personalChance = uniqueChance * (double)(personalPoints / totalPoints); + tableComponent.addRow("Unique:", UNIQUE_FORMAT.format(uniqueChance)); - panel.getChildren().add(LineComponent.builder() - .left("Personal:") - .right(UNIQUE_FORMAT.format(personalChance)) - .build()); - }*/ + panel.getChildren().add(tableComponent); return panel.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java index 8df3087054..8e7dec1309 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java @@ -47,7 +47,7 @@ public class RaidsTimer extends InfoBox @Setter private boolean stopped; - public RaidsTimer(BufferedImage image, Plugin plugin, Instant startTime) + RaidsTimer(BufferedImage image, Plugin plugin, Instant startTime) { super(image, plugin); this.startTime = startTime; @@ -55,7 +55,7 @@ public class RaidsTimer extends InfoBox stopped = false; } - public void timeFloor() + void timeFloor() { Duration elapsed = Duration.between(floorTime, Instant.now()); @@ -75,45 +75,12 @@ public class RaidsTimer extends InfoBox floorTime = Instant.now(); } - public void timeOlm() + void timeOlm() { Duration elapsed = Duration.between(floorTime, Instant.now()); olmTime = LocalTime.ofSecondOfDay(elapsed.getSeconds()); } - @Override - public String getText() - { - if (startTime == null) - { - return ""; - } - - if (!stopped) - { - Duration elapsed = Duration.between(startTime, Instant.now()); - time = LocalTime.ofSecondOfDay(elapsed.getSeconds()); - } - - if (time.getHour() > 0) - { - return time.format(DateTimeFormatter.ofPattern("HH:mm")); - } - - return time.format(DateTimeFormatter.ofPattern("mm:ss")); - } - - @Override - public Color getTextColor() - { - if (stopped) - { - return Color.GREEN; - } - - return Color.WHITE; - } - @Override public String getTooltip() { @@ -147,4 +114,37 @@ public class RaidsTimer extends InfoBox return builder.toString(); } + + @Override + public String getText() + { + if (startTime == null) + { + return ""; + } + + if (!stopped) + { + Duration elapsed = Duration.between(startTime, Instant.now()); + time = LocalTime.ofSecondOfDay(elapsed.getSeconds()); + } + + if (time.getHour() > 0) + { + return time.format(DateTimeFormatter.ofPattern("HH:mm")); + } + + return time.format(DateTimeFormatter.ofPattern("mm:ss")); + } + + @Override + public Color getTextColor() + { + if (stopped) + { + return Color.GREEN; + } + + return Color.WHITE; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutOverlay.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutOverlay.java index 2211c02690..30762daf39 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutOverlay.java @@ -5,12 +5,12 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.GameObject; -import api.Perspective; -import api.Point; -import api.Skill; -import api.TileObject; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Skill; +import net.runelite.api.TileObject; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutPlugin.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutPlugin.java index 05468cad1b..422c85225f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/shortcuts/ShortcutPlugin.java @@ -6,12 +6,12 @@ import java.util.Iterator; import java.util.List; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.TileObject; -import api.coords.WorldPoint; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameTick; +import net.runelite.api.Client; +import net.runelite.api.TileObject; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -26,17 +26,14 @@ import net.runelite.client.ui.overlay.OverlayManager; @Slf4j public class ShortcutPlugin extends Plugin { + private final List shortcut = new ArrayList<>(); @Inject private Client client; - @Inject private OverlayManager overlayManager; - @Inject private ShortcutOverlay overlay; - private final List shortcut = new ArrayList<>(); - List getShortcut() { return shortcut; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java index 3bee58d4fc..09357f7774 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java @@ -27,12 +27,17 @@ package net.runelite.client.plugins.raids.solver; import java.util.ArrayList; import java.util.List; import lombok.Getter; +import lombok.Setter; public class Layout { @Getter private final List rooms = new ArrayList<>(); + @Getter + @Setter + private String code; + public void add(Room room) { rooms.add(room); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java index 3b893aee4e..f53de67596 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java @@ -213,6 +213,7 @@ public class LayoutSolver room.setPrevious(lastRoom); lastRoom.setNext(room); layout.add(room); + layout.setCode(code); position += 8; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/Room.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Room.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/Room.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Room.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/RotationSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/RotationSolver.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/RotationSolver.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/RotationSolver.java index e7c9cd0c08..04e0323a5c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raids/solver/RotationSolver.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/RotationSolver.java @@ -32,25 +32,6 @@ import net.runelite.client.plugins.raids.RaidRoom.Boss; public class RotationSolver { - private static class Rotation extends ArrayList - { - Rotation(Collection bosses) - { - super(bosses); - } - - @Override - public E get(int index) - { - if (index < 0) - { - index = index + size(); - } - - return super.get(index % size()); - } - } - private static final Rotation[] ROTATIONS = { new Rotation<>(Arrays.asList(Boss.TEKTON, Boss.VASA, Boss.GUARDIANS, Boss.MYSTICS, Boss.SHAMANS, Boss.MUTTADILES, Boss.VANGUARDS, Boss.VESPULA)), @@ -147,4 +128,23 @@ public class RotationSolver return true; } + + private static class Rotation extends ArrayList + { + Rotation(Collection bosses) + { + super(bosses); + } + + @Override + public E get(int index) + { + if (index < 0) + { + index = index + size(); + } + + return super.get(index % size()); + } + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/BatSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/BatSolver.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/BatSolver.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/BatSolver.java index a2b9f1bb01..e937633dc8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/BatSolver.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/BatSolver.java @@ -106,7 +106,7 @@ public class BatSolver } - public void calculateChanceOfPoison() + private void calculateChanceOfPoison() { if (getType() == null) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ChestIdentifier.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ChestIdentifier.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ChestIdentifier.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ChestIdentifier.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/SolutionSet.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/SolutionSet.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/SolutionSet.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/SolutionSet.java index 11bda048e5..82c36163e4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/SolutionSet.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/SolutionSet.java @@ -35,9 +35,9 @@ import lombok.Getter; // e.g. if there is an empty chest in L room chest 1, the other empty chests could be 16, 17, 38, 54, 55 // See https://dikkenoob.github.io/ for more information -public class SolutionSet +class SolutionSet { - public static final SolutionSet[] SOLUTION_SETS = + static final SolutionSet[] SOLUTION_SETS = { new SolutionSet(ThievingRoomType.LEFT_TURN, 1, 16, 17, 55), new SolutionSet(ThievingRoomType.LEFT_TURN, 1, 17, 38, 54), @@ -147,12 +147,12 @@ public class SolutionSet this.emptyChests = new HashSet<>(Arrays.asList(emptyChests)); } - public void addEmptyChest(int chestId) + void addEmptyChest(int chestId) { emptyChests.add(chestId); } - public boolean containsChest(int chestId) + boolean containsChest(int chestId) { return emptyChests.contains(chestId); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ThievingRoomType.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ThievingRoomType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ThievingRoomType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/BatSolver/ThievingRoomType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/ChestOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/ChestOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/ChestOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/ChestOverlay.java index 8fbe18b7e4..077132dc61 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/ChestOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/ChestOverlay.java @@ -30,11 +30,11 @@ import java.awt.Graphics2D; import java.util.Map; import java.util.TreeSet; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.raidsthieving.BatSolver.BatSolver; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/InstancePoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/InstancePoint.java similarity index 86% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/InstancePoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/InstancePoint.java index d9aef2bc2f..b1ba3e0102 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/InstancePoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/InstancePoint.java @@ -2,9 +2,9 @@ package net.runelite.client.plugins.raidsthieving; import java.util.Objects; import lombok.Getter; -import api.Client; -import api.Point; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; /** * Represents a point in the instance chunk, invariant of rotation. @@ -15,7 +15,7 @@ public class InstancePoint private static final int CHUNK_SIZE = 8; private static final double CHUNK_OFFSET = 3.5; - public InstancePoint(int x, int y, int rot) + private InstancePoint(int x, int y, int rot) { this.x = x; this.y = y; @@ -29,7 +29,7 @@ public class InstancePoint this.rot = 0; } - public static InstancePoint buildFromPoint(WorldPoint worldPoint, Client client) + static InstancePoint buildFromPoint(WorldPoint worldPoint, Client client) { Point point = new Point(worldPoint.getX(), worldPoint.getY()); Point base = new Point(client.getBaseX(), client.getBaseY()); @@ -48,7 +48,7 @@ public class InstancePoint return buildFromTile(base, point, rotation, new Point(x, y)); } - public static InstancePoint buildFromTile(Point base, Point tile, int rot, Point chunkOrigin) + private static InstancePoint buildFromTile(Point base, Point tile, int rot, Point chunkOrigin) { int deltaX = tile.getX() - base.getX(); int deltaY = tile.getY() - base.getY(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConstants.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConstants.java similarity index 86% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConstants.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConstants.java index 965934a01b..8ab527ebe8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConstants.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingConstants.java @@ -26,10 +26,10 @@ package net.runelite.client.plugins.raidsthieving; public class RaidsThievingConstants { - public static final int CLOSED_CHEST_ID = 29742; - public static final int OPEN_EMPTY_CHEST = 29743; - public static final int OPEN_FULL_CHEST_1 = 29744; - public static final int OPEN_FULL_CHEST_2 = 29745; - public static final int EMPTY_TROUGH = 29746; + static final int CLOSED_CHEST_ID = 29742; + static final int OPEN_EMPTY_CHEST = 29743; + static final int OPEN_FULL_CHEST_1 = 29744; + static final int OPEN_FULL_CHEST_2 = 29745; + static final int EMPTY_TROUGH = 29746; public static final int[] STORAGE = {29769, 29770, 29771, 29772}; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingPlugin.java index 443de7fab5..a7679b985a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/RaidsThievingPlugin.java @@ -32,15 +32,15 @@ import java.util.Map; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameObject; -import api.GraphicsObject; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameObjectSpawned; -import api.events.GraphicsObjectCreated; -import api.events.VarbitChanged; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GraphicsObject; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GraphicsObjectCreated; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -57,8 +57,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Raids Bat Finder", description = "Tracks which chests need to be searched for bats and which poison", tags = {"overlay", "skilling", "raid"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) + public class RaidsThievingPlugin extends Plugin { @Inject @@ -199,6 +201,12 @@ public class RaidsThievingPlugin extends Plugin { log.debug("Found poison splat"); WorldPoint loc = WorldPoint.fromLocal(client, obj.getLocation()); + + if (chests.get(loc) == null) + { + return; + } + chests.get(loc).setPoison(true); } } @@ -233,7 +241,7 @@ public class RaidsThievingPlugin extends Plugin mapper = null; } - public int numberOfEmptyChestsFound() + int numberOfEmptyChestsFound() { int total = 0; for (ThievingChest chest : chests.values()) @@ -246,7 +254,6 @@ public class RaidsThievingPlugin extends Plugin return total; } - private boolean checkForBats() { for (ThievingChest chest : chests.values()) @@ -264,7 +271,7 @@ public class RaidsThievingPlugin extends Plugin return false; } - public int getChestId(WorldPoint worldPoint) + int getChestId(WorldPoint worldPoint) { return chests.get(worldPoint).getChestId(); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/ThievingChest.java b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/ThievingChest.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/ThievingChest.java rename to runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/ThievingChest.java index 43c9df114f..05a58d554e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/raidsthieving/ThievingChest.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raidsthieving/ThievingChest.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.raidsthieving; import lombok.Getter; import lombok.Setter; -import api.GameObject; -import api.coords.WorldPoint; +import net.runelite.api.GameObject; +import net.runelite.api.coords.WorldPoint; /** * Wrapper class for a GameObject that represents a chest in the thieving room of Chambers of Xeric. diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java index ab09453bcb..bff5f7c398 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java @@ -33,10 +33,10 @@ import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.geom.Arc2D; import javax.inject.Inject; -import api.Client; -import api.VarPlayer; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.VarPlayer; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterPlugin.java index f1cf59e85a..004441b6e3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterPlugin.java @@ -30,15 +30,15 @@ package net.runelite.client.plugins.regenmeter; import com.google.inject.Provides; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.Constants; -import api.GameState; -import api.Prayer; -import api.Skill; -import api.VarPlayer; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.VarbitChanged; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameState; +import net.runelite.api.Prayer; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java index 93bb70286b..7a73dae268 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.reorderprayers; -import api.Prayer; +import net.runelite.api.Prayer; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java index 0c81028f3e..2d95269eb5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java @@ -31,21 +31,21 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.HashTable; -import api.Prayer; -import api.WidgetNode; -import api.events.ConfigChanged; -import api.events.DraggingWidgetChanged; -import api.events.GameStateChanged; -import api.events.WidgetLoaded; -import api.events.WidgetMenuOptionClicked; -import api.widgets.Widget; -import static api.widgets.WidgetConfig.DRAG; -import static api.widgets.WidgetConfig.DRAG_ON; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.HashTable; +import net.runelite.api.Prayer; +import net.runelite.api.WidgetNode; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.DraggingWidgetChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.events.WidgetMenuOptionClicked; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetConfig.DRAG; +import static net.runelite.api.widgets.WidgetConfig.DRAG_ON; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.menus.MenuManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java index 640f66d34b..b633a89b10 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java @@ -36,11 +36,11 @@ import java.time.format.FormatStyle; import java.time.temporal.ChronoUnit; import java.util.Date; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.events.GameStateChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/reportbutton/TimeStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/TimeStyle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/reportbutton/TimeStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/TimeStyle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java similarity index 75% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java rename to runelite-client/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java index 2c7246b781..e518f4814b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java @@ -26,19 +26,19 @@ package net.runelite.client.plugins.roguesden; import com.google.common.collect.Sets; import java.util.Set; -import static api.NullObjectID.NULL_7235; -import static api.ObjectID.BLADE_7252; -import static api.ObjectID.CONTORTION_BARS; -import static api.ObjectID.FLOOR; -import static api.ObjectID.FLOOR_7230; -import static api.ObjectID.FLOOR_7245; -import static api.ObjectID.LEDGE_7240; -import static api.ObjectID.PENDULUM; -import static api.ObjectID.SPINNING_BLADES_7224; -import static api.ObjectID.WALL_7228; -import static api.ObjectID.WALL_7229; -import static api.ObjectID.WALL_7248; -import static api.ObjectID.WALL_7249; +import static net.runelite.api.NullObjectID.NULL_7235; +import static net.runelite.api.ObjectID.BLADE_7252; +import static net.runelite.api.ObjectID.CONTORTION_BARS; +import static net.runelite.api.ObjectID.FLOOR; +import static net.runelite.api.ObjectID.FLOOR_7230; +import static net.runelite.api.ObjectID.FLOOR_7245; +import static net.runelite.api.ObjectID.LEDGE_7240; +import static net.runelite.api.ObjectID.PENDULUM; +import static net.runelite.api.ObjectID.SPINNING_BLADES_7224; +import static net.runelite.api.ObjectID.WALL_7228; +import static net.runelite.api.ObjectID.WALL_7229; +import static net.runelite.api.ObjectID.WALL_7248; +import static net.runelite.api.ObjectID.WALL_7249; class Obstacles { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java index d7d19661c8..4b5cc234e1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java @@ -29,8 +29,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; -import api.Client; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java index 95786836f8..138ee3d9ac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java @@ -28,21 +28,21 @@ import java.util.HashMap; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemID; -import api.Tile; -import api.TileObject; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GroundObjectChanged; -import api.events.GroundObjectDespawned; -import api.events.GroundObjectSpawned; -import api.events.ItemContainerChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemID; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java index 13e8efdc78..b0e2bb0b99 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java @@ -35,11 +35,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import api.Client; -import api.DecorativeObject; -import api.NPC; -import api.Perspective; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.DecorativeObject; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; import net.runelite.client.game.ItemManager; import static net.runelite.client.plugins.runecraft.AbyssRifts.AIR_RIFT; import static net.runelite.client.plugins.runecraft.AbyssRifts.BLOOD_RIFT; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/AbyssRifts.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssRifts.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/AbyssRifts.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssRifts.java index 289363e002..e9546e3cee 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/AbyssRifts.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssRifts.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.runecraft; import java.util.HashMap; import java.util.Map; import lombok.Getter; -import static api.ItemID.*; -import api.ObjectID; +import static net.runelite.api.ItemID.*; +import net.runelite.api.ObjectID; public enum AbyssRifts { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java index 251ff488fe..91a95bb885 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java @@ -4,7 +4,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentOrientation; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java index c65b64a41c..b653a56fb2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java @@ -33,26 +33,26 @@ import java.util.stream.Stream; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.DecorativeObject; -import api.EquipmentInventorySlot; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemID; -import api.MenuEntry; -import api.NPC; -import api.NpcID; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.DecorativeObjectDespawned; -import api.events.DecorativeObjectSpawned; -import api.events.GameStateChanged; -import api.events.ItemContainerChanged; -import api.events.MenuEntryAdded; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.DecorativeObject; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemID; +import net.runelite.api.MenuEntry; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.DecorativeObjectDespawned; +import net.runelite.api.events.DecorativeObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuConfig.java new file mode 100644 index 0000000000..0e44decfa0 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuConfig.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2019, gazivodag + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.plugins.runedoku; + +import java.awt.Color; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Stub; + +@ConfigGroup("runedoku") +public interface RunedokuConfig extends Config +{ + + @ConfigItem( + position = 0, + keyName = "colorStub", + name = "Colors", + description = "" //stubs don't show descriptions when hovered over + ) + default Stub colorStub() + { + return new Stub(); + } + + @ConfigItem( + position = 1, + keyName = "mindRuneColor", + name = "Mind Rune Color", + description = "Color used to highlight Mind runes.", + parent = "colorStub" + ) + default Color mindRuneColor() + { + return Color.PINK; + } + + @ConfigItem( + position = 2, + keyName = "fireRuneColor", + name = "Fire Rune Color", + description = "Color used to highlight Fire runes.", + parent = "colorStub" + ) + default Color fireRuneColor() + { + return Color.RED; + } + + @ConfigItem( + position = 3, + keyName = "bodyRuneColor", + name = "Body Rune Color", + description = "Color used to highlight Body runes.", + parent = "colorStub" + ) + default Color bodyRuneColor() + { + return Color.MAGENTA; + } + + @ConfigItem( + position = 4, + keyName = "airRuneColor", + name = "Air Rune Color", + description = "Color used to highlight Air runes.", + parent = "colorStub" + ) + default Color airRuneColor() + { + return Color.WHITE; + } + + @ConfigItem( + position = 5, + keyName = "deathRuneColor", + name = "Death Rune Color", + description = "Color used to highlight Death runes.", + parent = "colorStub" + ) + default Color deathRuneColor() + { + return Color.BLACK; + } + + @ConfigItem( + position = 6, + keyName = "waterRuneColor", + name = "Water Rune Color", + description = "Color used to highlight Water runes.", + parent = "colorStub" + ) + default Color waterRuneColor() + { + return Color.BLUE; + } + + @ConfigItem( + position = 7, + keyName = "chaosRuneColor", + name = "Chaos Rune Color", + description = "Color used to highlight Chaos runes.", + parent = "colorStub" + ) + default Color chaosRuneColor() + { + return Color.YELLOW; + } + + @ConfigItem( + position = 8, + keyName = "earthRuneColor", + name = "Earth Rune Color", + description = "Color used to highlight Earth runes.", + parent = "colorStub" + ) + default Color earthRuneColor() + { + return Color.GREEN; + } + + @ConfigItem( + position = 9, + keyName = "lawRuneColor", + name = "Law Rune Color", + description = "Color used to highlight Law runes.", + parent = "colorStub" + ) + default Color lawRuneColor() + { + return Color.CYAN; + } + + @ConfigItem( + position = 10, + keyName = "miscFeature", + name = "Miscellaneous Features", + description = "" + ) + default Stub miscFeature() + { + return new Stub(); + } + + @ConfigItem( + position = 11, + keyName = "onlyHighlightSelectedPiece", + name = "Only Highlight Selected Piece", + description = "Instead of showing all, this option only show what rune you have selected." + ) + default boolean onlyHighlightSelectedPiece() + { + return false; + } + +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuOverlay.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuOverlay.java index 645ec087d8..5e44e55bee 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuOverlay.java @@ -30,8 +30,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.util.ArrayList; import javax.inject.Inject; -import api.Client; -import api.widgets.Widget; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -47,15 +47,17 @@ class RunedokuOverlay extends Overlay private final RunedokuPlugin plugin; private final Client client; private final RunedokuUtil util; + private final RunedokuConfig config; @Inject - private RunedokuOverlay(final RunedokuPlugin plugin, final Client client, final RunedokuUtil util) + private RunedokuOverlay(final RunedokuPlugin plugin, final Client client, final RunedokuUtil util, final RunedokuConfig config) { super(plugin); this.plugin = plugin; this.client = client; this.util = util; + this.config = config; setPosition(OverlayPosition.DETACHED); setLayer(OverlayLayer.ALWAYS_ON_TOP); @@ -138,7 +140,10 @@ class RunedokuOverlay extends Overlay } else { - OverlayUtil.renderPolygon(graphics, RunedokuUtil.rectangleToPolygon(squareToHighlight.getBounds()), util.sudokuPieceToColor(simpleArr.get(iteration))); + if (!config.onlyHighlightSelectedPiece() ^ (config.onlyHighlightSelectedPiece() && util.getSelectedPiece(client) == simpleArr.get(iteration))) + { + OverlayUtil.renderPolygon(graphics, RunedokuUtil.rectangleToPolygon(squareToHighlight.getBounds()), util.sudokuPieceToColor(simpleArr.get(iteration))); + } } iteration++; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPiece.java b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPiece.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPiece.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPiece.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPlugin.java index 895ea5f16c..e441779a7a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuPlugin.java @@ -28,7 +28,7 @@ import com.google.inject.Provides; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -39,8 +39,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Runedoku Solver", description = "Show solutions for current Runedoku puzzle.", tags = {"overlay", "runedoku", "sudoku", "puzzle", "solving"}, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + @Slf4j @Singleton public class RunedokuPlugin extends Plugin diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuUtil.java b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuUtil.java similarity index 55% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuUtil.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuUtil.java index 4646c0c5fe..36c5ac5662 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/RunedokuUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/RunedokuUtil.java @@ -1,3 +1,27 @@ +/* + * Copyright (c) 2019, gazivodag + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + package net.runelite.client.plugins.runedoku; import java.awt.Color; @@ -5,9 +29,9 @@ import java.awt.Polygon; import java.awt.Rectangle; import java.util.ArrayList; import javax.inject.Inject; -import api.Client; -import api.widgets.Widget; -import api.widgets.WidgetItem; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetItem; class RunedokuUtil { @@ -138,7 +162,14 @@ class RunedokuUtil item = sudokuScreen.getWidgetItem(myIndex); if (item != null) { - myArr[i][ii] = RunedokuPiece.getById(item.getId()).getPieceForSudoku(); + if (item.getId() != -1) + { + myArr[i][ii] = RunedokuPiece.getById(item.getId()).getPieceForSudoku(); + } + else + { + myArr[i][ii] = 0; + } } else { @@ -149,4 +180,41 @@ class RunedokuUtil return myArr; } + /** + * @param client + * @return + */ + int getSelectedPiece(Client client) + { + for (int i = 91; i < 100; i++) + { + Widget selectedPieceWidget = client.getWidget(288, i); + if (!selectedPieceWidget.isHidden()) + { + switch (i) + { + case 91: + return 8; + case 92: + return 6; + case 93: + return 4; + case 94: + return 2; + case 95: + return 1; + case 96: + return 3; + case 97: + return 5; + case 98: + return 7; + case 99: + return 9; + } + } + } + return -1; + } + } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/Sudoku.java b/runelite-client/src/main/java/net/runelite/client/plugins/runedoku/Sudoku.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runedoku/Sudoku.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runedoku/Sudoku.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusConfig.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusConfig.java index 8eda3a582e..8db739148c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusConfig.java @@ -81,15 +81,4 @@ public interface RuneLitePlusConfig extends Config { return false; } - - @ConfigItem( - keyName = "logOpt", - name = "Send logs", - description = "Send logs to help us analyze errors", - position = 4 - ) - default boolean logOpt() - { - return false; - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusPlugin.java similarity index 70% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusPlugin.java index 3d372aa796..289940cb8f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runeliteplus/RuneLitePlusPlugin.java @@ -27,15 +27,16 @@ package net.runelite.client.plugins.runeliteplus; import com.google.inject.Provides; + import java.awt.event.KeyEvent; import javax.inject.Inject; -import io.sentry.Sentry; + import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.events.ConfigChanged; -import api.events.WidgetLoaded; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.RuneLiteProperties; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; @@ -47,14 +48,13 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.ClientUI; -import org.apache.commons.lang3.ArrayUtils; @PluginDescriptor( - loadWhenOutdated = true, // prevent users from disabling - hidden = true, // prevent users from disabling - name = "RuneLitePlus", - description = "Configures various aspects of RuneLitePlus", - type = PluginType.EXTERNAL + loadWhenOutdated = true, // prevent users from disabling + hidden = true, // prevent users from disabling + name = "RuneLitePlus", + description = "Configures various aspects of RuneLitePlus", + type = PluginType.EXTERNAL ) @Slf4j @@ -67,7 +67,7 @@ public class RuneLitePlusPlugin extends Plugin @Override public void keyTyped(KeyEvent keyEvent) { - if (!isNumber(keyEvent)) + if (!Character.isDigit(keyEvent.getKeyChar())) { return; } @@ -93,12 +93,6 @@ public class RuneLitePlusPlugin extends Plugin public void keyReleased(KeyEvent keyEvent) { } - - private boolean isNumber(KeyEvent keyEvent) - { - char character = keyEvent.getKeyChar(); - return ArrayUtils.contains(numbers, character); - } } /* Can't feed this as args to runscript? @@ -127,7 +121,6 @@ public class RuneLitePlusPlugin extends Plugin public static boolean customPresenceEnabled = false; public static final String rlPlusDiscordApp = "560644885250572289"; public static final String rlDiscordApp = "409416265891971072"; - private static final char[] numbers = "0123456789".toCharArray(); @Inject public RuneLitePlusConfig config; @@ -153,39 +146,26 @@ public class RuneLitePlusPlugin extends Plugin return configManager.getConfig(RuneLitePlusConfig.class); } - private RuneLitePlusKeyListener keyListener; + private RuneLitePlusKeyListener keyListener = new RuneLitePlusKeyListener(); private int entered = -1; private int enterIdx; + private boolean expectInput; @Override protected void startUp() throws Exception { - entered = -1; - enterIdx = 0; - - if (getConfig(configManager).customPresence()) + if (config.customPresence()) { ClientUI.currentPresenceName = ("RuneLitePlus"); ClientUI.frame.setTitle(ClientUI.currentPresenceName); - } - - if (config.logOpt()) - { - Sentry.init("https://f0ed76be2fe847f8b9eb3620fa55d729@sentry.io/1468399?stacktrace.app.packages=net.runelite.client"); - } - - if (config.customPresence()) - { RuneLiteProperties.discordAppID = rlPlusDiscordApp; discordService.close(); discordService.init(); } - else - { - RuneLiteProperties.discordAppID = rlDiscordApp; - discordService.close(); - discordService.init(); - } + + entered = -1; + enterIdx = 0; + expectInput = false; } @Subscribe @@ -202,30 +182,25 @@ public class RuneLitePlusPlugin extends Plugin { ClientUI.currentPresenceName = ("RuneLitePlus"); ClientUI.frame.setTitle(ClientUI.currentPresenceName); - } - else - { - ClientUI.currentPresenceName = ("RuneLite"); - ClientUI.frame.setTitle(ClientUI.currentPresenceName); - } - - if (config.customPresence()) - { RuneLiteProperties.discordAppID = rlPlusDiscordApp; discordService.close(); discordService.init(); } else { + ClientUI.currentPresenceName = ("RuneLite"); + ClientUI.frame.setTitle(ClientUI.currentPresenceName); RuneLiteProperties.discordAppID = rlDiscordApp; discordService.close(); discordService.init(); } } + else if (!config.keyboardPin()) { - entered = -1; + entered = 0; enterIdx = 0; + expectInput = false; keyManager.unregisterKeyListener(keyListener); } } @@ -233,73 +208,91 @@ public class RuneLitePlusPlugin extends Plugin @Override protected void shutDown() throws Exception { - entered = -1; + entered = 0; enterIdx = 0; + expectInput = false; keyManager.unregisterKeyListener(keyListener); } @Subscribe - public void onWidgetLoaded(WidgetLoaded event) + private void onScriptCallbackEvent(ScriptCallbackEvent e) { if (!config.keyboardPin()) { return; } - if (event.getGroupId() == WidgetID.BANK_GROUP_ID) + if (e.getEventName().equals("bankpin")) { - // log.debug("Bank opened, removing key listener"); - keyManager.unregisterKeyListener(keyListener); - return; - } - else if (event.getGroupId() != WidgetID.BANK_PIN_GROUP_ID) - //|| !Text.standardize(client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText()).equals("bank of gielinor")) - { - return; - } + int[] intStack = client.getIntStack(); + int intStackSize = client.getIntStackSize(); - // log.debug("Registering key listener"); - keyListener = new RuneLitePlusKeyListener(); - keyManager.registerKeyListener(keyListener); + // This'll be anywhere from -1 to 3 + // 0 = first number, 1 second, etc + // Anything other than 0123 means the bankpin interface closes + int enterIdx = intStack[intStackSize - 1]; + + if (enterIdx < 0 || enterIdx > 3) + { + keyManager.unregisterKeyListener(keyListener); + this.enterIdx = 0; + this.entered = 0; + expectInput = false; + return; + } + else if (enterIdx == 0) + { + keyManager.registerKeyListener(keyListener); + } + + this.enterIdx = enterIdx; + expectInput = true; + } } private void handleKey(char c) { if (client.getWidget(WidgetID.BANK_PIN_GROUP_ID, 0) == null - || !client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText().equals("Bank of Gielinor")) + || !client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText().equals("Bank of Gielinor") + && !client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText().equals("Chambers of Xeric") + && !client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText().equals("Grand Exchange") + && !client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText().equals("Housing Security System") + && !client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText().equals("Dominic's Coffer") + && !client.getWidget(WidgetInfo.BANK_PIN_TOP_LEFT_TEXT).getText().equals("Dominic's Reward Shop")) + { - // log.debug("Key was pressed, but widget wasn't open"); - entered = -1; + entered = 0; enterIdx = 0; + expectInput = false; keyManager.unregisterKeyListener(keyListener); - keyListener = null; + return; + } + + if (!expectInput) + { return; } int num = Character.getNumericValue(c); - client.runScript(685, num, enterIdx, entered, 13959181, 13959183, 13959184, 13959186, 13959188, 13959190, 13959192, 13959194, 13959196, 13959198, 13959200, 13959202, 13959171, 13959172, 13959173, 13959174, 13959178); + // We gotta copy this cause enteridx changes while the script is executing + int oldEnterIdx = enterIdx; - if (enterIdx == 0) + // Script 685 will call 653, which in turn will set expectInput to true + expectInput = false; + client.runScript(685, num, enterIdx, entered, 13959181, 13959183, 13959184, 13959186, 13959188, 13959190, 13959192, 13959194, 13959196, 13959198, 13959200, 13959202, 13959171, 13959172, 13959173, 13959174, 13959178); + + if (oldEnterIdx == 0) { entered = num * 1000; - enterIdx++; } - else if (enterIdx == 1) + else if (oldEnterIdx == 1) { entered += num * 100; - enterIdx++; } - else if (enterIdx == 2) + else if (oldEnterIdx == 2) { entered += num * 10; - enterIdx++; - } - else if (enterIdx == 3) - { - entered = -1; - enterIdx = 0; - keyManager.unregisterKeyListener(keyListener); } } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyOverlay.java index 5009560eea..9ca4c40d6b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyOverlay.java @@ -28,10 +28,10 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.inject.Inject; -import api.Client; -import api.Point; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java similarity index 59% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java index f3b9c0df18..52170baa4e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java @@ -27,112 +27,112 @@ package net.runelite.client.plugins.runenergy; import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.Constants; -import api.EquipmentInventorySlot; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import static api.ItemID.AGILITY_CAPE; -import static api.ItemID.AGILITY_CAPET; -import static api.ItemID.GRACEFUL_BOOTS_11861; -import static api.ItemID.GRACEFUL_BOOTS_13589; -import static api.ItemID.GRACEFUL_BOOTS_13590; -import static api.ItemID.GRACEFUL_BOOTS_13601; -import static api.ItemID.GRACEFUL_BOOTS_13602; -import static api.ItemID.GRACEFUL_BOOTS_13613; -import static api.ItemID.GRACEFUL_BOOTS_13614; -import static api.ItemID.GRACEFUL_BOOTS_13625; -import static api.ItemID.GRACEFUL_BOOTS_13626; -import static api.ItemID.GRACEFUL_BOOTS_13637; -import static api.ItemID.GRACEFUL_BOOTS_13638; -import static api.ItemID.GRACEFUL_BOOTS_13677; -import static api.ItemID.GRACEFUL_BOOTS_13678; -import static api.ItemID.GRACEFUL_BOOTS_21076; -import static api.ItemID.GRACEFUL_BOOTS_21078; -import static api.ItemID.GRACEFUL_CAPE_11853; -import static api.ItemID.GRACEFUL_CAPE_13581; -import static api.ItemID.GRACEFUL_CAPE_13582; -import static api.ItemID.GRACEFUL_CAPE_13593; -import static api.ItemID.GRACEFUL_CAPE_13594; -import static api.ItemID.GRACEFUL_CAPE_13605; -import static api.ItemID.GRACEFUL_CAPE_13606; -import static api.ItemID.GRACEFUL_CAPE_13617; -import static api.ItemID.GRACEFUL_CAPE_13618; -import static api.ItemID.GRACEFUL_CAPE_13629; -import static api.ItemID.GRACEFUL_CAPE_13630; -import static api.ItemID.GRACEFUL_CAPE_13669; -import static api.ItemID.GRACEFUL_CAPE_13670; -import static api.ItemID.GRACEFUL_CAPE_21064; -import static api.ItemID.GRACEFUL_CAPE_21066; -import static api.ItemID.GRACEFUL_GLOVES_11859; -import static api.ItemID.GRACEFUL_GLOVES_13587; -import static api.ItemID.GRACEFUL_GLOVES_13588; -import static api.ItemID.GRACEFUL_GLOVES_13599; -import static api.ItemID.GRACEFUL_GLOVES_13600; -import static api.ItemID.GRACEFUL_GLOVES_13611; -import static api.ItemID.GRACEFUL_GLOVES_13612; -import static api.ItemID.GRACEFUL_GLOVES_13623; -import static api.ItemID.GRACEFUL_GLOVES_13624; -import static api.ItemID.GRACEFUL_GLOVES_13635; -import static api.ItemID.GRACEFUL_GLOVES_13636; -import static api.ItemID.GRACEFUL_GLOVES_13675; -import static api.ItemID.GRACEFUL_GLOVES_13676; -import static api.ItemID.GRACEFUL_GLOVES_21073; -import static api.ItemID.GRACEFUL_GLOVES_21075; -import static api.ItemID.GRACEFUL_HOOD_11851; -import static api.ItemID.GRACEFUL_HOOD_13579; -import static api.ItemID.GRACEFUL_HOOD_13580; -import static api.ItemID.GRACEFUL_HOOD_13591; -import static api.ItemID.GRACEFUL_HOOD_13592; -import static api.ItemID.GRACEFUL_HOOD_13603; -import static api.ItemID.GRACEFUL_HOOD_13604; -import static api.ItemID.GRACEFUL_HOOD_13615; -import static api.ItemID.GRACEFUL_HOOD_13616; -import static api.ItemID.GRACEFUL_HOOD_13627; -import static api.ItemID.GRACEFUL_HOOD_13628; -import static api.ItemID.GRACEFUL_HOOD_13667; -import static api.ItemID.GRACEFUL_HOOD_13668; -import static api.ItemID.GRACEFUL_HOOD_21061; -import static api.ItemID.GRACEFUL_HOOD_21063; -import static api.ItemID.GRACEFUL_LEGS_11857; -import static api.ItemID.GRACEFUL_LEGS_13585; -import static api.ItemID.GRACEFUL_LEGS_13586; -import static api.ItemID.GRACEFUL_LEGS_13597; -import static api.ItemID.GRACEFUL_LEGS_13598; -import static api.ItemID.GRACEFUL_LEGS_13609; -import static api.ItemID.GRACEFUL_LEGS_13610; -import static api.ItemID.GRACEFUL_LEGS_13621; -import static api.ItemID.GRACEFUL_LEGS_13622; -import static api.ItemID.GRACEFUL_LEGS_13633; -import static api.ItemID.GRACEFUL_LEGS_13634; -import static api.ItemID.GRACEFUL_LEGS_13673; -import static api.ItemID.GRACEFUL_LEGS_13674; -import static api.ItemID.GRACEFUL_LEGS_21070; -import static api.ItemID.GRACEFUL_LEGS_21072; -import static api.ItemID.GRACEFUL_TOP_11855; -import static api.ItemID.GRACEFUL_TOP_13583; -import static api.ItemID.GRACEFUL_TOP_13584; -import static api.ItemID.GRACEFUL_TOP_13595; -import static api.ItemID.GRACEFUL_TOP_13596; -import static api.ItemID.GRACEFUL_TOP_13607; -import static api.ItemID.GRACEFUL_TOP_13608; -import static api.ItemID.GRACEFUL_TOP_13619; -import static api.ItemID.GRACEFUL_TOP_13620; -import static api.ItemID.GRACEFUL_TOP_13631; -import static api.ItemID.GRACEFUL_TOP_13632; -import static api.ItemID.GRACEFUL_TOP_13671; -import static api.ItemID.GRACEFUL_TOP_13672; -import static api.ItemID.GRACEFUL_TOP_21067; -import static api.ItemID.GRACEFUL_TOP_21069; -import static api.ItemID.MAX_CAPE; -import api.Skill; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import static net.runelite.api.ItemID.AGILITY_CAPE; +import static net.runelite.api.ItemID.AGILITY_CAPET; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_11861; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13589; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13590; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13601; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13602; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13613; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13614; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13625; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13626; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13637; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13638; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13677; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13678; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_21076; +import static net.runelite.api.ItemID.GRACEFUL_BOOTS_21078; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_11853; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13581; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13582; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13593; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13594; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13605; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13606; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13617; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13618; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13629; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13630; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13669; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_13670; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_21064; +import static net.runelite.api.ItemID.GRACEFUL_CAPE_21066; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_11859; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13587; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13588; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13599; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13600; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13611; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13612; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13623; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13624; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13635; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13636; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13675; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13676; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_21073; +import static net.runelite.api.ItemID.GRACEFUL_GLOVES_21075; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_11851; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13579; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13580; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13591; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13592; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13603; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13604; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13615; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13616; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13627; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13628; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13667; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_13668; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_21061; +import static net.runelite.api.ItemID.GRACEFUL_HOOD_21063; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_11857; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13585; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13586; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13597; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13598; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13609; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13610; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13621; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13622; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13633; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13634; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13673; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_13674; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_21070; +import static net.runelite.api.ItemID.GRACEFUL_LEGS_21072; +import static net.runelite.api.ItemID.GRACEFUL_TOP_11855; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13583; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13584; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13595; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13596; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13607; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13608; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13619; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13620; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13631; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13632; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13671; +import static net.runelite.api.ItemID.GRACEFUL_TOP_13672; +import static net.runelite.api.ItemID.GRACEFUL_TOP_21067; +import static net.runelite.api.ItemID.GRACEFUL_TOP_21069; +import static net.runelite.api.ItemID.MAX_CAPE; +import net.runelite.api.Skill; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/RunepouchConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/RunepouchConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java index 7e00381a66..91b4e9c6fa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java @@ -29,11 +29,11 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.ItemID; -import api.Point; -import api.Varbits; -import api.widgets.WidgetItem; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import net.runelite.api.Point; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.game.ItemManager; import static net.runelite.client.plugins.runepouch.config.RunePouchOverlayMode.BOTH; import static net.runelite.client.plugins.runepouch.config.RunePouchOverlayMode.MOUSE_HOVER; @@ -47,13 +47,13 @@ import net.runelite.client.util.ColorUtil; public class RunepouchOverlay extends WidgetItemOverlay { private static final Varbits[] AMOUNT_VARBITS = - { - Varbits.RUNE_POUCH_AMOUNT1, Varbits.RUNE_POUCH_AMOUNT2, Varbits.RUNE_POUCH_AMOUNT3 - }; + { + Varbits.RUNE_POUCH_AMOUNT1, Varbits.RUNE_POUCH_AMOUNT2, Varbits.RUNE_POUCH_AMOUNT3 + }; private static final Varbits[] RUNE_VARBITS = - { - Varbits.RUNE_POUCH_RUNE1, Varbits.RUNE_POUCH_RUNE2, Varbits.RUNE_POUCH_RUNE3 - }; + { + Varbits.RUNE_POUCH_RUNE1, Varbits.RUNE_POUCH_RUNE2, Varbits.RUNE_POUCH_RUNE3 + }; private static final Dimension IMAGE_SIZE = new Dimension(11, 11); private final Client client; @@ -118,13 +118,13 @@ public class RunepouchOverlay extends WidgetItemOverlay } graphics.setColor(Color.black); - graphics.drawString("" + formatNumber(amount), location.getX() + (config.showIcons() ? 13 : 6), - location.getY() + 14 + (graphics.getFontMetrics().getHeight() - 1) * i); - - graphics.setColor(config.fontColor()); graphics.drawString("" + formatNumber(amount), location.getX() + (config.showIcons() ? 12 : 5), location.getY() + 13 + (graphics.getFontMetrics().getHeight() - 1) * i); + graphics.setColor(config.fontColor()); + graphics.drawString("" + formatNumber(amount), location.getX() + (config.showIcons() ? 11 : 4), + location.getY() + 12 + (graphics.getFontMetrics().getHeight() - 1) * i); + if (!config.showIcons()) { continue; @@ -134,7 +134,7 @@ public class RunepouchOverlay extends WidgetItemOverlay if (image != null) { OverlayUtil.renderImageLocation(graphics, - new Point(location.getX(), location.getY() + graphics.getFontMetrics().getHeight() * i), + new Point(location.getX() - 1, location.getY() + graphics.getFontMetrics().getHeight() * i - 1), image); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/RunepouchPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/RunepouchPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/Runes.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/Runes.java similarity index 72% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/Runes.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runepouch/Runes.java index 6231fbbd41..3031aa7b97 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/Runes.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/Runes.java @@ -30,27 +30,27 @@ import java.awt.image.BufferedImage; import java.util.Map; import lombok.Getter; import lombok.Setter; -import static api.ItemID.AIR_RUNE; -import static api.ItemID.ASTRAL_RUNE; -import static api.ItemID.BLOOD_RUNE; -import static api.ItemID.BODY_RUNE; -import static api.ItemID.CHAOS_RUNE; -import static api.ItemID.COSMIC_RUNE; -import static api.ItemID.DEATH_RUNE; -import static api.ItemID.DUST_RUNE; -import static api.ItemID.EARTH_RUNE; -import static api.ItemID.FIRE_RUNE; -import static api.ItemID.LAVA_RUNE; -import static api.ItemID.LAW_RUNE; -import static api.ItemID.MIND_RUNE; -import static api.ItemID.MIST_RUNE; -import static api.ItemID.MUD_RUNE; -import static api.ItemID.NATURE_RUNE; -import static api.ItemID.SMOKE_RUNE; -import static api.ItemID.SOUL_RUNE; -import static api.ItemID.STEAM_RUNE; -import static api.ItemID.WATER_RUNE; -import static api.ItemID.WRATH_RUNE; +import static net.runelite.api.ItemID.AIR_RUNE; +import static net.runelite.api.ItemID.ASTRAL_RUNE; +import static net.runelite.api.ItemID.BLOOD_RUNE; +import static net.runelite.api.ItemID.BODY_RUNE; +import static net.runelite.api.ItemID.CHAOS_RUNE; +import static net.runelite.api.ItemID.COSMIC_RUNE; +import static net.runelite.api.ItemID.DEATH_RUNE; +import static net.runelite.api.ItemID.DUST_RUNE; +import static net.runelite.api.ItemID.EARTH_RUNE; +import static net.runelite.api.ItemID.FIRE_RUNE; +import static net.runelite.api.ItemID.LAVA_RUNE; +import static net.runelite.api.ItemID.LAW_RUNE; +import static net.runelite.api.ItemID.MIND_RUNE; +import static net.runelite.api.ItemID.MIST_RUNE; +import static net.runelite.api.ItemID.MUD_RUNE; +import static net.runelite.api.ItemID.NATURE_RUNE; +import static net.runelite.api.ItemID.SMOKE_RUNE; +import static net.runelite.api.ItemID.SOUL_RUNE; +import static net.runelite.api.ItemID.STEAM_RUNE; +import static net.runelite.api.ItemID.WATER_RUNE; +import static net.runelite.api.ItemID.WRATH_RUNE; public enum Runes { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/config/RunePouchOverlayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/config/RunePouchOverlayMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/runepouch/config/RunePouchOverlayMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/runepouch/config/RunePouchOverlayMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotOverlay.java index 424beb0681..a208f59dc2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotOverlay.java @@ -13,8 +13,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; -import api.Client; -import api.Perspective; +import net.runelite.api.Client; +import net.runelite.api.Perspective; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotPlugin.java index ffaff2a7bf..5d0a6df8a3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/safespot/SafeSpotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/safespot/SafeSpotPlugin.java @@ -13,17 +13,17 @@ import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import lombok.Getter; -import api.Actor; -import api.Client; -import api.CollisionDataFlag; -import api.NPC; -import api.Player; -import api.Tile; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import api.events.GameTick; -import api.events.InteractingChanged; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.CollisionDataFlag; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.InteractingChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -38,6 +38,7 @@ import net.runelite.client.ui.overlay.OverlayManager; type = PluginType.UTILITY, enabledByDefault = false ) + public class SafeSpotPlugin extends Plugin { @Inject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java index eb7b475cdc..ff8dcf0057 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java @@ -41,7 +41,7 @@ import java.util.stream.Stream; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.events.ConfigChanged; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.MouseManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerRenderable.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerRenderable.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerRenderable.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerRenderable.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java index 9dbf4b8c00..a5fd92a862 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java @@ -38,8 +38,8 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Consumer; import javax.inject.Inject; -import api.Client; -import api.MainBufferProvider; +import net.runelite.api.Client; +import net.runelite.api.MainBufferProvider; import net.runelite.client.ui.DrawManager; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 6af0947fa9..9e4a5dcfaf 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -61,29 +61,29 @@ import javax.swing.SwingUtilities; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.Player; -import api.Point; -import api.SpriteID; -import api.Varbits; -import api.WorldType; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import static api.widgets.WidgetID.BARROWS_REWARD_GROUP_ID; -import static api.widgets.WidgetID.CHAMBERS_OF_XERIC_REWARD_GROUP_ID; -import static api.widgets.WidgetID.CLUE_SCROLL_REWARD_GROUP_ID; -import static api.widgets.WidgetID.DIALOG_SPRITE_GROUP_ID; -import static api.widgets.WidgetID.KINGDOM_GROUP_ID; -import static api.widgets.WidgetID.LEVEL_UP_GROUP_ID; -import static api.widgets.WidgetID.QUEST_COMPLETED_GROUP_ID; -import static api.widgets.WidgetID.THEATRE_OF_BLOOD_REWARD_GROUP_ID; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.SpriteID; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetID.BARROWS_REWARD_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.CHAMBERS_OF_XERIC_REWARD_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.CLUE_SCROLL_REWARD_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.DIALOG_SPRITE_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.KINGDOM_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.LEVEL_UP_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.QUEST_COMPLETED_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.THEATRE_OF_BLOOD_REWARD_GROUP_ID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import static net.runelite.client.RuneLite.SCREENSHOT_DIR; import net.runelite.client.config.ConfigManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadRequest.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadRequest.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadRequest.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadRequest.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadResponse.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadResponse.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadResponse.java rename to runelite-client/src/main/java/net/runelite/client/plugins/screenshot/imgur/ImageUploadResponse.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryOverlay.java index 01c97fe918..a7b0ab1bcf 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryOverlay.java @@ -32,9 +32,9 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.ItemID; -import api.NPC; -import api.Point; +import net.runelite.api.ItemID; +import net.runelite.api.NPC; +import net.runelite.api.Point; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryPlugin.java index 7001d5668f..d5f38d8172 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/shayzieninfirmary/ShayzienInfirmaryPlugin.java @@ -30,9 +30,9 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.NPC; -import api.events.GameTick; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.events.GameTick; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -44,8 +44,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Shayzien Infirmary", description = "Shows the status of wounded soldiers", tags = {"shayzien", "infirmary", "soldiers"}, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + public class ShayzienInfirmaryPlugin extends Plugin { @Getter(AccessLevel.PACKAGE) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerConfig.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerConfig.java index 36ad3f492a..a4e2b92543 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerConfig.java @@ -26,11 +26,30 @@ package net.runelite.client.plugins.shiftwalker; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; -// import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.ConfigItem; @ConfigGroup("shiftwalkhere") public interface ShiftWalkerConfig extends Config { + @ConfigItem( + keyName = "shiftWalk", + name = "Shift to Walk", + description = "For when you want Walk here as a priority" + ) + default boolean shiftWalk() + { + return false; + } + + @ConfigItem( + keyName = "shiftLoot", + name = "Shift to Loot", + description = "For when people stand on your loot" + ) + default boolean shiftLoot() + { + return false; + } /* @ConfigItem( diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerGroups.java b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerGroups.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerGroups.java rename to runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerGroups.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerInputListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerInputListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerInputListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java similarity index 88% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java index 42715f289b..7197de9eaa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.shiftwalker; import com.google.inject.Provides; import javax.inject.Inject; -import api.events.FocusChanged; +import net.runelite.api.events.FocusChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.KeyManager; @@ -39,17 +39,18 @@ import net.runelite.client.plugins.PluginType; * Shift Walker Plugin. Credit to MenuEntrySwapperPlugin for code some code structure used here. */ @PluginDescriptor( - name = "Shift To Walk", + name = "Shift Walk Under", description = "Use Shift to toggle the Walk Here menu option. While pressed you will Walk rather than interact with objects.", tags = {"npcs", "items", "objects"}, - enabledByDefault = false, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + public class ShiftWalkerPlugin extends Plugin { private static final String WALK_HERE = "Walk here"; - + private static final String TAKE = "Take"; @Inject private ShiftWalkerConfig config; @@ -91,11 +92,20 @@ public class ShiftWalkerPlugin extends Plugin void startPrioritizing() { - menuManager.addPriorityEntry(WALK_HERE); + if (config.shiftLoot()) + { + menuManager.addPriorityEntry(TAKE); + } + + if (config.shiftWalk()) + { + menuManager.addPriorityEntry(WALK_HERE); + } } void stopPrioritizing() { + menuManager.removePriorityEntry(TAKE); menuManager.removePriorityEntry(WALK_HERE); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/BankedCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/BankedCalculator.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/BankedCalculator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/BankedCalculator.java index d43ecf11c1..b4f6785a96 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/BankedCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/BankedCalculator.java @@ -42,9 +42,9 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Experience; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Skill; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.skillcalculator.banked.CriticalItem; import net.runelite.client.plugins.skillcalculator.banked.beans.Activity; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java index a03e80e867..1b3cbf818b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.skillcalculator; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Skill; +import net.runelite.api.Skill; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java index 8ceae03117..32bda79122 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -42,9 +42,9 @@ import javax.swing.JLabel; import javax.swing.JPanel; import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.Experience; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Skill; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.skillcalculator.beans.SkillData; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java index 4b37f4a340..d7f14a0492 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java @@ -40,8 +40,8 @@ import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.Skill; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SkillIconManager; import net.runelite.client.game.SpriteManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java index 5e86208596..8cb7fbc713 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java @@ -33,15 +33,15 @@ import java.util.Map; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.Getter; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.events.ConfigChanged; -import api.events.ExperienceChanged; -import api.events.GameTick; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/CriticalItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/CriticalItem.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/CriticalItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/CriticalItem.java index 171aa5c7ea..688a00d3c6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/CriticalItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/CriticalItem.java @@ -30,9 +30,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import lombok.Getter; -import api.ItemDefinition; -import api.ItemID; -import api.Skill; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemID; +import net.runelite.api.Skill; import net.runelite.client.game.ItemManager; public enum CriticalItem diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/Activity.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/Activity.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/Activity.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/Activity.java index 4e503fbde6..d3109c15e6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/Activity.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/Activity.java @@ -28,8 +28,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import lombok.Getter; -import api.ItemID; -import api.Skill; +import net.runelite.api.ItemID; +import net.runelite.api.Skill; import net.runelite.client.plugins.skillcalculator.banked.CriticalItem; @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/ActivitySecondaries.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/ActivitySecondaries.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/ActivitySecondaries.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/ActivitySecondaries.java index e20310a971..94a74bd6fd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/ActivitySecondaries.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/ActivitySecondaries.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.skillcalculator.banked.beans; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; @Getter public enum ActivitySecondaries diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/SecondaryItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/SecondaryItem.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/SecondaryItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/beans/SecondaryItem.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/ui/CriticalItemPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/ui/CriticalItemPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/banked/ui/CriticalItemPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/ui/CriticalItemPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skybox/Skybox.java b/runelite-client/src/main/java/net/runelite/client/plugins/skybox/Skybox.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skybox/Skybox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skybox/Skybox.java index 3c7521a9e8..aa770f37f8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skybox/Skybox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skybox/Skybox.java @@ -34,7 +34,7 @@ import java.io.Reader; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; -import api.Client; +import net.runelite.api.Client; class Skybox { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java index e34e08d2a9..55b1a37017 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java @@ -26,12 +26,12 @@ package net.runelite.client.plugins.skybox; import com.google.inject.Inject; import java.io.IOException; -import api.Client; -import api.GameState; -import api.Player; -import api.coords.LocalPoint; -import api.events.BeforeRender; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.BeforeRender; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/KnapsackSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/KnapsackSolver.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/KnapsackSolver.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/KnapsackSolver.java index b97e2aa21f..dc2afab56c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/KnapsackSolver.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/KnapsackSolver.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.slayer; import java.util.ArrayList; import java.util.List; -public class KnapsackSolver +class KnapsackSolver { private List reconstructItemsInSack(int[][] sackMatrix, List items, int i, int w) @@ -49,7 +49,7 @@ public class KnapsackSolver } } - public int howMuchFitsInSack(List items, int maxWeight) + int howMuchFitsInSack(List items, int maxWeight) { int itemCount = items.size(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/NPCPresence.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/NPCPresence.java similarity index 82% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/NPCPresence.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/NPCPresence.java index 8448bcdfd6..cc28df5393 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/NPCPresence.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/NPCPresence.java @@ -1,7 +1,7 @@ package net.runelite.client.plugins.slayer; import lombok.Getter; -import api.NPC; +import net.runelite.api.NPC; public class NPCPresence { @@ -29,17 +29,17 @@ public class NPCPresence return name + "[" + combatLevel + "]"; } - public boolean shouldExist() + boolean shouldExist() { return fadeTimer > 0; } - public void tickExistence() + void tickExistence() { fadeTimer--; } - public static NPCPresence buildPresence(NPC npc) + static NPCPresence buildPresence(NPC npc) { return new NPCPresence(npc.getName(), npc.getCombatLevel()); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/RenderStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/RenderStyle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/RenderStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/RenderStyle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java index 196ae88d12..0d970b43ea 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java @@ -30,8 +30,8 @@ import java.awt.Point; import java.awt.Rectangle; import java.util.Set; import javax.inject.Inject; -import api.ItemID; -import api.widgets.WidgetItem; +import net.runelite.api.ItemID; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.WidgetItemOverlay; import net.runelite.client.ui.overlay.components.TextComponent; @@ -124,8 +124,8 @@ class SlayerOverlay extends WidgetItemOverlay textComponent.setText(String.valueOf(amount)); - // Draw the counter in the top left for equipment, and bottom left for jewelry - textComponent.setPosition(new Point(bounds.x, bounds.y + (SLAYER_JEWELRY.contains(itemId) + // Draw the counter in the bottom left for equipment, and top left for jewelry + textComponent.setPosition(new Point(bounds.x - 1, bounds.y - 1 + (SLAYER_JEWELRY.contains(itemId) ? bounds.height : graphics.getFontMetrics().getHeight()))); textComponent.render(graphics); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 28a671f520..79dca36797 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -49,29 +49,29 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.ChatMessageType; -import api.Client; -import api.ItemID; -import api.MessageNode; -import api.NPC; -import api.NPCDefinition; -import static api.Skill.SLAYER; -import api.SpriteID; -import api.Varbits; -import api.coords.WorldPoint; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.ExperienceChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.InteractingChanged; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.VarbitChanged; -import api.vars.SlayerUnlock; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import net.runelite.api.MessageNode; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import static net.runelite.api.Skill.SLAYER; +import net.runelite.api.SpriteID; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.vars.SlayerUnlock; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatColorType; @@ -248,6 +248,7 @@ public class SlayerPlugin extends Plugin private SlayerTaskPanel panel; private NavigationButton navButton; private long lastTickMillis = 0; + private boolean loginTick = false; private void clearTrackedNPCs() { @@ -284,13 +285,6 @@ public class SlayerPlugin extends Plugin clientToolbar.addNavigation(navButton); - if (config.amount() != -1 - && !config.taskName().isEmpty()) - { - streak = config.streak(); - clientThread.invoke(() -> setTask(config.taskName(), config.amount(), config.initialAmount(), true, config.taskLocation(), config.lastCertainAmount())); - } - chatCommandManager.registerCommandAsync(TASK_COMMAND_STRING, this::taskLookup, this::taskSubmit); } @@ -325,7 +319,16 @@ public class SlayerPlugin extends Plugin clearTrackedNPCs(); break; case LOGIN_SCREEN: + loginTick = true; currentTask.setPaused(true); + break; + case LOGGED_IN: + if (loginTick && config.amount() != -1 + && !config.taskName().isEmpty()) + { + streak = config.streak(); + setTask(config.taskName(), config.amount(), config.initialAmount(), true, config.taskLocation(), config.lastCertainAmount()); + } } } @@ -387,7 +390,7 @@ public class SlayerPlugin extends Plugin } } - int estimateKillCount(List potentialKills, int gains) + private int estimateKillCount(List potentialKills, int gains) { // failsafe to avoid calculating kill count if there were no slayer monsters around that could be killed on task // this failsafe *WILL FAIL* if someone decides to lamp their slayer in the middle of a task next to on task creatures @@ -475,6 +478,8 @@ public class SlayerPlugin extends Plugin @Subscribe public void onGameTick(GameTick tick) { + loginTick = false; + // update the lingering presence of npcs in the slayer xp consideration list Iterator presenceIterator = lingeringPresences.iterator(); while (presenceIterator.hasNext()) @@ -746,7 +751,7 @@ public class SlayerPlugin extends Plugin } @VisibleForTesting - void killedOne() + private void killedOne() { if (currentTask.getAmount() == 0) { @@ -779,11 +784,11 @@ public class SlayerPlugin extends Plugin private boolean doubleTroubleExtraKill() { return WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()).getRegionID() == GROTESQUE_GUARDIANS_REGION && - SlayerUnlock.GROTESQUE_GARDIAN_DOUBLE_COUNT.isEnabled(client); + SlayerUnlock.GROTESQUE_GUARDIAN_DOUBLE_COUNT.isEnabled(client); } // checks if any contiguous subsequence of seq0 exactly matches the String toMatch - boolean contiguousSubsequenceMatches(String[] seq0, String toMatch) + private boolean contiguousSubsequenceMatches(String[] seq0, String toMatch) { for (int i = 0; i < seq0.length; i++) { @@ -957,7 +962,7 @@ public class SlayerPlugin extends Plugin rebuildTargetList(); } - public AsyncBufferedImage getImageForTask(Task task) + AsyncBufferedImage getImageForTask(Task task) { int itemSpriteId = ItemID.ENCHANTED_GEM; if (task != null) @@ -1043,6 +1048,11 @@ public class SlayerPlugin extends Plugin return; } + if (task == null) + { + return; + } + if (TASK_STRING_VALIDATION.matcher(task.getTask()).find() || task.getTask().length() > TASK_STRING_MAX_LENGTH || TASK_STRING_VALIDATION.matcher(task.getLocation()).find() || task.getLocation().length() > TASK_STRING_MAX_LENGTH) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java index ea3fbf0712..0cd238a6d3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java @@ -343,7 +343,7 @@ public class SlayerTaskPanel extends PluginPanel changePauseState(paused); } - static String htmlLabel(String key, long timeMillis) + private static String htmlLabel(String key, long timeMillis) { if (timeMillis == Long.MAX_VALUE) { @@ -363,7 +363,7 @@ public class SlayerTaskPanel extends PluginPanel } } - static String htmlLabel(String key, int value) + private static String htmlLabel(String key, int value) { String valueStr = StackFormatter.quantityToRSDecimalStack(value); return String.format(HTML_LABEL_TEMPLATE, ColorUtil.toHexColor(ColorScheme.LIGHT_GRAY_COLOR), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerXpDropLookup.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerXpDropLookup.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerXpDropLookup.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerXpDropLookup.java index a3e3898390..458c9421c2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/SlayerXpDropLookup.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerXpDropLookup.java @@ -31,14 +31,14 @@ import java.io.InputStreamReader; import java.util.List; import java.util.Map; -public class SlayerXpDropLookup +class SlayerXpDropLookup { private Map> xpMap; // floating point math equality private static final double EPSILON = 1e-6; - void loadXpJson() + private void loadXpJson() { final InputStream xpFile = getClass().getResourceAsStream("/slayer_xp.json"); Gson gson = new Gson(); @@ -76,7 +76,7 @@ public class SlayerXpDropLookup * @param npc the npc we are estimating slayer xp for * @return our best guess for the slayer xp for this npc */ - public double findXpForNpc(NPCPresence npc) + double findXpForNpc(NPCPresence npc) { List xpCombatLevel = xpMap.get(npc.getName()); if (xpCombatLevel == null) @@ -127,7 +127,7 @@ public class SlayerXpDropLookup return -1; } - public SlayerXpDropLookup() + SlayerXpDropLookup() { loadXpJson(); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java index f4741e0e1a..c5bd4f1130 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java @@ -26,20 +26,19 @@ */ package net.runelite.client.plugins.slayer; -import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -57,8 +56,7 @@ public class TargetClickboxOverlay extends Overlay private final ModelOutlineRenderer modelOutliner; @Inject - TargetClickboxOverlay(Client client, SlayerConfig config, SlayerPlugin plugin, - ModelOutlineRenderer modelOutlineRenderer) + TargetClickboxOverlay(Client client, SlayerConfig config, SlayerPlugin plugin, ModelOutlineRenderer modelOutlineRenderer) { this.client = client; this.config = config; @@ -76,7 +74,13 @@ public class TargetClickboxOverlay extends Overlay List targets = plugin.getHighlightedTargets(); for (NPC target : targets) { + if (target == null || target.getName() == null) + { + continue; + } + Color coloration = config.getTargetColor(); + if (plugin.isSuperior(target.getName())) { coloration = config.getSuperiorColor(); @@ -95,28 +99,36 @@ public class TargetClickboxOverlay extends Overlay { case SOUTH_WEST_TILE: LocalPoint lp1 = LocalPoint.fromWorld(client, actor.getWorldLocation()); + + if (lp1 == null) + { + return; + } + Polygon tilePoly1 = Perspective.getCanvasTilePoly(client, lp1); - renderPoly(graphics, color, tilePoly1); + OverlayUtil.renderPolygon(graphics, tilePoly1, color); break; case TILE: int size = 1; NPCDefinition composition = actor.getTransformedDefinition(); + if (composition != null) { size = composition.getSize(); } + LocalPoint lp = actor.getLocalLocation(); Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); - renderPoly(graphics, color, tilePoly); + OverlayUtil.renderPolygon(graphics, tilePoly, color); break; case HULL: Polygon objectClickbox = actor.getConvexHull(); - renderPoly(graphics, color, objectClickbox); + OverlayUtil.renderPolygon(graphics, objectClickbox, color); break; case THIN_OUTLINE: modelOutliner.drawOutline(actor, 1, color); @@ -136,15 +148,23 @@ public class TargetClickboxOverlay extends Overlay case TRUE_LOCATIONS: size = 1; composition = actor.getTransformedDefinition(); + if (composition != null) { size = composition.getSize(); } + WorldPoint wp = actor.getWorldLocation(); lp = LocalPoint.fromWorld(client, wp); + + if (lp == null) + { + return; + } + tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); - renderPoly(graphics, color, tilePoly); + OverlayUtil.renderPolygon(graphics, tilePoly, color); break; } @@ -159,16 +179,4 @@ public class TargetClickboxOverlay extends Overlay } } } - - private static void renderPoly(Graphics2D graphics, Color color, Polygon polygon) - { - if (polygon != null) - { - graphics.setColor(color); - graphics.setStroke(new BasicStroke(2)); - graphics.draw(polygon); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); - graphics.fill(polygon); - } - } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetMinimapOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetMinimapOverlay.java index 43bfd6c31b..57615b2a10 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetMinimapOverlay.java @@ -31,9 +31,9 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.util.List; import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -67,7 +67,13 @@ public class TargetMinimapOverlay extends Overlay List targets = plugin.getHighlightedTargets(); for (NPC target : targets) { + if (target == null || target.getName() == null) + { + continue; + } + Color coloration = config.getTargetColor(); + if (plugin.isSuperior(target.getName())) { coloration = config.getSuperiorColor(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java index c1344afe9d..7a113607ee 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java @@ -28,11 +28,11 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.NPC; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.game.ItemManager; import net.runelite.client.game.NPCManager; import net.runelite.client.ui.overlay.Overlay; @@ -98,9 +98,9 @@ class TargetWeaknessOverlay extends Overlay final int healthScale = target.getHealth(); final int healthRatio = target.getHealthRatio(); - final Integer maxHealth = npcManager.getHealth(target.getId()); + final int maxHealth = npcManager.getHealth(target.getId()); - if (healthRatio < 0 || healthScale <= 0 || maxHealth == null) + if (healthRatio < 0 || healthScale <= 0 || maxHealth == -1) { return -1; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/Task.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/Task.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java index 4da3201e05..5c32ba6e73 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/Task.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java @@ -33,8 +33,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; import lombok.Getter; -import api.ItemID; -import api.NpcID; +import net.runelite.api.ItemID; +import net.runelite.api.NpcID; @Getter enum Task diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TaskCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TaskCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TaskData.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskData.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayer/TaskData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskData.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java index 4e6c78fb40..59b1b31e8c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java @@ -1,6 +1,6 @@ package net.runelite.client.plugins.slayermusiq; -import api.ChatMessageType; +import net.runelite.api.ChatMessageType; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayermusiq/SlayermusiqPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/SlayermusiqPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/slayermusiq/SlayermusiqPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/SlayermusiqPlugin.java index 54ee28eb24..9584d17c34 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/slayermusiq/SlayermusiqPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/SlayermusiqPlugin.java @@ -55,12 +55,12 @@ import com.google.common.primitives.Ints; import java.util.Arrays; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.MenuAction; -import api.MenuEntry; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -75,6 +75,7 @@ import net.runelite.client.util.Text; type = PluginType.UTILITY, enabledByDefault = false ) + @Slf4j public class SlayermusiqPlugin extends Plugin { @@ -125,10 +126,10 @@ public class SlayermusiqPlugin extends Plugin @Subscribe private void onMenuOptionClicked(MenuOptionClicked ev) { - if (ev.getMenuAction() == MenuAction.RUNELITE && ev.getMenuOption().equals(MENUOP_SLAYERMUSIQ)) + if (ev.getMenuAction() == MenuAction.RUNELITE && ev.getOption().equals(MENUOP_SLAYERMUSIQ)) { ev.consume(); - String quest = Text.removeTags(ev.getMenuTarget()); + String quest = Text.removeTags(ev.getTarget()); QuestGuideLinks.tryOpenGuide(quest, chatMessageManager); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java similarity index 81% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java index 9ca350b6a1..3e9cad459d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java @@ -30,19 +30,20 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; -import static api.AnimationID.SMITHING_CANNONBALL; -import static api.AnimationID.SMITHING_SMELTING; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Skill; +import static net.runelite.api.AnimationID.SMITHING_CANNONBALL; +import static net.runelite.api.AnimationID.SMITHING_SMELTING; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class SmeltingOverlay extends Overlay { @@ -94,27 +95,23 @@ class SmeltingOverlay extends Overlay int actions = xpTrackerService.getActions(Skill.SMITHING); if (actions > 0) { + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (plugin.getSession().getBarsSmelted() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Bars:") - .right(Integer.toString(session.getBarsSmelted())) - .build()); + tableComponent.addRow("Bars:", Integer.toString(session.getBarsSmelted())); } if (plugin.getSession().getCannonBallsSmelted() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Cannonballs:") - .right(Integer.toString(session.getCannonBallsSmelted())) - .build()); + tableComponent.addRow("Cannonballs:", Integer.toString(session.getCannonBallsSmelted())); } if (actions > 2) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Actions/hr:") - .right(Integer.toString(xpTrackerService.getActionsHr(Skill.SMITHING))) - .build()); + tableComponent.addRow("Actions/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.SMITHING))); } + + panelComponent.getChildren().add(tableComponent); } return panelComponent.render(graphics); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingPlugin.java index 53bbacc80e..21a3b5440b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingPlugin.java @@ -30,9 +30,9 @@ import java.time.Instant; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import api.ChatMessageType; -import api.events.ChatMessage; -import api.events.GameTick; +import net.runelite.api.ChatMessageType; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingSession.java b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingSession.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/smelting/SmeltingSession.java rename to runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingSession.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerOverlay.java index d7f3d152b0..f823cf3308 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerOverlay.java @@ -1,7 +1,7 @@ package net.runelite.client.plugins.spawntimer; -import api.*; -import api.Point; +import net.runelite.api.*; +import net.runelite.api.Point; import net.runelite.client.plugins.spawntimer.SpawnTimerPlugin; import net.runelite.client.plugins.spawntimer.SpawnTimerConfig; import net.runelite.client.ui.overlay.Overlay; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerPlugin.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerPlugin.java index a356e1898f..b98a2a2541 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/SpawnTimerPlugin.java @@ -4,13 +4,13 @@ import com.google.common.annotations.VisibleForTesting; import com.google.inject.Provides; import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.GameState; -import api.NPC; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/thing.java b/runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/thing.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/thing.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/thing.java index e0c4163c90..45095c18f7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spawntimer/thing.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/spawntimer/thing.java @@ -1,6 +1,6 @@ package net.runelite.client.plugins.spawntimer; -import api.NPC; +import net.runelite.api.NPC; public class thing { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specbar/SpecBarPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/specbar/SpecBarPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/specbar/SpecBarPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/specbar/SpecBarPlugin.java index 09efc32324..086d3d397d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specbar/SpecBarPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specbar/SpecBarPlugin.java @@ -25,8 +25,8 @@ package net.runelite.client.plugins.specbar; import javax.inject.Inject; -import api.Client; -import api.events.ScriptCallbackEvent; +import net.runelite.api.Client; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -36,9 +36,10 @@ import net.runelite.client.plugins.PluginType; name = "Spec Bar", description = "Adds a spec bar to every weapon", tags = {"spec bar", "special attack", "spec", "bar", "pklite"}, - enabledByDefault = false, - type = PluginType.PVP + type = PluginType.PVP, + enabledByDefault = false ) + public class SpecBarPlugin extends Plugin { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/Boss.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/Boss.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/Boss.java rename to runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/Boss.java index f8bceb90fb..a9b4434797 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/Boss.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/Boss.java @@ -28,7 +28,7 @@ import com.google.common.collect.Sets; import java.util.Set; import lombok.Getter; import lombok.ToString; -import api.NpcID; +import net.runelite.api.NpcID; @Getter @ToString diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java index 2608e1e9b4..1f056ad234 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java @@ -28,22 +28,22 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.inject.Inject; -import api.Actor; -import api.Client; -import api.EquipmentInventorySlot; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.NPC; -import api.NPCDefinition; -import api.Player; -import api.Skill; -import api.VarPlayer; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcDespawned; -import api.events.VarbitChanged; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Player; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterUpdate.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterUpdate.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterUpdate.java rename to runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterUpdate.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java rename to runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java index ea33163443..69d8d68193 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.specialcounter; import lombok.AllArgsConstructor; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/Spell.java b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/Spell.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/Spell.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spellbook/Spell.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/Spellbook.java b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/Spellbook.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/Spellbook.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spellbook/Spellbook.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookDragOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookDragOverlay.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookDragOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookDragOverlay.java index 9ced0fbdf8..0066f841fe 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookDragOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookDragOverlay.java @@ -31,7 +31,7 @@ import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -64,8 +64,8 @@ public class SpellbookDragOverlay extends Overlay return null; } - final api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); - final api.Point draggingLocation = plugin.getDraggingLocation(); + final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); + final net.runelite.api.Point draggingLocation = plugin.getDraggingLocation(); final int size = plugin.getDraggingWidget().getWidth(); final int sprite = plugin.getDraggingWidget().getSpriteId(); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookMouseListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookMouseListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookMouseListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookMouseListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookPlugin.java index ac74bc014e..5f739ab8b5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/spellbook/SpellbookPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/spellbook/SpellbookPlugin.java @@ -38,18 +38,18 @@ import java.util.Set; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.Point; -import api.VarClientInt; -import api.Varbits; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.ScriptCallbackEvent; -import api.events.VarbitChanged; -import api.events.WidgetMenuOptionClicked; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Point; +import net.runelite.api.VarClientInt; +import net.runelite.api.Varbits; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetMenuOptionClicked; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -67,8 +67,10 @@ import net.runelite.client.util.Text; name = "Spellbook", description = "Modifications to the spellbook", tags = {"resize", "spell", "mobile", "lowers", "pvp", "skill", "level"}, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + @Slf4j public class SpellbookPlugin extends Plugin { @@ -446,9 +448,7 @@ public class SpellbookPlugin extends Plugin } // CHECKSTYLE:OFF - Collection gson = GSON.fromJson(cfg, new TypeToken>() - { - }.getType()); + Collection gson = GSON.fromJson(cfg, new TypeToken>() {}.getType()); // CHECKSTYLE:ON gson.stream().filter(Objects::nonNull).forEach(s -> spells.put(s.getWidget(), s)); @@ -463,7 +463,7 @@ public class SpellbookPlugin extends Plugin private void saveSpells() { - if (spells.isEmpty()) + if (spells.isEmpty() || tmp == null || tmp.isEmpty()) { return; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java similarity index 77% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java index 573e561e2d..f8d0fed78f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.statusbars; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; +import net.runelite.client.plugins.statusbars.config.BarMode; @ConfigGroup("statusbars") public interface StatusBarsConfig extends Config @@ -34,8 +35,8 @@ public interface StatusBarsConfig extends Config @ConfigItem( position = 1, keyName = "enableCounter", - name = "Show hitpoints & prayer counter", - description = "Shows current amount of hitpoints & prayer on the status bars" + name = "Show counters", + description = "Shows currentValue value of the status on the bar" ) default boolean enableCounter() { @@ -45,7 +46,7 @@ public interface StatusBarsConfig extends Config @ConfigItem( position = 2, keyName = "enableSkillIcon", - name = "Show hitpoints & prayer icons", + name = "Show icons", description = "Adds skill icons at the top of the bars." ) default boolean enableSkillIcon() @@ -56,8 +57,8 @@ public interface StatusBarsConfig extends Config @ConfigItem( position = 3, keyName = "enableRestorationBars", - name = "Show amount of hitpoints and prayer restored", - description = "Visually shows how much a food or prayer will heal/restore you on the bars." + name = "Show restores", + description = "Visually shows how much will be restored to your status bar." ) default boolean enableRestorationBars() { @@ -65,7 +66,29 @@ public interface StatusBarsConfig extends Config } @ConfigItem( - position = 4, + position = 4, + keyName = "leftBarMode", + name = "Left Status Bar", + description = "Configures the left status bar" + ) + default BarMode leftBarMode() + { + return BarMode.HITPOINTS; + } + + @ConfigItem( + position = 5, + keyName = "rightBarMode", + name = "Right Status Bar", + description = "Configures the right status bar" + ) + default BarMode rightBarMode() + { + return BarMode.PRAYER; + } + + @ConfigItem( + position = 6, keyName = "toggleRestorationBars", name = "Toggle to hide when not in combat", description = "Visually hides the Status Bars when player is out of combat." @@ -76,7 +99,7 @@ public interface StatusBarsConfig extends Config } @ConfigItem( - position = 5, + position = 7, keyName = "hideStatusBarDelay", name = "Delay (seconds)", description = "Number of seconds after combat to hide the status bars." diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java new file mode 100644 index 0000000000..bf2dce7138 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2018, Jos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.statusbars; + +import com.google.common.base.Strings; +import com.google.common.primitives.Ints; +import net.runelite.api.Client; +import net.runelite.api.MenuEntry; +import net.runelite.api.Point; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.plugins.itemstats.Effect; +import net.runelite.client.plugins.itemstats.ItemStatChangesService; +import net.runelite.client.plugins.itemstats.StatChange; +import net.runelite.client.plugins.itemstats.StatsChanges; +import net.runelite.client.plugins.statusbars.renderer.BarRenderer; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; + +import javax.inject.Inject; +import java.awt.Dimension; +import java.awt.Graphics2D; + +public class StatusBarsOverlay extends Overlay +{ + private static final int HEIGHT = 252; + private static final int RESIZED_BOTTOM_HEIGHT = 272; + private static final int RESIZED_BOTTOM_OFFSET_Y = 12; + private static final int RESIZED_BOTTOM_OFFSET_X = 10; + + private final Client client; + private final StatusBarsPlugin plugin; + private final StatusBarsConfig config; + private final ItemStatChangesService itemStatService; + + @Inject + private StatusBarsOverlay(Client client, StatusBarsPlugin plugin, StatusBarsConfig config, ItemStatChangesService itemstatservice) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + this.client = client; + this.plugin = plugin; + this.config = config; + this.itemStatService = itemstatservice; + } + + @Override + public Dimension render(Graphics2D g) + { + final Widget widgetBankTitleBar = client.getWidget(WidgetInfo.BANK_TITLE_BAR); + if (widgetBankTitleBar != null && !widgetBankTitleBar.isHidden()) + { + return null; + } + + Viewport curViewport = null; + Widget curWidget = null; + + for (Viewport viewport : Viewport.values()) + { + final Widget viewportWidget = client.getWidget(viewport.getViewport()); + if (viewportWidget != null && !viewportWidget.isHidden()) + { + curViewport = viewport; + curWidget = viewportWidget; + break; + } + } + + if (curViewport == null || curWidget.isHidden()) + { + return null; + } + + final Point offsetLeft = curViewport.getOffsetLeft(); + final Point offsetRight = curViewport.getOffsetRight(); + final Point location = curWidget.getCanvasLocation(); + final int height, offsetLeftBarX, offsetLeftBarY, offsetRightBarX, offsetRightBarY; + + if (curViewport == Viewport.RESIZED_BOTTOM) + { + height = RESIZED_BOTTOM_HEIGHT; + offsetLeftBarX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetLeft.getX()); + offsetLeftBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); + offsetRightBarX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetRight.getX()); + offsetRightBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); + } + else + { + height = HEIGHT; + offsetLeftBarX = (location.getX() - offsetLeft.getX()); + offsetLeftBarY = (location.getY() - offsetLeft.getY()); + offsetRightBarX = (location.getX() - offsetRight.getX()) + curWidget.getWidth(); + offsetRightBarY = (location.getY() - offsetRight.getY()); + } + + BarRenderer left = plugin.getBarRenderers().get(config.leftBarMode()); + BarRenderer right = plugin.getBarRenderers().get(config.rightBarMode()); + + if (left != null) + { + left.draw(client, this, g, offsetLeftBarX, offsetLeftBarY, height); + } + + if (right != null) + { + right.draw(client, this, g, offsetRightBarX, offsetRightBarY, height); + } + + return null; + } + + public int getRestoreValue(String skill) + { + final MenuEntry[] menu = client.getMenuEntries(); + final int menuSize = menu.length; + final MenuEntry entry = menuSize > 0 ? menu[menuSize - 1] : null; + int restoreValue = 0; + + if (entry != null && entry.getParam1() == WidgetInfo.INVENTORY.getId()) + { + final Effect change = itemStatService.getItemStatChanges(entry.getIdentifier()); + + if (change != null) + { + final StatsChanges statsChanges = change.calculate(client); + + for (final StatChange c : statsChanges.getStatChanges()) + { + //final String strVar = c.getTheoretical(); this was erroring + final String strVar = String.valueOf(c.getTheoretical()); + + if (Strings.isNullOrEmpty(strVar)) + { + continue; + } + + final Integer value = Ints.tryParse(strVar.startsWith("+") ? strVar.substring(1) : strVar); + + if (value == null) + { + continue; + } + + if (c.getStat().getName().equals(skill)) + { + restoreValue = value; + } + + if (restoreValue != 0) + { + break; + } + } + } + } + + return restoreValue; + } +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java similarity index 73% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java index 96fd09d0be..93d6f94163 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java @@ -24,30 +24,41 @@ */ package net.runelite.client.plugins.statusbars; +import javax.inject.Inject; + +import com.google.common.collect.Maps; import com.google.inject.Provides; +import lombok.Getter; import java.time.Duration; import java.time.Instant; import java.util.Arrays; import java.util.List; -import javax.inject.Inject; import lombok.AccessLevel; -import lombok.Getter; -import api.Actor; -import api.Client; -import api.NPC; -import api.NPCDefinition; -import api.events.GameTick; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDependency; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.itemstats.ItemStatPlugin; +import net.runelite.client.plugins.statusbars.config.BarMode; +import net.runelite.client.plugins.statusbars.renderer.BarRenderer; +import net.runelite.client.plugins.statusbars.renderer.EnergyRenderer; +import net.runelite.client.plugins.statusbars.renderer.HitPointsRenderer; +import net.runelite.client.plugins.statusbars.renderer.PrayerRenderer; +import net.runelite.client.plugins.statusbars.renderer.SpecialAttackRenderer; import net.runelite.client.ui.overlay.OverlayManager; + +import java.util.Map; + @PluginDescriptor( name = "Status Bars", - description = "Draws status bars next to players inventory showing current HP & Prayer and healing amounts", + description = "Draws status bars next to players inventory showing currentValue and restore amounts", enabledByDefault = false ) @PluginDependency(ItemStatPlugin.class) @@ -59,6 +70,21 @@ public class StatusBarsPlugin extends Plugin @Inject private OverlayManager overlayManager; + @Inject + private HitPointsRenderer hitPointsRenderer; + + @Inject + private PrayerRenderer prayerRenderer; + + @Inject + private EnergyRenderer energyRenderer; + + @Inject + private SpecialAttackRenderer specialAttackRenderer; + + @Getter + private final Map barRenderers = Maps.newEnumMap(BarMode.class); + @Inject private Client client; @@ -71,6 +97,12 @@ public class StatusBarsPlugin extends Plugin @Override protected void startUp() throws Exception { + overlayManager.add(overlay); + barRenderers.put(BarMode.DISABLED, null); + barRenderers.put(BarMode.HITPOINTS, hitPointsRenderer); + barRenderers.put(BarMode.PRAYER, prayerRenderer); + barRenderers.put(BarMode.RUN_ENERGY, energyRenderer); + barRenderers.put(BarMode.SPECIAL_ATTACK, specialAttackRenderer); } void updateLastCombatAction() @@ -122,6 +154,7 @@ public class StatusBarsPlugin extends Plugin protected void shutDown() throws Exception { overlayManager.remove(overlay); + barRenderers.clear(); } @Provides diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java rename to runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java index 6f40e02047..ce4c6e86b6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java @@ -26,8 +26,8 @@ package net.runelite.client.plugins.statusbars; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Point; -import api.widgets.WidgetInfo; +import net.runelite.api.Point; +import net.runelite.api.widgets.WidgetInfo; @Getter @AllArgsConstructor diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/config/BarMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/config/BarMode.java new file mode 100644 index 0000000000..7da3d0c308 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/config/BarMode.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.statusbars.config; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum BarMode +{ + DISABLED("Disabled"), + HITPOINTS("Hitpoints"), + PRAYER("Prayer"), + RUN_ENERGY("Run Energy"), + SPECIAL_ATTACK("Special Attack"); + + private final String name; + + @Override + public String toString() + { + return name; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/BarRenderer.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/BarRenderer.java new file mode 100644 index 0000000000..21ed8fd96b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/BarRenderer.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018, Rheon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.plugins.statusbars.renderer; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import net.runelite.api.Client; +import net.runelite.client.plugins.statusbars.StatusBarsConfig; +import net.runelite.client.plugins.statusbars.StatusBarsOverlay; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.overlay.components.TextComponent; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public abstract class BarRenderer +{ + private static final TextComponent TEXT = new TextComponent(); + private static final Color COLOR_BAR_BG = new Color(0, 0, 0, 150); + private static final Color COLOR_OVERHEAL = new Color(216, 255, 139, 150); + private static final int BAR_WIDTH = 20; + private static final int COUNTER_ICON_HEIGHT = 18; + private static final int SKILL_ICON_HEIGHT = 35; + private static final int PADDING = 1; + private static final int OVERHEAL_OFFSET = 2; + private static final int HEAL_OFFSET = 3; + private static final int ICON_AND_COUNTER_OFFSET_X = 1; + private static final int ICON_AND_COUNTER_OFFSET_Y = 21; + private static final int OFFSET = 2; + + protected final StatusBarsConfig config; + protected int maximumValue; + protected int currentValue; + protected int restore; + protected Color standardColor; + protected Color restoreColor; + protected Image icon; + + protected abstract void update(Client client, StatusBarsOverlay overlay); + + private void renderBar(Graphics2D graphics, int x, int y, int height) + { + graphics.setColor(COLOR_BAR_BG); + graphics.drawRect(x, y, BAR_WIDTH - PADDING, height - PADDING); + graphics.fillRect(x, y, BAR_WIDTH, height); + + final int filledHeight = getBarHeight(maximumValue, currentValue, height); + graphics.setColor(standardColor); + graphics.fillRect(x + PADDING, + y + PADDING + (height - filledHeight), + BAR_WIDTH - PADDING * OFFSET, + filledHeight - PADDING * OFFSET); + } + + private void renderIconsAndCounters(Graphics2D graphics, int x, int y) + { + final String counterText = Integer.toString(currentValue); + final int widthOfCounter = graphics.getFontMetrics().stringWidth(counterText); + final int centerText = (BAR_WIDTH - PADDING) / 2 - (widthOfCounter / 2); + + if (config.enableCounter()) + { + graphics.setFont(FontManager.getRunescapeSmallFont()); + TEXT.setText(counterText); + TEXT.setPosition(new Point(x + centerText + 1, y + COUNTER_ICON_HEIGHT)); + } + else + { + TEXT.setText(""); + } + + if (config.enableSkillIcon()) + { + graphics.drawImage(icon, x + ICON_AND_COUNTER_OFFSET_X + PADDING, y + ICON_AND_COUNTER_OFFSET_Y - icon.getWidth(null), null); + TEXT.setPosition(new Point(x + centerText + 1, y + SKILL_ICON_HEIGHT)); + } + + TEXT.render(graphics); + } + + private void renderRestore(Graphics2D graphics, int x, int y, int height) + { + if (restore <= 0) + { + return; + } + + final int filledCurrentHeight = getBarHeight(maximumValue, currentValue, height); + int filledHeight = getBarHeight(maximumValue, restore, height); + graphics.setColor(restoreColor); + + if (filledHeight + filledCurrentHeight > height) + { + final int overHeal = filledHeight + filledCurrentHeight - height; + filledHeight = filledHeight - overHeal + OVERHEAL_OFFSET; + graphics.setColor(COLOR_OVERHEAL); + graphics.fillRect(x + PADDING, + y - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, + BAR_WIDTH - PADDING * OVERHEAL_OFFSET, + filledHeight - PADDING * OVERHEAL_OFFSET); + } + else + { + graphics.fillRect(x + PADDING, + y - OVERHEAL_OFFSET - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, + BAR_WIDTH - PADDING * OVERHEAL_OFFSET, + filledHeight + OVERHEAL_OFFSET - PADDING * OVERHEAL_OFFSET); + } + } + + private static int getBarHeight(int base, int current, int size) + { + final double ratio = (double) current / base; + + if (ratio >= 1) + { + return size; + } + + return (int) Math.round(ratio * size); + } + + public void draw(Client client, StatusBarsOverlay overlay, Graphics2D graphics, int x, int y, int height) + { + update(client, overlay); + renderBar(graphics, x, y, height); + if (config.enableRestorationBars()) + renderRestore(graphics, x, y, height); + if (config.enableSkillIcon() || config.enableCounter()) + renderIconsAndCounters(graphics, x, y); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/EnergyRenderer.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/EnergyRenderer.java new file mode 100644 index 0000000000..127aa6b601 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/EnergyRenderer.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018, Rheon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.plugins.statusbars.renderer; + +import net.runelite.api.Client; +import net.runelite.api.SpriteID; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.plugins.statusbars.StatusBarsConfig; +import net.runelite.client.plugins.statusbars.StatusBarsOverlay; + +import javax.inject.Inject; +import java.awt.Color; + +public class EnergyRenderer extends BarRenderer +{ + private final SpriteManager spriteManager; + + @Inject + public EnergyRenderer(StatusBarsConfig config, SpriteManager spriteManager) + { + super(config); + maximumValue = 100; + this.spriteManager = spriteManager; + standardColor = new Color(199, 174, 0, 220); + restoreColor = new Color(199, 118, 0, 218); + } + + @Override + protected void update(Client client, StatusBarsOverlay overlay) + { + icon = spriteManager.getSprite(SpriteID.MINIMAP_ORB_RUN_ICON, 0); + currentValue = client.getEnergy(); + restore = overlay.getRestoreValue("Run Energy"); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/HitPointsRenderer.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/HitPointsRenderer.java new file mode 100644 index 0000000000..68e1c29548 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/HitPointsRenderer.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018, Rheon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.plugins.statusbars.renderer; + +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; +import net.runelite.client.game.SkillIconManager; +import net.runelite.client.plugins.statusbars.StatusBarsConfig; +import net.runelite.client.plugins.statusbars.StatusBarsOverlay; + +import javax.inject.Inject; +import java.awt.Color; + +public class HitPointsRenderer extends BarRenderer +{ + private static final Color COLOR_STANDARD = new Color(225, 35, 0, 125); + private static final Color COLOR_POISON = new Color(0, 145, 0, 150); + private static final Color COLOR_VENOM = new Color(0, 65, 0, 150); + + @Inject + public HitPointsRenderer(StatusBarsConfig config, SkillIconManager iconManager) + { + super(config); + icon = iconManager.getSkillImage(Skill.HITPOINTS, true); + restoreColor = new Color(255, 112, 6, 150); + } + + @Override + protected void update(Client client, StatusBarsOverlay overlay) + { + maximumValue = client.getRealSkillLevel(Skill.HITPOINTS); + currentValue = client.getBoostedSkillLevel(Skill.HITPOINTS); + restore = overlay.getRestoreValue(Skill.HITPOINTS.getName()); + + final int poisonState = client.getVar(VarPlayer.IS_POISONED); + + if (poisonState > 0 && poisonState < 50) + { + standardColor = COLOR_POISON; + } + else if (poisonState >= 1000000) + { + standardColor = COLOR_VENOM; + } + else + { + standardColor = COLOR_STANDARD; + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/PrayerRenderer.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/PrayerRenderer.java new file mode 100644 index 0000000000..76ed6fadca --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/PrayerRenderer.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018, Rheon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.plugins.statusbars.renderer; + +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.api.Varbits; +import net.runelite.client.game.SkillIconManager; +import net.runelite.client.plugins.statusbars.StatusBarsConfig; +import net.runelite.client.plugins.statusbars.StatusBarsOverlay; +import net.runelite.client.util.ImageUtil; + +import javax.inject.Inject; +import java.awt.Color; + +public class PrayerRenderer extends BarRenderer +{ + private static final Color COLOR_STANDARD = new Color(50, 200, 200, 175); + private static final Color COLOR_ACTIVE = new Color(57, 255, 186, 225); + private static final int SIZE = 17; + + @Inject + public PrayerRenderer(StatusBarsConfig config, SkillIconManager iconManager) + { + super(config); + icon = ImageUtil.resizeImage(iconManager.getSkillImage(Skill.PRAYER, true), SIZE, SIZE); + restoreColor = new Color(57, 255, 186, 75); + } + + @Override + protected void update(Client client, StatusBarsOverlay overlay) + { + maximumValue = client.getRealSkillLevel(Skill.PRAYER); + currentValue = client.getBoostedSkillLevel(Skill.PRAYER); + standardColor = client.getVar(Varbits.QUICK_PRAYER) == 1 ? COLOR_ACTIVE : COLOR_STANDARD; + restore = overlay.getRestoreValue(Skill.PRAYER.getName()); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/SpecialAttackRenderer.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/SpecialAttackRenderer.java new file mode 100644 index 0000000000..a2f43f1c2e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/renderer/SpecialAttackRenderer.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018, Rheon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.runelite.client.plugins.statusbars.renderer; + +import net.runelite.api.Client; +import net.runelite.api.SpriteID; +import net.runelite.api.VarPlayer; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.plugins.statusbars.StatusBarsConfig; +import net.runelite.client.plugins.statusbars.StatusBarsOverlay; + +import javax.inject.Inject; +import java.awt.Color; + +public class SpecialAttackRenderer extends BarRenderer +{ + private final SpriteManager spriteManager; + + @Inject + public SpecialAttackRenderer(StatusBarsConfig config, SpriteManager spriteManager) + { + super(config); + maximumValue = 100; + this.spriteManager = spriteManager; + standardColor = restoreColor = new Color(3, 153, 0, 195); + } + + @Override + protected void update(Client client, StatusBarsOverlay overlay) + { + icon = spriteManager.getSprite(SpriteID.MINIMAP_ORB_SPECIAL_ICON, 0); + currentValue = client.getVar(VarPlayer.SPECIAL_ATTACK_PERCENT) / 10; + restore = 0; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ItemSortTypes.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ItemSortTypes.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ItemSortTypes.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ItemSortTypes.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerPlugin.java index 90d354a74d..ceb85fe365 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/StonedLootTrackerPlugin.java @@ -48,24 +48,24 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.InventoryID; -import api.ItemDefinition; -import api.ItemContainer; -import api.NPC; -import api.NpcID; -import api.Player; -import api.coords.WorldPoint; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.ItemContainerChanged; -import api.events.WidgetLoaded; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -94,9 +94,10 @@ import net.runelite.client.util.Text; name = "Stoned Loot Tracker", description = "Tracks loot from monsters and minigames", tags = {"drops"}, - enabledByDefault = false, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) + @Slf4j public class StonedLootTrackerPlugin extends Plugin { @@ -292,7 +293,7 @@ public class StonedLootTrackerPlugin extends Plugin eventType = "Chambers of Xeric"; container = client.getItemContainer(InventoryID.CHAMBERS_OF_XERIC_CHEST); break; - case (WidgetID.THEATRE_OF_BLOOD_GROUP_ID): + case (WidgetID.THEATRE_OF_BLOOD_REWARD_GROUP_ID): int region = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()).getRegionID(); if (region != THEATRE_OF_BLOOD_REGION) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/BossTab.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/BossTab.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/BossTab.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/BossTab.java index 01ae66eecc..b59752f5f7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/BossTab.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/BossTab.java @@ -30,7 +30,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; @Getter public enum BossTab diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecord.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecord.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecord.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecord.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordCustom.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordCustom.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordCustom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordCustom.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordWriter.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordWriter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordWriter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootRecordWriter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootTrackerItemEntry.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootTrackerItemEntry.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootTrackerItemEntry.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/LootTrackerItemEntry.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/Pet.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/Pet.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/Pet.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/Pet.java index 53e307744a..354ef2bd7c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/Pet.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/Pet.java @@ -3,7 +3,7 @@ package net.runelite.client.plugins.stonedloottracker.data; import java.util.HashMap; import java.util.Map; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; @Getter public enum Pet diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItem.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItem.java index ba974813e8..959327e293 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItem.java @@ -32,7 +32,7 @@ import java.util.Map; import java.util.stream.Collectors; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.ItemID; +import net.runelite.api.ItemID; @RequiredArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItemPrepared.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItemPrepared.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItemPrepared.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/UniqueItemPrepared.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerNameChange.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerNameChange.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerNameChange.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerNameChange.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerRecordStored.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerRecordStored.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerRecordStored.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/data/events/LootTrackerRecordStored.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/ItemPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/ItemPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/ItemPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/ItemPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootGrid.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootGrid.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootGrid.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootGrid.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerBox.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerBox.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/LootTrackerPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/SelectionPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/SelectionPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/SelectionPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/SelectionPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/TextPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/TextPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/TextPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/TextPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/UniqueItemPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/UniqueItemPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/UniqueItemPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stonedloottracker/ui/UniqueItemPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModeConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModeConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModeConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModePlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModePlugin.java index cc70b917c7..cbaceb550b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/StretchedModePlugin.java @@ -27,9 +27,9 @@ package net.runelite.client.plugins.stretchedmode; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.events.ConfigChanged; -import api.events.ResizeableChanged; +import net.runelite.api.Client; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ResizeableChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.MouseManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseListener.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseListener.java index 83b373516a..4720dbe98f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseListener.java @@ -29,7 +29,7 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseEvent; import javax.inject.Inject; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.input.MouseListener; public class TranslateMouseListener implements MouseListener diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseWheelListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseWheelListener.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseWheelListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseWheelListener.java index d8cc7a3628..2fdd39ec03 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseWheelListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stretchedmode/TranslateMouseWheelListener.java @@ -29,7 +29,7 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseWheelEvent; import javax.inject.Inject; -import api.Client; +import net.runelite.api.Client; import net.runelite.client.input.MouseWheelListener; public class TranslateMouseWheelListener implements MouseWheelListener diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/ActionType.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ActionType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/ActionType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ActionType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/BlowpipeDartType.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/BlowpipeDartType.java similarity index 83% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/BlowpipeDartType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/BlowpipeDartType.java index 95a398b498..5ab1a31652 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/BlowpipeDartType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/BlowpipeDartType.java @@ -26,13 +26,13 @@ package net.runelite.client.plugins.suppliestracker; import lombok.AllArgsConstructor; import lombok.Getter; -import static api.ItemID.ADAMANT_DART; -import static api.ItemID.BRONZE_DART; -import static api.ItemID.DRAGON_DART; -import static api.ItemID.IRON_DART; -import static api.ItemID.MITHRIL_DART; -import static api.ItemID.RUNE_DART; -import static api.ItemID.STEEL_DART; +import static net.runelite.api.ItemID.ADAMANT_DART; +import static net.runelite.api.ItemID.BRONZE_DART; +import static net.runelite.api.ItemID.DRAGON_DART; +import static net.runelite.api.ItemID.IRON_DART; +import static net.runelite.api.ItemID.MITHRIL_DART; +import static net.runelite.api.ItemID.RUNE_DART; +import static net.runelite.api.ItemID.STEEL_DART; /** * Type of darts that can be put into the blowpipe diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/MenuAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/MenuAction.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/MenuAction.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/MenuAction.java index aa9a4e6064..76c83d1bb6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/MenuAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/MenuAction.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.suppliestracker; import lombok.AllArgsConstructor; import lombok.Getter; -import api.Item; +import net.runelite.api.Item; /** * Data class that tracks all info related to a menu click action diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesBox.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesBox.java index e1810e1d47..ee4788a3ce 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesBox.java @@ -38,38 +38,38 @@ import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; import lombok.AccessLevel; import lombok.Getter; -import static api.ItemID.ADMIRAL_PIE; -import static api.ItemID.ANCHOVY_PIZZA; -import static api.ItemID.APPLE_PIE; -import static api.ItemID.BOTANICAL_PIE; -import static api.ItemID.CAKE; -import static api.ItemID.CHOCOLATE_CAKE; -import static api.ItemID.CHOCOLATE_SLICE; -import static api.ItemID.FISH_PIE; -import static api.ItemID.GARDEN_PIE; -import static api.ItemID.HALF_AN_ADMIRAL_PIE; -import static api.ItemID.HALF_AN_APPLE_PIE; -import static api.ItemID.HALF_A_BOTANICAL_PIE; -import static api.ItemID.HALF_A_FISH_PIE; -import static api.ItemID.HALF_A_GARDEN_PIE; -import static api.ItemID.HALF_A_MEAT_PIE; -import static api.ItemID.HALF_A_MUSHROOM_PIE; -import static api.ItemID.HALF_A_REDBERRY_PIE; -import static api.ItemID.HALF_A_SUMMER_PIE; -import static api.ItemID.HALF_A_WILD_PIE; -import static api.ItemID.MEAT_PIE; -import static api.ItemID.MEAT_PIZZA; -import static api.ItemID.MUSHROOM_PIE; -import static api.ItemID.PINEAPPLE_PIZZA; -import static api.ItemID.PLAIN_PIZZA; -import static api.ItemID.REDBERRY_PIE; -import static api.ItemID.SLICE_OF_CAKE; -import static api.ItemID.SUMMER_PIE; -import static api.ItemID.WILD_PIE; -import static api.ItemID._12_ANCHOVY_PIZZA; -import static api.ItemID._12_MEAT_PIZZA; -import static api.ItemID._12_PINEAPPLE_PIZZA; -import static api.ItemID._12_PLAIN_PIZZA; +import static net.runelite.api.ItemID.ADMIRAL_PIE; +import static net.runelite.api.ItemID.ANCHOVY_PIZZA; +import static net.runelite.api.ItemID.APPLE_PIE; +import static net.runelite.api.ItemID.BOTANICAL_PIE; +import static net.runelite.api.ItemID.CAKE; +import static net.runelite.api.ItemID.CHOCOLATE_CAKE; +import static net.runelite.api.ItemID.CHOCOLATE_SLICE; +import static net.runelite.api.ItemID.FISH_PIE; +import static net.runelite.api.ItemID.GARDEN_PIE; +import static net.runelite.api.ItemID.HALF_AN_ADMIRAL_PIE; +import static net.runelite.api.ItemID.HALF_AN_APPLE_PIE; +import static net.runelite.api.ItemID.HALF_A_BOTANICAL_PIE; +import static net.runelite.api.ItemID.HALF_A_FISH_PIE; +import static net.runelite.api.ItemID.HALF_A_GARDEN_PIE; +import static net.runelite.api.ItemID.HALF_A_MEAT_PIE; +import static net.runelite.api.ItemID.HALF_A_MUSHROOM_PIE; +import static net.runelite.api.ItemID.HALF_A_REDBERRY_PIE; +import static net.runelite.api.ItemID.HALF_A_SUMMER_PIE; +import static net.runelite.api.ItemID.HALF_A_WILD_PIE; +import static net.runelite.api.ItemID.MEAT_PIE; +import static net.runelite.api.ItemID.MEAT_PIZZA; +import static net.runelite.api.ItemID.MUSHROOM_PIE; +import static net.runelite.api.ItemID.PINEAPPLE_PIZZA; +import static net.runelite.api.ItemID.PLAIN_PIZZA; +import static net.runelite.api.ItemID.REDBERRY_PIE; +import static net.runelite.api.ItemID.SLICE_OF_CAKE; +import static net.runelite.api.ItemID.SUMMER_PIE; +import static net.runelite.api.ItemID.WILD_PIE; +import static net.runelite.api.ItemID._12_ANCHOVY_PIZZA; +import static net.runelite.api.ItemID._12_MEAT_PIZZA; +import static net.runelite.api.ItemID._12_PINEAPPLE_PIZZA; +import static net.runelite.api.ItemID._12_PLAIN_PIZZA; import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerItem.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerItem.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerItem.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java similarity index 75% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java index 930971c532..3731f6df9a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java @@ -40,128 +40,128 @@ import java.util.regex.Pattern; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; -import static api.AnimationID.BLOWPIPE_ATTACK; -import static api.AnimationID.HIGH_LEVEL_MAGIC_ATTACK; -import static api.AnimationID.LOW_LEVEL_MAGIC_ATTACK; -import api.Client; -import api.EquipmentInventorySlot; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.ItemContainer; -import api.ItemID; -import static api.ItemID.ACCUMULATOR_MAX_CAPE; -import static api.ItemID.ADAMANT_DART; -import static api.ItemID.ADAMANT_KNIFE; -import static api.ItemID.ADAMANT_THROWNAXE; -import static api.ItemID.ADMIRAL_PIE; -import static api.ItemID.AIR_RUNE; -import static api.ItemID.ANCHOVY_PIZZA; -import static api.ItemID.APPLE_PIE; -import static api.ItemID.ASSEMBLER_MAX_CAPE; -import static api.ItemID.ASTRAL_RUNE; -import static api.ItemID.AVAS_ACCUMULATOR; -import static api.ItemID.AVAS_ASSEMBLER; -import static api.ItemID.AVAS_ATTRACTOR; -import static api.ItemID.BLACK_CHINCHOMPA; -import static api.ItemID.BLACK_DART; -import static api.ItemID.BLACK_KNIFE; -import static api.ItemID.BLOOD_RUNE; -import static api.ItemID.BODY_RUNE; -import static api.ItemID.BOTANICAL_PIE; -import static api.ItemID.BRONZE_DART; -import static api.ItemID.BRONZE_KNIFE; -import static api.ItemID.BRONZE_THROWNAXE; -import static api.ItemID.CAKE; -import static api.ItemID.CANNONBALL; -import static api.ItemID.CHAOS_RUNE; -import static api.ItemID.CHINCHOMPA_10033; -import static api.ItemID.CHOCOLATE_CAKE; -import static api.ItemID.CHOCOLATE_SLICE; -import static api.ItemID.COINS_995; -import static api.ItemID.COSMIC_RUNE; -import static api.ItemID.DEATH_RUNE; -import static api.ItemID.DRAGON_DART; -import static api.ItemID.DRAGON_KNIFE; -import static api.ItemID.DRAGON_KNIFEP; -import static api.ItemID.DRAGON_KNIFEP_22808; -import static api.ItemID.DRAGON_KNIFEP_22810; -import static api.ItemID.DRAGON_KNIFE_22812; -import static api.ItemID.DRAGON_KNIFE_22814; -import static api.ItemID.DRAGON_THROWNAXE; -import static api.ItemID.DUST_RUNE; -import static api.ItemID.EARTH_RUNE; -import static api.ItemID.FIRE_RUNE; -import static api.ItemID.FISH_PIE; -import static api.ItemID.GARDEN_PIE; -import static api.ItemID.HALF_AN_ADMIRAL_PIE; -import static api.ItemID.HALF_AN_APPLE_PIE; -import static api.ItemID.HALF_A_BOTANICAL_PIE; -import static api.ItemID.HALF_A_FISH_PIE; -import static api.ItemID.HALF_A_GARDEN_PIE; -import static api.ItemID.HALF_A_MEAT_PIE; -import static api.ItemID.HALF_A_MUSHROOM_PIE; -import static api.ItemID.HALF_A_REDBERRY_PIE; -import static api.ItemID.HALF_A_SUMMER_PIE; -import static api.ItemID.HALF_A_WILD_PIE; -import static api.ItemID.IRON_DART; -import static api.ItemID.IRON_KNIFE; -import static api.ItemID.IRON_THROWNAXE; -import static api.ItemID.LAVA_RUNE; -import static api.ItemID.LAW_RUNE; -import static api.ItemID.MEAT_PIE; -import static api.ItemID.MEAT_PIZZA; -import static api.ItemID.MIND_RUNE; -import static api.ItemID.MIST_RUNE; -import static api.ItemID.MITHRIL_DART; -import static api.ItemID.MITHRIL_KNIFE; -import static api.ItemID.MITHRIL_THROWNAXE; -import static api.ItemID.MUD_RUNE; -import static api.ItemID.MUSHROOM_PIE; -import static api.ItemID.NATURE_RUNE; -import static api.ItemID.PINEAPPLE_PIZZA; -import static api.ItemID.PLAIN_PIZZA; -import static api.ItemID.RANGING_CAPE; -import static api.ItemID.REDBERRY_PIE; -import static api.ItemID.RED_CHINCHOMPA_10034; -import static api.ItemID.RUNE_DART; -import static api.ItemID.RUNE_KNIFE; -import static api.ItemID.RUNE_THROWNAXE; -import static api.ItemID.SANGUINESTI_STAFF; -import static api.ItemID.SANGUINESTI_STAFF_UNCHARGED; -import static api.ItemID.SLICE_OF_CAKE; -import static api.ItemID.SMOKE_RUNE; -import static api.ItemID.SOUL_RUNE; -import static api.ItemID.STEAM_RUNE; -import static api.ItemID.STEEL_DART; -import static api.ItemID.STEEL_KNIFE; -import static api.ItemID.STEEL_THROWNAXE; -import static api.ItemID.SUMMER_PIE; -import static api.ItemID.TRIDENT_OF_THE_SEAS; -import static api.ItemID.TRIDENT_OF_THE_SEAS_E; -import static api.ItemID.TRIDENT_OF_THE_SEAS_FULL; -import static api.ItemID.TRIDENT_OF_THE_SWAMP; -import static api.ItemID.TRIDENT_OF_THE_SWAMP_E; -import static api.ItemID.UNCHARGED_TOXIC_TRIDENT; -import static api.ItemID.UNCHARGED_TOXIC_TRIDENT_E; -import static api.ItemID.WATER_RUNE; -import static api.ItemID.WILD_PIE; -import static api.ItemID.WRATH_RUNE; -import static api.ItemID.ZULRAHS_SCALES; -import static api.ItemID._12_ANCHOVY_PIZZA; -import static api.ItemID._12_MEAT_PIZZA; -import static api.ItemID._12_PINEAPPLE_PIZZA; -import static api.ItemID._12_PLAIN_PIZZA; -import static api.ItemID._23_CAKE; -import static api.ItemID._23_CHOCOLATE_CAKE; -import api.Player; -import api.VarPlayer; -import api.events.AnimationChanged; -import api.events.CannonballFired; -import api.events.GameTick; -import api.events.ItemContainerChanged; -import api.events.MenuOptionClicked; -import api.events.VarbitChanged; +import static net.runelite.api.AnimationID.BLOWPIPE_ATTACK; +import static net.runelite.api.AnimationID.HIGH_LEVEL_MAGIC_ATTACK; +import static net.runelite.api.AnimationID.LOW_LEVEL_MAGIC_ATTACK; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import static net.runelite.api.ItemID.ACCUMULATOR_MAX_CAPE; +import static net.runelite.api.ItemID.ADAMANT_DART; +import static net.runelite.api.ItemID.ADAMANT_KNIFE; +import static net.runelite.api.ItemID.ADAMANT_THROWNAXE; +import static net.runelite.api.ItemID.ADMIRAL_PIE; +import static net.runelite.api.ItemID.AIR_RUNE; +import static net.runelite.api.ItemID.ANCHOVY_PIZZA; +import static net.runelite.api.ItemID.APPLE_PIE; +import static net.runelite.api.ItemID.ASSEMBLER_MAX_CAPE; +import static net.runelite.api.ItemID.ASTRAL_RUNE; +import static net.runelite.api.ItemID.AVAS_ACCUMULATOR; +import static net.runelite.api.ItemID.AVAS_ASSEMBLER; +import static net.runelite.api.ItemID.AVAS_ATTRACTOR; +import static net.runelite.api.ItemID.BLACK_CHINCHOMPA; +import static net.runelite.api.ItemID.BLACK_DART; +import static net.runelite.api.ItemID.BLACK_KNIFE; +import static net.runelite.api.ItemID.BLOOD_RUNE; +import static net.runelite.api.ItemID.BODY_RUNE; +import static net.runelite.api.ItemID.BOTANICAL_PIE; +import static net.runelite.api.ItemID.BRONZE_DART; +import static net.runelite.api.ItemID.BRONZE_KNIFE; +import static net.runelite.api.ItemID.BRONZE_THROWNAXE; +import static net.runelite.api.ItemID.CAKE; +import static net.runelite.api.ItemID.CANNONBALL; +import static net.runelite.api.ItemID.CHAOS_RUNE; +import static net.runelite.api.ItemID.CHINCHOMPA_10033; +import static net.runelite.api.ItemID.CHOCOLATE_CAKE; +import static net.runelite.api.ItemID.CHOCOLATE_SLICE; +import static net.runelite.api.ItemID.COINS_995; +import static net.runelite.api.ItemID.COSMIC_RUNE; +import static net.runelite.api.ItemID.DEATH_RUNE; +import static net.runelite.api.ItemID.DRAGON_DART; +import static net.runelite.api.ItemID.DRAGON_KNIFE; +import static net.runelite.api.ItemID.DRAGON_KNIFEP; +import static net.runelite.api.ItemID.DRAGON_KNIFEP_22808; +import static net.runelite.api.ItemID.DRAGON_KNIFEP_22810; +import static net.runelite.api.ItemID.DRAGON_KNIFE_22812; +import static net.runelite.api.ItemID.DRAGON_KNIFE_22814; +import static net.runelite.api.ItemID.DRAGON_THROWNAXE; +import static net.runelite.api.ItemID.DUST_RUNE; +import static net.runelite.api.ItemID.EARTH_RUNE; +import static net.runelite.api.ItemID.FIRE_RUNE; +import static net.runelite.api.ItemID.FISH_PIE; +import static net.runelite.api.ItemID.GARDEN_PIE; +import static net.runelite.api.ItemID.HALF_AN_ADMIRAL_PIE; +import static net.runelite.api.ItemID.HALF_AN_APPLE_PIE; +import static net.runelite.api.ItemID.HALF_A_BOTANICAL_PIE; +import static net.runelite.api.ItemID.HALF_A_FISH_PIE; +import static net.runelite.api.ItemID.HALF_A_GARDEN_PIE; +import static net.runelite.api.ItemID.HALF_A_MEAT_PIE; +import static net.runelite.api.ItemID.HALF_A_MUSHROOM_PIE; +import static net.runelite.api.ItemID.HALF_A_REDBERRY_PIE; +import static net.runelite.api.ItemID.HALF_A_SUMMER_PIE; +import static net.runelite.api.ItemID.HALF_A_WILD_PIE; +import static net.runelite.api.ItemID.IRON_DART; +import static net.runelite.api.ItemID.IRON_KNIFE; +import static net.runelite.api.ItemID.IRON_THROWNAXE; +import static net.runelite.api.ItemID.LAVA_RUNE; +import static net.runelite.api.ItemID.LAW_RUNE; +import static net.runelite.api.ItemID.MEAT_PIE; +import static net.runelite.api.ItemID.MEAT_PIZZA; +import static net.runelite.api.ItemID.MIND_RUNE; +import static net.runelite.api.ItemID.MIST_RUNE; +import static net.runelite.api.ItemID.MITHRIL_DART; +import static net.runelite.api.ItemID.MITHRIL_KNIFE; +import static net.runelite.api.ItemID.MITHRIL_THROWNAXE; +import static net.runelite.api.ItemID.MUD_RUNE; +import static net.runelite.api.ItemID.MUSHROOM_PIE; +import static net.runelite.api.ItemID.NATURE_RUNE; +import static net.runelite.api.ItemID.PINEAPPLE_PIZZA; +import static net.runelite.api.ItemID.PLAIN_PIZZA; +import static net.runelite.api.ItemID.RANGING_CAPE; +import static net.runelite.api.ItemID.REDBERRY_PIE; +import static net.runelite.api.ItemID.RED_CHINCHOMPA_10034; +import static net.runelite.api.ItemID.RUNE_DART; +import static net.runelite.api.ItemID.RUNE_KNIFE; +import static net.runelite.api.ItemID.RUNE_THROWNAXE; +import static net.runelite.api.ItemID.SANGUINESTI_STAFF; +import static net.runelite.api.ItemID.SANGUINESTI_STAFF_UNCHARGED; +import static net.runelite.api.ItemID.SLICE_OF_CAKE; +import static net.runelite.api.ItemID.SMOKE_RUNE; +import static net.runelite.api.ItemID.SOUL_RUNE; +import static net.runelite.api.ItemID.STEAM_RUNE; +import static net.runelite.api.ItemID.STEEL_DART; +import static net.runelite.api.ItemID.STEEL_KNIFE; +import static net.runelite.api.ItemID.STEEL_THROWNAXE; +import static net.runelite.api.ItemID.SUMMER_PIE; +import static net.runelite.api.ItemID.TRIDENT_OF_THE_SEAS; +import static net.runelite.api.ItemID.TRIDENT_OF_THE_SEAS_E; +import static net.runelite.api.ItemID.TRIDENT_OF_THE_SEAS_FULL; +import static net.runelite.api.ItemID.TRIDENT_OF_THE_SWAMP; +import static net.runelite.api.ItemID.TRIDENT_OF_THE_SWAMP_E; +import static net.runelite.api.ItemID.UNCHARGED_TOXIC_TRIDENT; +import static net.runelite.api.ItemID.UNCHARGED_TOXIC_TRIDENT_E; +import static net.runelite.api.ItemID.WATER_RUNE; +import static net.runelite.api.ItemID.WILD_PIE; +import static net.runelite.api.ItemID.WRATH_RUNE; +import static net.runelite.api.ItemID.ZULRAHS_SCALES; +import static net.runelite.api.ItemID._12_ANCHOVY_PIZZA; +import static net.runelite.api.ItemID._12_MEAT_PIZZA; +import static net.runelite.api.ItemID._12_PINEAPPLE_PIZZA; +import static net.runelite.api.ItemID._12_PLAIN_PIZZA; +import static net.runelite.api.ItemID._23_CAKE; +import static net.runelite.api.ItemID._23_CHOCOLATE_CAKE; +import net.runelite.api.Player; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.CannonballFired; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; @@ -184,6 +184,7 @@ import net.runelite.http.api.item.ItemPrice; type = PluginType.UTILITY, enabledByDefault = false ) + @Slf4j public class SuppliesTrackerPlugin extends Plugin { @@ -514,7 +515,7 @@ public class SuppliesTrackerPlugin extends Plugin if (itemContainer.getItems().length > EQUIPMENT_MAINHAND_SLOT) { mainHand = itemContainer.getItems()[EQUIPMENT_MAINHAND_SLOT].getId(); - api.Item mainHandItem = itemContainer.getItems()[EQUIPMENT_MAINHAND_SLOT]; + net.runelite.api.Item mainHandItem = itemContainer.getItems()[EQUIPMENT_MAINHAND_SLOT]; for (int throwingIDs : THROWING_IDS) { if (mainHand == throwingIDs) @@ -560,7 +561,7 @@ public class SuppliesTrackerPlugin extends Plugin //Ammo tracking if (itemContainer.getItems().length > EQUIPMENT_AMMO_SLOT) { - api.Item ammoSlot = itemContainer.getItems()[EQUIPMENT_AMMO_SLOT]; + net.runelite.api.Item ammoSlot = itemContainer.getItems()[EQUIPMENT_AMMO_SLOT]; if (ammoSlot != null) { if (ammoLoaded) @@ -602,23 +603,23 @@ public class SuppliesTrackerPlugin extends Plugin // Create pattern to find eat/drink at beginning Pattern eatPattern = Pattern.compile(EAT_PATTERN); Pattern drinkPattern = Pattern.compile(DRINK_PATTERN); - if (eatPattern.matcher(event.getMenuTarget().toLowerCase()).find() || drinkPattern.matcher(event.getMenuTarget().toLowerCase()).find()) + if (eatPattern.matcher(event.getTarget().toLowerCase()).find() || drinkPattern.matcher(event.getTarget().toLowerCase()).find()) { if (actionStack.stream().noneMatch(a -> { if (a instanceof MenuAction.ItemAction) { MenuAction.ItemAction i = (MenuAction.ItemAction) a; - return i.getItemID() == event.getId(); + return i.getItemID() == event.getIdentifier(); } return false; })) { old = client.getItemContainer(InventoryID.INVENTORY); - int slot = event.getActionParam(); + int slot = event.getActionParam0(); if (old.getItems() != null) { - int pushItem = old.getItems()[event.getActionParam()].getId(); + int pushItem = old.getItems()[event.getActionParam0()].getId(); MenuAction newAction = new MenuAction.ItemAction(CONSUMABLE, old.getItems(), pushItem, slot); actionStack.push(newAction); } @@ -628,8 +629,8 @@ public class SuppliesTrackerPlugin extends Plugin // Create pattern for teleport scrolls and tabs Pattern teleportPattern = Pattern.compile(TELEPORT_PATTERN); Pattern teletabPattern = Pattern.compile(TELETAB_PATTERN); - if (teleportPattern.matcher(event.getMenuTarget().toLowerCase()).find() || - teletabPattern.matcher(event.getMenuTarget().toLowerCase()).find()) + if (teleportPattern.matcher(event.getTarget().toLowerCase()).find() || + teletabPattern.matcher(event.getTarget().toLowerCase()).find()) { old = client.getItemContainer(InventoryID.INVENTORY); @@ -637,17 +638,17 @@ public class SuppliesTrackerPlugin extends Plugin if (old != null && old.getItems() != null && actionStack.stream().noneMatch(a -> a.getType() == TELEPORT)) { - int teleid = event.getId(); - MenuAction newAction = new MenuAction.ItemAction(TELEPORT, old.getItems(), teleid, event.getActionParam()); + int teleid = event.getIdentifier(); + MenuAction newAction = new MenuAction.ItemAction(TELEPORT, old.getItems(), teleid, event.getActionParam0()); actionStack.push(newAction); } } // Create pattern for spell cast Pattern spellPattern = Pattern.compile(SPELL_PATTERN); - // note that here we look at the menuOption not menuTarget b/c the option for all spells is cast + // note that here we look at the option not target b/c the option for all spells is cast // but the target differs based on each spell name - if (spellPattern.matcher(event.getMenuOption().toLowerCase()).find()) + if (spellPattern.matcher(event.getOption().toLowerCase()).find()) { old = client.getItemContainer(InventoryID.INVENTORY); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java similarity index 51% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java index fdb8d45436..5ba66e2747 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java @@ -26,94 +26,94 @@ package net.runelite.client.plugins.tarnslair; import com.google.common.collect.Sets; import java.util.Set; -import static api.NullObjectID.NULL_20575; -import static api.ObjectID.FLOOR_20583; -import static api.ObjectID.FLOOR_20584; -import static api.ObjectID.FLOOR_20628; -import static api.ObjectID.FLOOR_20634; -import static api.ObjectID.FLOOR_20636; -import static api.ObjectID.HANGING_LOG_20571; -import static api.ObjectID.HANGING_LOG_20572; -import static api.ObjectID.HANGING_LOG_20573; -import static api.ObjectID.HANGING_LOG_20574; -import static api.ObjectID.PASSAGEWAY_15770; -import static api.ObjectID.PASSAGEWAY_15771; -import static api.ObjectID.PASSAGEWAY_15772; -import static api.ObjectID.PASSAGEWAY_15773; -import static api.ObjectID.PASSAGEWAY_15774; -import static api.ObjectID.PASSAGEWAY_16129; -import static api.ObjectID.PASSAGEWAY_16130; -import static api.ObjectID.PASSAGEWAY_16131; -import static api.ObjectID.PASSAGEWAY_16132; -import static api.ObjectID.PASSAGEWAY_16133; -import static api.ObjectID.PASSAGEWAY_16134; -import static api.ObjectID.PASSAGEWAY_18307; -import static api.ObjectID.PASSAGEWAY_18308; -import static api.ObjectID.PASSAGEWAY_18309; -import static api.ObjectID.PASSAGEWAY_18310; -import static api.ObjectID.PASSAGEWAY_18311; -import static api.ObjectID.PASSAGEWAY_20488; -import static api.ObjectID.PASSAGEWAY_20489; -import static api.ObjectID.PASSAGEWAY_20490; -import static api.ObjectID.PASSAGEWAY_20491; -import static api.ObjectID.PASSAGEWAY_20492; -import static api.ObjectID.PASSAGEWAY_20493; -import static api.ObjectID.PASSAGEWAY_20495; -import static api.ObjectID.PASSAGEWAY_20497; -import static api.ObjectID.PASSAGEWAY_20498; -import static api.ObjectID.PASSAGEWAY_20499; -import static api.ObjectID.PASSAGEWAY_20500; -import static api.ObjectID.PASSAGEWAY_20501; -import static api.ObjectID.PASSAGEWAY_20502; -import static api.ObjectID.PASSAGEWAY_20503; -import static api.ObjectID.PASSAGEWAY_20504; -import static api.ObjectID.PASSAGEWAY_20505; -import static api.ObjectID.PASSAGEWAY_20506; -import static api.ObjectID.PASSAGEWAY_20507; -import static api.ObjectID.PASSAGEWAY_20509; -import static api.ObjectID.PASSAGEWAY_20510; -import static api.ObjectID.PASSAGEWAY_20511; -import static api.ObjectID.PASSAGEWAY_20512; -import static api.ObjectID.PASSAGEWAY_20513; -import static api.ObjectID.PASSAGEWAY_20514; -import static api.ObjectID.PASSAGEWAY_20515; -import static api.ObjectID.PASSAGEWAY_20516; -import static api.ObjectID.PASSAGEWAY_20517; -import static api.ObjectID.PASSAGEWAY_20518; -import static api.ObjectID.PASSAGEWAY_20519; -import static api.ObjectID.PASSAGEWAY_20520; -import static api.ObjectID.PASSAGEWAY_20521; -import static api.ObjectID.PASSAGEWAY_20522; -import static api.ObjectID.PASSAGEWAY_20523; -import static api.ObjectID.PASSAGEWAY_20524; -import static api.ObjectID.PASSAGEWAY_20525; -import static api.ObjectID.PASSAGEWAY_20526; -import static api.ObjectID.PASSAGEWAY_20527; -import static api.ObjectID.PASSAGEWAY_20528; -import static api.ObjectID.PASSAGEWAY_20529; -import static api.ObjectID.PASSAGEWAY_20530; -import static api.ObjectID.PASSAGEWAY_20531; -import static api.ObjectID.PASSAGEWAY_20532; -import static api.ObjectID.PASSAGEWAY_20533; -import static api.ObjectID.PASSAGEWAY_20534; -import static api.ObjectID.PASSAGEWAY_20535; -import static api.ObjectID.PASSAGEWAY_20536; -import static api.ObjectID.PASSAGEWAY_20537; -import static api.ObjectID.PASSAGEWAY_20538; -import static api.ObjectID.PASSAGEWAY_20539; -import static api.ObjectID.STAIRS_17098; -import static api.ObjectID.STAIRS_17099; -import static api.ObjectID.STAIRS_18973; -import static api.ObjectID.STAIRS_18974; -import static api.ObjectID.WALL_20588; -import static api.ObjectID.WALL_20590; -import static api.ObjectID.WALL_20592; -import static api.ObjectID.WALL_20594; -import static api.ObjectID.WALL_20596; -import static api.ObjectID.WALL_20613; -import static api.ObjectID.WALL_20615; -import static api.ObjectID.WALL_20616; -import static api.ObjectID.WALL_20618; +import static net.runelite.api.NullObjectID.NULL_20575; +import static net.runelite.api.ObjectID.FLOOR_20583; +import static net.runelite.api.ObjectID.FLOOR_20584; +import static net.runelite.api.ObjectID.FLOOR_20628; +import static net.runelite.api.ObjectID.FLOOR_20634; +import static net.runelite.api.ObjectID.FLOOR_20636; +import static net.runelite.api.ObjectID.HANGING_LOG_20571; +import static net.runelite.api.ObjectID.HANGING_LOG_20572; +import static net.runelite.api.ObjectID.HANGING_LOG_20573; +import static net.runelite.api.ObjectID.HANGING_LOG_20574; +import static net.runelite.api.ObjectID.PASSAGEWAY_15770; +import static net.runelite.api.ObjectID.PASSAGEWAY_15771; +import static net.runelite.api.ObjectID.PASSAGEWAY_15772; +import static net.runelite.api.ObjectID.PASSAGEWAY_15773; +import static net.runelite.api.ObjectID.PASSAGEWAY_15774; +import static net.runelite.api.ObjectID.PASSAGEWAY_16129; +import static net.runelite.api.ObjectID.PASSAGEWAY_16130; +import static net.runelite.api.ObjectID.PASSAGEWAY_16131; +import static net.runelite.api.ObjectID.PASSAGEWAY_16132; +import static net.runelite.api.ObjectID.PASSAGEWAY_16133; +import static net.runelite.api.ObjectID.PASSAGEWAY_16134; +import static net.runelite.api.ObjectID.PASSAGEWAY_18307; +import static net.runelite.api.ObjectID.PASSAGEWAY_18308; +import static net.runelite.api.ObjectID.PASSAGEWAY_18309; +import static net.runelite.api.ObjectID.PASSAGEWAY_18310; +import static net.runelite.api.ObjectID.PASSAGEWAY_18311; +import static net.runelite.api.ObjectID.PASSAGEWAY_20488; +import static net.runelite.api.ObjectID.PASSAGEWAY_20489; +import static net.runelite.api.ObjectID.PASSAGEWAY_20490; +import static net.runelite.api.ObjectID.PASSAGEWAY_20491; +import static net.runelite.api.ObjectID.PASSAGEWAY_20492; +import static net.runelite.api.ObjectID.PASSAGEWAY_20493; +import static net.runelite.api.ObjectID.PASSAGEWAY_20495; +import static net.runelite.api.ObjectID.PASSAGEWAY_20497; +import static net.runelite.api.ObjectID.PASSAGEWAY_20498; +import static net.runelite.api.ObjectID.PASSAGEWAY_20499; +import static net.runelite.api.ObjectID.PASSAGEWAY_20500; +import static net.runelite.api.ObjectID.PASSAGEWAY_20501; +import static net.runelite.api.ObjectID.PASSAGEWAY_20502; +import static net.runelite.api.ObjectID.PASSAGEWAY_20503; +import static net.runelite.api.ObjectID.PASSAGEWAY_20504; +import static net.runelite.api.ObjectID.PASSAGEWAY_20505; +import static net.runelite.api.ObjectID.PASSAGEWAY_20506; +import static net.runelite.api.ObjectID.PASSAGEWAY_20507; +import static net.runelite.api.ObjectID.PASSAGEWAY_20509; +import static net.runelite.api.ObjectID.PASSAGEWAY_20510; +import static net.runelite.api.ObjectID.PASSAGEWAY_20511; +import static net.runelite.api.ObjectID.PASSAGEWAY_20512; +import static net.runelite.api.ObjectID.PASSAGEWAY_20513; +import static net.runelite.api.ObjectID.PASSAGEWAY_20514; +import static net.runelite.api.ObjectID.PASSAGEWAY_20515; +import static net.runelite.api.ObjectID.PASSAGEWAY_20516; +import static net.runelite.api.ObjectID.PASSAGEWAY_20517; +import static net.runelite.api.ObjectID.PASSAGEWAY_20518; +import static net.runelite.api.ObjectID.PASSAGEWAY_20519; +import static net.runelite.api.ObjectID.PASSAGEWAY_20520; +import static net.runelite.api.ObjectID.PASSAGEWAY_20521; +import static net.runelite.api.ObjectID.PASSAGEWAY_20522; +import static net.runelite.api.ObjectID.PASSAGEWAY_20523; +import static net.runelite.api.ObjectID.PASSAGEWAY_20524; +import static net.runelite.api.ObjectID.PASSAGEWAY_20525; +import static net.runelite.api.ObjectID.PASSAGEWAY_20526; +import static net.runelite.api.ObjectID.PASSAGEWAY_20527; +import static net.runelite.api.ObjectID.PASSAGEWAY_20528; +import static net.runelite.api.ObjectID.PASSAGEWAY_20529; +import static net.runelite.api.ObjectID.PASSAGEWAY_20530; +import static net.runelite.api.ObjectID.PASSAGEWAY_20531; +import static net.runelite.api.ObjectID.PASSAGEWAY_20532; +import static net.runelite.api.ObjectID.PASSAGEWAY_20533; +import static net.runelite.api.ObjectID.PASSAGEWAY_20534; +import static net.runelite.api.ObjectID.PASSAGEWAY_20535; +import static net.runelite.api.ObjectID.PASSAGEWAY_20536; +import static net.runelite.api.ObjectID.PASSAGEWAY_20537; +import static net.runelite.api.ObjectID.PASSAGEWAY_20538; +import static net.runelite.api.ObjectID.PASSAGEWAY_20539; +import static net.runelite.api.ObjectID.STAIRS_17098; +import static net.runelite.api.ObjectID.STAIRS_17099; +import static net.runelite.api.ObjectID.STAIRS_18973; +import static net.runelite.api.ObjectID.STAIRS_18974; +import static net.runelite.api.ObjectID.WALL_20588; +import static net.runelite.api.ObjectID.WALL_20590; +import static net.runelite.api.ObjectID.WALL_20592; +import static net.runelite.api.ObjectID.WALL_20594; +import static net.runelite.api.ObjectID.WALL_20596; +import static net.runelite.api.ObjectID.WALL_20613; +import static net.runelite.api.ObjectID.WALL_20615; +import static net.runelite.api.ObjectID.WALL_20616; +import static net.runelite.api.ObjectID.WALL_20618; class Obstacles { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java index 55a348a084..e7ed05731e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java @@ -30,8 +30,8 @@ import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java index 871d775c6b..b6dd13f6ad 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java @@ -29,18 +29,18 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.Tile; -import api.TileObject; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.GroundObjectChanged; -import api.events.GroundObjectDespawned; -import api.events.GroundObjectSpawned; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -51,7 +51,8 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Tarn's Lair", description = "Mark tiles and clickboxes to help traverse the maze", tags = {"agility", "maze", "minigame", "overlay"}, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) @Slf4j diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java index 3709f4639b..9dbd2dc861 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java @@ -28,8 +28,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Map; import javax.inject.Inject; -import api.ItemID; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.ItemID; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java index 4c02771130..61d283cbfd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java @@ -33,9 +33,9 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.Player; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixExperienceOverlay.java similarity index 55% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixExperienceOverlay.java index 3fcf59ba34..b702556f5f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/batools/BAToolsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixExperienceOverlay.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Aquivers * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,80 +22,56 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.batools; -import java.awt.Color; -import static java.awt.Color.GREEN; -import static java.awt.Color.RED; +package net.runelite.client.plugins.tearsofguthix; + +import net.runelite.api.Client; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.PanelComponent; +import javax.inject.Inject; import java.awt.Dimension; import java.awt.Graphics2D; -import java.time.Duration; -import java.time.Instant; -import javax.inject.Inject; -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; -@Slf4j - -public class BAToolsOverlay extends Overlay +class TearsOfGuthixExperienceOverlay extends Overlay { - private final BAToolsConfig config; - private BAToolsPlugin plugin; + private final TearsOfGuthixPlugin plugin; + private final PanelComponent panelComponent = new PanelComponent(); @Inject - public BAToolsOverlay(BAToolsPlugin plugin, BAToolsConfig config) + private Client client; + + @Inject + private TearsOfGuthixExperienceOverlay(final TearsOfGuthixPlugin plugin) { - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_SCENE); - this.config = config; + setPosition(OverlayPosition.ABOVE_CHATBOX_RIGHT); + setPriority(OverlayPriority.LOW); this.plugin = plugin; } - @Override public Dimension render(Graphics2D graphics) { - if (!config.healerCodes()) + if (plugin.getPlayerLowestSkill() == null) { return null; } - for (Healer healer : plugin.getHealers().values()) + panelComponent.getChildren().clear(); + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + tableComponent.addRow(plugin.getPlayerLowestSkill().getName(), "Lvl - " + client.getRealSkillLevel(plugin.getPlayerLowestSkill()) + ""); + + if (!tableComponent.isEmpty()) { - Color color; - int timeLeft = healer.getLastFoodTime() - (int) Duration.between(plugin.getWave_start(), Instant.now()).getSeconds(); - timeLeft = timeLeft < 1 ? 0 : timeLeft; - - if (healer.getFoodRemaining() > 1) - { - color = GREEN; - } - else if (healer.getFoodRemaining() == 1) - { - if (timeLeft > 0) - { - color = RED; - } - else - { - color = GREEN; - } - } - else - { - continue; - } - - String text = String.format("%d %d", - healer.getFoodRemaining(), - timeLeft); - - - OverlayUtil.renderActorOverlay(graphics, healer.getNpc(), text, color); + panelComponent.getChildren().add(tableComponent); } - return null; + + return panelComponent.render(graphics); } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java index a9b8c260de..4c1a5569fc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java @@ -30,7 +30,7 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; -import api.Point; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java similarity index 68% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java index d3e60ee397..9d2f1100aa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java @@ -28,13 +28,16 @@ import java.time.Instant; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; +import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.DecorativeObject; -import api.ObjectID; -import api.events.DecorativeObjectDespawned; -import api.events.DecorativeObjectSpawned; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameState; +import net.runelite.api.ObjectID; +import net.runelite.api.Skill; +import net.runelite.api.events.DecorativeObjectDespawned; +import net.runelite.api.events.DecorativeObjectSpawned; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -58,20 +61,29 @@ public class TearsOfGuthixPlugin extends Plugin @Inject private TearsOfGuthixOverlay overlay; - @Getter + @Inject + private TearsOfGuthixExperienceOverlay experienceOverlay; + + @Getter(AccessLevel.PACKAGE) private final Map streams = new HashMap<>(); + @Getter(AccessLevel.PACKAGE) + private Skill playerLowestSkill = null; + @Override protected void startUp() { overlayManager.add(overlay); + overlayManager.add(experienceOverlay); } @Override protected void shutDown() { overlayManager.remove(overlay); + overlayManager.remove(experienceOverlay); streams.clear(); + playerLowestSkill = null; } @Subscribe @@ -84,6 +96,26 @@ public class TearsOfGuthixPlugin extends Plugin case HOPPING: streams.clear(); } + + if (event.getGameState() == GameState.LOGGED_IN) + { + if (client.getLocalPlayer().getWorldLocation().getRegionID() == TOG_REGION) + { + if (playerLowestSkill != null) + { + return; + } + + if (client.getSkillExperience(Skill.HITPOINTS) > 0) + { + playerLowestSkill = getLowestPlayerSkill(); + } + } + else + { + playerLowestSkill = null; + } + } } @Subscribe @@ -112,4 +144,24 @@ public class TearsOfGuthixPlugin extends Plugin DecorativeObject object = event.getDecorativeObject(); streams.remove(object); } + + private Skill getLowestPlayerSkill() + { + final Skill[] playerSkills = Skill.values(); + Skill lowestExperienceSkill = null; + int lowestExperienceAmount = Integer.MAX_VALUE; + + for (Skill skill : playerSkills) + { + int currentSkillExp = client.getSkillExperience(skill); + + if (currentSkillExp < lowestExperienceAmount) + { + lowestExperienceAmount = currentSkillExp; + lowestExperienceSkill = skill; + } + } + + return lowestExperienceSkill; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java index 6e6ff7bbd4..e67560663f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java @@ -1,10 +1,10 @@ package net.runelite.client.plugins.theatre; -import api.*; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; +import net.runelite.api.*; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.OverlayUtil; import java.awt.*; import java.util.Iterator; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreConstant.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreConstant.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreConstant.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreConstant.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreOverlay.java index f65c86a155..492e9a25c4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreOverlay.java @@ -11,7 +11,7 @@ package net.runelite.client.plugins.theatre; import java.awt.*; import java.util.*; import javax.inject.Inject; -import api.*; +import net.runelite.api.*; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatrePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatrePlugin.java similarity index 67% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatrePlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatrePlugin.java index bff574041c..0fe357d9e3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatrePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatrePlugin.java @@ -12,11 +12,16 @@ import com.google.inject.Provides; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import api.Client; -import api.events.*; +import net.runelite.api.Client; +import java.util.LinkedList; +import java.util.List; +import net.runelite.api.events.*; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; import net.runelite.client.plugins.theatre.rooms.BloatHandler; @@ -28,6 +33,7 @@ import net.runelite.client.plugins.theatre.rooms.nylocas.NyloHandler; import net.runelite.client.ui.overlay.OverlayManager; import javax.inject.Inject; +import java.awt.*; @PluginDescriptor( name = "Theatre of Blood", @@ -65,6 +71,8 @@ public class TheatrePlugin extends Plugin @Inject private Client client; + private Widget widget = null; + @Getter(AccessLevel.PUBLIC) @Inject private OverlayManager overlayManager; @@ -173,6 +181,25 @@ public class TheatrePlugin extends Plugin verzikHandler.onAnimationChanged(event); } + @Subscribe + public void onWidgetLoaded(WidgetLoaded event) + { + if (event.getGroupId() != WidgetID.PERFORMERS_FOR_THE_THEATRE_GROUPS_GROUP_ID && event.getGroupId() != WidgetID.PERFORMERS_FOR_THE_THEATRE_PLAYERS_GROUP_ID) + { + return; + } + + if (event.getGroupId() == WidgetID.PERFORMERS_FOR_THE_THEATRE_GROUPS_GROUP_ID) + { + widget = client.getWidget(WidgetID.PERFORMERS_FOR_THE_THEATRE_GROUPS_GROUP_ID, 0); + } + + if (event.getGroupId() == WidgetID.PERFORMERS_FOR_THE_THEATRE_PLAYERS_GROUP_ID) + { + widget = client.getWidget(WidgetID.PERFORMERS_FOR_THE_THEATRE_PLAYERS_GROUP_ID, 0); + } + } + @Subscribe public void onGameTick(GameTick event) { @@ -193,6 +220,95 @@ public class TheatrePlugin extends Plugin if (verzikHandler != null) verzikHandler.onGameTick(); + + if (widget == null) + { + return; + } + + // recheck if the widget is still active + int p_id = WidgetInfo.TO_GROUP(widget.getId()); + + List widgetList = new LinkedList<>(); + + if (p_id == WidgetID.PERFORMERS_FOR_THE_THEATRE_GROUPS_GROUP_ID) + { + Widget w = client.getWidget(p_id, 16); + if (w == null) + { + return; + } + + Widget[] ws = w.getStaticChildren(); + for (Widget widget : ws) + { + Widget[] widgets = widget.getDynamicChildren(); + if (widgets.length > 3) + { + widgetList.add(widgets[3]); + } + } + + } + else if (p_id == WidgetID.PERFORMERS_FOR_THE_THEATRE_PLAYERS_GROUP_ID) + { + Widget w1 = client.getWidget(p_id, 26); + + if (w1 != null) + { + Widget[] dChildsAccepted = w1.getDynamicChildren(); + + if (dChildsAccepted.length > 2) + { + for (int i = 1; i < dChildsAccepted.length; i += 11) + { + if (!dChildsAccepted[i].getText().equals("-")) + { + widgetList.add(dChildsAccepted[i]); + } + } + } + } + + Widget w2 = client.getWidget(p_id, 41); + + if (w2 != null) + { + Widget[] dChildsApplied = w2.getDynamicChildren(); + + if (dChildsApplied.length > 2) + { + for (int i = 1; i < dChildsApplied.length; i += 11) + { + if (!dChildsApplied[i].getText().equals("-")) + { + widgetList.add(dChildsApplied[i]); + } + } + } + } + } + + for (Widget w : widgetList) + { + String wtext = w.getText(); + if (client.isFriended(wtext, false)) + { + w.setTextColor(Color.green.getRGB()); + continue; + } + for (int i = 0; i < client.getIgnoreCount(); i++) + { + String name = client.getIgnores()[i].getName(); + if (name.replace('\u00A0', ' ').equals(wtext)) + { + w.setTextColor(Color.red.getRGB()); + break; + } + } + } + + widget = null; } @Subscribe diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreRoom.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/TheatreRoom.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/TheatreRoom.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/BloatHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/BloatHandler.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/BloatHandler.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/BloatHandler.java index 4c02c7f375..98e229a58b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/BloatHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/BloatHandler.java @@ -2,12 +2,12 @@ package net.runelite.client.plugins.theatre.rooms; import lombok.AccessLevel; import lombok.Getter; -import api.*; -import api.Point; -import api.coords.WorldPoint; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.VarbitChanged; +import net.runelite.api.*; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatrePlugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java index 0b2db61a56..5c926e127b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java @@ -2,14 +2,14 @@ package net.runelite.client.plugins.theatre.rooms; import lombok.AccessLevel; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.GraphicsObject; -import api.NPC; -import api.NpcID; -import api.coords.WorldPoint; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GraphicsObject; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.plugins.theatre.RoomHandler; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatreConstant; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/SotetsegHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/SotetsegHandler.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/SotetsegHandler.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/SotetsegHandler.java index ff1fd1c1d1..03c706c154 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/SotetsegHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/SotetsegHandler.java @@ -2,13 +2,13 @@ package net.runelite.client.plugins.theatre.rooms; import lombok.AccessLevel; import lombok.Getter; -import api.*; -import api.Point; -import api.coords.WorldPoint; -import api.events.GroundObjectSpawned; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.ProjectileMoved; +import net.runelite.api.*; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.ProjectileMoved; import net.runelite.client.plugins.theatre.RoomHandler; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatreConstant; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/VerzikHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/VerzikHandler.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/VerzikHandler.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/VerzikHandler.java index 39f421fc6d..7b02a32106 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/VerzikHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/VerzikHandler.java @@ -2,21 +2,21 @@ package net.runelite.client.plugins.theatre.rooms; import lombok.AccessLevel; import lombok.Getter; -import api.Actor; -import api.ChatMessageType; -import api.Client; -import api.GraphicsObject; -import api.Model; -import api.NPC; -import api.Perspective; -import api.Player; -import api.Point; -import api.Projectile; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.NpcSpawned; -import api.events.ProjectileMoved; +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GraphicsObject; +import net.runelite.api.Model; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Projectile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.ProjectileMoved; import net.runelite.client.plugins.theatre.RoomHandler; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatreConstant; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloHandler.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloHandler.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloHandler.java index 37e6c62dfa..1e84e21eb6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloHandler.java @@ -3,15 +3,15 @@ package net.runelite.client.plugins.theatre.rooms.nylocas; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import api.ChatMessageType; -import api.Client; -import api.NPC; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.plugins.theatre.RoomHandler; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatreConstant; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java similarity index 79% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java index d3e958ef71..0f3e4dd26d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java @@ -24,22 +24,24 @@ */ package net.runelite.client.plugins.theatre.rooms.nylocas; -import api.Client; -import api.NPC; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.NPC; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatrePlugin; import net.runelite.client.plugins.theatre.TheatreRoom; import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; - -import java.awt.*; - -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class NyloOverlay extends Overlay { @@ -100,25 +102,19 @@ class NyloOverlay extends Overlay } panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + int nyloCount = (hagios + toxobolos + ischyros); if (nylohandler.getWave() < 21) { if (nyloCount > 12) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 12" ) - .rightColor(Color.RED) - .build()); + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 12", Color.RED)); } else { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 12" ) - .rightColor(Color.GREEN) - .build()); - + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 12", Color.GREEN)); } } @@ -126,22 +122,16 @@ class NyloOverlay extends Overlay { if (nyloCount > 24) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 24" ) - .rightColor(Color.RED) - .build()); + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 24", Color.RED)); } else { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 24" ) - .rightColor(Color.GREEN) - .build()); + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 24", Color.GREEN)); } } + panelComponent.getChildren().add(tableComponent); + /** panelComponent.getChildren().add(LineComponent.builder() diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloPredictor.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloPredictor.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloPredictor.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloPredictor.java index 0933b566dd..75042fa328 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloPredictor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloPredictor.java @@ -1,9 +1,9 @@ package net.runelite.client.plugins.theatre.rooms.nylocas; -import api.Client; -import api.NPC; -import api.coords.LocalPoint; -import api.events.NpcSpawned; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.NpcSpawned; import java.util.ArrayList; import java.util.HashMap; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java similarity index 68% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java index 044a8d2cb1..3b39af4640 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java @@ -1,16 +1,20 @@ package net.runelite.client.plugins.theatre.rooms.xarpus; -import api.Client; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatrePlugin; -import net.runelite.client.ui.overlay.*; -import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -import java.awt.*; - -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class XarpusCounter extends Overlay { @@ -56,10 +60,11 @@ public class XarpusCounter extends Overlay graphics.getFontMetrics().stringWidth(overlayTitle) + 30, 0 )); - panelComponent.getChildren().add(LineComponent.builder() - .left("Exhumes: ") - .right(String.valueOf(xarpusHandler.getExhumesCount())) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Exhumes", String.valueOf(xarpusHandler.getExhumesCount())); + + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusHandler.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusHandler.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusHandler.java index 25db5d1c94..f8395e14b4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusHandler.java @@ -1,19 +1,19 @@ package net.runelite.client.plugins.theatre.rooms.xarpus; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.GroundObject; -import api.NPC; -import api.NpcID; -import api.Perspective; -import api.Point; -import api.Varbits; -import api.coords.LocalPoint; -import api.events.GroundObjectSpawned; -import api.events.NpcDespawned; -import api.events.NpcSpawned; -import api.events.VarbitChanged; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GroundObject; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Varbits; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.VarbitChanged; import net.runelite.client.plugins.theatre.RoomHandler; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatreConstant; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/timers/RoomTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/timers/RoomTimer.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/timers/RoomTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/timers/RoomTimer.java index fac8274d1a..9fb911a542 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/timers/RoomTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/timers/RoomTimer.java @@ -1,7 +1,7 @@ package net.runelite.client.plugins.theatre.timers; -import api.Client; -import api.Player; +import net.runelite.api.Client; +import net.runelite.api.Player; import net.runelite.client.plugins.theatre.TheatrePlugin; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayMenuEntry; @@ -11,7 +11,7 @@ import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; import javax.inject.Inject; import java.awt.*; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; public class RoomTimer extends Overlay diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/timers/Timeable.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/timers/Timeable.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/theatre/timers/Timeable.java rename to runelite-client/src/main/java/net/runelite/client/plugins/theatre/timers/Timeable.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java index 9b88065b78..abd408abb4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java @@ -31,17 +31,18 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.text.DecimalFormat; import javax.inject.Inject; -import static api.AnimationID.THIEVING_STALL; -import static api.AnimationID.PICKPOCKET_SUCCESS; -import static api.AnimationID.BLOCK_UNARMED; -import api.Client; -import api.Skill; +import static net.runelite.api.AnimationID.BLOCK_UNARMED; +import static net.runelite.api.AnimationID.PICKPOCKET_SUCCESS; +import static net.runelite.api.AnimationID.THIEVING_STALL; +import net.runelite.api.Client; +import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class ThievingOverlay extends Overlay { @@ -95,15 +96,13 @@ public class ThievingOverlay extends Overlay .build()); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Succeeded:") - .right(session.getSuccessful() + (session.getSuccessful() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.THIEVING) + "/hr)" : "")) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panelComponent.getChildren().add(LineComponent.builder() - .left("Failed:") - .right(session.getFailed() + (session.getFailed() >= 1 ? " (" + FORMAT.format(session.getSuccessRate()) + "%)" : "")) - .build()); + tableComponent.addRow("Succeeded:", session.getSuccessful() + (session.getSuccessful() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.THIEVING) + "/hr)" : "")); + tableComponent.addRow("Failed:", session.getFailed() + (session.getFailed() >= 1 ? " (" + FORMAT.format(session.getSuccessRate()) + "%)" : "")); + + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingPlugin.java index 71087bda40..e1babf47fd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingPlugin.java @@ -32,9 +32,9 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import com.google.inject.Provides; -import api.ChatMessageType; -import api.events.ChatMessage; -import api.events.GameTick; +import net.runelite.api.ChatMessageType; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -49,8 +49,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Thieving", description = "Show thieving overlay", tags = {"overlay", "skilling", "thieving", "pickpocketing"}, - type = PluginType.SKILLING + type = PluginType.SKILLING, + enabledByDefault = false ) + @PluginDependency(XpTrackerPlugin.class) public class ThievingPlugin extends Plugin { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingSession.java b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingSession.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/thieving/ThievingSession.java rename to runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingSession.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/NPCContainer.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/NPCContainer.java new file mode 100644 index 0000000000..6edc06cead --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/NPCContainer.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2019, Ganom + * Copyright (c) 2019, Lucas + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.ticktimers; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import java.awt.Color; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.NpcID; +import net.runelite.api.Prayer; + +@Getter +class NPCContainer +{ + private NPC npc; + private int npcIndex; + private String npcName; + private int npcSize; + private ImmutableSet animations; + private int attackSpeed; + @Setter + private int ticksUntilAttack; + @Setter + private Actor npcInteracting; + @Setter + private AttackStyle attackStyle; + + NPCContainer(NPC npc, int attackSpeed) + { + this.npc = npc; + this.npcName = npc.getName(); + this.npcIndex = npc.getIndex(); + this.npcInteracting = npc.getInteracting(); + this.attackStyle = AttackStyle.UNKNOWN; + this.attackSpeed = attackSpeed; + this.ticksUntilAttack = -1; + final NPCDefinition composition = npc.getTransformedDefinition(); + + BossMonsters monster = BossMonsters.of(npc.getId()); + + if (monster == null) + { + throw new IllegalStateException(); + } + + this.animations = monster.animations; + this.attackStyle = monster.attackStyle; + + if (composition != null) + { + this.npcSize = composition.getSize(); + } + } + + @RequiredArgsConstructor + enum BossMonsters + { + SERGEANT_STRONGSTACK(NpcID.SERGEANT_STRONGSTACK, AttackStyle.MELEE, ImmutableSet.of(AnimationID.MINION_AUTO1, AnimationID.MINION_AUTO2, AnimationID.MINION_AUTO3)), + SERGEANT_STEELWILL(NpcID.SERGEANT_STEELWILL, AttackStyle.MAGE, ImmutableSet.of(AnimationID.MINION_AUTO1, AnimationID.MINION_AUTO2, AnimationID.MINION_AUTO3)), + SERGEANT_GRIMSPIKE(NpcID.SERGEANT_GRIMSPIKE, AttackStyle.RANGE, ImmutableSet.of(AnimationID.MINION_AUTO1, AnimationID.MINION_AUTO2, AnimationID.MINION_AUTO4)), + GENERAL_GRAARDOR(NpcID.GENERAL_GRAARDOR, AttackStyle.MELEE, ImmutableSet.of(AnimationID.GENERAL_AUTO1, AnimationID.GENERAL_AUTO2, AnimationID.GENERAL_AUTO3)), + + TSTANON_KARLAK(NpcID.TSTANON_KARLAK, AttackStyle.MELEE, ImmutableSet.of(AnimationID.ZAMMY_GENERIC_AUTO)), + BALFRUG_KREEYATH(NpcID.BALFRUG_KREEYATH, AttackStyle.MAGE, ImmutableSet.of(AnimationID.ZAMMY_GENERIC_AUTO, AnimationID.BALFRUG_AUTO)), + ZAKLN_GRITCH(NpcID.ZAKLN_GRITCH, AttackStyle.RANGE, ImmutableSet.of(AnimationID.ZAMMY_GENERIC_AUTO, AnimationID.ZAKL_AUTO)), + KRIL_TSUTSAROTH(NpcID.KRIL_TSUTSAROTH, AttackStyle.UNKNOWN, ImmutableSet.of(AnimationID.KRIL_SPEC, AnimationID.KRIL_AUTO)), + + STARLIGHT(NpcID.STARLIGHT, AttackStyle.MELEE, ImmutableSet.of(AnimationID.STARLIGHT_AUTO)), + GROWLER(NpcID.GROWLER, AttackStyle.MAGE, ImmutableSet.of(AnimationID.GROWLER_AUTO)), + BREE(NpcID.BREE, AttackStyle.RANGE, ImmutableSet.of(AnimationID.BREE_AUTO)), + COMMANDER_ZILYANA(NpcID.COMMANDER_ZILYANA, AttackStyle.UNKNOWN, ImmutableSet.of(AnimationID.ZILYANA_AUTO, AnimationID.ZILYANA_MELEE_AUTO, AnimationID.ZILYANA_SPEC)), + + FLIGHT_KILISA(NpcID.FLIGHT_KILISA, AttackStyle.MELEE, ImmutableSet.of(AnimationID.KILISA_AUTO)), + FLOCKLEADER_GEERIN(NpcID.FLOCKLEADER_GEERIN, AttackStyle.MAGE, ImmutableSet.of(AnimationID.GEERIN_AUTO, AnimationID.GEERIN_FLINCH)), + WINGMAN_SKREE(NpcID.WINGMAN_SKREE, AttackStyle.RANGE, ImmutableSet.of(AnimationID.SKREE_AUTO)), + KREEARRA(NpcID.KREEARRA, AttackStyle.RANGE, ImmutableSet.of(AnimationID.KREE_RANGED)), + + DAGANNOTH_REX(NpcID.DAGANNOTH_REX, AttackStyle.MAGE, ImmutableSet.of(AnimationID.DAG_REX)), + DAGANNOTH_SUPREME(NpcID.DAGANNOTH_SUPREME, AttackStyle.RANGE, ImmutableSet.of(AnimationID.DAG_SUPREME)), + DAGANNOTH_PRIME(NpcID.DAGANNOTH_PRIME, AttackStyle.MAGE, ImmutableSet.of(AnimationID.DAG_PRIME)); + + private static ImmutableMap idMap; + + static + { + ImmutableMap.Builder builder = ImmutableMap.builder(); + + for (BossMonsters monster : values()) + { + builder.put(monster.npcID, monster); + } + + idMap = builder.build(); + } + + private final int npcID; + private final AttackStyle attackStyle; + private final ImmutableSet animations; + + static BossMonsters of(int npcID) + { + return idMap.get(npcID); + } + } + + @AllArgsConstructor + @Getter + public enum AttackStyle + { + MAGE("Mage", Color.CYAN, Prayer.PROTECT_FROM_MAGIC), + RANGE("Range", Color.GREEN, Prayer.PROTECT_FROM_MISSILES), + MELEE("Melee", Color.RED, Prayer.PROTECT_FROM_MELEE), + UNKNOWN("Unknown", Color.WHITE, null); + + private String name; + private Color color; + private Prayer prayer; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersConfig.java new file mode 100644 index 0000000000..58b0a346cd --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersConfig.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2019, ganom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.ticktimers; + +import java.awt.Font; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Range; +import net.runelite.client.config.Stub; + +@ConfigGroup("TickTimers") +public interface TickTimersConfig extends Config +{ + @ConfigItem( + position = 0, + keyName = "mainConfig", + name = "Main Config", + description = "" + ) + default Stub mainConfig() + { + return new Stub(); + } + + @ConfigItem( + position = 1, + keyName = "prayerWidgetHelper", + name = "Prayer Widget Helper", + description = "Shows you which prayer to click and the time until click.", + parent = "mainConfig" + ) + default boolean showPrayerWidgetHelper() + { + return false; + } + + @ConfigItem( + position = 2, + keyName = "showHitSquares", + name = "Show Hit Squares", + description = "Shows you where the melee bosses can hit you from.", + parent = "mainConfig" + ) + default boolean showHitSquares() + { + return false; + } + + @ConfigItem( + position = 3, + keyName = "changeTickColor", + name = "Change Tick Color", + description = "If this is enabled, it will change the tick color to white" + + "
    at 1 tick remaining, signaling you to swap.", + parent = "mainConfig" + ) + default boolean changeTickColor() + { + return false; + } + + @ConfigItem( + position = 4, + keyName = "bosses", + name = "Bosses", + description = "" + ) + default Stub bosses() + { + return new Stub(); + } + + @ConfigItem( + position = 5, + keyName = "gwd", + name = "God Wars Dungeon", + description = "Show tick timers for GWD Bosses. This must be enabled before you zone in.", + parent = "bosses" + ) + default boolean gwd() + { + return true; + } + + @ConfigItem( + position = 6, + keyName = "dks", + name = "Dagannoth Kings", + description = "Show tick timers for Dagannoth Kings. This must be enabled before you zone in.", + parent = "bosses" + ) + default boolean dks() + { + return true; + } + + @ConfigItem( + position = 7, + keyName = "text", + name = "Text", + description = "" + ) + default Stub text() + { + return new Stub(); + } + + @ConfigItem( + position = 8, + keyName = "fontStyle", + name = "Font Style", + description = "Plain | Bold | Italics", + parent = "text" + ) + default FontStyle fontStyle() + { + return FontStyle.BOLD; + } + + @Range( + min = 14, + max = 40 + ) + @ConfigItem( + position = 9, + keyName = "textSize", + name = "Text Size", + description = "Text Size for Timers.", + parent = "text" + ) + default int textSize() + { + return 32; + } + + @ConfigItem( + position = 10, + keyName = "shadows", + name = "Shadows", + description = "Adds Shadows to text.", + parent = "text" + ) + default boolean shadows() + { + return false; + } + + @Getter + @AllArgsConstructor + enum FontStyle + { + BOLD("Bold", Font.BOLD), + ITALIC("Italic", Font.ITALIC), + PLAIN("Plain", Font.PLAIN); + + private String name; + private int font; + + @Override + public String toString() + { + return getName(); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersPlugin.java new file mode 100644 index 0000000000..2454e42a1e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersPlugin.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2019, Ganom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.ticktimers; + +import com.google.inject.Provides; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.NPCManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.ui.overlay.OverlayManager; + +@PluginDescriptor( + name = "Boss Tick Timers", + description = "Tick timers for bosses", + tags = {"pvm", "bossing"}, + enabledByDefault = false, + type = PluginType.PVM +) + +@Slf4j +public class TickTimersPlugin extends Plugin +{ + private static final int GENERAL_REGION = 11347; + private static final int ARMA_REGION = 11346; + private static final int SARA_REGION = 11601; + private static final int ZAMMY_REGION = 11603; + private static final int WATERBITH_REGION = 11589; + + @Inject + private Client client; + @Inject + private OverlayManager overlayManager; + @Inject + private TimersOverlay timersOverlay; + @Inject + private TickTimersConfig config; + @Inject + private NPCManager npcManager; + @Getter(AccessLevel.PACKAGE) + private Set npcContainer = new HashSet<>(); + private boolean validRegion; + + @Provides + TickTimersConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(TickTimersConfig.class); + } + + @Override + public void startUp() + { + npcContainer.clear(); + } + + @Override + public void shutDown() + { + npcContainer.clear(); + overlayManager.remove(timersOverlay); + validRegion = false; + } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + if (gameStateChanged.getGameState() != GameState.LOGGED_IN) + { + return; + } + + if (regionCheck()) + { + validRegion = true; + overlayManager.add(timersOverlay); + } + else + { + validRegion = false; + overlayManager.remove(timersOverlay); + } + npcContainer.clear(); + } + + @Subscribe + public void onNpcSpawned(NpcSpawned event) + { + if (!validRegion) + { + return; + } + + NPC npc = event.getNpc(); + + switch (npc.getId()) + { + case NpcID.SERGEANT_STRONGSTACK: + case NpcID.SERGEANT_STEELWILL: + case NpcID.SERGEANT_GRIMSPIKE: + case NpcID.GENERAL_GRAARDOR: + case NpcID.TSTANON_KARLAK: + case NpcID.BALFRUG_KREEYATH: + case NpcID.ZAKLN_GRITCH: + case NpcID.KRIL_TSUTSAROTH: + case NpcID.STARLIGHT: + case NpcID.BREE: + case NpcID.GROWLER: + case NpcID.COMMANDER_ZILYANA: + case NpcID.FLIGHT_KILISA: + case NpcID.FLOCKLEADER_GEERIN: + case NpcID.WINGMAN_SKREE: + case NpcID.KREEARRA: + if (config.gwd()) + { + npcContainer.add(new NPCContainer(npc, npcManager.getAttackSpeed(npc.getId()))); + } + break; + case NpcID.DAGANNOTH_REX: + case NpcID.DAGANNOTH_SUPREME: + case NpcID.DAGANNOTH_PRIME: + if (config.dks()) + { + npcContainer.add(new NPCContainer(npc, npcManager.getAttackSpeed(npc.getId()))); + } + break; + } + } + + @Subscribe + public void onNpcDespawned(NpcDespawned event) + { + if (!validRegion) + { + return; + } + + NPC npc = event.getNpc(); + + switch (npc.getId()) + { + case NpcID.SERGEANT_STRONGSTACK: + case NpcID.SERGEANT_STEELWILL: + case NpcID.SERGEANT_GRIMSPIKE: + case NpcID.GENERAL_GRAARDOR: + case NpcID.TSTANON_KARLAK: + case NpcID.BALFRUG_KREEYATH: + case NpcID.ZAKLN_GRITCH: + case NpcID.KRIL_TSUTSAROTH: + case NpcID.STARLIGHT: + case NpcID.BREE: + case NpcID.GROWLER: + case NpcID.COMMANDER_ZILYANA: + case NpcID.FLIGHT_KILISA: + case NpcID.FLOCKLEADER_GEERIN: + case NpcID.WINGMAN_SKREE: + case NpcID.KREEARRA: + case NpcID.DAGANNOTH_REX: + case NpcID.DAGANNOTH_SUPREME: + case NpcID.DAGANNOTH_PRIME: + npcContainer.removeIf(c -> c.getNpc() == npc); + break; + } + } + + @Subscribe + public void onGameTick(GameTick Event) + { + if (!validRegion) + { + return; + } + + handleBosses(); + } + + private void handleBosses() + { + for (NPCContainer npcs : getNpcContainer()) + { + if (npcs.getTicksUntilAttack() >= 0) + { + npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); + } + + for (int anims : npcs.getAnimations()) + { + if (anims == npcs.getNpc().getAnimation()) + { + if (npcs.getTicksUntilAttack() < 1) + { + npcs.setTicksUntilAttack(npcs.getAttackSpeed()); + } + } + } + } + } + + private boolean regionCheck() + { + return Arrays.stream(client.getMapRegions()).anyMatch( + x -> x == ARMA_REGION || x == GENERAL_REGION || x == ZAMMY_REGION || x == SARA_REGION || x == WATERBITH_REGION + ); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java new file mode 100644 index 0000000000..a07cf1bede --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2019, Ganom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.ticktimers; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.util.List; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.OverlayUtil; + +public class TimersOverlay extends Overlay +{ + private TickTimersPlugin plugin; + private Client client; + private TickTimersConfig config; + + @Inject + TimersOverlay(TickTimersPlugin plugin, Client client, TickTimersConfig config) + { + this.plugin = plugin; + this.client = client; + this.config = config; + setPosition(OverlayPosition.DYNAMIC); + setPriority(OverlayPriority.HIGHEST); + setLayer(OverlayLayer.ALWAYS_ON_TOP); + } + + @Override + public Dimension render(Graphics2D graphics) + { + for (NPCContainer npc : plugin.getNpcContainer()) + { + if (npc.getNpc() == null) + { + continue; + } + + int ticksLeft = npc.getTicksUntilAttack(); + final List hitSquares = getHitSquares(npc.getNpc().getWorldLocation(), npc.getNpcSize(), 1, false); + final NPCContainer.AttackStyle attackStyle = npc.getAttackStyle(); + + if (config.showHitSquares() && attackStyle.getName().equals("Melee")) + { + for (WorldPoint p : hitSquares) + { + OverlayUtil.drawTile(graphics, client, p, client.getLocalPlayer().getWorldLocation(), attackStyle.getColor(), 0, 0, 50); + } + } + + if (ticksLeft <= 0) + { + continue; + } + + final String ticksLeftStr = String.valueOf(ticksLeft); + final int font = config.fontStyle().getFont(); + final boolean shadows = config.shadows(); + Color color = (ticksLeft <= 1 ? Color.WHITE : attackStyle.getColor()); + + if (!config.changeTickColor()) + { + color = attackStyle.getColor(); + } + + final Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, Integer.toString(ticksLeft), 0); + + OverlayUtil.renderTextLocation(graphics, ticksLeftStr, config.textSize(), font, color, canvasPoint, shadows, 0); + + if (config.showPrayerWidgetHelper() && attackStyle.getPrayer() != null) + { + Rectangle bounds = OverlayUtil.renderPrayerOverlay(graphics, client, attackStyle.getPrayer(), color); + + if (bounds != null) + { + renderTextLocation(graphics, ticksLeftStr, 16, config.fontStyle().getFont(), color, centerPoint(bounds), shadows); + } + } + } + return null; + } + + private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint, boolean shadows) + { + graphics.setFont(new Font("Arial", fontStyle, fontSize)); + if (canvasPoint != null) + { + final Point canvasCenterPoint = new Point( + canvasPoint.getX() - 3, + canvasPoint.getY() + 6); + final Point canvasCenterPoint_shadow = new Point( + canvasPoint.getX() - 2, + canvasPoint.getY() + 7); + if (shadows) + { + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); + } + OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); + } + } + + private List getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder) + { + List little = new WorldArea(npcLoc, npcSize, npcSize).toWorldPointList(); + List big = new WorldArea(npcLoc.getX() - thickness, npcLoc.getY() - thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList(); + if (!includeUnder) + { + big.removeIf(little::contains); + } + return big; + } + + private Point centerPoint(Rectangle rect) + { + int x = (int) (rect.getX() + rect.getWidth() / 2); + int y = (int) (rect.getY() + rect.getHeight() / 2); + return new Point(x, y); + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java similarity index 66% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java index 9a5e0bad33..0d1022d92f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java @@ -35,9 +35,9 @@ public interface TileIndicatorsConfig extends Config { @Alpha @ConfigItem( - keyName = "highlightDestinationColor", - name = "Color of current destination highlighting", - description = "Configures the highlight color of current destination" + keyName = "highlightDestinationColor", + name = "Color of current destination highlighting", + description = "Configures the highlight color of current destination" ) default Color highlightDestinationColor() { @@ -45,9 +45,9 @@ public interface TileIndicatorsConfig extends Config } @ConfigItem( - keyName = "highlightDestinationTile", - name = "Highlight destination tile", - description = "Highlights tile player is walking to" + keyName = "highlightDestinationTile", + name = "Highlight destination tile", + description = "Highlights tile player is walking to" ) default boolean highlightDestinationTile() { @@ -56,9 +56,30 @@ public interface TileIndicatorsConfig extends Config @Alpha @ConfigItem( - keyName = "highlightHoveredColor", - name = "Color of current hovered highlighting", - description = "Configures the highlight color of hovered tile" + keyName = "highlightCurrentColor", + name = "Color of current tile highlighting", + description = "Configures the highlight color of current tile position" + ) + default Color highlightCurrentColor() + { + return Color.CYAN; + } + + @ConfigItem( + keyName = "highlightCurrentTile", + name = "Highlight current tile", + description = "Highlights tile player is on" + ) + default boolean highlightCurrentTile() + { + return false; + } + + @Alpha + @ConfigItem( + keyName = "highlightHoveredColor", + name = "Color of current hovered highlighting", + description = "Configures the highlight color of hovered tile" ) default Color highlightHoveredColor() { @@ -66,9 +87,9 @@ public interface TileIndicatorsConfig extends Config } @ConfigItem( - keyName = "highlightHoveredTile", - name = "Highlight hovered tile", - description = "Highlights tile player is hovering with mouse" + keyName = "highlightHoveredTile", + name = "Highlight hovered tile", + description = "Highlights tile player is hovering with mouse" ) default boolean highlightHoveredTile() { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java similarity index 83% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java index dd36a1eee1..938a842088 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java @@ -29,9 +29,10 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -70,6 +71,23 @@ public class TileIndicatorsOverlay extends Overlay renderTile(graphics, client.getLocalDestinationLocation(), config.highlightDestinationColor()); } + if (config.highlightCurrentTile()) + { + final WorldPoint playerPos = client.getLocalPlayer().getWorldLocation(); + if (playerPos == null) + { + return null; + } + + final LocalPoint playerPosLocal = LocalPoint.fromWorld(client, client.getLocalPlayer().getWorldLocation()); + if (playerPosLocal == null) + { + return null; + } + + renderTile(graphics, playerPosLocal, config.highlightCurrentColor()); + } + return null; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsPlugin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsPlugin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java index fa726b625c..b91f8c7080 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java @@ -28,7 +28,7 @@ import java.awt.Color; import java.awt.image.BufferedImage; import lombok.AccessLevel; import lombok.Getter; -import api.SpriteID; +import net.runelite.api.SpriteID; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java index 4ab8d559a5..dcd739fad6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java @@ -31,9 +31,9 @@ import java.awt.image.BufferedImage; import java.time.Duration; import java.time.temporal.ChronoUnit; import lombok.Getter; -import api.GraphicID; -import api.ItemID; -import api.SpriteID; +import net.runelite.api.GraphicID; +import net.runelite.api.ItemID; +import net.runelite.api.SpriteID; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameTimerImageType.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimerImageType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/GameTimerImageType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimerImageType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TeleportWidget.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TeleportWidget.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TeleportWidget.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/TeleportWidget.java index a3b6d2f887..a5e3c44a2e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TeleportWidget.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TeleportWidget.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.timers; import com.google.common.collect.ImmutableList; import java.util.Collection; import javax.annotation.Nullable; -import api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetInfo; enum TeleportWidget { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java index 6d6db90404..db7048c094 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java @@ -30,43 +30,43 @@ import com.google.inject.Provides; import java.awt.image.BufferedImage; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.AnimationID; -import api.ChatMessageType; -import api.Client; -import api.EquipmentInventorySlot; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.ItemID; -import api.NPC; -import api.NpcID; -import api.Player; -import api.Prayer; -import api.Skill; -import api.SkullIcon; -import api.VarPlayer; -import api.Varbits; -import api.WorldType; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.BoostedLevelChanged; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.SpotAnimationChanged; -import api.events.ItemContainerChanged; -import api.events.LocalPlayerDeath; -import api.events.MenuOptionClicked; -import api.events.NpcDespawned; -import api.events.VarbitChanged; -import api.events.WidgetHiddenChanged; -import api.widgets.Widget; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; -import static api.widgets.WidgetInfo.PVP_WORLD_SAFE_ZONE; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Player; +import net.runelite.api.Prayer; +import net.runelite.api.Skill; +import net.runelite.api.SkullIcon; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.BoostedLevelChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.SpotAnimationChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.LocalPlayerDeath; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import static net.runelite.api.widgets.WidgetInfo.PVP_WORLD_SAFE_ZONE; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; @@ -126,13 +126,13 @@ public class TimersPlugin extends Plugin private static final String CANNON_REPAIR_MESSAGE = "You repair your cannon, restoring it to working order."; private static final String CHARGE_EXPIRED_MESSAGE = "Your magical charge fades away."; private static final String CHARGE_MESSAGE = "You feel charged with magic power."; - private static final String DEADMAN_HALF_TELEBLOCK_MESSAGE = "A teleblock spell has been cast on you. It will expire in 1 minute, 15 seconds."; + private static final String DEADMAN_HALF_TELEBLOCK_MESSAGE = "A Tele Block spell has been cast on you. It will expire in 1 minute, 15 seconds."; private static final String EXTENDED_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended antifire potion."; private static final String EXTENDED_SUPER_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended super antifire potion."; private static final String FROZEN_MESSAGE = "You have been frozen!"; - private static final String FULL_TELEBLOCK_MESSAGE = "A teleblock spell has been cast on you. It will expire in 5 minutes, 0 seconds."; + private static final String FULL_TELEBLOCK_MESSAGE = "A Tele Block spell has been cast on you. It will expire in 5 minutes, 0 seconds."; private static final String GOD_WARS_ALTAR_MESSAGE = "you recharge your prayer."; - private static final String HALF_TELEBLOCK_MESSAGE = "A teleblock spell has been cast on you. It will expire in 2 minutes, 30 seconds."; + private static final String HALF_TELEBLOCK_MESSAGE = "A Tele Block spell has been cast on you. It will expire in 2 minutes, 30 seconds."; private static final String IMBUED_HEART_READY_MESSAGE = "Your imbued heart has regained its magical power."; private static final String IMBUED_HEART_NOTREADY_MESSAGE = "The heart is still drained of its power."; private static final String MAGIC_IMBUE_EXPIRED_MESSAGE = "Your Magic Imbue charge has ended."; @@ -396,9 +396,9 @@ public class TimersPlugin extends Plugin public void onMenuOptionClicked(MenuOptionClicked event) { if (config.showStamina() - && event.getMenuOption().contains("Drink") - && (event.getId() == ItemID.STAMINA_MIX1 - || event.getId() == ItemID.STAMINA_MIX2)) + && event.getOption().contains("Drink") + && (event.getIdentifier() == ItemID.STAMINA_MIX1 + || event.getIdentifier() == ItemID.STAMINA_MIX2)) { // Needs menu option hook because mixes use a common drink message, distinct from their standard potion messages createGameTimer(STAMINA); @@ -406,9 +406,9 @@ public class TimersPlugin extends Plugin } if (config.showAntiFire() - && event.getMenuOption().contains("Drink") - && (event.getId() == ItemID.ANTIFIRE_MIX1 - || event.getId() == ItemID.ANTIFIRE_MIX2)) + && event.getOption().contains("Drink") + && (event.getIdentifier() == ItemID.ANTIFIRE_MIX1 + || event.getIdentifier() == ItemID.ANTIFIRE_MIX2)) { // Needs menu option hook because mixes use a common drink message, distinct from their standard potion messages createGameTimer(ANTIFIRE); @@ -416,9 +416,9 @@ public class TimersPlugin extends Plugin } if (config.showAntiFire() - && event.getMenuOption().contains("Drink") - && (event.getId() == ItemID.EXTENDED_ANTIFIRE_MIX1 - || event.getId() == ItemID.EXTENDED_ANTIFIRE_MIX2)) + && event.getOption().contains("Drink") + && (event.getIdentifier() == ItemID.EXTENDED_ANTIFIRE_MIX1 + || event.getIdentifier() == ItemID.EXTENDED_ANTIFIRE_MIX2)) { // Needs menu option hook because mixes use a common drink message, distinct from their standard potion messages createGameTimer(EXANTIFIRE); @@ -426,9 +426,9 @@ public class TimersPlugin extends Plugin } if (config.showAntiFire() - && event.getMenuOption().contains("Drink") - && (event.getId() == ItemID.SUPER_ANTIFIRE_MIX1 - || event.getId() == ItemID.SUPER_ANTIFIRE_MIX2)) + && event.getOption().contains("Drink") + && (event.getIdentifier() == ItemID.SUPER_ANTIFIRE_MIX1 + || event.getIdentifier() == ItemID.SUPER_ANTIFIRE_MIX2)) { // Needs menu option hook because mixes use a common drink message, distinct from their standard potion messages createGameTimer(SUPERANTIFIRE); @@ -436,23 +436,23 @@ public class TimersPlugin extends Plugin } if (config.showAntiFire() - && event.getMenuOption().contains("Drink") - && (event.getId() == ItemID.EXTENDED_SUPER_ANTIFIRE_MIX1 - || event.getId() == ItemID.EXTENDED_SUPER_ANTIFIRE_MIX2)) + && event.getOption().contains("Drink") + && (event.getIdentifier() == ItemID.EXTENDED_SUPER_ANTIFIRE_MIX1 + || event.getIdentifier() == ItemID.EXTENDED_SUPER_ANTIFIRE_MIX2)) { // Needs menu option hook because mixes use a common drink message, distinct from their standard potion messages createGameTimer(EXSUPERANTIFIRE); return; } - TeleportWidget teleportWidget = TeleportWidget.of(event.getWidgetId()); + TeleportWidget teleportWidget = TeleportWidget.of(event.getActionParam1()); if (teleportWidget != null) { lastTeleportClicked = teleportWidget; } if (config.showImbuedHeart() - && event.getMenuOption().contains("Invigorate")) + && event.getOption().contains("Invigorate")) { // Needs a hook as there's a few cases where potions boost the same amount as the heart imbuedHeartClicked = true; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timestamp/TimestampConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timestamp/TimestampConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java index a590f86be8..4379d37844 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java @@ -34,11 +34,11 @@ import java.time.ZonedDateTime; import java.util.Date; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.MessageNode; -import api.Varbits; -import api.events.ConfigChanged; -import api.events.ScriptCallbackEvent; +import net.runelite.api.Client; +import net.runelite.api.MessageNode; +import net.runelite.api.Varbits; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java index 520dcb0f3b..973eec5eaa 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java @@ -35,6 +35,7 @@ import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; +import net.runelite.api.Constants; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; @@ -60,7 +61,7 @@ class OverviewItemPanel extends JPanel setBorder(new EmptyBorder(7, 7, 7, 7)); JLabel iconLabel = new JLabel(); - iconLabel.setMinimumSize(new Dimension(36, 32)); + iconLabel.setMinimumSize(new Dimension(Constants.ITEM_SPRITE_WIDTH, Constants.ITEM_SPRITE_HEIGHT)); itemManager.getImage(tab.getItemID()).addTo(iconLabel); add(iconLabel, BorderLayout.WEST); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/SummaryState.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/SummaryState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/SummaryState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/SummaryState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/Tab.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/Tab.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/Tab.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/Tab.java index 57a3bb1700..dc9a44a0d1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/Tab.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/Tab.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.timetracking; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.ItemID; +import net.runelite.api.ItemID; @RequiredArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java index 5fa93d97a1..9279883311 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java @@ -33,14 +33,14 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameTick; -import api.events.UsernameChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.UsernameChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeablePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeablePanel.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeablePanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeablePanel.java index 8bbb5ae4ab..c01f770063 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/TimeablePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeablePanel.java @@ -33,6 +33,7 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import lombok.Getter; +import net.runelite.api.Constants; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.components.ThinProgressBar; @@ -58,7 +59,7 @@ public class TimeablePanel extends JPanel topContainer.setLayout(new BorderLayout()); topContainer.setBackground(ColorScheme.DARKER_GRAY_COLOR); - icon.setMinimumSize(new Dimension(36, 32)); + icon.setMinimumSize(new Dimension(Constants.ITEM_SPRITE_WIDTH, Constants.ITEM_SPRITE_HEIGHT)); JPanel infoPanel = new JPanel(); infoPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/Clock.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Clock.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/Clock.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Clock.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/Stopwatch.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Stopwatch.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/Stopwatch.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Stopwatch.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/StopwatchPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/StopwatchPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/StopwatchPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/StopwatchPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingPatch.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingPatch.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingPatch.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingPatch.java index 70453a972d..8c24588917 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingPatch.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingPatch.java @@ -28,7 +28,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import api.Varbits; +import net.runelite.api.Varbits; @RequiredArgsConstructor( access = AccessLevel.PACKAGE diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingRegion.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingRegion.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingRegion.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingRegion.java index 8267548943..c768d30c14 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingRegion.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingRegion.java @@ -25,8 +25,8 @@ package net.runelite.client.plugins.timetracking.farming; import lombok.Getter; -import api.Varbits; -import api.coords.WorldPoint; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; @Getter public class FarmingRegion diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java index 85655940c3..276e50a658 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.timetracking.farming; +import net.runelite.api.vars.Autoweed; import com.google.inject.Inject; import com.google.inject.Singleton; import java.time.Instant; @@ -31,10 +32,9 @@ import java.util.EnumMap; import java.util.Map; import java.util.Set; import javax.annotation.Nullable; -import api.Client; -import api.Varbits; -import api.coords.WorldPoint; -import api.vars.Autoweed; +import net.runelite.api.Client; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.timetracking.SummaryState; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java index 6f219abd83..d74d9027f3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java @@ -34,8 +34,8 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import lombok.Getter; -import api.Varbits; -import api.coords.WorldPoint; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.timetracking.Tab; @Singleton diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchPrediction.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchPrediction.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchPrediction.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchPrediction.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java index bfb6bcf311..66883eedba 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.timetracking.farming; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.ItemID; -import api.NullItemID; +import net.runelite.api.ItemID; +import net.runelite.api.NullItemID; @RequiredArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouse.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouse.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouse.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouse.java index 9548b0fc89..009a2bd7e6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouse.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouse.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.timetracking.hunter; import javax.annotation.Nullable; import lombok.AllArgsConstructor; import lombok.Getter; -import api.ItemID; +import net.runelite.api.ItemID; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseData.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseData.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseData.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseSpace.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseSpace.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseSpace.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseSpace.java index 90b29102ab..635ce2a4e3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseSpace.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseSpace.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.timetracking.hunter; import lombok.AllArgsConstructor; import lombok.Getter; -import api.VarPlayer; +import net.runelite.api.VarPlayer; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseState.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTabPanel.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTabPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTabPanel.java index c46da12c06..c8935b850a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTabPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTabPanel.java @@ -30,7 +30,7 @@ import java.awt.Color; import java.time.Instant; import java.util.ArrayList; import java.util.List; -import api.ItemID; +import net.runelite.api.ItemID; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.timetracking.TabContentPanel; import net.runelite.client.plugins.timetracking.TimeTrackingConfig; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTracker.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTracker.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTracker.java rename to runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTracker.java index e7715c411f..bfb71e3287 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTracker.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/hunter/BirdHouseTracker.java @@ -36,8 +36,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.coords.WorldPoint; +import net.runelite.api.Client; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ItemManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlant.java b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlant.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlant.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlant.java index ee690dfd67..f7dce4fbfc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlant.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlant.java @@ -28,8 +28,8 @@ import java.time.Duration; import java.time.Instant; import lombok.Getter; import lombok.Setter; -import api.GameObject; -import api.coords.WorldPoint; +import net.runelite.api.GameObject; +import net.runelite.api.coords.WorldPoint; class TitheFarmPlant { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantOverlay.java index 5ae343fd16..5e39d3b452 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantOverlay.java @@ -30,11 +30,11 @@ import java.awt.Graphics2D; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.widgets.Widget; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.widgets.Widget; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantState.java b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantState.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantState.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantType.java b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantType.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantType.java index 40c09b60da..04a48e6eb3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlantType.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.tithefarm; import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; -import api.ObjectID; +import net.runelite.api.ObjectID; public enum TitheFarmPlantType { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlugin.java index 4eb3d1ed0f..ae3ee54894 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPlugin.java @@ -30,11 +30,11 @@ import java.util.Set; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.GameObject; -import api.coords.WorldPoint; -import api.events.ConfigChanged; -import api.events.GameObjectSpawned; -import api.events.GameTick; +import net.runelite.api.GameObject; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPluginConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPluginConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmPluginConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tmorph/TMorph.java b/runelite-client/src/main/java/net/runelite/client/plugins/tmorph/TMorph.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tmorph/TMorph.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tmorph/TMorph.java index 8b52373e30..e7795025b3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tmorph/TMorph.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tmorph/TMorph.java @@ -25,13 +25,13 @@ package net.runelite.client.plugins.tmorph; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.GameState; -import api.Player; -import api.events.AnimationChanged; -import api.events.GameTick; -import api.kit.KitType; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.kit.KitType; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -43,7 +43,8 @@ import org.apache.commons.lang3.ObjectUtils; name = "TMorph", description = "Want to wear a infernal cape? well now you can!", tags = {"transform", "model", "item", "morph"}, - type = PluginType.UTILITY + type = PluginType.UTILITY, + enabledByDefault = false ) public class TMorph extends Plugin @@ -63,7 +64,7 @@ public class TMorph extends Plugin @Subscribe public void onAnimationChanged(AnimationChanged event) { - if (config.animationTarget() < 0 && config.animationSwap() < 0) + if (config.animationTarget() <= 0 && config.animationSwap() <= 0 && config.globalAnimSwap() > 0) { if (event.getActor().getAnimation() != -1) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tmorph/TMorphConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/tmorph/TMorphConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tmorph/TMorphConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tmorph/TMorphConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java index fa374148d6..2cb2ff0de8 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java @@ -27,20 +27,20 @@ package net.runelite.client.plugins.tobdamagecount; import java.text.DecimalFormat; import javax.inject.Inject; -import api.Actor; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.NPC; -import api.NpcID; -import api.Player; -import api.Skill; -import api.coords.WorldPoint; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.HitsplatApplied; -import api.events.LocalPlayerDeath; -import api.events.NpcDespawned; +import net.runelite.api.Actor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.Player; +import net.runelite.api.Skill; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.LocalPlayerDeath; +import net.runelite.api.events.NpcDespawned; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/TwitchConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/TwitchConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java index cbc0d578b8..ce7b25acb3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java @@ -30,10 +30,10 @@ import java.time.temporal.ChronoUnit; import java.util.Map; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.Client; -import api.GameState; -import api.events.ConfigChanged; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/irc/Message.java b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/irc/Message.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/irc/Message.java rename to runelite-client/src/main/java/net/runelite/client/plugins/twitch/irc/Message.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchIRCClient.java b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchIRCClient.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchIRCClient.java rename to runelite-client/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchIRCClient.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchListener.java rename to runelite-client/src/main/java/net/runelite/client/plugins/twitch/irc/TwitchListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vetion/VetionOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/vetion/VetionOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/vetion/VetionOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/vetion/VetionOverlay.java index 33ceb7882c..6dccc6abc3 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vetion/VetionOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vetion/VetionOverlay.java @@ -30,10 +30,10 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vetion/VetionPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/vetion/VetionPlugin.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/vetion/VetionPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/vetion/VetionPlugin.java index 4160429890..7f4ccff362 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vetion/VetionPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vetion/VetionPlugin.java @@ -29,9 +29,9 @@ import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import lombok.Getter; -import api.Actor; -import api.AnimationID; -import api.events.AnimationChanged; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.events.AnimationChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -42,8 +42,10 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Vetion Helper", description = "Tracks Vet'ion's special attacks", tags = {"bosses", "combat", "pve", "overlay"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) + public class VetionPlugin extends Plugin { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java index 19776a5764..7be76a31b4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java @@ -27,11 +27,11 @@ package net.runelite.client.plugins.virtuallevels; import com.google.inject.Provides; import javax.inject.Inject; -import api.Client; -import api.Experience; -import api.Skill; -import api.events.ConfigChanged; -import api.events.ScriptCallbackEvent; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Skill; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/Vorkath.java b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/Vorkath.java new file mode 100644 index 0000000000..2691f4991d --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/Vorkath.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2019, Infinitay + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.vorkath; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.NPC; + +@Data +@Slf4j +public class Vorkath +{ + static final int ATTACKS_PER_SWITCH = 6; + static final int FIRE_BALL_ATTACKS = 25; + + private NPC vorkath; + + private VorkathAttack lastAttack; + + private Phase currentPhase; + private Phase nextPhase; + private Phase lastPhase; + + private int attacksLeft; + + enum Phase + { + UNKNOWN, + ACID, + FIRE_BALL, + SPAWN + } + + public Vorkath(NPC vorkath) + { + this.vorkath = vorkath; + this.attacksLeft = ATTACKS_PER_SWITCH; + this.currentPhase = Phase.UNKNOWN; + this.nextPhase = Phase.UNKNOWN; + this.lastPhase = Phase.UNKNOWN; + log.debug("[Vorkath] Created Vorkath: {}", this); + } + + /** + * Updates the existing Vorkath object depending on the new phase it is currently on + * + * @param newPhase the new phase Vorkath is current on + */ + public void updatePhase(Phase newPhase) + { + Phase oldLastPhase = this.lastPhase; + Phase oldCurrentPhase = this.currentPhase; + Phase oldNextPhase = this.currentPhase; + int oldAttacksLeft = this.attacksLeft; + + this.lastPhase = this.currentPhase; + this.currentPhase = newPhase; + switch (newPhase) + { + case ACID: + this.nextPhase = Phase.FIRE_BALL; + break; + case FIRE_BALL: + this.nextPhase = Phase.SPAWN; + break; + case SPAWN: + this.nextPhase = Phase.ACID; + break; + default: + this.nextPhase = Phase.UNKNOWN; + break; + } + + if (this.currentPhase == Phase.FIRE_BALL) + { + this.attacksLeft = FIRE_BALL_ATTACKS; + } + else + { + this.attacksLeft = ATTACKS_PER_SWITCH; + } + + log.debug("[Vorkath] Update! Last Phase: {}->{}, Current Phase: {}->{}, Next Phase: {}->{}, Attacks: {}->{}", + oldLastPhase, this.lastPhase, oldCurrentPhase, this.currentPhase, oldNextPhase, this.nextPhase, oldAttacksLeft, this.attacksLeft); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathAttack.java b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathAttack.java new file mode 100644 index 0000000000..8e1b20daae --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathAttack.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2019, Infinitay + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.vorkath; + +import com.google.common.collect.ImmutableMap; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.AnimationID; +import net.runelite.api.ProjectileID; + +@AllArgsConstructor +@Getter +public enum VorkathAttack +{ + /** + * Vorkath's melee attack (see VorkathPlugin#onAnimationChanged) + */ + SLASH_ATTACK(AnimationID.VORKATH_SLASH_ATTACK, -1), + /** + * Vorkath's dragon breath attack + */ + FIRE_BREATH(AnimationID.VORKATH_ATTACK, ProjectileID.VORKATH_DRAGONBREATH), + /** + * Vorkath's dragon breath attack causing the player's active prayers to be deactivated + */ + PRAYER_BREATH(AnimationID.VORKATH_ATTACK, ProjectileID.VORKATH_PRAYER_DISABLE), + /** + * Vorkath's dragon breath attack causing the player to become poisoned with venom + */ + VENOM_BREATH(AnimationID.VORKATH_ATTACK, ProjectileID.VORKATH_VENOM), + /** + * Vorkath's ranged attack + */ + SPIKE(AnimationID.VORKATH_ATTACK, ProjectileID.VORKATH_RANGED), + /** + * Vorkath's magic attack + */ + ICE(AnimationID.VORKATH_ATTACK, ProjectileID.VORKATH_MAGIC), + /** + * Vorkath's aoe fire bomb attack (3x3 from where player was originally standing) + */ + FIRE_BOMB(AnimationID.VORKATH_FIRE_BOMB_OR_SPAWN_ATTACK, ProjectileID.VORKATH_BOMB_AOE), + /** + * Vorkath's aoe acid attacking, spewing acid across the instance + */ + ACID(AnimationID.VORKATH_ACID_ATTACK, ProjectileID.VORKATH_POISON_POOL_AOE), + /** + * Vorkath's fire ball attack that is fired during the acid phase, almost every tick for 25(?) attacks total + */ + FIRE_BALL(AnimationID.VORKATH_ACID_ATTACK, ProjectileID.VORKATH_TICK_FIRE_AOE), + /** + * Vorkath's dragon breath attack causing the player to be frozen during Zombified Spawn phase + */ + FREEZE_BREATH(AnimationID.VORKATH_ATTACK, ProjectileID.VORKATH_ICE), + /** + * Vorkath's spawning of a Zombified Spawn + */ + ZOMBIFIED_SPAWN(AnimationID.VORKATH_FIRE_BOMB_OR_SPAWN_ATTACK, ProjectileID.VORKATH_SPAWN_AOE); + + private final int vorkathAnimationID; + private final int projectileID; + + private static final Map VORKATH_ATTACKS; + private static final Map VORKATH_BASIC_ATTACKS; + + static + { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + for (VorkathAttack vorkathAttack : values()) + { + builder.put(vorkathAttack.getProjectileID(), vorkathAttack); + } + VORKATH_ATTACKS = builder.build(); + } + + static + { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + builder.put(FIRE_BREATH.getProjectileID(), FIRE_BREATH) + .put(PRAYER_BREATH.getProjectileID(), PRAYER_BREATH) + .put(VENOM_BREATH.getProjectileID(), VENOM_BREATH) + .put(SPIKE.getProjectileID(), SPIKE) + .put(ICE.getProjectileID(), ICE) + .put(FIRE_BOMB.getProjectileID(), FIRE_BOMB) + .put(FIRE_BALL.getProjectileID(), FIRE_BALL); + // FIRE_BOMB and FIRE_BALL are also basic attacks + // Although SLASH_ATTACK is a basic attack, we're going to handle it differently + VORKATH_BASIC_ATTACKS = builder.build(); + } + + /** + * @param projectileID id of projectile + * @return {@link VorkathAttack} associated with the specified projectile + */ + public static VorkathAttack getVorkathAttack(int projectileID) + { + return VORKATH_ATTACKS.get(projectileID); + } + + /** + * @param projectileID + * @return true if the projectile id matches a {@link VorkathAttack#getProjectileID()} within {@link VorkathAttack#VORKATH_BASIC_ATTACKS}, + * false otherwise + */ + public static boolean isBasicAttack(int projectileID) + { + return VORKATH_BASIC_ATTACKS.get(projectileID) != null; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/VorkathOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathOverlay.java similarity index 63% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/VorkathOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathOverlay.java index ec51b0cf03..3b94cefe7b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/VorkathOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathOverlay.java @@ -1,5 +1,7 @@ /* * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2019, Infinitay + * * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,10 +33,10 @@ import java.awt.Graphics2D; import java.awt.geom.Arc2D; import java.awt.image.BufferedImage; import javax.inject.Inject; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -59,20 +61,6 @@ public class VorkathOverlay extends Overlay this.plugin = plugin; } - private BufferedImage getIcon(Vorkath.AttackStyle attackStyle) - { - switch (attackStyle) - { - case MAGERANGE: - return VorkathPlugin.MAGERANGE; - case ICE: - return VorkathPlugin.ICE; - case ACID: - return VorkathPlugin.ACID; - } - return null; - } - @Override public Dimension render(Graphics2D graphics) { @@ -80,29 +68,17 @@ public class VorkathOverlay extends Overlay { Vorkath vorkath = plugin.getVorkath(); - LocalPoint localLocation = vorkath.getNpc().getLocalLocation(); + LocalPoint localLocation = vorkath.getVorkath().getLocalLocation(); if (localLocation != null) { - Point point = Perspective.localToCanvas(client, localLocation, client.getPlane(), vorkath.getNpc().getLogicalHeight() + 16); + Point point = Perspective.localToCanvas(client, localLocation, client.getPlane(), vorkath.getVorkath().getLogicalHeight() + 16); if (point != null) { point = new Point(point.getX(), point.getY()); - BufferedImage icon = null; - if (vorkath.getPhase() == 0) - { - icon = getIcon(Vorkath.AttackStyle.MAGERANGE); - } - else if (vorkath.getPhase() == 1) - { - icon = getIcon(Vorkath.AttackStyle.ACID); - } - else if (vorkath.getPhase() == 2) - { - icon = getIcon(Vorkath.AttackStyle.ICE); - } + BufferedImage currentPhaseIcon = getIcon(vorkath); - int totalWidth = icon.getWidth() * OVERLAY_ICON_MARGIN; + int totalWidth = currentPhaseIcon.getWidth() * OVERLAY_ICON_MARGIN; int bgPadding = 8; int currentPosX = 0; @@ -110,32 +86,31 @@ public class VorkathOverlay extends Overlay graphics.setColor(COLOR_ICON_BACKGROUND); graphics.fillOval( point.getX() - totalWidth / 2 + currentPosX - bgPadding, - point.getY() - icon.getHeight() / 2 - OVERLAY_ICON_DISTANCE - bgPadding, - icon.getWidth() + bgPadding * 2, - icon.getHeight() + bgPadding * 2); + point.getY() - currentPhaseIcon.getHeight() / 2 - OVERLAY_ICON_DISTANCE - bgPadding, + currentPhaseIcon.getWidth() + bgPadding * 2, + currentPhaseIcon.getHeight() + bgPadding * 2); graphics.setColor(COLOR_ICON_BORDER); graphics.drawOval( point.getX() - totalWidth / 2 + currentPosX - bgPadding, - point.getY() - icon.getHeight() / 2 - OVERLAY_ICON_DISTANCE - bgPadding, - icon.getWidth() + bgPadding * 2, - icon.getHeight() + bgPadding * 2); + point.getY() - currentPhaseIcon.getHeight() / 2 - OVERLAY_ICON_DISTANCE - bgPadding, + currentPhaseIcon.getWidth() + bgPadding * 2, + currentPhaseIcon.getHeight() + bgPadding * 2); graphics.drawImage( - icon, + currentPhaseIcon, point.getX() - totalWidth / 2 + currentPosX, - point.getY() - icon.getHeight() / 2 - OVERLAY_ICON_DISTANCE, + point.getY() - currentPhaseIcon.getHeight() / 2 - OVERLAY_ICON_DISTANCE, null); graphics.setColor(COLOR_ICON_BORDER_FILL); Arc2D.Double arc = new Arc2D.Double( point.getX() - totalWidth / 2 + currentPosX - bgPadding, - point.getY() - icon.getHeight() / 2 - OVERLAY_ICON_DISTANCE - bgPadding, - icon.getWidth() + bgPadding * 2, - icon.getHeight() + bgPadding * 2, + point.getY() - currentPhaseIcon.getHeight() / 2 - OVERLAY_ICON_DISTANCE - bgPadding, + currentPhaseIcon.getWidth() + bgPadding * 2, + currentPhaseIcon.getHeight() + bgPadding * 2, 90.0, - -360.0 * (Vorkath.ATTACKS_PER_SWITCH - - vorkath.getAttacksUntilSwitch()) / Vorkath.ATTACKS_PER_SWITCH, + -360.0 * getAttacksLeftProgress(), Arc2D.OPEN); graphics.draw(arc); } @@ -144,4 +119,39 @@ public class VorkathOverlay extends Overlay return null; } + + /** + * @param vorkath Vorkath object + * @return image of the current phase Vorkath is on + */ + private BufferedImage getIcon(Vorkath vorkath) + { + switch (vorkath.getCurrentPhase()) + { + case UNKNOWN: + return VorkathPlugin.UNKNOWN; + case ACID: + return VorkathPlugin.ACID; + case FIRE_BALL: + return VorkathPlugin.FIRE_BALL; + case SPAWN: + return VorkathPlugin.SPAWN; + } + return null; + } + + /** + * @return number of attacks Vorkath has left in the current phase + */ + private double getAttacksLeftProgress() + { + if (plugin.getVorkath().getCurrentPhase() != Vorkath.Phase.FIRE_BALL) + { + return (double) (Vorkath.ATTACKS_PER_SWITCH - plugin.getVorkath().getAttacksLeft()) / Vorkath.ATTACKS_PER_SWITCH; + } + else + { + return (double) (Vorkath.FIRE_BALL_ATTACKS - plugin.getVorkath().getAttacksLeft()) / Vorkath.FIRE_BALL_ATTACKS; + } + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java new file mode 100644 index 0000000000..a694be9826 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2019, Infinitay + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.vorkath; + +import com.google.inject.Inject; +import java.awt.image.BufferedImage; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.NpcID; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.ProjectileMoved; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.ImageUtil; +import org.apache.commons.lang3.ArrayUtils; + +@PluginDescriptor( + name = "Vorkath Helper", + description = "Count vorkath attacks, and which phase is coming next", + tags = {"combat", "overlay", "pve", "pvm"}, + type = PluginType.PVM, + enabledByDefault = false +) +@Slf4j +public class VorkathPlugin extends Plugin +{ + private static final int VORKATH_REGION = 9023; + + @Inject + private Client client; + + @Inject + private OverlayManager overlayManager; + + @Inject + private VorkathOverlay overlay; + + @Inject + private ZombifiedSpawnOverlay SpawnOverlay; + + @Getter + private Vorkath vorkath; + + @Getter + private NPC zombifiedSpawn; + + /** + * The last projectile's starting movement cycle + */ + private int lastProjectileCycle; + + static final BufferedImage UNKNOWN; + static final BufferedImage ACID; + static final BufferedImage FIRE_BALL; + static final BufferedImage SPAWN; + + static + { + UNKNOWN = ImageUtil.getResourceStreamFromClass(VorkathPlugin.class, "magerange.png"); + ACID = ImageUtil.getResourceStreamFromClass(VorkathPlugin.class, "acid.png"); + FIRE_BALL = ImageUtil.getResourceStreamFromClass(VorkathPlugin.class, "fire_strike.png"); + SPAWN = ImageUtil.getResourceStreamFromClass(VorkathPlugin.class, "ice.png"); + } + + @Subscribe + public void onNpcSpawned(NpcSpawned event) + { + if (isAtVorkath()) + { + if (isVorkath(event.getNpc().getId())) + { + vorkath = new Vorkath(event.getNpc()); + lastProjectileCycle = -1; + overlayManager.add(overlay); + } + else if (isZombifiedSpawn(event.getNpc().getId())) + { + zombifiedSpawn = event.getNpc(); + overlayManager.add(SpawnOverlay); + } + } + } + + @Subscribe + public void onNpcDespawned(NpcDespawned event) + { + if (isAtVorkath()) + { + if (isVorkath(event.getNpc().getId())) + { + vorkath = null; + lastProjectileCycle = -1; + overlayManager.remove(overlay); + } + else if (isZombifiedSpawn(event.getNpc().getId())) + { + zombifiedSpawn = null; + overlayManager.remove(SpawnOverlay); + } + } + } + + @Subscribe + public void onProjectileMoved(ProjectileMoved event) + { + // Only capture initial projectile + if (!isAtVorkath() || event.getProjectile().getStartMovementCycle() == lastProjectileCycle) + { + return; + } + + VorkathAttack vorkathAttack = VorkathAttack.getVorkathAttack(event.getProjectile().getId()); + if (vorkathAttack != null) + { + /*log.debug("[Projectile ({})] Game Tick: {}, Game Cycle: {}, Starting Cyle: {} Last Cycle: {}, Initial Projectile?: {}", + vorkathAttack, client.getTickCount(), client.getGameCycle(), event.getProjectile().getStartMovementCycle(), + lastProjectileCycle, event.getProjectile().getStartMovementCycle() == client.getGameCycle());*/ + if (VorkathAttack.isBasicAttack(vorkathAttack.getProjectileID()) && vorkath.getAttacksLeft() > 0) + { + vorkath.setAttacksLeft(vorkath.getAttacksLeft() - 1); + } + else if (vorkathAttack == VorkathAttack.ACID) + { + vorkath.updatePhase(Vorkath.Phase.ACID); + // Sets the phase's progress indicator to done + vorkath.setAttacksLeft(0); + } + else if (vorkathAttack == VorkathAttack.FIRE_BALL) + { + vorkath.updatePhase(Vorkath.Phase.FIRE_BALL); + // Decrement to account for this fire ball + vorkath.setAttacksLeft(vorkath.getAttacksLeft() - 1); + } + else if (vorkathAttack == VorkathAttack.FREEZE_BREATH && vorkath.getLastAttack() != VorkathAttack.ZOMBIFIED_SPAWN) + { + // Filters out second invisible freeze attack that is immediately after the Zombified Spawn + vorkath.updatePhase(Vorkath.Phase.SPAWN); + // Sets progress of the phase to half + vorkath.setAttacksLeft(vorkath.getAttacksLeft() - (vorkath.getAttacksLeft() / 2)); + } + else if (vorkathAttack == VorkathAttack.ZOMBIFIED_SPAWN || (vorkath.getLastAttack() == VorkathAttack.ZOMBIFIED_SPAWN)) + { + // Also consumes the second invisible freeze attack that is immediately after the Zombified Spawn + // Sets progress of the phase to done as there are no more attacks within this phase + vorkath.setAttacksLeft(0); + } + else + { + // Vorkath fired a basic attack AND there are no more attacks left, typically after phases are over + vorkath.updatePhase(vorkath.getNextPhase()); + // Decrement to account for this basic attack + vorkath.setAttacksLeft(vorkath.getAttacksLeft() - 1); + } + + log.debug("[Vorkath ({})] {}", vorkathAttack, vorkath); + vorkath.setLastAttack(vorkathAttack); + lastProjectileCycle = event.getProjectile().getStartMovementCycle(); + } + } + + @Subscribe + public void onAnimationChanged(AnimationChanged event) + { + if (isAtVorkath() && vorkath != null && event.getActor().equals(vorkath.getVorkath()) + && event.getActor().getAnimation() == VorkathAttack.SLASH_ATTACK.getVorkathAnimationID()) + { + if (vorkath.getAttacksLeft() > 0) + { + vorkath.setAttacksLeft(vorkath.getAttacksLeft() - 1); + } + else + { + // No more attacks left, typically after phases are over + vorkath.updatePhase(vorkath.getNextPhase()); + // Decrement to account for this basic attack + vorkath.setAttacksLeft(vorkath.getAttacksLeft() - 1); + } + log.debug("[Vorkath (SLASH_ATTACK)] {}", vorkath); + } + } + + /** + * @return true if the player is in the Vorkath region, false otherwise + */ + private boolean isAtVorkath() + { + return ArrayUtils.contains(client.getMapRegions(), VORKATH_REGION); + } + + /** + * @param npcID + * @return true if the npc is Vorkath, false otherwise + */ + private boolean isVorkath(int npcID) + { + // Could be done with a a simple name check instead... + return npcID == NpcID.VORKATH || + npcID == NpcID.VORKATH_8058 || + npcID == NpcID.VORKATH_8059 || + npcID == NpcID.VORKATH_8060 || + npcID == NpcID.VORKATH_8061; + } + + /** + * @param npcID + * @return true if the npc is a Zombified Spawn, otherwise false + */ + private boolean isZombifiedSpawn(int npcID) + { + // Could be done with a a simple name check instead... + return npcID == NpcID.ZOMBIFIED_SPAWN || + npcID == NpcID.ZOMBIFIED_SPAWN_8063; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawnOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawnOverlay.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawnOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawnOverlay.java index 28bd682d2f..50fb185532 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawnOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/ZombifiedSpawnOverlay.java @@ -48,10 +48,9 @@ public class ZombifiedSpawnOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (plugin.getSpawn() != null) + if (plugin.getZombifiedSpawn() != null) { - ZombifiedSpawn spawn = plugin.getSpawn(); - OverlayUtil.renderActorOverlayImage(graphics, spawn.getNpc(), VorkathPlugin.ICE, Color.green, 10); + OverlayUtil.renderActorOverlayImage(graphics, plugin.getZombifiedSpawn(), VorkathPlugin.SPAWN, Color.green, 10); } return null; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorMiniMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorMiniMapOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorMiniMapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorMiniMapOverlay.java index 3a31e936a3..d7fa0cc92a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorMiniMapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorMiniMapOverlay.java @@ -29,7 +29,7 @@ import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; import javax.inject.Singleton; -import api.Player; +import net.runelite.api.Player; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -63,7 +63,7 @@ public class WarIndicatorMiniMapOverlay extends Overlay private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) { final String name = actor.getName().replace('\u00A0', ' '); - final api.Point minimapLocation = actor.getMinimapLocation(); + final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); String[] callers = config.getActiveCallers().split(", "); String[] targets = config.getTargetedSnipes().split(", "); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorOverlay.java index a6ec66bdaf..3eb4c463de 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorOverlay.java @@ -30,8 +30,8 @@ import java.awt.Graphics2D; import java.awt.Polygon; import javax.inject.Inject; import javax.inject.Singleton; -import api.Player; -import api.Point; +import net.runelite.api.Player; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorPlugin.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorPlugin.java index c18b0fa5d3..6e6d80a476 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorPlugin.java @@ -27,22 +27,22 @@ package net.runelite.client.plugins.warindicators; import com.google.inject.Provides; import java.awt.Color; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.FOLLOW; -import static api.MenuAction.ITEM_USE_ON_PLAYER; -import static api.MenuAction.PLAYER_EIGTH_OPTION; -import static api.MenuAction.PLAYER_FIFTH_OPTION; -import static api.MenuAction.PLAYER_FIRST_OPTION; -import static api.MenuAction.PLAYER_FOURTH_OPTION; -import static api.MenuAction.PLAYER_SECOND_OPTION; -import static api.MenuAction.PLAYER_SEVENTH_OPTION; -import static api.MenuAction.PLAYER_SIXTH_OPTION; -import static api.MenuAction.PLAYER_THIRD_OPTION; -import static api.MenuAction.SPELL_CAST_ON_PLAYER; -import static api.MenuAction.TRADE; -import api.MenuEntry; -import api.Player; -import api.events.MenuEntryAdded; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.FOLLOW; +import static net.runelite.api.MenuAction.ITEM_USE_ON_PLAYER; +import static net.runelite.api.MenuAction.PLAYER_EIGTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIFTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIRST_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FOURTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SECOND_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SEVENTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SIXTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_THIRD_OPTION; +import static net.runelite.api.MenuAction.SPELL_CAST_ON_PLAYER; +import static net.runelite.api.MenuAction.TRADE; +import net.runelite.api.MenuEntry; +import net.runelite.api.Player; +import net.runelite.api.events.MenuEntryAdded; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -58,6 +58,7 @@ import org.apache.commons.lang3.ArrayUtils; type = PluginType.PVP, enabledByDefault = false ) + public class WarIndicatorPlugin extends Plugin { @Inject diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorService.java b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorService.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorService.java rename to runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorService.java index ea1f99879b..1188dc6a12 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/warindicators/WarIndicatorService.java @@ -28,8 +28,8 @@ import java.awt.Color; import java.util.function.BiConsumer; import javax.inject.Inject; import javax.inject.Singleton; -import api.Client; -import api.Player; +import net.runelite.api.Client; +import net.runelite.api.Player; @Singleton public class WarIndicatorService diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersGloryOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersGloryOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersGloryOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersGloryOverlay.java index c7eb14ad75..b15b87c431 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersGloryOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersGloryOverlay.java @@ -13,8 +13,8 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.ItemID; +import net.runelite.api.Client; +import net.runelite.api.ItemID; import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersOverlay.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersOverlay.java index 705170c20b..5ea462699b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersOverlay.java @@ -12,8 +12,8 @@ package net.runelite.client.plugins.whalewatchers; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.MenuAction; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayMenuEntry; @@ -47,8 +47,8 @@ public class WhaleWatchersOverlay extends Overlay this.plugin = plugin; setLayer(OverlayLayer.ABOVE_WIDGETS); setPriority(OverlayPriority.HIGHEST); - setPosition(OverlayPosition.DYNAMIC); - this.setPreferredPosition(OverlayPosition.TOP_CENTER); + setPosition(OverlayPosition.TOP_LEFT); + this.setPreferredPosition(OverlayPosition.TOP_LEFT); panelComponent = new PanelComponent(); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java similarity index 67% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java index 09c013c266..4d554fee56 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java @@ -1,35 +1,39 @@ -/******************************************************************************* - * Copyright (c) 2019. PKLite - * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. - * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the following authors: - * - * PKLite discord: https://discord.gg/Dp3HuFM - * Written by PKLite(ST0NEWALL, others) , 2019 - * - ******************************************************************************/ + +/* + * ****************************************************************************** + * * Copyright (c) 2019 RuneLitePlus + * * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. + * * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: + * * ST0NEWALL#9112 + * * RuneLitePlus Discord: https://discord.gg/Q7wFtCe + * * RuneLitePlus website: https://runelitepl.us + * ***************************************************************************** + */ package net.runelite.client.plugins.whalewatchers; import com.google.inject.Provides; +import java.util.EnumSet; +import java.util.Objects; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.InventoryID; -import api.ItemID; -import api.MenuAction; -import api.Skill; -import api.SkullIcon; -import api.VarPlayer; -import api.Varbits; -import static api.WorldType.HIGH_RISK; -import static api.WorldType.PVP; -import static api.WorldType.isPvpWorld; -import api.events.GameTick; -import api.events.HitsplatApplied; -import api.events.ItemContainerChanged; -import api.events.MenuOptionClicked; -import api.events.VarbitChanged; -import api.kit.KitType; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.ItemID; +import net.runelite.api.MenuAction; +import net.runelite.api.Skill; +import net.runelite.api.SkullIcon; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import static net.runelite.api.WorldType.isPvpWorld; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.kit.KitType; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.OverlayMenuClicked; @@ -46,10 +50,13 @@ import org.apache.commons.lang3.ObjectUtils; type = PluginType.PVP, enabledByDefault = false ) + public class WhaleWatchersPlugin extends Plugin { - public boolean enableOverlay = false; + private static final String CONFIG_GROUP_NAME = "WhaleWatchers"; + + public boolean protectItemOverlay = false; public int damageDone = 0; public int damageTaken = 0; public boolean inCombat = false; @@ -82,11 +89,7 @@ public class WhaleWatchersPlugin extends Plugin @Subscribe public void onOverlayMenuClicked(OverlayMenuClicked event) { - if (!event.getOverlay().equals(overlay)) - { - return; - } - else + if (event.getOverlay().equals(overlay)) { if (event.getEntry().getOption().equals("Reset")) { @@ -115,6 +118,28 @@ public class WhaleWatchersPlugin extends Plugin resetDamageCounter(); } + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (!event.getGroup().equals(CONFIG_GROUP_NAME)) + { + return; + } + + if (!config.protectItemWarning()) + { + protectItemOverlay = false; + } + if (!config.gloryWarning()) + { + displayGloryOverlay = false; + } + if (!config.smiteableWarning()) + { + displaySmiteOverlay = false; + } + } + @Subscribe public void onHitsplatApplied(HitsplatApplied event) @@ -185,28 +210,32 @@ public class WhaleWatchersPlugin extends Plugin { try { - if (client.getLocalPlayer().getSkullIcon() == (SkullIcon.SKULL)) + final SkullIcon skullIcon = Objects.requireNonNull(client.getLocalPlayer().getSkullIcon()); + final EnumSet worldTypes = client.getWorldType(); + if (WorldType.isHighRiskWorld(worldTypes)) { - if (client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 0 && client.getVar(Varbits.IN_WILDERNESS) == 1 || - client.getWorldType().contains(PVP)) - { - enableOverlay = true; - } - if (client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 1 || client.getVar(Varbits.IN_WILDERNESS) == 0 || - client.getWorldType().contains(HIGH_RISK) || client.getWorld() == 365) - { - enableOverlay = false; - } + protectItemOverlay = false; + return; } - else + if (skullIcon.equals(SkullIcon.SKULL)) { - enableOverlay = false; + if (WorldType.isPvpWorld(worldTypes) || WorldType.isDeadmanWorld(worldTypes) || + client.getVar(Varbits.IN_WILDERNESS) == 1) + { + protectItemOverlay = client.getRealSkillLevel(Skill.PRAYER) > 25 && + client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 0; + } + else + { + protectItemOverlay = false; + } } } catch (NullPointerException e) { - + // local player isn't skulled } + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java similarity index 69% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java index 1cd94ac04e..b0d7dc7cac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java @@ -1,12 +1,14 @@ -/******************************************************************************* - * Copyright (c) 2019. PKLite - * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. - * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the following authors: - * - * PKLite discord: https://discord.gg/Dp3HuFM - * Written by PKLite(ST0NEWALL, others) , 2019 - * - ******************************************************************************/ + +/* + * ****************************************************************************** + * * Copyright (c) 2019 RuneLitePlus + * * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. + * * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: + * * ST0NEWALL#9112 + * * RuneLitePlus Discord: https://discord.gg/Q7wFtCe + * * RuneLitePlus website: https://runelitepl.us + * ***************************************************************************** + */ package net.runelite.client.plugins.whalewatchers; @@ -18,8 +20,8 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Stroke; import javax.inject.Inject; -import api.Client; -import api.Point; +import net.runelite.api.Client; +import net.runelite.api.Point; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -49,7 +51,7 @@ public class WhaleWatchersProtOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (plugin.enableOverlay && config.protectItemWarning()) + if (plugin.protectItemOverlay && config.protectItemWarning()) { Rectangle rectangle = new Rectangle(); rectangle.setBounds(client.getCanvas().getBounds()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersSmiteableOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersSmiteableOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersSmiteableOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersSmiteableOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java similarity index 89% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java index 322fa91dc0..8ff438b68f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java @@ -31,23 +31,23 @@ import java.util.regex.Pattern; import javax.inject.Inject; import javax.inject.Provider; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.MenuAction; -import api.MenuEntry; -import api.NPC; -import api.NPCDefinition; -import api.ObjectDefinition; -import api.coords.WorldPoint; -import api.events.MenuEntryAdded; -import api.events.MenuOptionClicked; -import api.events.WidgetLoaded; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetConfig; -import api.widgets.WidgetID; -import api.widgets.WidgetInfo; -import api.widgets.WidgetPositionMode; -import api.widgets.WidgetType; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.ObjectDefinition; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetConfig; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; @@ -215,7 +215,7 @@ public class WikiPlugin extends Plugin case SPELL_CAST_ON_GROUND_ITEM: { type = "item"; - id = itemManager.canonicalize(ev.getId()); + id = itemManager.canonicalize(ev.getIdentifier()); name = itemManager.getItemDefinition(id).getName(); location = null; break; @@ -223,7 +223,7 @@ public class WikiPlugin extends Plugin case SPELL_CAST_ON_NPC: { type = "npc"; - NPC npc = client.getCachedNPCs()[ev.getId()]; + NPC npc = client.getCachedNPCs()[ev.getIdentifier()]; NPCDefinition nc = npc.getTransformedDefinition(); id = nc.getId(); name = nc.getName(); @@ -233,14 +233,14 @@ public class WikiPlugin extends Plugin case SPELL_CAST_ON_GAME_OBJECT: { type = "object"; - ObjectDefinition lc = client.getObjectDefinition(ev.getId()); + ObjectDefinition lc = client.getObjectDefinition(ev.getIdentifier()); if (lc.getImpostorIds() != null) { lc = lc.getImpostor(); } id = lc.getId(); name = lc.getName(); - location = WorldPoint.fromScene(client, ev.getActionParam(), ev.getWidgetId(), client.getPlane()); + location = WorldPoint.fromScene(client, ev.getActionParam0(), ev.getActionParam1(), client.getPlane()); break; } default: @@ -272,14 +272,14 @@ public class WikiPlugin extends Plugin if (ev.getMenuAction() == MenuAction.RUNELITE) { boolean quickguide = false; - switch (ev.getMenuOption()) + switch (ev.getOption()) { case MENUOP_QUICKGUIDE: quickguide = true; //fallthrough; case MENUOP_GUIDE: ev.consume(); - String quest = Text.removeTags(ev.getMenuTarget()); + String quest = Text.removeTags(ev.getTarget()); HttpUrl.Builder ub = WIKI_BASE.newBuilder() .addPathSegment("w") .addPathSegment(quest) @@ -291,8 +291,8 @@ public class WikiPlugin extends Plugin LinkBrowser.browse(ub.build().toString()); break; case MENUOP_WIKI: - Matcher skillRegex = WikiPlugin.SKILL_REGEX.matcher(Text.removeTags(ev.getMenuTarget())); - Matcher diaryRegex = WikiPlugin.DIARY_REGEX.matcher(Text.removeTags(ev.getMenuTarget())); + Matcher skillRegex = WikiPlugin.SKILL_REGEX.matcher(Text.removeTags(ev.getTarget())); + Matcher diaryRegex = WikiPlugin.DIARY_REGEX.matcher(Text.removeTags(ev.getTarget())); if (skillRegex.find()) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiSearchChatboxTextInput.java b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiSearchChatboxTextInput.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiSearchChatboxTextInput.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiSearchChatboxTextInput.java index f80d13f454..96ebec1479 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiSearchChatboxTextInput.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiSearchChatboxTextInput.java @@ -39,12 +39,12 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.inject.Named; import lombok.extern.slf4j.Slf4j; -import api.widgets.JavaScriptCallback; -import api.widgets.Widget; -import api.widgets.WidgetPositionMode; -import api.widgets.WidgetSizeMode; -import api.widgets.WidgetTextAlignment; -import api.widgets.WidgetType; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetSizeMode; +import net.runelite.api.widgets.WidgetTextAlignment; +import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.game.chatbox.ChatboxTextInput; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiSprite.java b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiSprite.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiSprite.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiSprite.java index cb7254125c..188d54837b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wiki/WikiSprite.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiSprite.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.wiki; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.SpriteID; +import net.runelite.api.SpriteID; import net.runelite.client.game.SpriteOverride; @RequiredArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsPlugin.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsPlugin.java index 60ab6d6f9b..ba776475ed 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wildernesslocations/WildernessLocationsPlugin.java @@ -18,15 +18,15 @@ import java.util.Objects; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.ScriptID; -import api.VarClientStr; -import api.Varbits; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import api.events.GameTick; -import api.events.VarClientStrChanged; -import api.widgets.WidgetInfo; +import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.VarClientStrChanged; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -46,6 +46,7 @@ import net.runelite.client.util.WildernessLocation; type = PluginType.PVP, enabledByDefault = false ) + public class WildernessLocationsPlugin extends Plugin { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java index 6351dc39b5..dadca4137b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java @@ -40,4 +40,4 @@ enum WintertodtActivity LIGHTING_BRAZIER("Lighting"); private final String actionString; -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java index 03f05e76fc..db7fe0d416 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java @@ -42,4 +42,4 @@ enum WintertodtInterruptType BRAZIER_WENT_OUT("Brazier went out"); private final String interruptSourceString; -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java similarity index 55% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java index ed4c702f5c..95dc4a7e42 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java @@ -29,17 +29,26 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; +import static net.runelite.client.plugins.wintertodt.WintertodtPlugin.WINTERTODT_KINDLING_MULTIPLIER; +import static net.runelite.client.plugins.wintertodt.WintertodtPlugin.WINTERTODT_ROOTS_MULTIPLIER; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class WintertodtOverlay extends Overlay { + @Inject + private Client client; + private final WintertodtPlugin plugin; private final PanelComponent panelComponent = new PanelComponent(); @@ -61,28 +70,32 @@ class WintertodtOverlay extends Overlay } panelComponent.getChildren().clear(); - panelComponent.setPreferredSize(new Dimension(150, 0)); + panelComponent.setPreferredSize(new Dimension(180, 0)); panelComponent.getChildren().add(TitleComponent.builder() - .text(plugin.getCurrentActivity().getActionString()) - .color(plugin.getCurrentActivity() == WintertodtActivity.IDLE ? Color.RED : Color.GREEN) + .text("Points in inventory") + .color(Color.WHITE) .build()); - String inventoryString = plugin.getNumLogs() > 0 ? plugin.getInventoryScore() + " (" + plugin.getTotalPotentialinventoryScore() + ") pts" : plugin.getInventoryScore() + " pts"; - panelComponent.getChildren().add(LineComponent.builder() - .left("Inventory:") - .leftColor(Color.WHITE) - .right(inventoryString) - .rightColor(plugin.getInventoryScore() > 0 ? Color.GREEN : Color.RED) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - String kindlingString = plugin.getNumLogs() > 0 ? plugin.getNumKindling() + " (" + (plugin.getNumLogs() + plugin.getNumKindling()) + ")" : Integer.toString(plugin.getNumKindling()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Kindling:") - .leftColor(Color.WHITE) - .right(kindlingString) - .rightColor(plugin.getNumKindling() + plugin.getNumLogs() > 0 ? Color.GREEN : Color.RED) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("Status:", Color.WHITE), ColorUtil.prependColorTag(plugin.getCurrentActivity().getActionString(), plugin.getCurrentActivity() == WintertodtActivity.IDLE ? Color.RED : Color.GREEN)); + + int firemakingLvl = client.getRealSkillLevel(Skill.FIREMAKING); + + int rootsScore = plugin.getNumRoots() * WINTERTODT_ROOTS_MULTIPLIER; + int rootsXp = plugin.getNumRoots() * Math.round(2 + (3 * firemakingLvl)); + + tableComponent.addRow(ColorUtil.prependColorTag("Roots:", Color.WHITE), ColorUtil.prependColorTag(rootsScore + " pts (" + rootsXp + " xp)", plugin.getNumRoots() > 0 ? Color.GREEN : Color.RED)); + + int kindlingScore = plugin.getNumKindling() * WINTERTODT_KINDLING_MULTIPLIER; + long kindlingXp = plugin.getNumKindling() * Math.round(3.8 * firemakingLvl); + + tableComponent.addRow(ColorUtil.prependColorTag("Kindling:", Color.WHITE), ColorUtil.prependColorTag(kindlingScore + " pts (" + kindlingXp + " xp)", plugin.getNumKindling() > 0 ? Color.GREEN : Color.RED)); + tableComponent.addRow(ColorUtil.prependColorTag("Total:", Color.WHITE), ColorUtil.prependColorTag((rootsScore + kindlingScore) + " pts (" + (rootsXp + kindlingXp) + " xp)", (rootsScore + kindlingScore > 0) ? Color.GREEN : Color.RED)); + + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java similarity index 81% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java index 4cdcfa4f36..0ad69971f7 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java @@ -32,34 +32,20 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import static api.AnimationID.CONSTRUCTION; -import static api.AnimationID.FIREMAKING; -import static api.AnimationID.FLETCHING_BOW_CUTTING; -import static api.AnimationID.IDLE; -import static api.AnimationID.LOOKING_INTO; -import static api.AnimationID.WOODCUTTING_3A_AXE; -import static api.AnimationID.WOODCUTTING_ADAMANT; -import static api.AnimationID.WOODCUTTING_BLACK; -import static api.AnimationID.WOODCUTTING_BRONZE; -import static api.AnimationID.WOODCUTTING_DRAGON; -import static api.AnimationID.WOODCUTTING_INFERNAL; -import static api.AnimationID.WOODCUTTING_IRON; -import static api.AnimationID.WOODCUTTING_MITHRIL; -import static api.AnimationID.WOODCUTTING_RUNE; -import static api.AnimationID.WOODCUTTING_STEEL; -import api.ChatMessageType; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import static api.ItemID.BRUMA_KINDLING; -import static api.ItemID.BRUMA_ROOT; -import api.MessageNode; -import api.Player; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.GameTick; -import api.events.ItemContainerChanged; +import static net.runelite.api.AnimationID.*; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import static net.runelite.api.ItemID.BRUMA_KINDLING; +import static net.runelite.api.ItemID.BRUMA_ROOT; +import net.runelite.api.MessageNode; +import net.runelite.api.Player; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.Notifier; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; @@ -79,6 +65,9 @@ public class WintertodtPlugin extends Plugin { private static final int WINTERTODT_REGION = 6462; + static final int WINTERTODT_ROOTS_MULTIPLIER = 10; + static final int WINTERTODT_KINDLING_MULTIPLIER = 25; + @Inject private Notifier notifier; @@ -101,13 +90,7 @@ public class WintertodtPlugin extends Plugin private WintertodtActivity currentActivity = WintertodtActivity.IDLE; @Getter(AccessLevel.PACKAGE) - private int inventoryScore; - - @Getter(AccessLevel.PACKAGE) - private int totalPotentialinventoryScore; - - @Getter(AccessLevel.PACKAGE) - private int numLogs; + private int numRoots; @Getter(AccessLevel.PACKAGE) private int numKindling; @@ -139,9 +122,7 @@ public class WintertodtPlugin extends Plugin private void reset() { - inventoryScore = 0; - totalPotentialinventoryScore = 0; - numLogs = 0; + numRoots = 0; numKindling = 0; currentActivity = WintertodtActivity.IDLE; lastActionTime = null; @@ -410,20 +391,15 @@ public class WintertodtPlugin extends Plugin final Item[] inv = container.getItems(); - inventoryScore = 0; - totalPotentialinventoryScore = 0; - numLogs = 0; + numRoots = 0; numKindling = 0; for (Item item : inv) { - inventoryScore += getPoints(item.getId()); - totalPotentialinventoryScore += getPotentialPoints(item.getId()); - switch (item.getId()) { case BRUMA_ROOT: - ++numLogs; + ++numRoots; break; case BRUMA_KINDLING: ++numKindling; @@ -431,13 +407,13 @@ public class WintertodtPlugin extends Plugin } } - //If we're currently fletching but there are no more logs, go ahead and abort fletching immediately - if (numLogs == 0 && currentActivity == WintertodtActivity.FLETCHING) + //If we're currently fletching but there are no more roots, go ahead and abort fletching immediately + if (numRoots == 0 && currentActivity == WintertodtActivity.FLETCHING) { currentActivity = WintertodtActivity.IDLE; } - //Otherwise, if we're currently feeding the brazier but we've run out of both logs and kindling, abort the feeding activity - else if (numLogs == 0 && numKindling == 0 && currentActivity == WintertodtActivity.FEEDING_BRAZIER) + //Otherwise, if we're currently feeding the brazier but we've run out of both roots and kindling, abort the feeding activity + else if (numRoots == 0 && numKindling == 0 && currentActivity == WintertodtActivity.FEEDING_BRAZIER) { currentActivity = WintertodtActivity.IDLE; } @@ -448,29 +424,4 @@ public class WintertodtPlugin extends Plugin currentActivity = action; lastActionTime = Instant.now(); } - - private static int getPoints(int id) - { - switch (id) - { - case BRUMA_ROOT: - return 10; - case BRUMA_KINDLING: - return 25; - default: - return 0; - } - } - - private static int getPotentialPoints(int id) - { - switch (id) - { - case BRUMA_ROOT: - case BRUMA_KINDLING: - return 25; - default: - return 0; - } - } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/config/WintertodtNotifyMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/config/WintertodtNotifyMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/wintertodt/config/WintertodtNotifyMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/config/WintertodtNotifyMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java similarity index 68% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java rename to runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java index be3d262cb2..7b8a5c5f4e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java @@ -28,26 +28,26 @@ import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.AllArgsConstructor; import lombok.Getter; -import static api.AnimationID.WOODCUTTING_3A_AXE; -import static api.AnimationID.WOODCUTTING_ADAMANT; -import static api.AnimationID.WOODCUTTING_BLACK; -import static api.AnimationID.WOODCUTTING_BRONZE; -import static api.AnimationID.WOODCUTTING_DRAGON; -import static api.AnimationID.WOODCUTTING_INFERNAL; -import static api.AnimationID.WOODCUTTING_IRON; -import static api.AnimationID.WOODCUTTING_MITHRIL; -import static api.AnimationID.WOODCUTTING_RUNE; -import static api.AnimationID.WOODCUTTING_STEEL; -import static api.ItemID.ADAMANT_AXE; -import static api.ItemID.BLACK_AXE; -import static api.ItemID.BRONZE_AXE; -import static api.ItemID.DRAGON_AXE; -import static api.ItemID.INFERNAL_AXE; -import static api.ItemID.IRON_AXE; -import static api.ItemID.MITHRIL_AXE; -import static api.ItemID.RUNE_AXE; -import static api.ItemID.STEEL_AXE; -import static api.ItemID._3RD_AGE_AXE; +import static net.runelite.api.AnimationID.WOODCUTTING_3A_AXE; +import static net.runelite.api.AnimationID.WOODCUTTING_ADAMANT; +import static net.runelite.api.AnimationID.WOODCUTTING_BLACK; +import static net.runelite.api.AnimationID.WOODCUTTING_BRONZE; +import static net.runelite.api.AnimationID.WOODCUTTING_DRAGON; +import static net.runelite.api.AnimationID.WOODCUTTING_INFERNAL; +import static net.runelite.api.AnimationID.WOODCUTTING_IRON; +import static net.runelite.api.AnimationID.WOODCUTTING_MITHRIL; +import static net.runelite.api.AnimationID.WOODCUTTING_RUNE; +import static net.runelite.api.AnimationID.WOODCUTTING_STEEL; +import static net.runelite.api.ItemID.ADAMANT_AXE; +import static net.runelite.api.ItemID.BLACK_AXE; +import static net.runelite.api.ItemID.BRONZE_AXE; +import static net.runelite.api.ItemID.DRAGON_AXE; +import static net.runelite.api.ItemID.INFERNAL_AXE; +import static net.runelite.api.ItemID.IRON_AXE; +import static net.runelite.api.ItemID.MITHRIL_AXE; +import static net.runelite.api.ItemID.RUNE_AXE; +import static net.runelite.api.ItemID.STEEL_AXE; +import static net.runelite.api.ItemID._3RD_AGE_AXE; @AllArgsConstructor @Getter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java rename to runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java index 06b06a310c..befc78df8c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.woodcutting; import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; -import static api.ObjectID.REDWOOD; -import static api.ObjectID.REDWOOD_29670; +import static net.runelite.api.ObjectID.REDWOOD; +import static net.runelite.api.ObjectID.REDWOOD_29670; @Getter enum Tree diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java index cc02425d62..497d9695b4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java @@ -28,17 +28,18 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Skill; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class WoodcuttingOverlay extends Overlay { @@ -92,23 +93,22 @@ class WoodcuttingOverlay extends Overlay .build()); } + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + int actions = xpTrackerService.getActions(Skill.WOODCUTTING); if (actions > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Logs cut:") - .right(Integer.toString(actions)) - .build()); + tableComponent.addRow("Logs cut:", Integer.toString(actions)); if (actions > 2) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Logs/hr:") - .right(Integer.toString(xpTrackerService.getActionsHr(Skill.WOODCUTTING))) - .build()); + tableComponent.addRow("Logs/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.WOODCUTTING))); } } + panelComponent.getChildren().add(tableComponent); + return panelComponent.render(graphics); } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java index fd25736ad8..28547b8921 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java @@ -31,18 +31,18 @@ import java.util.HashSet; import java.util.Set; import javax.inject.Inject; import lombok.Getter; -import api.ChatMessageType; -import api.Client; -import api.GameObject; -import api.GameState; -import api.Player; -import api.events.AnimationChanged; -import api.events.ChatMessage; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GameStateChanged; -import api.events.GameTick; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSession.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSession.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSession.java rename to runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSession.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java index 57d8913bd0..2415d17f7a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java @@ -28,8 +28,8 @@ package net.runelite.client.plugins.woodcutting; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import api.Client; -import api.GameObject; +import net.runelite.api.Client; +import net.runelite.api.GameObject; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/SubscriptionFilterMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/SubscriptionFilterMode.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/SubscriptionFilterMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/SubscriptionFilterMode.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 14739d8fbc..84abfcf9f5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -47,24 +47,24 @@ import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.ChatMessageType; -import api.ChatPlayer; -import api.ClanMember; -import api.Client; -import api.Friend; -import api.GameState; -import api.MenuAction; -import api.MenuEntry; -import api.Varbits; -import api.events.ChatMessage; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.MenuEntryAdded; -import api.events.PlayerMenuOptionClicked; -import api.events.VarbitChanged; -import api.events.WorldListLoad; -import api.widgets.WidgetInfo; +import net.runelite.api.ChatMessageType; +import net.runelite.api.ChatPlayer; +import net.runelite.api.ClanMember; +import net.runelite.api.Client; +import net.runelite.api.Friend; +import net.runelite.api.GameState; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.PlayerMenuOptionClicked; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WorldListLoad; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; @@ -136,7 +136,7 @@ public class WorldHopperPlugin extends Plugin private NavigationButton navButton; private WorldSwitcherPanel panel; - private api.World quickHopTargetWorld; + private net.runelite.api.World quickHopTargetWorld; private int displaySwitcherAttempts = 0; @Getter @@ -430,7 +430,7 @@ public class WorldHopperPlugin extends Plugin Map worldData = new HashMap<>(); - for (api.World w : worldListLoad.getWorlds()) + for (net.runelite.api.World w : worldListLoad.getWorlds()) { worldData.put(w.getId(), w.getPlayerCount()); } @@ -619,7 +619,7 @@ public class WorldHopperPlugin extends Plugin return; } - final api.World rsWorld = client.createWorld(); + final net.runelite.api.World rsWorld = client.createWorld(); rsWorld.setActivity(world.getActivity()); rsWorld.setAddress(world.getAddress()); rsWorld.setId(world.getId()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldSwitcherPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldSwitcherPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldSwitcherPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldSwitcherPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/ping/IPHlpAPI.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IPHlpAPI.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/ping/IPHlpAPI.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IPHlpAPI.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/ping/Ping.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/Ping.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldhopper/ping/Ping.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/Ping.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/AgilityShortcutPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityShortcutPoint.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/AgilityShortcutPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityShortcutPoint.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FairyRingLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FairyRingLocation.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FairyRingLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FairyRingLocation.java index fec2abe853..25ee1addcd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FairyRingLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FairyRingLocation.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.worldmap; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Getter enum FairyRingLocation diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FairyRingPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FairyRingPoint.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FairyRingPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FairyRingPoint.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java index 836fae7105..73b903ab26 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.worldmap; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Getter enum FarmingPatchLocation diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchPoint.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchPoint.java index 295ef3cbd5..79b380c220 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchPoint.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.worldmap; import java.awt.image.BufferedImage; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; class FarmingPatchPoint extends WorldMapPoint diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/MinigameLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MinigameLocation.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/MinigameLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MinigameLocation.java index 939c38906a..1b87a8f067 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/MinigameLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MinigameLocation.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.worldmap; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Getter enum MinigameLocation diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/MinigamePoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MinigamePoint.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/MinigamePoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MinigamePoint.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java new file mode 100644 index 0000000000..43f2f73a8a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2018, John James Hamilton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.worldmap; + +import lombok.Getter; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.Quest; + +// Some quests are in the same spot, but they are done in order. If multiple +// quests start in the same location, an array of quests is expected. +enum QuestStartLocation +{ + //Free Quests + COOKS_ASSISTANT_RFD(Quest.COOKS_ASSISTANT, new WorldPoint(3211, 3216, 0)), + THE_CORSAIR_CURSE(Quest.THE_CORSAIR_CURSE, new WorldPoint(3029, 3273, 0)), + DEMON_SLAYER(Quest.DEMON_SLAYER, new WorldPoint(3204, 3424, 0)), + DORICS_QUEST(Quest.DORICS_QUEST, new WorldPoint(2952, 3450, 0)), + DRAGON_SLAYER(Quest.DRAGON_SLAYER, new WorldPoint(3190, 3362, 0)), + ERNEST_THE_CHICKEN(Quest.ERNEST_THE_CHICKEN, new WorldPoint(3109, 3330, 0)), + GOBLIN_DIPLOMACY(Quest.GOBLIN_DIPLOMACY, new WorldPoint(2957, 3509, 0)), + IMP_CATCHER(Quest.IMP_CATCHER, new WorldPoint(3108, 3160, 0)), + THE_KNIGHTS_SWORD(Quest.THE_KNIGHTS_SWORD, new WorldPoint(2976, 3342, 0)), + MISTHALIN_MYSTERY(Quest.MISTHALIN_MYSTERY, new WorldPoint(3234, 3155, 0)), + PIRATES_TREASURE(Quest.PIRATES_TREASURE, new WorldPoint(3051, 3252, 0)), + PRINCE_ALI_RESCUE(Quest.PRINCE_ALI_RESCUE, new WorldPoint(3301, 3163, 0)), + THE_RESTLESS_GHOST(Quest.THE_RESTLESS_GHOST, new WorldPoint(3240, 3210, 0)), + RUNE_MYSTERIES(Quest.RUNE_MYSTERIES, new WorldPoint(3210, 3220, 0)), + SHEEP_SHEARER(Quest.SHEEP_SHEARER, new WorldPoint(3190, 3272, 0)), + SHIELD_OF_ARRAV(Quest.SHIELD_OF_ARRAV, new WorldPoint(3208, 3495, 0)), + VAMPIRE_SLAYER(Quest.VAMPIRE_SLAYER, new WorldPoint(3096, 3266, 0)), + WITCHS_POTION(Quest.WITCHS_POTION, new WorldPoint(2967, 3203, 0)), + X_MARKS_THE_SPOT(Quest.X_MARKS_THE_SPOT, new WorldPoint(3227, 3242, 0)), + + //Members' Quests + ANIMAL_MAGNETISM(Quest.ANIMAL_MAGNETISM, new WorldPoint(3094, 3360, 0)), + ANOTHER_SLICE_OF_HAM(Quest.ANOTHER_SLICE_OF_HAM, new WorldPoint(2799, 5428, 0)), + THE_ASCENT_OF_ARCEUUS(Quest.THE_ASCENT_OF_ARCEUUS, new WorldPoint(1700, 3742, 0)), + BETWEEN_A_ROCK(Quest.BETWEEN_A_ROCK, new WorldPoint(2823, 10168, 0)), + BIG_CHOMPY_BIRD_HUNTING(Quest.BIG_CHOMPY_BIRD_HUNTING, new WorldPoint(2629, 2981, 0)), + BIOHAZARD(Quest.BIOHAZARD, new WorldPoint(2591, 3335, 0)), + BONE_VOYAGE(Quest.BONE_VOYAGE, new WorldPoint(3259, 3450, 0)), + CABIN_FEVER(Quest.CABIN_FEVER, new WorldPoint(3674, 3496, 0)), + CLIENT_OF_KOUREND(Quest.CLIENT_OF_KOUREND, new WorldPoint(1823, 3690, 0)), + CLOCK_TOWER(Quest.CLOCK_TOWER, new WorldPoint(2568, 3249, 0)), + COLD_WAR(Quest.COLD_WAR, new WorldPoint(2593, 3265, 0)), + CONTACT(Quest.CONTACT, new WorldPoint(3280, 2770, 0)), + CREATURE_OF_FENKENSTRAIN(Quest.CREATURE_OF_FENKENSTRAIN, new WorldPoint(3487, 3485, 0)), + DARKNESS_OF_HALLOWVALE(Quest.DARKNESS_OF_HALLOWVALE, new WorldPoint(3494, 9628, 0)), + DEATH_PLATEAU_TROLL_STRONGHOLD(new Quest[]{Quest.DEATH_PLATEAU, Quest.TROLL_STRONGHOLD}, new WorldPoint(2895, 3528, 0)), + DEATH_TO_THE_DORGESHUUN(Quest.DEATH_TO_THE_DORGESHUUN, new WorldPoint(3316, 9613, 0)), + THE_DEPTHS_OF_DESPAIR(Quest.THE_DEPTHS_OF_DESPAIR, new WorldPoint(1846, 3556, 0)), + DESERT_TREASURE(Quest.DESERT_TREASURE, new WorldPoint(3177, 3043, 0)), + DEVIOUS_MINDS(Quest.DEVIOUS_MINDS, new WorldPoint(3405, 3492, 0)), + THE_DIG_SITE(Quest.THE_DIG_SITE, new WorldPoint(3363, 3337, 0)), + DRAGON_SLAYER_II(Quest.DRAGON_SLAYER_II, new WorldPoint(2456, 2868, 0)), + DREAM_MENTOR(Quest.DREAM_MENTOR, new WorldPoint(2144, 10346, 0)), + DRUIDIC_RITUAL(Quest.DRUIDIC_RITUAL, new WorldPoint(2916, 3484, 0)), + DWARF_CANNON(Quest.DWARF_CANNON, new WorldPoint(2566, 3461, 0)), + EADGARS_RUSE(Quest.EADGARS_RUSE, new WorldPoint(2896, 3426, 0)), + EAGLES_PEAK(Quest.EAGLES_PEAK, new WorldPoint(2605, 3264, 0)), + ELEMENTAL_WORKSHOP(new Quest[]{Quest.ELEMENTAL_WORKSHOP_I, Quest.ELEMENTAL_WORKSHOP_II}, new WorldPoint(2714, 3482, 0)), + ENAKHRAS_LAMENT(Quest.ENAKHRAS_LAMENT, new WorldPoint(3190, 2926, 0)), + ENLIGHTENED_JOURNEY(Quest.ENLIGHTENED_JOURNEY, new WorldPoint(2809, 3356, 0)), + THE_EYES_OF_GLOUPHRIE(Quest.THE_EYES_OF_GLOUPHRIE, new WorldPoint(2400, 3419, 0)), + FAIRYTALE(new Quest[]{Quest.FAIRYTALE_I__GROWING_PAINS, Quest.FAIRYTALE_II__CURE_A_QUEEN}, new WorldPoint(3077, 3258, 0)), + FAMILY_CREST(Quest.FAMILY_CREST, new WorldPoint(3278, 3404, 0)), + THE_FEUD(Quest.THE_FEUD, new WorldPoint(3301, 3211, 0)), + FIGHT_ARENA(Quest.FIGHT_ARENA, new WorldPoint(2565, 3199, 0)), + FISHING_CONTEST_1(Quest.FISHING_CONTEST, new WorldPoint(2875, 3483, 0)), + FISHING_CONTEST_2(Quest.FISHING_CONTEST, new WorldPoint(2820, 3487, 0)), + FORGETTABLE_TALE(Quest.FORGETTABLE_TALE, new WorldPoint(2826, 10215, 0)), + THE_FORSAKEN_TOWER(Quest.THE_FORSAKEN_TOWER, new WorldPoint(1484, 3747, 0)), + THE_FREMENNIK_ISLES(Quest.THE_FREMENNIK_ISLES, new WorldPoint(2645, 3711, 0)), + THE_FREMENNIK_TRIALS(Quest.THE_FREMENNIK_TRIALS, new WorldPoint(2657, 3669, 0)), + GARDEN_OF_TRANQUILLITY(Quest.GARDEN_OF_TRANQUILLITY, new WorldPoint(3227, 3477, 0)), + GERTRUDES_CAT_RATCATCHERS(Quest.GERTRUDES_CAT, new WorldPoint(3150, 3411, 0)), + GHOSTS_AHOY(Quest.GHOSTS_AHOY, new WorldPoint(3677, 3510, 0)), + THE_GIANT_DWARF(Quest.THE_GIANT_DWARF, new WorldPoint(2841, 10129, 0)), + THE_GOLEM(Quest.THE_GOLEM, new WorldPoint(3487, 3089, 0)), + THE_GRAND_TREE_MONKEY_MADNESS(new Quest[]{Quest.THE_GRAND_TREE, Quest.MONKEY_MADNESS_I, Quest.MONKEY_MADNESS_II}, new WorldPoint(2466, 3497, 0)), + THE_GREAT_BRAIN_ROBBERY(Quest.THE_GREAT_BRAIN_ROBBERY, new WorldPoint(3681, 2963, 0)), + GRIM_TALES(Quest.GRIM_TALES, new WorldPoint(2890, 3454, 0)), + THE_HAND_IN_THE_SAND(Quest.THE_HAND_IN_THE_SAND, new WorldPoint(2552, 3101, 0)), + HAUNTED_MINE(Quest.HAUNTED_MINE, new WorldPoint(3443, 3258, 0)), + HAZEEL_CULT(Quest.HAZEEL_CULT, new WorldPoint(2565, 3271, 0)), + HEROES_QUEST(Quest.HEROES_QUEST, new WorldPoint(2903, 3511, 0)), + HOLY_GRAIL(new Quest[]{Quest.MERLINS_CRYSTAL, Quest.HOLY_GRAIL}, new WorldPoint(2763, 3515, 0)), + HORROR_FROM_THE_DEEP(Quest.HORROR_FROM_THE_DEEP, new WorldPoint(2507, 3635, 0)), + ICTHLARINS_LITTLE_HELPER(Quest.ICTHLARINS_LITTLE_HELPER, new WorldPoint(3314, 2849, 0)), + IN_SEARCH_OF_THE_MYREQUE(Quest.IN_SEARCH_OF_THE_MYREQUE, new WorldPoint(3502, 3477, 0)), + JUNGLE_POTION(Quest.JUNGLE_POTION, new WorldPoint(2809, 3086, 0)), + KINGS_RANSOM(Quest.KINGS_RANSOM, new WorldPoint(2741, 3554, 0)), + LEGENDS_QUEST(Quest.LEGENDS_QUEST, new WorldPoint(2725, 3367, 0)), + LOST_CITY(Quest.LOST_CITY, new WorldPoint(3149, 3205, 0)), + THE_LOST_TRIBE(Quest.THE_LOST_TRIBE, new WorldPoint(3211, 3224, 0)), + LUNAR_DIPLOMACY(Quest.LUNAR_DIPLOMACY, new WorldPoint(2619, 3689, 0)), + MAKING_FRIENDS_WITH_MY_ARM(Quest.MAKING_FRIENDS_WITH_MY_ARM, new WorldPoint(2904, 10092, 0)), + MAKING_HISTORY(Quest.MAKING_HISTORY, new WorldPoint(2435, 3346, 0)), + MONKS_FRIEND(Quest.MONKS_FRIEND, new WorldPoint(2605, 3209, 0)), + MOUNTAIN_DAUGHTER(Quest.MOUNTAIN_DAUGHTER, new WorldPoint(2810, 3672, 0)), + MOURNINGS_ENDS_PART_I(Quest.MOURNINGS_ENDS_PART_I, new WorldPoint(2289, 3149, 0)), + MOURNINGS_ENDS_PART_II(Quest.MOURNINGS_ENDS_PART_II, new WorldPoint(2352, 3172, 0)), + MURDER_MYSTERY(Quest.MURDER_MYSTERY, new WorldPoint(2740, 3562, 0)), + MY_ARMS_BIG_ADVENTURE(Quest.MY_ARMS_BIG_ADVENTURE, new WorldPoint(2908, 10088, 0)), + NATURE_SPIRIT(Quest.NATURE_SPIRIT, new WorldPoint(3440, 9894, 0)), + OBSERVATORY_QUEST(Quest.OBSERVATORY_QUEST, new WorldPoint(2438, 3185, 0)), + OLAFS_QUEST(Quest.OLAFS_QUEST, new WorldPoint(2723, 3729, 0)), + ONE_SMALL_FAVOUR(Quest.ONE_SMALL_FAVOUR, new WorldPoint(2834, 2985, 0)), + PLAGUE_CITY(Quest.PLAGUE_CITY, new WorldPoint(2567, 3334, 0)), + PRIEST_IN_PERIL(Quest.PRIEST_IN_PERIL, new WorldPoint(3219, 3473, 0)), + THE_QUEEN_OF_THIEVES(Quest.THE_QUEEN_OF_THIEVES, new WorldPoint(1795, 3782, 0)), + RAG_AND_BONE_MAN(new Quest[]{Quest.RAG_AND_BONE_MAN, Quest.RAG_AND_BONE_MAN_II}, new WorldPoint(3359, 3504, 0)), + RECRUITMENT_DRIVE_BLACK_KNIGHTS_FORTRESS(new Quest[]{Quest.BLACK_KNIGHTS_FORTRESS, Quest.RECRUITMENT_DRIVE}, new WorldPoint(2959, 3336, 0)), + ROVING_ELVES(Quest.ROVING_ELVES, new WorldPoint(2289, 3146, 0)), + RUM_DEAL(Quest.RUM_DEAL, new WorldPoint(3679, 3535, 0)), + SCORPION_CATCHER(Quest.SCORPION_CATCHER, new WorldPoint(2701, 3399, 0)), + SEA_SLUG(Quest.SEA_SLUG, new WorldPoint(2715, 3302, 0)), + SHADES_OF_MORTTON(Quest.SHADES_OF_MORTTON, new WorldPoint(3463, 3308, 0)), + SHADOW_OF_THE_STORM(Quest.SHADOW_OF_THE_STORM, new WorldPoint(3270, 3159, 0)), + SHEEP_HERDER(Quest.SHEEP_HERDER, new WorldPoint(2616, 3299, 0)), + SHILO_VILLAGE(Quest.SHILO_VILLAGE, new WorldPoint(2882, 2951, 0)), + A_SOULS_BANE(Quest.A_SOULS_BANE, new WorldPoint(3307, 3454, 0)), + SPIRITS_OF_THE_ELID(Quest.SPIRITS_OF_THE_ELID, new WorldPoint(3441, 2911, 0)), + SWAN_SONG(Quest.SWAN_SONG, new WorldPoint(2345, 3652, 0)), + TAI_BWO_WANNAI_TRIO(Quest.TAI_BWO_WANNAI_TRIO, new WorldPoint(2779, 3087, 0)), + A_TAIL_OF_TWO_CATS(Quest.A_TAIL_OF_TWO_CATS, new WorldPoint(2917, 3557, 0)), + TALE_OF_THE_RIGHTEOUS(Quest.TALE_OF_THE_RIGHTEOUS, new WorldPoint(1511, 3631, 0)), + A_TASTE_OF_HOPE(Quest.A_TASTE_OF_HOPE, new WorldPoint(3668, 3216, 0)), + TEARS_OF_GUTHIX(Quest.TEARS_OF_GUTHIX, new WorldPoint(3251, 9517, 0)), + TEMPLE_OF_IKOV(Quest.TEMPLE_OF_IKOV, new WorldPoint(2574, 3320, 0)), + THRONE_OF_MISCELLANIA_ROYAL_TROUBLE(new Quest[]{Quest.THRONE_OF_MISCELLANIA, Quest.ROYAL_TROUBLE}, new WorldPoint(2497, 3859, 0)), + THE_TOURIST_TRAP(Quest.THE_TOURIST_TRAP, new WorldPoint(3302, 3113, 0)), + TOWER_OF_LIFE(Quest.TOWER_OF_LIFE, new WorldPoint(2640, 3218, 0)), + TREE_GNOME_VILLAGE(Quest.TREE_GNOME_VILLAGE, new WorldPoint(2541, 3169, 0)), + TRIBAL_TOTEM(Quest.TRIBAL_TOTEM, new WorldPoint(2790, 3182, 0)), + TROLL_ROMANCE(Quest.TROLL_ROMANCE, new WorldPoint(2890, 10097, 0)), + UNDERGROUND_PASS_REGICIDE(new Quest[]{Quest.REGICIDE, Quest.UNDERGROUND_PASS}, new WorldPoint(2575, 3293, 0)), + WANTED_SLUG_MENACE(new Quest[]{Quest.WANTED, Quest.THE_SLUG_MENACE}, new WorldPoint(2996, 3373, 0)), + WATCHTOWER(Quest.WATCHTOWER, new WorldPoint(2545, 3112, 0)), + WATERFALL_QUEST(Quest.WATERFALL_QUEST, new WorldPoint(2521, 3498, 0)), + WHAT_LIES_BELOW(Quest.WHAT_LIES_BELOW, new WorldPoint(3265, 3333, 0)), + WITCHS_HOUSE(Quest.WITCHS_HOUSE, new WorldPoint(2927, 3456, 0)), + ZOGRE_FLESH_EATERS(Quest.ZOGRE_FLESH_EATERS, new WorldPoint(2442, 3051, 0)); + + @Getter + private final WorldPoint location; + + @Getter + private final Quest[] quests; + + QuestStartLocation(Quest[] quests, WorldPoint location) + { + this.location = location; + this.quests = quests; + } + + QuestStartLocation(Quest quest, WorldPoint location) + { + this.location = location; + this.quests = new Quest[]{quest}; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/QuestStartPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartPoint.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/QuestStartPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartPoint.java index ad84a3aa5b..4bd778188c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/QuestStartPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartPoint.java @@ -25,15 +25,15 @@ */ package net.runelite.client.plugins.worldmap; +import net.runelite.api.coords.WorldPoint; import java.awt.image.BufferedImage; import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; class QuestStartPoint extends WorldMapPoint { - QuestStartPoint(QuestStartLocation data, BufferedImage icon) + QuestStartPoint(WorldPoint location, BufferedImage icon, String tooltip) { - super(data.getLocation(), icon); - - setTooltip(data.getTooltip()); + super(location, icon); + setTooltip(tooltip); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java similarity index 94% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java index d1b80af299..843d6eb645 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.worldmap; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Getter enum RareTreeLocation @@ -67,6 +67,7 @@ enum RareTreeLocation new WorldPoint(1640, 3496, 0), new WorldPoint(1613, 3494, 0), new WorldPoint(1560, 3636, 0), + new WorldPoint(1646, 3590, 0), // Miscellania new WorldPoint(2550, 3869, 0), @@ -109,9 +110,8 @@ enum RareTreeLocation new WorldPoint(1353, 3731, 0), new WorldPoint(1529, 3452, 0), new WorldPoint(1591, 3421, 0), - new WorldPoint(1647, 3510, 0), - new WorldPoint(1632, 3509, 0), - new WorldPoint(1623, 3512, 0), + new WorldPoint(1647, 3508, 0), + new WorldPoint(1621, 3512, 0), new WorldPoint(1593, 3491, 0), new WorldPoint(1583, 3499, 0), new WorldPoint(1696, 3554, 0), @@ -119,6 +119,9 @@ enum RareTreeLocation new WorldPoint(1625, 3669, 0), new WorldPoint(1642, 3683, 0), new WorldPoint(1642, 3663, 0), + new WorldPoint(1642, 3533, 0), + new WorldPoint(1671, 3657, 0), + new WorldPoint(1680, 3657, 0), // Tirannwn new WorldPoint(2217, 3141, 0), @@ -187,8 +190,10 @@ enum RareTreeLocation new WorldPoint(1389, 3821, 0), new WorldPoint(1610, 3443, 0), new WorldPoint(1578, 3488, 0), - new WorldPoint(1772, 3510, 0), new WorldPoint(1685, 3740, 0), + new WorldPoint(1681, 3689, 0), + new WorldPoint(1751, 3564, 0), + new WorldPoint(1796, 3600, 0), // Misthalin new WorldPoint(3355, 3312, 0), diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/RareTreePoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreePoint.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/RareTreePoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreePoint.java index b802ea26b7..ce48f4cafd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/RareTreePoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreePoint.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.worldmap; import java.awt.image.BufferedImage; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; class RareTreePoint extends WorldMapPoint diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java index ae1fd5a72c..5444d43c82 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.worldmap; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Getter enum TeleportLocationData diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TeleportType.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TeleportType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TransportationPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPoint.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TransportationPoint.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPoint.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java index 1636aff5c9..a82e77fa72 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java @@ -29,7 +29,7 @@ package net.runelite.client.plugins.worldmap; import lombok.AllArgsConstructor; import lombok.Getter; -import api.coords.WorldPoint; +import net.runelite.api.coords.WorldPoint; @Getter @AllArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java index ca62df484d..7ebe417ef2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java @@ -166,8 +166,8 @@ public interface WorldMapConfig extends Config @ConfigItem( keyName = WorldMapPlugin.CONFIG_KEY_QUEST_START_TOOLTIPS, - name = "Show quest names", - description = "Indicates the names of quests and highlights incomplete ones", + name = "Show quest names and status", + description = "Indicates the names of quests and shows completion status", position = 13 ) default boolean questStartTooltips() diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java similarity index 75% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index e104d1c11c..d5be4c8591 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -29,11 +29,17 @@ import com.google.inject.Inject; import com.google.inject.Provides; import java.awt.image.BufferedImage; import java.util.Arrays; -import api.Client; -import api.Experience; -import api.Skill; -import api.events.ConfigChanged; -import api.events.ExperienceChanged; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.GameState; +import net.runelite.api.Skill; +import net.runelite.api.Quest; +import net.runelite.api.QuestState; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.WidgetID; +import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.AgilityShortcut; @@ -52,6 +58,9 @@ public class WorldMapPlugin extends Plugin static final BufferedImage BLANK_ICON; private static final BufferedImage FAIRY_TRAVEL_ICON; private static final BufferedImage NOPE_ICON; + private static final BufferedImage NOT_STARTED_ICON; + private static final BufferedImage STARTED_ICON; + private static final BufferedImage FINISHED_ICON; static final String CONFIG_KEY = "worldmap"; static final String CONFIG_KEY_FAIRY_RING_TOOLTIPS = "fairyRingTooltips"; @@ -77,6 +86,9 @@ public class WorldMapPlugin extends Plugin //A size of 17 gives us a buffer when triggering tooltips final int iconBufferSize = 17; + //Quest icons are a bit bigger. + final int questIconBufferSize = 22; + BLANK_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); FAIRY_TRAVEL_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); @@ -86,11 +98,26 @@ public class WorldMapPlugin extends Plugin NOPE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); final BufferedImage nopeImage = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "nope_icon.png"); NOPE_ICON.getGraphics().drawImage(nopeImage, 1, 1, null); + + NOT_STARTED_ICON = new BufferedImage(questIconBufferSize, questIconBufferSize, BufferedImage.TYPE_INT_ARGB); + final BufferedImage notStartedIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "quest_not_started_icon.png"); + NOT_STARTED_ICON.getGraphics().drawImage(notStartedIcon, 4, 4, null); + + STARTED_ICON = new BufferedImage(questIconBufferSize, questIconBufferSize, BufferedImage.TYPE_INT_ARGB); + final BufferedImage startedIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "quest_started_icon.png"); + STARTED_ICON.getGraphics().drawImage(startedIcon, 4, 4, null); + + FINISHED_ICON = new BufferedImage(questIconBufferSize, questIconBufferSize, BufferedImage.TYPE_INT_ARGB); + final BufferedImage finishedIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "quest_completed_icon.png"); + FINISHED_ICON.getGraphics().drawImage(finishedIcon, 4, 4, null); } @Inject private Client client; + @Inject + private ClientThread clientThread; + @Inject private WorldMapConfig config; @@ -164,6 +191,17 @@ public class WorldMapPlugin extends Plugin } } + @Subscribe + public void onWidgetLoaded(WidgetLoaded widgetLoaded) + { + if (widgetLoaded.getGroupId() == WidgetID.WORLD_MAP_GROUP_ID) + { + // Quest icons are per-account due to showing quest status, + // so we recreate them each time the map is loaded + updateQuestStartPointIcons(); + } + } + private void updateAgilityIcons() { worldMapPointManager.removeIf(AgilityShortcutPoint.class::isInstance); @@ -200,6 +238,7 @@ public class WorldMapPlugin extends Plugin { updateAgilityIcons(); updateRareTreeIcons(); + updateQuestStartPointIcons(); worldMapPointManager.removeIf(FairyRingPoint.class::isInstance); if (config.fairyRingIcon() || config.fairyRingTooltips()) @@ -219,14 +258,6 @@ public class WorldMapPlugin extends Plugin .forEach(worldMapPointManager::add); } - worldMapPointManager.removeIf(QuestStartPoint.class::isInstance); - if (config.questStartTooltips()) - { - Arrays.stream(QuestStartLocation.values()) - .map(value -> new QuestStartPoint(value, BLANK_ICON)) - .forEach(worldMapPointManager::add); - } - worldMapPointManager.removeIf(TransportationPoint.class::isInstance); if (config.transportationTeleportTooltips()) { @@ -271,4 +302,72 @@ public class WorldMapPlugin extends Plugin }).map(TeleportPoint::new) .forEach(worldMapPointManager::add); } + + private void updateQuestStartPointIcons() + { + worldMapPointManager.removeIf(QuestStartPoint.class::isInstance); + + if (!config.questStartTooltips()) + { + return; + } + + // Must setup the quest icons on the client thread, after the player has logged in. + clientThread.invokeLater(() -> + { + if (client.getGameState() != GameState.LOGGED_IN) + { + return false; + } + + Arrays.stream(QuestStartLocation.values()) + .map(this::createQuestStartPoint) + .forEach(worldMapPointManager::add); + return true; + }); + } + + private QuestStartPoint createQuestStartPoint(QuestStartLocation data) + { + Quest[] quests = data.getQuests(); + + // Get first uncompleted quest. Else, return the last quest. + Quest quest = null; + for (int i = 0; i < quests.length; i++) + { + if (quests[i].getState(client) != QuestState.FINISHED) + { + quest = quests[i]; + break; + } + } + if (quest == null) + { + quest = quests[quests.length - 1]; + } + + BufferedImage icon = BLANK_ICON; + String tooltip = ""; + if (quest != null) + { + tooltip = quest.getName(); + switch (quest.getState(client)) + { + case FINISHED: + icon = FINISHED_ICON; + tooltip += " - Finished"; + break; + case IN_PROGRESS: + icon = STARTED_ICON; + tooltip += " - Started"; + break; + case NOT_STARTED: + icon = NOT_STARTED_ICON; + tooltip += " - Not Started"; + break; + } + } + + return new QuestStartPoint(data.getLocation(), icon, tooltip); + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobe.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobe.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobe.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobe.java index ed185e090b..51d0e1328d 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobe.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobe.java @@ -28,7 +28,7 @@ import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import api.Skill; +import net.runelite.api.Skill; @Getter @Setter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java index 85582b3545..c7e4b1610b 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java @@ -39,9 +39,9 @@ import java.text.DecimalFormat; import java.time.Instant; import java.util.List; import javax.inject.Inject; -import api.Client; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Point; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Point; import net.runelite.client.game.SkillIconManager; import net.runelite.client.plugins.xptracker.XpActionType; import net.runelite.client.plugins.xptracker.XpTrackerService; @@ -51,8 +51,10 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; public class XpGlobesOverlay extends Overlay { @@ -248,16 +250,11 @@ public class XpGlobesOverlay extends Overlay xpTooltip.setPreferredLocation(new java.awt.Point(x, y)); xpTooltip.setPreferredSize(new Dimension(TOOLTIP_RECT_SIZE_X, 0)); - xpTooltip.getChildren().add(LineComponent.builder() - .left(skillName) - .right(skillLevel) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - xpTooltip.getChildren().add(LineComponent.builder() - .left("Current XP:") - .leftColor(Color.ORANGE) - .right(skillCurrentXp) - .build()); + tableComponent.addRow(skillName, skillLevel); + tableComponent.addRow(ColorUtil.prependColorTag("Current XP:", Color.ORANGE), skillCurrentXp); if (goalXp > mouseOverSkill.getCurrentXp()) { @@ -267,43 +264,30 @@ public class XpGlobesOverlay extends Overlay if (actionsLeft != Integer.MAX_VALUE) { String actionsLeftString = decimalFormat.format(actionsLeft); - xpTooltip.getChildren().add(LineComponent.builder() - .left(xpActionType.getLabel() + " left:") - .leftColor(Color.ORANGE) - .right(actionsLeftString) - .build()); + + tableComponent.addRow(ColorUtil.prependColorTag(xpActionType.getLabel() + " left:", Color.ORANGE), actionsLeftString); } int xpLeft = goalXp - mouseOverSkill.getCurrentXp(); String skillXpToLvl = decimalFormat.format(xpLeft); - xpTooltip.getChildren().add(LineComponent.builder() - .left("XP left:") - .leftColor(Color.ORANGE) - .right(skillXpToLvl) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("XP left:", Color.ORANGE), skillXpToLvl); int xpHr = xpTrackerService.getXpHr(mouseOverSkill.getSkill()); if (xpHr != 0) { String xpHrString = decimalFormat.format(xpHr); - xpTooltip.getChildren().add(LineComponent.builder() - .left("XP per hour:") - .leftColor(Color.ORANGE) - .right(xpHrString) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("XP per hour:", Color.ORANGE), xpHrString); } - + if (config.enableTimeToLevel()) { String timeLeft = xpTrackerService.getTimeTillGoal(mouseOverSkill.getSkill()); - xpTooltip.getChildren().add(LineComponent.builder() - .left("Time left:") - .leftColor(Color.ORANGE) - .right(timeLeft) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("TimeLeft:", Color.ORANGE), timeLeft); } } + xpTooltip.getChildren().add(tableComponent); + xpTooltip.render(graphics); } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java index f3bae1ca07..2771c986f5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java @@ -32,11 +32,11 @@ import java.util.Iterator; import java.util.List; import javax.inject.Inject; import lombok.Getter; -import api.Client; -import api.Experience; -import api.Skill; -import api.events.ExperienceChanged; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Skill; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpAction.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpAction.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpAction.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpActionType.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpActionType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpActionType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpActionType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBox.java similarity index 84% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBox.java index fd3fe04134..c2e2284797 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBox.java @@ -28,6 +28,9 @@ package net.runelite.client.plugins.xptracker; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collections; @@ -42,9 +45,9 @@ import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import lombok.AccessLevel; import lombok.Getter; -import api.Client; -import api.Experience; -import api.Skill; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.Skill; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.DynamicGridLayout; @@ -79,12 +82,13 @@ class XpInfoBox extends JPanel /* The tracker's wrapping container */ private final JPanel container = new JPanel(); - /* Contains the skill icon and the stats panel */ - private final JPanel headerPanel = new JPanel(); + /* Contains the skill icon */ + private final JPanel skillWrapper = new JPanel(); /* Contains all the skill information (exp gained, per hour, etc) */ private final JPanel statsPanel = new JPanel(); + private final JPanel progressWrapper = new JPanel(); private final ProgressBar progressBar = new ProgressBar(); private final JLabel expGained = new JLabel(); @@ -98,6 +102,14 @@ class XpInfoBox extends JPanel private boolean paused = false; + private Style style = Style.FULL; + + private enum Style + { + FULL, + SIMPLE + } + XpInfoBox(XpTrackerPlugin xpTrackerPlugin, XpTrackerConfig xpTrackerConfig, Client client, JPanel panel, Skill skill, SkillIconManager iconManager) { this.xpTrackerConfig = xpTrackerConfig; @@ -134,6 +146,10 @@ class XpInfoBox extends JPanel popupMenu.add(pauseSkill); popupMenu.add(canvasItem); + skillWrapper.setBackground(ColorScheme.DARKER_GRAY_COLOR); + skillWrapper.setLayout(new BorderLayout()); + skillWrapper.setBorder(new EmptyBorder(0, 5, 0, 0)); + canvasItem.addActionListener(e -> { if (canvasItem.getText().equals(REMOVE_STATE)) @@ -151,14 +167,13 @@ class XpInfoBox extends JPanel JLabel skillIcon = new JLabel(new ImageIcon(iconManager.getSkillImage(skill))); skillIcon.setHorizontalAlignment(SwingConstants.CENTER); skillIcon.setVerticalAlignment(SwingConstants.CENTER); - skillIcon.setPreferredSize(new Dimension(35, 35)); + skillIcon.setPreferredSize(new Dimension(30, 30)); - headerPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); - headerPanel.setLayout(new BorderLayout()); + skillWrapper.add(skillIcon, BorderLayout.NORTH); statsPanel.setLayout(new DynamicGridLayout(2, 2)); statsPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); - statsPanel.setBorder(new EmptyBorder(9, 2, 9, 2)); + statsPanel.setBorder(new EmptyBorder(6, 5, 0, 2)); expGained.setFont(FontManager.getRunescapeSmallFont()); expHour.setFont(FontManager.getRunescapeSmallFont()); @@ -170,13 +185,8 @@ class XpInfoBox extends JPanel statsPanel.add(expHour); statsPanel.add(actionsLeft); - headerPanel.add(skillIcon, BorderLayout.WEST); - headerPanel.add(statsPanel, BorderLayout.CENTER); - - JPanel progressWrapper = new JPanel(); progressWrapper.setBackground(ColorScheme.DARKER_GRAY_COLOR); progressWrapper.setLayout(new BorderLayout()); - progressWrapper.setBorder(new EmptyBorder(0, 7, 7, 7)); progressBar.setMaximumValue(100); progressBar.setBackground(new Color(61, 56, 49)); @@ -185,15 +195,48 @@ class XpInfoBox extends JPanel progressWrapper.add(progressBar, BorderLayout.NORTH); - container.add(headerPanel, BorderLayout.NORTH); - container.add(progressWrapper, BorderLayout.SOUTH); - container.setComponentPopupMenu(popupMenu); progressBar.setComponentPopupMenu(popupMenu); + MouseListener mouseListener = new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + if (SwingUtilities.isLeftMouseButton(e)) + { + toggleStyle(); + } + } + }; + container.addMouseListener(mouseListener); + progressBar.addMouseListener(mouseListener); + add(container, BorderLayout.NORTH); } + void setStyle(Style style) + { + container.removeAll(); + + if (style == Style.SIMPLE) + { + progressWrapper.setBorder(new EmptyBorder(7, 7, 7, 7)); + container.add(skillWrapper, BorderLayout.WEST); + container.add(progressWrapper, BorderLayout.CENTER); + } + else + { + progressWrapper.setBorder(new EmptyBorder(4, 7, 7, 7)); + container.add(skillWrapper, BorderLayout.WEST); + container.add(statsPanel, BorderLayout.CENTER); + container.add(progressWrapper, BorderLayout.SOUTH); + } + + panel.revalidate(); + this.style = style; + } + void reset() { canvasItem.setText(ADD_STATE); @@ -214,7 +257,7 @@ class XpInfoBox extends JPanel if (getParent() != panel) { panel.add(this); - panel.revalidate(); + setStyle(style); } paused = skillPaused; @@ -284,6 +327,18 @@ class XpInfoBox extends JPanel expHour.setText(htmlLabel("XP/Hour: ", xpSnapshotSingle.getXpPerHour())); } + private void toggleStyle() + { + if (style == Style.FULL) + { + setStyle(Style.SIMPLE); + } + else + { + setStyle(Style.FULL); + } + } + static String htmlLabel(String key, int value) { String valueStr = StackFormatter.quantityToRSDecimalStack(value, true); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java index a6c28b4616..2f07d07389 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java @@ -32,9 +32,9 @@ import java.awt.Rectangle; import java.awt.image.BufferedImage; import lombok.AccessLevel; import lombok.Getter; -import api.Experience; -import static api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import api.Skill; +import net.runelite.api.Experience; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.SkillColor; import net.runelite.client.ui.overlay.Overlay; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java index f3db60c05f..c7bf7c3876 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java @@ -38,9 +38,9 @@ import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.Client; -import api.Skill; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Skill; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java index 43ab6f0c02..194c890c42 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.xptracker; import java.util.EnumMap; import java.util.Map; -import api.Skill; +import net.runelite.api.Skill; class XpPauseState { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java index bbba0d3097..9e5cc55622 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java @@ -28,7 +28,7 @@ import java.util.EnumSet; import java.util.Set; import lombok.Getter; import lombok.RequiredArgsConstructor; -import api.Skill; +import net.runelite.api.Skill; @RequiredArgsConstructor class XpPauseStateSingle diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpSnapshotSingle.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpSnapshotSingle.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpSnapshotSingle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpSnapshotSingle.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpState.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpState.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java index e6176eff2d..2967c370f0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java @@ -27,8 +27,8 @@ package net.runelite.client.plugins.xptracker; import java.util.EnumMap; import java.util.Map; import lombok.NonNull; -import api.NPC; -import api.Skill; +import net.runelite.api.NPC; +import net.runelite.api.Skill; /** * Internal state for the XpTrackerPlugin @@ -126,9 +126,9 @@ class XpState * @param npc currently interacted NPC * @param npcHealth health of currently interacted NPC */ - void updateNpcExperience(Skill skill, NPC npc, Integer npcHealth) + void updateNpcExperience(Skill skill, NPC npc, int npcHealth) { - if (npc == null || npc.getCombatLevel() <= 0 || npcHealth == null) + if (npc == null || npc.getCombatLevel() <= 0 || npcHealth == -1) { return; } @@ -170,11 +170,11 @@ class XpState * @param npcHealth max health of npc that just died * @return UPDATED in case new kill was successfully added */ - XpUpdateResult updateNpcKills(Skill skill, NPC npc, Integer npcHealth) + XpUpdateResult updateNpcKills(Skill skill, NPC npc, int npcHealth) { XpStateSingle state = getSkill(skill); - if (state.getXpGained() <= 0 || npcHealth == null || npc != interactedNPC) + if (state.getXpGained() <= 0 || npcHealth == -1 || npc != interactedNPC) { return XpUpdateResult.NO_CHANGE; } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java index b2b565dd65..2b6c694ba1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java @@ -31,8 +31,8 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import api.Experience; -import api.Skill; +import net.runelite.api.Experience; +import net.runelite.api.Skill; @Slf4j @RequiredArgsConstructor diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index b3ed4a3139..68663a896f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -36,19 +36,19 @@ import java.util.List; import java.util.Objects; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Actor; -import api.Client; -import api.Experience; -import api.GameState; -import api.NPC; -import api.Player; -import api.Skill; -import api.VarPlayer; -import api.WorldType; -import api.events.ExperienceChanged; -import api.events.GameStateChanged; -import api.events.GameTick; -import api.events.NpcDespawned; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; +import net.runelite.api.WorldType; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.NPCManager; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java index 484f9e594c..9d8c248b50 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.xptracker; -import api.Skill; +import net.runelite.api.Skill; public interface XpTrackerService { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java index acdc8b087c..0c31b85ba2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.xptracker; import javax.inject.Inject; import javax.inject.Singleton; -import api.Skill; +import net.runelite.api.Skill; @Singleton class XpTrackerServiceImpl implements XpTrackerService diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpUpdateResult.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpUpdateResult.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpUpdateResult.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpUpdateResult.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpWorldType.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpWorldType.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpWorldType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpWorldType.java index d4ee8735d7..a907381347 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xptracker/XpWorldType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpWorldType.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.xptracker; -import api.WorldType; +import net.runelite.api.WorldType; enum XpWorldType { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java index 13f2b6bfc9..e8e31dd0f2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java @@ -28,9 +28,9 @@ import java.util.HashSet; import java.util.Set; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.events.GameStateChanged; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -81,6 +81,12 @@ public class XteaPlugin extends Plugin log.debug("Region {} keys {}, {}, {}, {}", region, keys[0], keys[1], keys[2], keys[3]); + //Don't post non encrypted regions + if (keys[0] == 0 && keys[1] == 0 && keys[2] == 0 && keys[3] == 0) + { + continue; + } + XteaKey xteaKey = new XteaKey(); xteaKey.setRegion(region); xteaKey.setKeys(keys); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zoom/ControlFunction.java b/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ControlFunction.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zoom/ControlFunction.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zoom/ControlFunction.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zoom/ZoomConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zoom/ZoomConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java index 4eb9907d23..634c9fe06a 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java @@ -28,11 +28,11 @@ package net.runelite.client.plugins.zoom; import com.google.inject.Inject; import com.google.inject.Provides; import java.awt.event.KeyEvent; -import api.Client; -import api.ScriptID; -import api.events.ConfigChanged; -import api.events.FocusChanged; -import api.events.ScriptCallbackEvent; +import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ImagePanelComponent.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ImagePanelComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ImagePanelComponent.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ImagePanelComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/TextComponent.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/TextComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/TextComponent.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/TextComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java similarity index 91% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java index 3955d043a2..2911317a38 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java @@ -44,4 +44,14 @@ public interface ZulrahConfig extends Config { return true; } + + @ConfigItem( + keyName = "sounds", + name = "Sounds Enabled", + description = "Configures whether client sounds are enabled for zulrah" + ) + default boolean sounds() + { + return true; + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahInstance.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahInstance.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahInstance.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahInstance.java index 708136818d..e701cd65f6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahInstance.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahInstance.java @@ -27,9 +27,9 @@ package net.runelite.client.plugins.zulrah; -import api.NPC; -import api.Prayer; -import api.coords.LocalPoint; +import net.runelite.api.NPC; +import net.runelite.api.Prayer; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.plugins.zulrah.patterns.ZulrahPattern; import net.runelite.client.plugins.zulrah.phase.StandLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahLocation; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java similarity index 77% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java index 252b7cdd65..366d636e94 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java @@ -2,6 +2,7 @@ * Copyright (c) 2017, Aria * Copyright (c) 2017, Adam * Copyright (c) 2017, Devin French + * Copyright (c) 2019, Ganom * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,14 +31,20 @@ import com.google.inject.Provides; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.GameState; -import api.NPC; -import api.events.GameTick; -import api.events.NpcDespawned; -import api.events.NpcSpawned; +import net.runelite.api.Actor; +import net.runelite.api.AnimationID; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.Prayer; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.Sound; +import net.runelite.client.game.SoundManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; @@ -57,56 +64,45 @@ import net.runelite.client.ui.overlay.OverlayManager; name = "Zulrah Helper", description = "Shows tiles on where to stand during the phases and what prayer to use.", tags = {"zulrah", "boss", "helper"}, - type = PluginType.PVM + type = PluginType.PVM, + enabledByDefault = false ) - @Slf4j public class ZulrahPlugin extends Plugin { - @Getter - private NPC zulrah; - - @Inject - private Client client; - - @Inject - private ZulrahConfig config; - - @Inject - private ZulrahOverlay overlay; - - @Inject - private OverlayManager overlayManager; - - @Inject - private ZulrahCurrentPhaseOverlay currentPhaseOverlay; - - @Inject - private ZulrahNextPhaseOverlay nextPhaseOverlay; - - @Inject - private ZulrahPrayerOverlay zulrahPrayerOverlay; - - @Inject - private ZulrahOverlay zulrahOverlay; - - - @Provides - ZulrahConfig getConfig(ConfigManager configManager) - { - return configManager.getConfig(ZulrahConfig.class); - } - - private final ZulrahPattern[] patterns = new ZulrahPattern[] + private static final ZulrahPattern[] patterns = new ZulrahPattern[] { new ZulrahPatternA(), new ZulrahPatternB(), new ZulrahPatternC(), new ZulrahPatternD() }; - + @Getter + private NPC zulrah; + @Inject + private Client client; + @Inject + private ZulrahConfig config; + @Inject + private OverlayManager overlayManager; + @Inject + private SoundManager soundManager; + @Inject + private ZulrahCurrentPhaseOverlay currentPhaseOverlay; + @Inject + private ZulrahNextPhaseOverlay nextPhaseOverlay; + @Inject + private ZulrahPrayerOverlay zulrahPrayerOverlay; + @Inject + private ZulrahOverlay zulrahOverlay; private ZulrahInstance instance; + @Provides + ZulrahConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(ZulrahConfig.class); + } + @Override protected void startUp() throws Exception { @@ -152,6 +148,7 @@ public class ZulrahPlugin extends Plugin } ZulrahPhase currentPhase = ZulrahPhase.valueOf(zulrah, instance.getStartLocation()); + if (instance.getPhase() == null) { instance.setPhase(currentPhase); @@ -166,6 +163,7 @@ public class ZulrahPlugin extends Plugin } ZulrahPattern pattern = instance.getPattern(); + if (pattern == null) { int potential = 0; @@ -196,36 +194,65 @@ public class ZulrahPlugin extends Plugin } @Subscribe - public void onNpcSpawned(NpcSpawned event) + public void onAnimationChanged(AnimationChanged event) { - try + if (instance == null) { - NPC npc = event.getNpc(); - if (npc != null && npc.getName().toLowerCase().contains("zulrah")) + return; + } + + ZulrahPhase currentPhase = instance.getPhase(); + + if (currentPhase == null) + { + return; + } + + Actor actor = event.getActor(); + if (config.sounds()) + { + if (zulrah == actor) { - zulrah = npc; + if (zulrah.getAnimation() == AnimationID.ZULRAH_PHASE) + { + Prayer prayer = instance.getNextPhase().getPrayer(); + + if (prayer != null) + { + switch (prayer) + { + case PROTECT_FROM_MAGIC: + soundManager.playSound(Sound.PRAY_MAGIC); + break; + case PROTECT_FROM_MISSILES: + soundManager.playSound(Sound.PRAY_RANGED); + break; + } + } + } } } - catch (Exception e) - { + } + @Subscribe + public void onNpcSpawned(NpcSpawned event) + { + NPC npc = event.getNpc(); + if (npc != null && npc.getName() != null && + npc.getName().toLowerCase().contains("zulrah")) + { + zulrah = npc; } } @Subscribe public void onNpcDespawned(NpcDespawned event) { - try + NPC npc = event.getNpc(); + if (npc != null && npc.getName() != null && + npc.getName().toLowerCase().contains("zulrah")) { - NPC npc = event.getNpc(); - if (npc != null && npc.getName().toLowerCase().contains("zulrah")) - { - zulrah = null; - } - } - catch (Exception e) - { - + zulrah = null; } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahCurrentPhaseOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahCurrentPhaseOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahCurrentPhaseOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahCurrentPhaseOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahImageManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahImageManager.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahImageManager.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahImageManager.java index 10bb6f3cbf..c64736c352 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahImageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahImageManager.java @@ -28,7 +28,7 @@ package net.runelite.client.plugins.zulrah.overlays; import java.awt.image.BufferedImage; import lombok.extern.slf4j.Slf4j; -import api.Prayer; +import net.runelite.api.Prayer; import net.runelite.client.plugins.zulrah.ZulrahPlugin; import net.runelite.client.plugins.zulrah.phase.ZulrahType; import net.runelite.client.util.ImageUtil; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahNextPhaseOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahNextPhaseOverlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahNextPhaseOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahNextPhaseOverlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahOverlay.java index 17fb0ab337..93ce00d4bc 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahOverlay.java @@ -37,10 +37,10 @@ import java.awt.image.BufferedImage; import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.plugins.zulrah.ZulrahInstance; import net.runelite.client.plugins.zulrah.ZulrahPlugin; import net.runelite.client.plugins.zulrah.phase.ZulrahPhase; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java index 317f141533..abcd234034 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java @@ -32,8 +32,8 @@ import java.awt.image.BufferedImage; import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import api.Client; -import api.Prayer; +import net.runelite.api.Client; +import net.runelite.api.Prayer; import net.runelite.client.plugins.zulrah.ImagePanelComponent; import net.runelite.client.plugins.zulrah.ZulrahInstance; import net.runelite.client.plugins.zulrah.ZulrahPlugin; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java index 0b3e077342..04cd35e278 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java @@ -29,7 +29,7 @@ package net.runelite.client.plugins.zulrah.patterns; import java.util.ArrayList; import java.util.List; -import api.Prayer; +import net.runelite.api.Prayer; import net.runelite.client.plugins.zulrah.phase.StandLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahPhase; @@ -74,4 +74,4 @@ public abstract class ZulrahPattern { return index >= pattern.size(); } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternA.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternA.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternA.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternA.java index 9f4d9dcc4f..887236f321 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternA.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternA.java @@ -26,7 +26,7 @@ */ package net.runelite.client.plugins.zulrah.patterns; -import api.Prayer; +import net.runelite.api.Prayer; import net.runelite.client.plugins.zulrah.phase.StandLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahType; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternB.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternB.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternB.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternB.java index d799a4a979..20a9a560a0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternB.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternB.java @@ -1,6 +1,6 @@ package net.runelite.client.plugins.zulrah.patterns; -import api.Prayer; +import net.runelite.api.Prayer; import net.runelite.client.plugins.zulrah.phase.StandLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahType; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java index 8e9d4d38a1..893ffcaff4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java @@ -26,7 +26,7 @@ */ package net.runelite.client.plugins.zulrah.patterns; -import api.Prayer; +import net.runelite.api.Prayer; import net.runelite.client.plugins.zulrah.phase.StandLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahType; @@ -53,4 +53,4 @@ public class ZulrahPatternC extends ZulrahPattern { return "Pattern C"; } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternD.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternD.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternD.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternD.java index 4148900fb6..bed503e24f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternD.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternD.java @@ -26,7 +26,7 @@ */ package net.runelite.client.plugins.zulrah.patterns; -import api.Prayer; +import net.runelite.api.Prayer; import net.runelite.client.plugins.zulrah.phase.StandLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahLocation; import net.runelite.client.plugins.zulrah.phase.ZulrahType; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/StandLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/StandLocation.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/StandLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/StandLocation.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahLocation.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahLocation.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahLocation.java index 8582b14bb3..ce5ab0fa94 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahLocation.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.zulrah.phase; import lombok.extern.slf4j.Slf4j; -import api.coords.LocalPoint; +import net.runelite.api.coords.LocalPoint; @Slf4j public enum ZulrahLocation diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java index ed1c776662..c1fc54b7da 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java @@ -26,9 +26,9 @@ package net.runelite.client.plugins.zulrah.phase; import java.awt.Color; -import api.NPC; -import api.Prayer; -import api.coords.LocalPoint; +import net.runelite.api.NPC; +import net.runelite.api.Prayer; +import net.runelite.api.coords.LocalPoint; public class ZulrahPhase { @@ -69,12 +69,12 @@ public class ZulrahPhase public String toString() { return "ZulrahPhase{" + - "zulrahLocation=" + zulrahLocation + - ", type=" + type + - ", jad=" + jad + - ", standLocation=" + standLocation + - ", prayer=" + prayer + - '}'; + "zulrahLocation=" + zulrahLocation + + ", type=" + type + + ", jad=" + jad + + ", standLocation=" + standLocation + + ", prayer=" + prayer + + '}'; } // world location @@ -184,4 +184,4 @@ public class ZulrahPhase } return RANGE_COLOR; } -} +} \ No newline at end of file diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahType.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahType.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahType.java rename to runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahType.java index 3a8665dd20..60b6bfb9fb 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahType.java @@ -26,7 +26,7 @@ package net.runelite.client.plugins.zulrah.phase; import lombok.extern.slf4j.Slf4j; -import api.NpcID; +import net.runelite.api.NpcID; @Slf4j public enum ZulrahType diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/ClientConfigLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/ClientConfigLoader.java rename to runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java new file mode 100644 index 0000000000..1024da016f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2016-2017, Adam + * Copyright (c) 2018, Tomas Slusny + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.rs; + +import java.net.URLClassLoader; +import java.applet.Applet; +import java.io.IOException; +import java.net.URL; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Singleton +public class ClientLoader +{ + private final ClientConfigLoader clientConfigLoader; + private ClientUpdateCheckMode updateCheckMode; + public static boolean useLocalInjected = false; + + @Inject + private ClientLoader( + @Named("updateCheckMode") final ClientUpdateCheckMode updateCheckMode, + final ClientConfigLoader clientConfigLoader) + { + this.updateCheckMode = updateCheckMode; + this.clientConfigLoader = clientConfigLoader; + } + + public Applet load() + { + try + { + final RSConfig config = clientConfigLoader.fetch(); + + switch (updateCheckMode) + { + case AUTO: + default: + return loadRLPlus(config); + case VANILLA: + return loadVanilla(config); + case NONE: + return null; + } + } + catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e) + { + if (e instanceof ClassNotFoundException) + { + log.error("Unable to load client - class not found. This means you" + + " are not running RuneLite with Maven as the injected client" + + " is not in your classpath."); + } + + log.error("Error loading RS!", e); + return null; + } + } + + private static Applet loadRLPlus(final RSConfig config) throws ClassNotFoundException, InstantiationException, IllegalAccessException + { + // the injected client is a runtime scoped dependency + final Class clientClass = ClientLoader.class.getClassLoader().loadClass(config.getInitialClass()); + return loadFromClass(config, clientClass); + } + + private static Applet loadVanilla(final RSConfig config) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException + { + final String codebase = config.getCodeBase(); + final String initialJar = config.getInitialJar(); + final String initialClass = config.getInitialClass(); + final URL url = new URL(codebase + initialJar); + + // Must set parent classloader to null, or it will pull from + // this class's classloader first + final URLClassLoader classloader = new URLClassLoader(new URL[]{url}, null); + final Class clientClass = classloader.loadClass(initialClass); + return loadFromClass(config, clientClass); + } + + private static Applet loadFromClass(final RSConfig config, final Class clientClass) throws IllegalAccessException, InstantiationException + { + final Applet rs = (Applet) clientClass.newInstance(); + rs.setStub(new RSAppletStub(config)); + return rs; + } +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java rename to runelite-client/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java index 4d810019ff..4d1dd55796 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java @@ -29,5 +29,6 @@ public enum ClientUpdateCheckMode AUTO, NONE, VANILLA, - CUSTOM + CUSTOM, + PATCH } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/RSAppletStub.java b/runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/RSAppletStub.java rename to runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/RSConfig.java b/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/RSConfig.java rename to runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/VerificationException.java b/runelite-client/src/main/java/net/runelite/client/rs/VerificationException.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/VerificationException.java rename to runelite-client/src/main/java/net/runelite/client/rs/VerificationException.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/MixinRunner.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/MixinRunner.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/MixinRunner.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/MixinRunner.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/AppendTransformer.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/AppendTransformer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/AppendTransformer.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/AppendTransformer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/DoNothingTransformer.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/DoNothingTransformer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/DoNothingTransformer.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/DoNothingTransformer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/InjectTransformer.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/InjectTransformer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/InjectTransformer.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/InjectTransformer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/InterfaceTransformer.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/InterfaceTransformer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/InterfaceTransformer.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/InterfaceTransformer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/MethodReflector.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/MethodReflector.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/MethodReflector.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/MethodReflector.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteSanityCheck.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteSanityCheck.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteSanityCheck.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteSanityCheck.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteTransformer.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteTransformer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteTransformer.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/OverwriteTransformer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/PrependTransformer.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/PrependTransformer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/PrependTransformer.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/PrependTransformer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/ProtectTransformer.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/ProtectTransformer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/ProtectTransformer.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/ProtectTransformer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/SanityChecker.java b/runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/SanityChecker.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/rs/mixins/transformers/SanityChecker.java rename to runelite-client/src/main/java/net/runelite/client/rs/mixins/transformers/SanityChecker.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/task/Schedule.java b/runelite-client/src/main/java/net/runelite/client/task/Schedule.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/task/Schedule.java rename to runelite-client/src/main/java/net/runelite/client/task/Schedule.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/task/ScheduledMethod.java b/runelite-client/src/main/java/net/runelite/client/task/ScheduledMethod.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/task/ScheduledMethod.java rename to runelite-client/src/main/java/net/runelite/client/task/ScheduledMethod.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/task/Scheduler.java b/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/task/Scheduler.java rename to runelite-client/src/main/java/net/runelite/client/task/Scheduler.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/ClientPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/ClientPanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java index 50eb83428a..a687751220 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/ClientPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java @@ -24,13 +24,13 @@ */ package net.runelite.client.ui; -import api.Client; -import api.Constants; import java.applet.Applet; import java.awt.BorderLayout; import java.awt.Color; import javax.annotation.Nullable; import javax.swing.JPanel; +import net.runelite.api.Client; +import net.runelite.api.Constants; final class ClientPanel extends JPanel { @@ -55,7 +55,7 @@ final class ClientPanel extends JPanel add(client, BorderLayout.CENTER); - // This causes the whole game frame to be redrawn each frame instead + // api.renderableThis causes the whole game frame to be redrawn each frame instead // of only the viewport, so we can hook to MainBufferProvider#draw // and draw anywhere without it leaving artifacts if (client instanceof Client) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/ClientPluginToolbar.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientPluginToolbar.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/ClientPluginToolbar.java rename to runelite-client/src/main/java/net/runelite/client/ui/ClientPluginToolbar.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/ClientTitleToolbar.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientTitleToolbar.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/ClientTitleToolbar.java rename to runelite-client/src/main/java/net/runelite/client/ui/ClientTitleToolbar.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/ClientToolbar.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientToolbar.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/ClientToolbar.java rename to runelite-client/src/main/java/net/runelite/client/ui/ClientToolbar.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/ClientUI.java rename to runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index f64de3c0df..8b3fc96130 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -24,15 +24,6 @@ */ package net.runelite.client.ui; -import api.Client; -import api.Constants; -import api.GameState; -import api.Player; -import api.Point; -import api.events.ConfigChanged; -import api.events.GameStateChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; import com.google.common.base.Strings; import java.applet.Applet; import java.awt.Canvas; @@ -76,6 +67,15 @@ import javax.swing.JRootPane; import javax.swing.SwingUtilities; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.RuneLite; import net.runelite.client.RuneLiteProperties; import net.runelite.client.callback.ClientThread; @@ -691,8 +691,8 @@ public class ClientUI final Rectangle sidebarButtonRange = new Rectangle(x - 15, 0, image.getWidth() + 25, client.getRealDimensions().height); final Point mousePosition = new Point( - (int)client.getMouseCanvasPosition().getX() + client.getViewportXOffset(), - (int)client.getMouseCanvasPosition().getY() + client.getViewportYOffset()); + client.getMouseCanvasPosition().getX() + client.getViewportXOffset(), + client.getMouseCanvasPosition().getY() + client.getViewportYOffset()); if (sidebarButtonRange.contains(mousePosition.getX(), mousePosition.getY())) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/ColorScheme.java b/runelite-client/src/main/java/net/runelite/client/ui/ColorScheme.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/ColorScheme.java rename to runelite-client/src/main/java/net/runelite/client/ui/ColorScheme.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/ContainableFrame.java b/runelite-client/src/main/java/net/runelite/client/ui/ContainableFrame.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/ContainableFrame.java rename to runelite-client/src/main/java/net/runelite/client/ui/ContainableFrame.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/DrawManager.java b/runelite-client/src/main/java/net/runelite/client/ui/DrawManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/DrawManager.java rename to runelite-client/src/main/java/net/runelite/client/ui/DrawManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/DynamicGridLayout.java b/runelite-client/src/main/java/net/runelite/client/ui/DynamicGridLayout.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/DynamicGridLayout.java rename to runelite-client/src/main/java/net/runelite/client/ui/DynamicGridLayout.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/FontManager.java b/runelite-client/src/main/java/net/runelite/client/ui/FontManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/FontManager.java rename to runelite-client/src/main/java/net/runelite/client/ui/FontManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/JagexColors.java b/runelite-client/src/main/java/net/runelite/client/ui/JagexColors.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/JagexColors.java rename to runelite-client/src/main/java/net/runelite/client/ui/JagexColors.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/NavigationButton.java b/runelite-client/src/main/java/net/runelite/client/ui/NavigationButton.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/NavigationButton.java rename to runelite-client/src/main/java/net/runelite/client/ui/NavigationButton.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/PluginPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/PluginPanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/RuneLiteSplashScreen.java b/runelite-client/src/main/java/net/runelite/client/ui/RuneLiteSplashScreen.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/RuneLiteSplashScreen.java rename to runelite-client/src/main/java/net/runelite/client/ui/RuneLiteSplashScreen.java index 9b124b2d5d..8dbc86a701 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/RuneLiteSplashScreen.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/RuneLiteSplashScreen.java @@ -130,7 +130,7 @@ public class RuneLiteSplashScreen panel.add(version, versionConstraints); // version - final JLabel litVersion = new JLabel("Plus Version : PRE-" + RuneLite.RUNELIT_VERSION); + final JLabel litVersion = new JLabel("Plus Version : " + RuneLite.RUNELIT_VERSION); litVersion.setForeground(Color.GREEN); litVersion.setFont(FontManager.getRunescapeSmallFont()); litVersion.setForeground(litVersion.getForeground().darker()); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/SkillColor.java b/runelite-client/src/main/java/net/runelite/client/ui/SkillColor.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/SkillColor.java rename to runelite-client/src/main/java/net/runelite/client/ui/SkillColor.java index 47b31e2d88..124a1ef229 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/SkillColor.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/SkillColor.java @@ -24,9 +24,9 @@ */ package net.runelite.client.ui; -import api.Skill; import java.awt.Color; import lombok.Getter; +import net.runelite.api.Skill; public enum SkillColor { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/ComboBoxListRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/components/ComboBoxListRenderer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/ComboBoxListRenderer.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/ComboBoxListRenderer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/CustomScrollBarUI.java b/runelite-client/src/main/java/net/runelite/client/ui/components/CustomScrollBarUI.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/CustomScrollBarUI.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/CustomScrollBarUI.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/DimmableJPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/components/DimmableJPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/DimmableJPanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/DimmableJPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/FlatTextField.java b/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/FlatTextField.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/IconButton.java b/runelite-client/src/main/java/net/runelite/client/ui/components/IconButton.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/IconButton.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/IconButton.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/IconTextField.java b/runelite-client/src/main/java/net/runelite/client/ui/components/IconTextField.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/IconTextField.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/IconTextField.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/PluginErrorPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/components/PluginErrorPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/PluginErrorPanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/PluginErrorPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/ProgressBar.java b/runelite-client/src/main/java/net/runelite/client/ui/components/ProgressBar.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/ProgressBar.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/ProgressBar.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/ThinProgressBar.java b/runelite-client/src/main/java/net/runelite/client/ui/components/ThinProgressBar.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/ThinProgressBar.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/ThinProgressBar.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/ColorPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/ColorPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/ColorPanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/ColorPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValuePanel.java b/runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValuePanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValuePanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValuePanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValueSlider.java b/runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValueSlider.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValueSlider.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/ColorValueSlider.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/HuePanel.java b/runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/HuePanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/HuePanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/HuePanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/PreviewPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/PreviewPanel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/PreviewPanel.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/PreviewPanel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/RuneliteColorPicker.java b/runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/RuneliteColorPicker.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/colorpicker/RuneliteColorPicker.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/colorpicker/RuneliteColorPicker.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java b/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTabGroup.java b/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTabGroup.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTabGroup.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTabGroup.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabel.java b/runelite-client/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabel.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabelUI.java b/runelite-client/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabelUI.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabelUI.java rename to runelite-client/src/main/java/net/runelite/client/ui/components/shadowlabel/JShadowedLabelUI.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/Overlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/Overlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayBounds.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayBounds.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayBounds.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayBounds.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayLayer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayLayer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayLayer.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayLayer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java index 0e4c3a4ee5..d68a7acbc1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java @@ -24,10 +24,6 @@ */ package net.runelite.client.ui.overlay; -import api.MenuAction; -import api.events.MenuOptionClicked; -import api.widgets.WidgetInfo; -import api.widgets.WidgetItem; import com.google.common.annotations.VisibleForTesting; import java.awt.Dimension; import java.awt.Point; @@ -43,6 +39,10 @@ import javax.inject.Inject; import javax.inject.Singleton; import lombok.AccessLevel; import lombok.Getter; +import net.runelite.api.MenuAction; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigManager; import net.runelite.client.config.RuneLiteConfig; @@ -130,13 +130,13 @@ public class OverlayManager event.consume(); - Optional optionalOverlay = overlays.stream().filter(o -> overlays.indexOf(o) == event.getId()).findAny(); + Optional optionalOverlay = overlays.stream().filter(o -> overlays.indexOf(o) == event.getIdentifier()).findAny(); if (optionalOverlay.isPresent()) { Overlay overlay = optionalOverlay.get(); List menuEntries = overlay.getMenuEntries(); Optional optionalOverlayMenuEntry = menuEntries.stream() - .filter(me -> me.getOption().equals(event.getMenuOption())) + .filter(me -> me.getOption().equals(event.getOption())) .findAny(); if (optionalOverlayMenuEntry.isPresent()) { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayMenuEntry.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayMenuEntry.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayMenuEntry.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayMenuEntry.java index 90b994833c..f952f37713 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayMenuEntry.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayMenuEntry.java @@ -24,8 +24,8 @@ */ package net.runelite.client.ui.overlay; -import api.MenuAction; import lombok.Value; +import net.runelite.api.MenuAction; @Value public class OverlayMenuEntry diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index b20cd0a5a8..813240f9a1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -24,15 +24,6 @@ */ package net.runelite.client.ui.overlay; -import api.Client; -import api.GameState; -import api.MenuAction; -import api.MenuEntry; -import api.events.BeforeRender; -import api.events.ClientTick; -import api.events.FocusChanged; -import api.widgets.Widget; -import api.widgets.WidgetInfo; import com.google.common.base.MoreObjects; import java.awt.Color; import java.awt.Dimension; @@ -45,6 +36,15 @@ import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import javax.swing.SwingUtilities; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.BeforeRender; +import net.runelite.api.events.ClientTick; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.KeyListener; @@ -193,7 +193,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener } // Get mouse position - final api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); + final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); final Point mouse = new Point(mouseCanvasPosition.getX(), mouseCanvasPosition.getY()); for (Overlay overlay : overlays) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java similarity index 75% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index 48025d9ec6..83df559115 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -24,22 +24,27 @@ */ package net.runelite.client.ui.overlay; -import api.Actor; -import api.Client; -import api.Perspective; -import api.Point; -import api.TileObject; -import api.coords.LocalPoint; import com.google.common.base.Strings; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; import java.awt.Graphics2D; import java.awt.Polygon; +import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.geom.Area; import java.awt.image.BufferedImage; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.Prayer; +import net.runelite.api.TileObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; /** @@ -98,7 +103,7 @@ public class OverlayUtil public static void renderImageLocation(Client client, Graphics2D graphics, LocalPoint localPoint, BufferedImage image, int zOffset) { - api.Point imageLocation = Perspective.getCanvasImageLocation(client, localPoint, image, zOffset); + net.runelite.api.Point imageLocation = Perspective.getCanvasImageLocation(client, localPoint, image, zOffset); if (imageLocation != null) { renderImageLocation(graphics, imageLocation, image); @@ -175,7 +180,7 @@ public class OverlayUtil renderImageLocation(client, graphics, localLocation, image, 0); } - public static void renderHoverableArea(Graphics2D graphics, Area area, api.Point mousePosition, Color fillColor, Color borderColor, Color borderHoverColor) + public static void renderHoverableArea(Graphics2D graphics, Area area, net.runelite.api.Point mousePosition, Color fillColor, Color borderColor, Color borderHoverColor) { if (area != null) { @@ -259,8 +264,7 @@ public class OverlayUtil return result; } - public static void renderActorTextAndImage(Graphics2D graphics, Actor actor, String text, Color color, - BufferedImage image, int yOffset, int xOffset) + public static void renderActorTextAndImage(Graphics2D graphics, Actor actor, String text, Color color, BufferedImage image, int yOffset, int xOffset) { Point textLocation = new Point(actor.getConvexHull().getBounds().x + xOffset, actor.getConvexHull().getBounds().y + yOffset); @@ -271,4 +275,69 @@ public class OverlayUtil textLocation = new Point(textLocation.getX() + xOffset, textLocation.getY() + image.getHeight() - yOffset); renderTextLocation(graphics, textLocation, text, color); } + + public static void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint, boolean shadows, int yOffset) + { + graphics.setFont(new Font("Arial", fontStyle, fontSize)); + if (canvasPoint != null) + { + final Point canvasCenterPoint = new Point( + canvasPoint.getX(), + canvasPoint.getY() + yOffset); + final Point canvasCenterPoint_shadow = new Point( + canvasPoint.getX() + 1, + canvasPoint.getY() + 1); + if (shadows) + { + renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); + } + renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); + } + } + + public static void drawTile(Graphics2D graphics, Client client, WorldPoint point, WorldPoint playerPoint, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) + { + if (point.distanceTo(playerPoint) >= 32) + { + return; + } + LocalPoint lp = LocalPoint.fromWorld(client, point); + if (lp == null) + { + return; + } + + Polygon poly = Perspective.getCanvasTilePoly(client, lp); + if (poly == null) + { + return; + } + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); + graphics.setStroke(new BasicStroke(strokeWidth)); + graphics.draw(poly); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); + graphics.fill(poly); + } + + public static Rectangle renderPrayerOverlay(Graphics2D graphics, Client client, Prayer prayer, Color color) + { + Widget widget = client.getWidget(prayer.getWidgetInfo()); + + if (widget == null || widget.isHidden()) + { + return null; + } + + Rectangle bounds = widget.getBounds(); + renderPolygon(graphics, rectangleToPolygon(bounds), color); + return bounds; + } + + private static Polygon rectangleToPolygon(Rectangle rect) + { + int[] xpoints = {rect.x, rect.x + rect.width, rect.x + rect.width, rect.x}; + int[] ypoints = {rect.y, rect.y, rect.y + rect.height, rect.y + rect.height}; + + return new Polygon(xpoints, ypoints, 4); + } } diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/RenderableEntity.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/RenderableEntity.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/RenderableEntity.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/RenderableEntity.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java similarity index 80% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java index 30ac39847e..3d8f1ab2e2 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java @@ -24,10 +24,6 @@ */ package net.runelite.client.ui.overlay; -import api.widgets.Widget; -import static api.widgets.WidgetID.*; -import static api.widgets.WidgetInfo.TO_GROUP; -import api.widgets.WidgetItem; import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Arrays; @@ -36,6 +32,19 @@ import java.util.List; import java.util.Set; import lombok.AccessLevel; import lombok.Setter; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetID.BANK_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.BANK_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.DEPOSIT_BOX_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.EQUIPMENT_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.EQUIPMENT_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.GRAND_EXCHANGE_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.GUIDE_PRICES_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.SEED_VAULT_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.SHOP_INVENTORY_GROUP_ID; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; +import net.runelite.api.widgets.WidgetItem; public abstract class WidgetItemOverlay extends Overlay { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index 41c3723846..f6ad586274 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -24,9 +24,6 @@ */ package net.runelite.client.ui.overlay; -import api.Client; -import api.widgets.Widget; -import api.widgets.WidgetInfo; import com.google.common.collect.ImmutableMap; import java.awt.Dimension; import java.awt.Graphics2D; @@ -36,6 +33,9 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; public class WidgetOverlay extends Overlay { @@ -57,6 +57,7 @@ public class WidgetOverlay extends Overlay .put(WidgetInfo.MULTICOMBAT_FIXED, OverlayPosition.BOTTOM_RIGHT) .put(WidgetInfo.MULTICOMBAT_RESIZEABLE, OverlayPosition.CANVAS_TOP_RIGHT) .put(WidgetInfo.PYRAMID_PLUNDER_DATA, OverlayPosition.TOP_CENTER) + .put(WidgetInfo.THEATRE_OF_BLOOD_HEALTH_ORBS, OverlayPosition.TOP_LEFT) .build(); public static Collection createOverlays(final Client client) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowMinimapOverlay.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowMinimapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowMinimapOverlay.java index b38d6932ab..904eac78ce 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowMinimapOverlay.java @@ -24,13 +24,6 @@ */ package net.runelite.client.ui.overlay.arrow; -import api.Client; -import api.GameObject; -import api.NPC; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; @@ -40,6 +33,13 @@ import java.util.Collection; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPoint.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPoint.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPoint.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPoint.java index b3ed77af46..9969869356 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPoint.java @@ -24,8 +24,6 @@ */ package net.runelite.client.ui.overlay.arrow; -import api.Point; -import api.coords.WorldPoint; import java.awt.Color; import java.awt.image.BufferedImage; import java.util.EnumSet; @@ -33,6 +31,8 @@ import java.util.HashSet; import lombok.Builder; import lombok.Data; import lombok.NonNull; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; @Data @Builder diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPointManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPointManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPointManager.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowPointManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowType.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowType.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowUtil.java similarity index 85% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowUtil.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowUtil.java index c2227c90bc..a4380ae9a4 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowUtil.java @@ -1,12 +1,12 @@ package net.runelite.client.ui.overlay.arrow; -import api.Client; -import api.GameObject; -import api.ObjectDefinition; -import api.Scene; -import api.Tile; import java.util.ArrayList; import java.util.HashSet; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.ObjectDefinition; +import net.runelite.api.Scene; +import net.runelite.api.Tile; class ArrowUtil { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowWorldOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowWorldOverlay.java similarity index 95% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowWorldOverlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowWorldOverlay.java index d7e9f8f33b..72301360f6 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowWorldOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/arrow/ArrowWorldOverlay.java @@ -24,13 +24,6 @@ */ package net.runelite.client.ui.overlay.arrow; -import api.Client; -import api.GameObject; -import api.NPC; -import api.Perspective; -import api.Point; -import api.coords.LocalPoint; -import api.coords.WorldPoint; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; @@ -40,6 +33,13 @@ import java.util.Collection; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.NPC; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/BackgroundComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/BackgroundComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/BackgroundComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/BackgroundComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ComponentConstants.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ComponentConstants.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ComponentConstants.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ComponentConstants.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ComponentOrientation.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ComponentOrientation.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ComponentOrientation.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ComponentOrientation.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ImageComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImageComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ImageComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImageComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/LayoutableRenderableEntity.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LayoutableRenderableEntity.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/LayoutableRenderableEntity.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LayoutableRenderableEntity.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/LineComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LineComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/LineComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LineComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java index 3eda960450..33e19c9c11 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java @@ -34,6 +34,7 @@ import java.util.List; import javax.annotation.Nullable; import lombok.Getter; import lombok.Setter; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class PanelComponent implements LayoutableRenderableEntity { @@ -74,6 +75,8 @@ public class PanelComponent implements LayoutableRenderableEntity @Override public Dimension render(Graphics2D graphics) { + children.removeIf(child -> child instanceof TableComponent && ((TableComponent) child).isEmpty()); + if (children.isEmpty()) { return null; @@ -114,6 +117,7 @@ public class PanelComponent implements LayoutableRenderableEntity for (int i = 0; i < children.size(); i++) { final LayoutableRenderableEntity child = children.get(i); + child.setPreferredLocation(new Point(x, y)); child.setPreferredSize(childPreferredSize); final Dimension childDimension = child.render(graphics); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java index f1854b859f..b8d8880d33 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java @@ -24,7 +24,6 @@ */ package net.runelite.client.ui.overlay.components; -import api.Point; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; @@ -32,6 +31,7 @@ import java.awt.Graphics2D; import java.awt.Stroke; import java.awt.geom.Arc2D; import lombok.Setter; +import net.runelite.api.Point; import net.runelite.client.ui.overlay.RenderableEntity; @Setter diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/SplitComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/SplitComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/SplitComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/SplitComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/TitleComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TitleComponent.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/TitleComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TitleComponent.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java index c81977230e..34c7cefce1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java @@ -24,7 +24,6 @@ */ package net.runelite.client.ui.overlay.components; -import api.IndexedSprite; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; @@ -33,6 +32,7 @@ import java.awt.Point; import java.awt.Rectangle; import java.util.regex.Pattern; import lombok.Setter; +import net.runelite.api.IndexedSprite; import net.runelite.client.ui.overlay.RenderableEntity; @Setter @@ -217,4 +217,4 @@ public class TooltipComponent implements RenderableEntity } } } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java new file mode 100644 index 0000000000..32acd39bca --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay.components.table; + +public enum TableAlignment +{ + LEFT, + CENTER, + RIGHT +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java new file mode 100644 index 0000000000..6edbca14e8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * Copyright (c) 2019, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay.components.table; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; +import net.runelite.client.ui.overlay.components.ComponentConstants; +import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity; +import net.runelite.client.ui.overlay.components.TextComponent; + +@Setter +public class TableComponent implements LayoutableRenderableEntity +{ + private static final TableElement EMPTY_ELEMENT = TableElement.builder().build(); + + @Getter + private final List columns = new ArrayList<>(); + @Getter + private final List rows = new ArrayList<>(); + + @Getter + private final Rectangle bounds = new Rectangle(); + + private TableAlignment defaultAlignment = TableAlignment.LEFT; + private Color defaultColor = Color.WHITE; + private Dimension gutter = new Dimension(3, 0); + private Point preferredLocation = new Point(); + private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); + + @Override + public Dimension render(final Graphics2D graphics) + { + final FontMetrics metrics = graphics.getFontMetrics(); + final TableRow colRow = TableRow.builder().elements(this.columns).build(); + final int[] columnWidths = getColumnWidths(metrics, colRow); + + graphics.translate(preferredLocation.x, preferredLocation.y); + + // Display the columns first + int height = displayRow(graphics, colRow, 0, columnWidths, metrics); + + for (TableRow row : this.rows) + { + height = displayRow(graphics, row, height, columnWidths, metrics); + } + + graphics.translate(-preferredLocation.x, -preferredLocation.y); + + final Dimension dimension = new Dimension(preferredSize.width, height); + bounds.setLocation(preferredLocation); + bounds.setSize(dimension); + + return dimension; + } + + private int displayRow(Graphics2D graphics, TableRow row, int height, int[] columnWidths, FontMetrics metrics) + { + int x = 0; + int startingRowHeight = height; + + final List elements = row.getElements(); + for (int i = 0; i < elements.size(); i++) + { + int y = startingRowHeight; + final TableElement cell = elements.get(i); + + final String content = cell.getContent(); + if (content == null) + { + continue; + } + + final String[] lines = lineBreakText(content, columnWidths[i], metrics); + final TableAlignment alignment = getCellAlignment(row, i); + final Color color = getCellColor(row, i); + + for (String line : lines) + { + final int alignmentOffset = getAlignedPosition(line, alignment, columnWidths[i], metrics); + final TextComponent leftLineComponent = new TextComponent(); + y += metrics.getHeight(); + + leftLineComponent.setPosition(new Point(x + alignmentOffset, y)); + leftLineComponent.setText(line); + leftLineComponent.setColor(color); + leftLineComponent.render(graphics); + } + height = Math.max(height, y); + x += columnWidths[i] + gutter.width; + } + + return height + gutter.height; + } + + /** + * Returns the width that each column should take up + * Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width + * @param metrics + * @return int[] of column width + */ + private int[] getColumnWidths(final FontMetrics metrics, final TableRow columnRow) + { + int numCols = columns.size(); + for (final TableRow r : rows) + { + numCols = Math.max(r.getElements().size(), numCols); + } + + int[] maxtextw = new int[numCols]; // max text width over all rows + int[] maxwordw = new int[numCols]; // max width of longest word + boolean[] flex = new boolean[numCols]; // is column flexible? + boolean[] wrap = new boolean[numCols]; // can column be wrapped? + int[] finalcolw = new int[numCols]; // final width of columns + + final List rows = new ArrayList<>(this.rows); + rows.add(columnRow); + + for (final TableRow r : rows) + { + final List elements = r.getElements(); + for (int col = 0; col < elements.size(); col++) + { + final TableElement ele = elements.get(col); + final String cell = ele.getContent(); + if (cell == null) + { + continue; + } + + final int cellWidth = getTextWidth(metrics, cell); + + maxtextw[col] = Math.max(maxtextw[col], cellWidth); + for (String word : cell.split(" ")) + { + maxwordw[col] = Math.max(maxwordw[col], getTextWidth(metrics, word)); + } + + if (maxtextw[col] == cellWidth) + { + wrap[col] = cell.contains(" "); + } + } + } + + int left = preferredSize.width - (numCols - 1) * gutter.width; + final double avg = left / numCols; + int nflex = 0; + + // Determine whether columns should be flexible and assign width of non-flexible cells + for (int col = 0; col < numCols; col++) + { + // This limit can be adjusted as needed + final double maxNonFlexLimit = 1.5 * avg; + + flex[col] = maxtextw[col] > maxNonFlexLimit; + if (flex[col]) + { + nflex++; + } + else + { + finalcolw[col] = maxtextw[col]; + left -= finalcolw[col]; + } + } + + // If there is not enough space, make columns that could be word-wrapped flexible too + if (left < nflex * avg) + { + for (int col = 0; col < numCols; col++) + { + if (!flex[col] && wrap[col]) + { + left += finalcolw[col]; + finalcolw[col] = 0; + flex[col] = true; + nflex++; + } + } + } + + // Calculate weights for flexible columns. The max width is capped at the table width to + // treat columns that have to be wrapped more or less equal + int tot = 0; + for (int col = 0; col < numCols; col++) + { + if (flex[col]) + { + maxtextw[col] = Math.min(maxtextw[col], preferredSize.width); + tot += maxtextw[col]; + } + } + + // Now assign the actual width for flexible columns. Make sure that it is at least as long + // as the longest word length + for (int col = 0; col < numCols; col++) + { + if (flex[col]) + { + finalcolw[col] = left * maxtextw[col] / tot; + finalcolw[col] = Math.max(finalcolw[col], maxwordw[col]); + left -= finalcolw[col]; + } + } + + // When the sum of column widths is less than the total space available, distribute the + // extra space equally across all columns + final int extraPerCol = left / numCols; + for (int col = 0; col < numCols; col++) + { + finalcolw[col] += extraPerCol; + left -= extraPerCol; + } + // Add any remainder to the right-most column + finalcolw[finalcolw.length - 1] += left; + + return finalcolw; + } + + private static int getTextWidth(final FontMetrics metrics, final String cell) + { + return metrics.stringWidth(TextComponent.textWithoutColTags(cell)); + } + + private static String[] lineBreakText(final String text, final int maxWidth, final FontMetrics metrics) + { + final String[] words = text.split(" "); + + if (words.length == 0) + { + return new String[0]; + } + + final StringBuilder wrapped = new StringBuilder(words[0]); + int spaceLeft = maxWidth - getTextWidth(metrics, wrapped.toString()); + + for (int i = 1; i < words.length; i++) + { + final String word = words[i]; + final int wordLen = getTextWidth(metrics, word); + final int spaceWidth = metrics.stringWidth(" "); + + if (wordLen + spaceWidth > spaceLeft) + { + wrapped.append("\n").append(word); + spaceLeft = maxWidth - wordLen; + } + else + { + wrapped.append(" ").append(word); + spaceLeft -= spaceWidth + wordLen; + } + } + + return wrapped.toString().split("\n"); + } + + public boolean isEmpty() + { + return columns.size() == 0 || rows.size() == 0; + } + + private void ensureColumnSize(final int size) + { + while (size > columns.size()) + { + columns.add(TableElement.builder().build()); + } + } + + private static int getAlignedPosition(final String str, final TableAlignment alignment, final int columnWidth, final FontMetrics metrics) + { + final int stringWidth = getTextWidth(metrics, str); + int offset = 0; + + switch (alignment) + { + case LEFT: + break; + case CENTER: + offset = (columnWidth / 2) - (stringWidth / 2); + break; + case RIGHT: + offset = columnWidth - stringWidth; + break; + } + return offset; + } + + /** + * Returns the color for the specified table element. + * Priority order: cell->row->column->default + * @param row TableRow element + * @param colIndex column index + */ + private Color getCellColor(final TableRow row, final int colIndex) + { + final List rowElements = row.getElements(); + final TableElement cell = colIndex < rowElements.size() ? rowElements.get(colIndex) : EMPTY_ELEMENT; + final TableElement column = colIndex < columns.size() ? columns.get(colIndex) : EMPTY_ELEMENT; + + return firstNonNull( + cell.getColor(), + row.getRowColor(), + column.getColor(), + defaultColor); + } + + public void setColumnAlignment(final int col, final TableAlignment alignment) + { + assert columns.size() > col; + columns.get(col).setAlignment(alignment); + } + + public void setColumnAlignments(@Nonnull final TableAlignment... alignments) + { + ensureColumnSize(alignments.length); + for (int i = 0; i < alignments.length; i++) + { + setColumnAlignment(i, alignments[i]); + } + } + + /** + * Returns the alignment for the specified table element. + * Priority order: cell->row->column->default + * @param row TableRow element + * @param colIndex column index + */ + private TableAlignment getCellAlignment(final TableRow row, final int colIndex) + { + final List rowElements = row.getElements(); + final TableElement cell = colIndex < rowElements.size() ? rowElements.get(colIndex) : EMPTY_ELEMENT; + final TableElement column = colIndex < columns.size() ? columns.get(colIndex) : EMPTY_ELEMENT; + + return firstNonNull( + cell.getAlignment(), + row.getRowAlignment(), + column.getAlignment(), + defaultAlignment); + } + + @SafeVarargs + private static T firstNonNull(@Nullable T... elements) + { + if (elements == null || elements.length == 0) + { + return null; + } + + int i = 0; + T cur = elements[0]; + while (cur == null && i < elements.length) + { + cur = elements[i]; + i++; + } + + return cur; + } + + // Helper functions for cleaner overlay code + public void addRow(@Nonnull final String... cells) + { + final List elements = new ArrayList<>(); + for (final String cell : cells) + { + elements.add(TableElement.builder().content(cell).build()); + } + + final TableRow row = TableRow.builder().build(); + row.setElements(elements); + + this.rows.add(row); + } + + public void addRows(@Nonnull final String[]... rows) + { + for (String[] row : rows) + { + addRow(row); + } + } + + public void addRows(@NonNull final TableRow... rows) + { + this.rows.addAll(Arrays.asList(rows)); + } + + public void setRows(@Nonnull final String[]... elements) + { + this.rows.clear(); + addRows(elements); + } + + public void setRows(@Nonnull final TableRow... elements) + { + this.rows.clear(); + this.rows.addAll(Arrays.asList(elements)); + } + + public void addColumn(@Nonnull final String col) + { + this.columns.add(TableElement.builder().content(col).build()); + } + + public void addColumns(@NonNull final TableElement... columns) + { + this.columns.addAll(Arrays.asList(columns)); + } + + public void setColumns(@Nonnull final TableElement... elements) + { + this.columns.clear(); + this.columns.addAll(Arrays.asList(elements)); + } + + public void setColumns(@Nonnull final String... columns) + { + this.columns.clear(); + for (String col : columns) + { + addColumn(col); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableElement.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableElement.java new file mode 100644 index 0000000000..8229f9533c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableElement.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay.components.table; + +import java.awt.Color; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class TableElement +{ + TableAlignment alignment; + Color color; + String content; +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java new file mode 100644 index 0000000000..5ff9eee7f4 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2019, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay.components.table; + +import java.awt.Color; +import java.util.List; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class TableRow +{ + Color rowColor; + TableAlignment rowAlignment; + @Builder.Default + List elements; +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/Counter.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/Counter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/Counter.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/Counter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java index 6d25cea41b..56ef1a66fd 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java @@ -24,7 +24,6 @@ */ package net.runelite.client.ui.overlay.infobox; -import api.events.ConfigChanged; import com.google.common.base.Preconditions; import com.google.common.collect.ComparisonChain; import java.awt.Graphics; @@ -38,6 +37,7 @@ import java.util.function.Predicate; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.PluginDescriptor; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java index 8f69430dfc..08412783f1 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java @@ -25,7 +25,6 @@ */ package net.runelite.client.ui.overlay.infobox; -import api.Client; import com.google.common.base.Strings; import java.awt.Color; import java.awt.Dimension; @@ -35,6 +34,7 @@ import java.awt.Rectangle; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.Client; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxPriority.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxPriority.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxPriority.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxPriority.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/LoopTimer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/LoopTimer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/LoopTimer.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/LoopTimer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/Timer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/Timer.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/infobox/Timer.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/Timer.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/tooltip/Tooltip.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/Tooltip.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/tooltip/Tooltip.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/Tooltip.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java index b3820954ac..9436da087f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java @@ -24,7 +24,6 @@ */ package net.runelite.client.ui.overlay.tooltip; -import api.Client; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Point; @@ -32,6 +31,7 @@ import java.awt.Rectangle; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -67,7 +67,7 @@ public class TooltipOverlay extends Overlay } final Rectangle clientCanvasBounds = new Rectangle(client.getRealDimensions()); - final api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); + final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); final Point mousePosition = new Point(mouseCanvasPosition.getX(), mouseCanvasPosition.getY() + OFFSET); final Rectangle bounds = new Rectangle(getBounds()); bounds.setLocation(mousePosition); diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java similarity index 97% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java index 5f12ccb114..fef98b9f84 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java @@ -24,12 +24,6 @@ */ package net.runelite.client.ui.overlay.worldmap; -import api.Client; -import api.Point; -import api.RenderOverview; -import api.coords.WorldPoint; -import api.widgets.Widget; -import api.widgets.WidgetInfo; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; @@ -39,6 +33,12 @@ import java.awt.image.BufferedImage; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.RenderOverview; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.input.MouseManager; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.JagexColors; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlayMouseListener.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlayMouseListener.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlayMouseListener.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlayMouseListener.java index 3142d238f9..ebca05deb9 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlayMouseListener.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlayMouseListener.java @@ -24,18 +24,18 @@ */ package net.runelite.client.ui.overlay.worldmap; - -import api.Client; -import api.RenderOverview; -import api.coords.WorldPoint; -import api.widgets.Widget; -import api.widgets.WidgetInfo; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import javax.swing.SwingUtilities; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.RenderOverview; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.input.MouseAdapter; @Singleton @@ -59,7 +59,7 @@ public class WorldMapOverlayMouseListener extends MouseAdapter if (SwingUtilities.isLeftMouseButton(e) && !worldMapPoints.isEmpty()) { - api.Point mousePos = client.getMouseCanvasPosition(); + Point mousePos = client.getMouseCanvasPosition(); for (WorldMapPoint worldMapPoint : worldMapPoints) { @@ -90,7 +90,7 @@ public class WorldMapOverlayMouseListener extends MouseAdapter return mouseEvent; } - final api.Point mousePos = client.getMouseCanvasPosition(); + final Point mousePos = client.getMouseCanvasPosition(); final Widget view = client.getWidget(WidgetInfo.WORLD_MAP_VIEW); if (view == null) diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPoint.java similarity index 96% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPoint.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPoint.java index 6f577ca68b..c9e7345e31 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPoint.java @@ -24,12 +24,12 @@ */ package net.runelite.client.ui.overlay.worldmap; -import api.Point; -import api.coords.WorldPoint; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import lombok.Data; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; @Data public class WorldMapPoint diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPointManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPointManager.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPointManager.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapPointManager.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java b/runelite-client/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java rename to runelite-client/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ui/skin/SubstanceRuneLiteLookAndFeel.java b/runelite-client/src/main/java/net/runelite/client/ui/skin/SubstanceRuneLiteLookAndFeel.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ui/skin/SubstanceRuneLiteLookAndFeel.java rename to runelite-client/src/main/java/net/runelite/client/ui/skin/SubstanceRuneLiteLookAndFeel.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/CallableExceptionLogger.java b/runelite-client/src/main/java/net/runelite/client/util/CallableExceptionLogger.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/CallableExceptionLogger.java rename to runelite-client/src/main/java/net/runelite/client/util/CallableExceptionLogger.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/ColorUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ColorUtil.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/ColorUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/ColorUtil.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/DeferredEventBus.java b/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/DeferredEventBus.java rename to runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/ExecutorServiceExceptionLogger.java b/runelite-client/src/main/java/net/runelite/client/util/ExecutorServiceExceptionLogger.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/ExecutorServiceExceptionLogger.java rename to runelite-client/src/main/java/net/runelite/client/util/ExecutorServiceExceptionLogger.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/GameEventManager.java b/runelite-client/src/main/java/net/runelite/client/util/GameEventManager.java similarity index 87% rename from RuneLitePlus/src/main/java/net/runelite/client/util/GameEventManager.java rename to runelite-client/src/main/java/net/runelite/client/util/GameEventManager.java index 0c546ce77a..edaedc856f 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/GameEventManager.java +++ b/runelite-client/src/main/java/net/runelite/client/util/GameEventManager.java @@ -24,31 +24,31 @@ */ package net.runelite.client.util; -import api.Client; -import api.Constants; -import api.GameState; -import api.InventoryID; -import api.Item; -import api.ItemContainer; -import api.NPC; -import api.Node; -import api.Player; -import api.Scene; -import api.Tile; -import api.events.DecorativeObjectSpawned; -import api.events.GameObjectSpawned; -import api.events.GroundObjectSpawned; -import api.events.ItemContainerChanged; -import api.events.ItemSpawned; -import api.events.NpcSpawned; -import api.events.PlayerSpawned; -import api.events.WallObjectSpawned; import java.util.Arrays; import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.Client; +import net.runelite.api.Constants; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.NPC; +import net.runelite.api.Node; +import net.runelite.api.Player; +import net.runelite.api.Scene; +import net.runelite.api.Tile; +import net.runelite.api.events.DecorativeObjectSpawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.PlayerSpawned; +import net.runelite.api.events.WallObjectSpawned; import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.EventBus; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/HotkeyListener.java b/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/HotkeyListener.java rename to runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/ImageUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/util/ImageUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java index b8dc0e8d11..1f1ee8ee0c 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/ImageUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java @@ -24,9 +24,6 @@ */ package net.runelite.client.util; -import api.Client; -import api.IndexedSprite; -import api.Sprite; import com.google.common.primitives.Ints; import java.awt.Color; import java.awt.Graphics2D; @@ -45,6 +42,9 @@ import java.util.function.Predicate; import javax.imageio.ImageIO; import javax.swing.GrayFilter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.IndexedSprite; +import net.runelite.api.Sprite; /** * Various Image/BufferedImage utilities. @@ -405,6 +405,36 @@ public class ImageUtil return filledImage; } + /** + * Recolors pixels of the given image with the given color based on a given recolor condition + * predicate. + * + * @param image The image which should have its non-transparent pixels recolored. + * @param color The color with which to recolor pixels. + * @param recolorCondition The condition on which to recolor pixels with the given color. + * @return The given image with all pixels fulfilling the recolor condition predicate + * set to the given color. + */ + public static BufferedImage recolorImage(final BufferedImage image, final Color color, final Predicate recolorCondition) + { + final BufferedImage recoloredImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < recoloredImage.getWidth(); x++) + { + for (int y = 0; y < recoloredImage.getHeight(); y++) + { + final Color pixelColor = new Color(image.getRGB(x, y), true); + if (!recolorCondition.test(pixelColor)) + { + recoloredImage.setRGB(x, y, image.getRGB(x, y)); + continue; + } + + recoloredImage.setRGB(x, y, color.getRGB()); + } + } + return recoloredImage; + } + /** * Performs a rescale operation on the image's color components. * @@ -426,7 +456,7 @@ public class ImageUtil * @param client Current client instance * @return The buffered image as a sprite image */ - public static Sprite getImageSpritePixels(BufferedImage image, Client client) + public static Sprite getImageSprite(BufferedImage image, Client client) { int[] pixels = new int[image.getWidth() * image.getHeight()]; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/ItemUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ItemUtil.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/util/ItemUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/ItemUtil.java index 99bf658a53..c3cfeb599e 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/ItemUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ItemUtil.java @@ -24,7 +24,6 @@ */ package net.runelite.client.util; -import api.Item; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -32,6 +31,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.annotation.Nullable; +import net.runelite.api.Item; import net.runelite.http.api.loottracker.GameItem; /** diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/LinkBrowser.java b/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/LinkBrowser.java rename to runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/MenuUtil.java b/runelite-client/src/main/java/net/runelite/client/util/MenuUtil.java similarity index 98% rename from RuneLitePlus/src/main/java/net/runelite/client/util/MenuUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/MenuUtil.java index 3f89d8c6c1..1e7135e3ab 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/MenuUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/MenuUtil.java @@ -24,14 +24,14 @@ */ package net.runelite.client.util; -import api.Client; -import api.MenuEntry; import com.google.common.collect.Lists; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.MenuEntry; @Deprecated @Slf4j diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/MiscUtils.java b/runelite-client/src/main/java/net/runelite/client/util/MiscUtils.java similarity index 93% rename from RuneLitePlus/src/main/java/net/runelite/client/util/MiscUtils.java rename to runelite-client/src/main/java/net/runelite/client/util/MiscUtils.java index 6778d75087..c44767d4a5 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/MiscUtils.java +++ b/runelite-client/src/main/java/net/runelite/client/util/MiscUtils.java @@ -1,10 +1,10 @@ package net.runelite.client.util; -import api.Client; -import api.Player; -import api.WorldType; -import api.coords.WorldPoint; import java.awt.Polygon; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.WorldType; +import net.runelite.api.coords.WorldPoint; public class MiscUtils { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/OSType.java b/runelite-client/src/main/java/net/runelite/client/util/OSType.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/OSType.java rename to runelite-client/src/main/java/net/runelite/client/util/OSType.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/OSXUtil.java b/runelite-client/src/main/java/net/runelite/client/util/OSXUtil.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/OSXUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/OSXUtil.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/PvPUtil.java b/runelite-client/src/main/java/net/runelite/client/util/PvPUtil.java similarity index 92% rename from RuneLitePlus/src/main/java/net/runelite/client/util/PvPUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/PvPUtil.java index b495b70295..53672490ac 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/PvPUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/PvPUtil.java @@ -9,17 +9,17 @@ package net.runelite.client.util; -import api.Client; -import api.InventoryID; -import api.Item; -import api.ItemDefinition; -import api.Player; -import api.Varbits; -import api.WorldType; -import api.coords.WorldPoint; import java.util.Comparator; import java.util.Objects; import java.util.TreeMap; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.Player; +import net.runelite.api.Varbits; +import net.runelite.api.WorldType; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.game.ItemManager; import static net.runelite.client.util.StackFormatter.quantityToRSDecimalStack; import org.apache.commons.lang3.ArrayUtils; diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/RefUtils.java b/runelite-client/src/main/java/net/runelite/client/util/RefUtils.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/RefUtils.java rename to runelite-client/src/main/java/net/runelite/client/util/RefUtils.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/RunnableExceptionLogger.java b/runelite-client/src/main/java/net/runelite/client/util/RunnableExceptionLogger.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/RunnableExceptionLogger.java rename to runelite-client/src/main/java/net/runelite/client/util/RunnableExceptionLogger.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/StackFormatter.java b/runelite-client/src/main/java/net/runelite/client/util/StackFormatter.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/StackFormatter.java rename to runelite-client/src/main/java/net/runelite/client/util/StackFormatter.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/SwingUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/Text.java b/runelite-client/src/main/java/net/runelite/client/util/Text.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/Text.java rename to runelite-client/src/main/java/net/runelite/client/util/Text.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/WildcardMatcher.java b/runelite-client/src/main/java/net/runelite/client/util/WildcardMatcher.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/WildcardMatcher.java rename to runelite-client/src/main/java/net/runelite/client/util/WildcardMatcher.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/WildernessLocation.java b/runelite-client/src/main/java/net/runelite/client/util/WildernessLocation.java similarity index 99% rename from RuneLitePlus/src/main/java/net/runelite/client/util/WildernessLocation.java rename to runelite-client/src/main/java/net/runelite/client/util/WildernessLocation.java index 7ae9583290..4757c875f0 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/WildernessLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/util/WildernessLocation.java @@ -1,7 +1,7 @@ package net.runelite.client.util; -import api.coords.WorldArea; import lombok.Getter; +import net.runelite.api.coords.WorldArea; public enum WildernessLocation { diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/WorldUtil.java b/runelite-client/src/main/java/net/runelite/client/util/WorldUtil.java similarity index 90% rename from RuneLitePlus/src/main/java/net/runelite/client/util/WorldUtil.java rename to runelite-client/src/main/java/net/runelite/client/util/WorldUtil.java index 3b1683ef2b..1acb092239 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/util/WorldUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/WorldUtil.java @@ -24,8 +24,8 @@ */ package net.runelite.client.util; -import api.WorldType; import java.util.EnumSet; +import net.runelite.api.WorldType; /** * Utility class for RuneScape worlds @@ -41,11 +41,11 @@ public class WorldUtil */ public static EnumSet toWorldTypes(final EnumSet apiTypes) { - final EnumSet types = EnumSet.noneOf(api.WorldType.class); + final EnumSet types = EnumSet.noneOf(net.runelite.api.WorldType.class); for (net.runelite.http.api.worlds.WorldType apiType : apiTypes) { - types.add(api.WorldType.valueOf(apiType.name())); + types.add(net.runelite.api.WorldType.valueOf(apiType.name())); } return types; diff --git a/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Bootstrap.java b/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Bootstrap.java new file mode 100644 index 0000000000..b8e6d60d94 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Bootstrap.java @@ -0,0 +1,337 @@ +package net.runelite.client.util.bootstrap; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.security.DigestInputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import javax.xml.bind.DatatypeConverter; +import net.runelite.http.api.RuneLiteAPI; + +public class Bootstrap +{ + class Artifact + { + String hash; + String name; + String path; + String size; + } + + String buildCommit = "2d0c2b8eb66a8088b41b29d42ec2a58ead460581"; + private Artifact[] artifacts = getArtifacts(); + Client client = new Client(); + String[] clientJvm9Arguments = new String[]{ + "-XX:+DisableAttachMechanism", + "-Xmx512m", + "-Xss2m", + "-XX:CompileThreshold=1500", + "-Djna.nosys=true" + }; + String[] clientJvmArguments = new String[]{ + "-XX:+DisableAttachMechanism", + "-Xmx512m", + "-Xss2m", + "-XX:CompileThreshold=1500", + "-Xincgc", + "-XX:+UseConcMarkSweepGC", + "-XX:+UseParNewGC", + "-Djna.nosys=true"}; + String[] dependencyHashes; + String[] launcherArguments = new String[]{ + "-XX:+DisableAttachMechanism", + "-Drunelite.launcher.nojvm=true", + "-Xmx512m", + "-Xss2m", + "-XX:CompileThreshold=1500", + "-Xincgc", + "-XX:+UseConcMarkSweepGC", + "-XX:+UseParNewGC", + "-Djna.nosys=true"}; + + Bootstrap() + { + } + + public static String getChecksumObject(Serializable object) throws IOException, NoSuchAlgorithmException + { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos)) + { + oos.writeObject(object); + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] thedigest = md.digest(baos.toByteArray()); + return DatatypeConverter.printHexBinary(thedigest); + } + } + + private static String getChecksumFile(String filepath) throws IOException, NoSuchAlgorithmException + { + System.out.println("Generating Hash for " + filepath); + MessageDigest md = MessageDigest.getInstance("SHA-256"); + + try (DigestInputStream dis = new DigestInputStream(new FileInputStream(filepath), md)) + { + //empty loop to clear the data + while (dis.read() != -1); + md = dis.getMessageDigest(); + } + + return bytesToHex(md.digest()); + + } + + private static String bytesToHex(byte[] hashInBytes) + { + + StringBuilder sb = new StringBuilder(); + for (byte b : hashInBytes) + { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + + } + + private Artifact[] getArtifacts() + { + try + { + artifacts = new Artifact[43]; + + //Static artifacts + artifacts[0] = new Artifact(); + artifacts[0].hash = "b12331da8683e5f107d294adeebb83ecf9124abc1db533554d2a8d3c62832d75"; + artifacts[0].name = "asm-all-6.0_BETA.jar"; + artifacts[0].path = "https://mvn.runelite.net/org/ow2/asm/asm-all/6.0_BETA/asm-all-6.0_BETA.jar"; + artifacts[0].size = "265176"; + artifacts[1] = new Artifact(); + artifacts[1].hash = "37abf0103ce5318bfda004fabc004c75ed0dc6d392a8459175692ab7eac97083"; + artifacts[1].name = "naturalmouse-2.0.0.jar"; + artifacts[1].path = "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/artifacts/naturalmouse-2.0.0.jar"; + artifacts[1].size = "3168921"; + artifacts[2] = new Artifact(); + artifacts[2].hash = "50d1e07f11827672249dee9ce8a23691fc59f663deed084bb7b52a4f778d5fbc"; + artifacts[2].name = "jcl-core-2.9-SNAPSHOT.jar"; + artifacts[2].path = "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/artifacts/jcl-core-2.9-SNAPSHOT.jar"; + artifacts[2].size = "3168921"; + artifacts[4] = new Artifact(); + artifacts[4].hash = "18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79"; + artifacts[4].name = "slf4j-api-1.7.25.jar"; + artifacts[4].path = "https://mvn.runelite.net/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar"; + artifacts[4].size = "41203"; + artifacts[5] = new Artifact(); + artifacts[5].hash = "fb53f8539e7fcb8f093a56e138112056ec1dc809ebb020b59d8a36a5ebac37e0"; + artifacts[5].name = "logback-classic-1.2.3.jar"; + artifacts[5].path = "https://mvn.runelite.net/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar"; + artifacts[5].size = "290339"; + artifacts[6] = new Artifact(); + artifacts[6].hash = "5946d837fe6f960c02a53eda7a6926ecc3c758bbdd69aa453ee429f858217f22"; + artifacts[6].name = "logback-core-1.2.3.jar"; + artifacts[6].path = "https://mvn.runelite.net/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar"; + artifacts[6].size = "471901"; + artifacts[7] = new Artifact(); + artifacts[7].hash = "9f0c8d50fa4b79b6ff1502dbec8502179d6b9497cacbe17a13074001aed537ec"; + artifacts[7].name = "jopt-simple-5.0.1.jar"; + artifacts[7].path = "https://mvn.runelite.net/net/sf/jopt-simple/jopt-simple/5.0.1/jopt-simple-5.0.1.jar"; + artifacts[7].size = "78826"; + artifacts[8] = new Artifact(); + artifacts[8].hash = "5be9a7d05ba0ccd74708bc8018ae412255f85843c0b92302e9b9befa6ed52564"; + artifacts[8].name = "guava-23.2-jre.jar"; + artifacts[8].path = "https://mvn.runelite.net/com/google/guava/guava/23.2-jre/guava-23.2-jre.jar"; + artifacts[8].size = "2649860"; + artifacts[9] = new Artifact(); + artifacts[9].hash = "905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed"; + artifacts[9].name = "jsr305-1.3.9.jar"; + artifacts[9].path = "https://mvn.runelite.net/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar"; + artifacts[9].size = "33015"; + artifacts[10] = new Artifact(); + artifacts[10].hash = "cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b"; + artifacts[10].name = "error_prone_annotations-2.0.18.jar"; + artifacts[10].path = "https://mvn.runelite.net/com/google/errorprone/error_prone_annotations/2.0.18/error_prone_annotations-2.0.18.jar"; + artifacts[10].size = "12078"; + artifacts[11] = new Artifact(); + artifacts[11].hash = "2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6"; + artifacts[11].name = "j2objc-annotations-1.1.jar"; + artifacts[11].path = "https://mvn.runelite.net/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar"; + artifacts[11].size = "8782"; + artifacts[12] = new Artifact(); + artifacts[12].hash = "2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d"; + artifacts[12].name = "animal-sniffer-annotations-1.14.jar"; + artifacts[12].path = "https://mvn.runelite.net/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar"; + artifacts[12].size = "3482"; + artifacts[13] = new Artifact(); + artifacts[13].hash = "9264c6931c431e928dc64adc842584d5f57d17b2f3aff29221f2b3fdea673dad"; + artifacts[13].name = "guice-4.1.0-no_aop.jar"; + artifacts[13].path = "https://mvn.runelite.net/com/google/inject/guice/4.1.0/guice-4.1.0-no_aop.jar"; + artifacts[13].size = "428603"; + artifacts[14] = new Artifact(); + artifacts[14].hash = "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff"; + artifacts[14].name = "javax.inject-1.jar"; + artifacts[14].path = "https://mvn.runelite.net/javax/inject/javax.inject/1/javax.inject-1.jar"; + artifacts[14].size = "2497"; + artifacts[15] = new Artifact(); + artifacts[15].hash = "0addec670fedcd3f113c5c8091d783280d23f75e3acb841b61a9cdb079376a08"; + artifacts[15].name = "aopalliance-1.0.jar"; + artifacts[15].path = "https://mvn.runelite.net/aopalliance/aopalliance/1.0/aopalliance-1.0.jar"; + artifacts[15].size = "4467"; + artifacts[16] = new Artifact(); + artifacts[16].hash = "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81"; + artifacts[16].name = "gson-2.8.5.jar"; + artifacts[16].path = "https://mvn.runelite.net/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar"; + artifacts[16].size = "241622"; + artifacts[17] = new Artifact(); + artifacts[17].hash = "0467d25f408428824d5c9c09ec60ee1f0bc341d9bf48971a77fd14939a826c83"; + artifacts[17].name = "substance-8.0.02.jar"; + artifacts[17].path = "https://repo.runelite.net/net/runelite/pushingpixels/substance/8.0.02/substance-8.0.02.jar"; + artifacts[17].size = "1589195"; + artifacts[18] = new Artifact(); + artifacts[18].hash = "3214e1c23d549d5d67c91da4da1ef33c5248470bb824f91cbe8f9e0beea59eef"; + artifacts[18].name = "trident-1.5.00.jar"; + artifacts[18].path = "https://repo.runelite.net/net/runelite/pushingpixels/trident/1.5.00/trident-1.5.00.jar"; + artifacts[18].size = "79726"; + artifacts[19] = new Artifact(); + artifacts[19].hash = "d4a57bbc1627da7c391308fd0fe910b83170fb66afd117236a5b111d2db1590b"; + artifacts[19].name = "commons-text-1.2.jar"; + artifacts[19].path = "https://mvn.runelite.net/org/apache/commons/commons-text/1.2/commons-text-1.2.jar"; + artifacts[19].size = "136544"; + artifacts[20] = new Artifact(); + artifacts[20].hash = "6e8dc31e046508d9953c96534edf0c2e0bfe6f468966b5b842b3f87e43b6a847"; + artifacts[20].name = "commons-lang3-3.7.jar"; + artifacts[20].path = "https://mvn.runelite.net/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar"; + artifacts[20].size = "499634"; + artifacts[21] = new Artifact(); + artifacts[21].hash = "e74603dc77b4183f108480279dbbf7fed3ac206069478636406c1fb45e83b31a"; + artifacts[21].name = "jogl-all-2.3.2.jar"; + artifacts[21].path = "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2.jar"; + artifacts[21].size = "3414448"; + artifacts[22] = new Artifact(); + artifacts[22].hash = "8c53b1884cef19309d34fd10a94b010136d9d6de9a88c386f46006fb47acab5d"; + artifacts[22].name = "jogl-all-2.3.2-natives-windows-amd64.jar"; + artifacts[22].path = "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-windows-amd64.jar"; + artifacts[22].size = "240721"; + artifacts[23] = new Artifact(); + artifacts[23].hash = "507a0e6bd1ee4e81c3dfb287783af93775864eec742988d4162f98ce0cbac9d6"; + artifacts[23].name = "jogl-all-2.3.2-natives-windows-i586.jar"; + artifacts[23].path = "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-windows-i586.jar"; + artifacts[23].size = "209445"; + artifacts[24] = new Artifact(); + artifacts[24].hash = "82637302ae9effdf7d6f302e1050ad6aee3b13019914ddda5b502b9faa980216"; + artifacts[24].name = "jogl-all-2.3.2-natives-linux-amd64.jar"; + artifacts[24].path = "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-linux-amd64.jar"; + artifacts[24].size = "224010"; + artifacts[25] = new Artifact(); + artifacts[25].hash = "f474ef2ef01be24ec811d3858b0f4bc5659076975f4a58ddd79abd787e9305c7"; + artifacts[25].name = "jogl-all-2.3.2-natives-linux-i586.jar"; + artifacts[25].path = "https://mvn.runelite.net/org/jogamp/jogl/jogl-all/2.3.2/jogl-all-2.3.2-natives-linux-i586.jar"; + artifacts[25].size = "217274"; + artifacts[26] = new Artifact(); + artifacts[26].hash = "084844543b18f7ff71b4c0437852bd22f0cb68d7e44c2c611c1bbea76f8c6fdf"; + artifacts[26].name = "gluegen-rt-2.3.2.jar"; + artifacts[26].path = "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2.jar"; + artifacts[26].size = "345605"; + artifacts[27] = new Artifact(); + artifacts[27].hash = "3474017422eff384db466bdb56c96c61220c43133a9da6329cf1781bea16c6b6"; + artifacts[27].name = "gluegen-rt-2.3.2-natives-windows-amd64.jar"; + artifacts[27].path = "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-windows-amd64.jar"; + artifacts[27].size = "8159"; + artifacts[28] = new Artifact(); + artifacts[28].hash = "4eeed9fc2ebea5b9dc48a342b9478d127e989a2e1aa7129b512a98ec75cde338"; + artifacts[28].name = "gluegen-rt-2.3.2-natives-windows-i586.jar"; + artifacts[28].path = "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-windows-i586.jar"; + artifacts[28].size = "7577"; + artifacts[29] = new Artifact(); + artifacts[29].hash = "f2dfd1800202059cf7e0294db5d57755147304e6eb220a9277526dbe6842bde2"; + artifacts[29].name = "gluegen-rt-2.3.2-natives-linux-amd64.jar"; + artifacts[29].path = "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-linux-amd64.jar"; + artifacts[29].size = "4149"; + artifacts[30] = new Artifact(); + artifacts[30].hash = "1365d463f98c0abec92f3ad6b35aa4b53a9599a517800cf99fdabea6712ca7ec"; + artifacts[30].name = "gluegen-rt-2.3.2-natives-linux-i586.jar"; + artifacts[30].path = "https://mvn.runelite.net/org/jogamp/gluegen/gluegen-rt/2.3.2/gluegen-rt-2.3.2-natives-linux-i586.jar"; + artifacts[30].size = "4130"; + artifacts[31] = new Artifact(); + artifacts[31].hash = "7b7ae00e2aa98c3b2b5ac76e793e2c9b752bf51c86c54654dbd473843a25f1aa"; + artifacts[31].name = "jbsdiff-1.0.jar"; + artifacts[31].path = "https://mvn.runelite.net/io/sigpipe/jbsdiff/1.0/jbsdiff-1.0.jar"; + artifacts[31].size = "24589"; + artifacts[32] = new Artifact(); + artifacts[32].hash = "55bbfe26cee9296fd5b7c0d47ce6a00ea4dd572e235b63e9bb4eaf6f802315e4"; + artifacts[32].name = "commons-compress-1.5.jar"; + artifacts[32].path = "https://mvn.runelite.net/org/apache/commons/commons-compress/1.5/commons-compress-1.5.jar"; + artifacts[32].size = "256241"; + artifacts[33] = new Artifact(); + artifacts[33].hash = "fbc9de96a0cc193a125b4008dbc348e9ed54e5e13fc67b8ed40e645d303cc51b"; + artifacts[33].name = "jna-4.5.1.jar"; + artifacts[33].path = "https://mvn.runelite.net/net/java/dev/jna/jna/4.5.1/jna-4.5.1.jar"; + artifacts[33].size = "1440662"; + artifacts[34] = new Artifact(); + artifacts[34].hash = "84c8667555ee8dd91fef44b451419f6f16f71f727d5fc475a10c2663eba83abb"; + artifacts[34].name = "jna-platform-4.5.1.jar"; + artifacts[34].path = "https://mvn.runelite.net/net/java/dev/jna/jna-platform/4.5.1/jna-platform-4.5.1.jar"; + artifacts[34].size = "2327547"; + artifacts[38] = new Artifact(); + artifacts[38].hash = "f55abda036da75e1af45bd43b9dfa79b2a3d90905be9cb38687c6621597a8165"; + artifacts[38].name = "okhttp-3.7.0.jar"; + artifacts[38].path = "https://mvn.runelite.net/com/squareup/okhttp3/okhttp/3.7.0/okhttp-3.7.0.jar"; + artifacts[38].size = "394987"; + artifacts[39] = new Artifact(); + artifacts[39].hash = "bfe7dfe483c37137966a1690f0c7d0b448ba217902c1fed202aaffdbba3291ae"; + artifacts[39].name = "okio-1.12.0.jar"; + artifacts[39].path = "https://mvn.runelite.net/com/squareup/okio/okio/1.12.0/okio-1.12.0.jar"; + artifacts[39].size = "81088"; + artifacts[40] = new Artifact(); + artifacts[40].hash = "9d4924588d6280c7516db3a4b7298306db5b6f0d1cdf568ce738309b5660f008"; + artifacts[40].name = "commons-csv-1.4.jar"; + artifacts[40].path = "https://mvn.runelite.net/org/apache/commons/commons-csv/1.4/commons-csv-1.4.jar"; + artifacts[40].size = "39978"; + artifacts[41] = new Artifact(); + artifacts[41].hash = "7e26a8d043418f2f22d5f6a3083a9a131817009ee8cd72c004e83b50d1849a7c"; + artifacts[41].name = "discord-1.1.jar"; + artifacts[41].path = "https://repo.runelite.net/net/runelite/discord/1.1/discord-1.1.jar"; + artifacts[41].size = "617294"; + + //Dynamic artifacts + artifacts[3] = new Artifact(); + artifacts[3].name = "client-" + RuneLiteAPI.getVersion() + ".jar"; + artifacts[3].hash = getChecksumFile("./runelite-client/target/" + artifacts[3].name); + artifacts[3].path = "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/" + artifacts[3].name; + artifacts[3].size = Long.toString(getFileSize("./runelite-client/target/" + artifacts[3].name)); + artifacts[35] = new Artifact(); + artifacts[35].name = "runelite-api-" + RuneLiteAPI.getVersion() + ".jar"; + artifacts[35].hash = getChecksumFile("./runelite-api/target/" + artifacts[35].name); + artifacts[35].path = "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/" + artifacts[35].name; + artifacts[35].size = Long.toString(getFileSize("./runelite-api/target/" + artifacts[35].name)); + artifacts[36] = new Artifact(); + artifacts[36].name = "runescape-api-" + RuneLiteAPI.getVersion() + ".jar"; + artifacts[36].hash = getChecksumFile("./runescape-api/target/" + artifacts[36].name); + artifacts[36].path = "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/" + artifacts[36].name; + artifacts[36].size = Long.toString(getFileSize("./runescape-api/target/" + artifacts[36].name)); + artifacts[37] = new Artifact(); + artifacts[37].name = "http-api-" + RuneLiteAPI.getVersion() + ".jar"; + artifacts[37].hash = getChecksumFile("./http-api/target/" + artifacts[37].name); + artifacts[37].path = "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/" + artifacts[37].name; + artifacts[37].size = Long.toString(getFileSize("./http-api/target/" + artifacts[37].name)); + artifacts[42] = new Artifact(); + artifacts[42].name = "injected-client-" + RuneLiteAPI.getVersion() + ".jar"; + artifacts[42].hash = getChecksumFile("./injected-client/target/" + artifacts[42].name); + artifacts[42].path = "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/" + artifacts[42].name; + artifacts[42].size = Long.toString(getFileSize("./injected-client/target/" + artifacts[42].name)); + } + catch (IOException | NoSuchAlgorithmException e) + { + e.printStackTrace(); + } + return artifacts; + } + + private long getFileSize(String fileLocation) + { + File f = new File(fileLocation); + return f.length(); + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Bootstrapper.java b/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Bootstrapper.java new file mode 100644 index 0000000000..b74b0453c2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Bootstrapper.java @@ -0,0 +1,23 @@ +package net.runelite.client.util.bootstrap; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.FileWriter; + +public class Bootstrapper +{ + + public static void main(String[] args) + { + Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); + try (FileWriter fw = new FileWriter("./bootstrap.json")) + { + gson.toJson(new Bootstrap(), fw); + } + catch (Exception e) + { + e.printStackTrace(); + } + + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Client.java b/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Client.java new file mode 100644 index 0000000000..c2ecf9da72 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/bootstrap/Client.java @@ -0,0 +1,12 @@ +package net.runelite.client.util.bootstrap; + +public class Client +{ + + String artifactId = "client"; + String classifier = ""; + String extension = "jar"; + String groupId = "net.runelite"; + String properties = ""; + String version = "1.5.28"; +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java b/runelite-client/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java rename to runelite-client/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/ping/IcmpEchoReply.java b/runelite-client/src/main/java/net/runelite/client/util/ping/IcmpEchoReply.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/ping/IcmpEchoReply.java rename to runelite-client/src/main/java/net/runelite/client/util/ping/IcmpEchoReply.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/util/ping/Ping.java b/runelite-client/src/main/java/net/runelite/client/util/ping/Ping.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/util/ping/Ping.java rename to runelite-client/src/main/java/net/runelite/client/util/ping/Ping.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ws/PartyMember.java b/runelite-client/src/main/java/net/runelite/client/ws/PartyMember.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ws/PartyMember.java rename to runelite-client/src/main/java/net/runelite/client/ws/PartyMember.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ws/PartyService.java b/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ws/PartyService.java rename to runelite-client/src/main/java/net/runelite/client/ws/PartyService.java diff --git a/RuneLitePlus/src/main/java/net/runelite/client/ws/WSClient.java b/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/ws/WSClient.java rename to runelite-client/src/main/java/net/runelite/client/ws/WSClient.java diff --git a/RuneLitePlus/src/main/resources/item_variations.json b/runelite-client/src/main/resources/item_variations.json similarity index 99% rename from RuneLitePlus/src/main/resources/item_variations.json rename to runelite-client/src/main/resources/item_variations.json index 8105a02ee2..987169cb75 100644 --- a/RuneLitePlus/src/main/resources/item_variations.json +++ b/runelite-client/src/main/resources/item_variations.json @@ -176,6 +176,10 @@ 237, 1487 ], + "wine of zamorak": [ + 245, + 23489 + ], "key": [ 275, 423, diff --git a/RuneLitePlus/src/main/resources/logback.xml b/runelite-client/src/main/resources/logback.xml similarity index 79% rename from RuneLitePlus/src/main/resources/logback.xml rename to runelite-client/src/main/resources/logback.xml index b4adf47b85..d3a5ffbcad 100644 --- a/RuneLitePlus/src/main/resources/logback.xml +++ b/runelite-client/src/main/resources/logback.xml @@ -51,30 +51,8 @@ - - - - ERROR - - - - - - WARN - - - - - - - - - - - - \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav new file mode 100644 index 0000000000..d7cf952977 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav new file mode 100644 index 0000000000..17c05cd53b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav new file mode 100644 index 0000000000..e7a4383f1b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav new file mode 100644 index 0000000000..9838762423 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav new file mode 100644 index 0000000000..da26385656 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav new file mode 100644 index 0000000000..f8945891df Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav new file mode 100644 index 0000000000..532b0083f9 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav new file mode 100644 index 0000000000..49b21d32ac Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav new file mode 100644 index 0000000000..8a632ac14e Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav new file mode 100644 index 0000000000..3e90326a5b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav new file mode 100644 index 0000000000..23d99f59d5 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav new file mode 100644 index 0000000000..8994a0faef Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav new file mode 100644 index 0000000000..985f222670 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav new file mode 100644 index 0000000000..25e37ee07e Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav new file mode 100644 index 0000000000..1f046c9aed Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav new file mode 100644 index 0000000000..66f2077b10 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav new file mode 100644 index 0000000000..90760c346f Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/account/login_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/account/login_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/account/login_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/account/login_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/account/logout_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/account/logout_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/account/logout_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/account/logout_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/down-arrow.png b/runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/down-arrow.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/down-arrow.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/down-arrow.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/incinerator.png b/runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/incinerator.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/incinerator.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/incinerator.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/new-tab.png b/runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/new-tab.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/new-tab.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/new-tab.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab-active.png b/runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab-active.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab-active.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab-active.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab.png b/runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/tag-tab.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/up-arrow.png b/runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/up-arrow.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/banktags/tabs/up-arrow.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/banktags/tabs/up-arrow.png diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/clock.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/clock.png similarity index 100% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/barbarianassault/clock.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/clock.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/fighter.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/fighter.png new file mode 100644 index 0000000000..dc3f909ee1 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/fighter.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/healer.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/healer.png new file mode 100644 index 0000000000..1938a5abdc Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/healer.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/ranger.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/ranger.png new file mode 100644 index 0000000000..662fa27e51 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/ranger.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/runner.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/runner.png new file mode 100644 index 0000000000..0b0ab46b9a Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/runner.png differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/buffed.png b/runelite-client/src/main/resources/net/runelite/client/plugins/boosts/buffed.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/buffed.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/boosts/buffed.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/buffedSmall.png b/runelite-client/src/main/resources/net/runelite/client/plugins/boosts/buffedSmall.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/buffedSmall.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/boosts/buffedSmall.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/debuffed.png b/runelite-client/src/main/resources/net/runelite/client/plugins/boosts/debuffed.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/debuffed.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/boosts/debuffed.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/debuffedSmall.png b/runelite-client/src/main/resources/net/runelite/client/plugins/boosts/debuffedSmall.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/boosts/debuffedSmall.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/boosts/debuffedSmall.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/cluescrolls/emote.png b/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/emote.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/cluescrolls/emote.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/emote.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/config_back_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/config_back_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/config_back_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/config/config_back_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/config_edit_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/config_edit_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/config_edit_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/config/config_edit_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/config_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/config_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/config_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/config/config_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/star_on.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/star_on.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/star_on.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/config/star_on.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/switcher_on.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/switcher_on.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/config/switcher_on.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/config/switcher_on.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-armadyl-godsword.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-armadyl-godsword.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-armadyl-godsword.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-armadyl-godsword.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-bandos-godsword.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-bandos-godsword.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-bandos-godsword.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-bandos-godsword.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-scimitar.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-scimitar.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-scimitar.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-scimitar.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-mouse.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-mouse.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-mouse.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-mouse.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-silver.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-silver.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-silver.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-silver.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-saradomin-godsword.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-saradomin-godsword.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-saradomin-godsword.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-saradomin-godsword.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-zamorak-godsword.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-zamorak-godsword.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/customcursor/cursor-zamorak-godsword.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-zamorak-godsword.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/devtools/devtools_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/devtools/devtools_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/devtools/devtools_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/devtools/devtools_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/discord/discord.png b/runelite-client/src/main/resources/net/runelite/client/plugins/discord/discord.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/discord/discord.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/discord/discord.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/LICENSE b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/LICENSE similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/LICENSE rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/LICENSE diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/blush.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/blush.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/blush.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/blush.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/broken_heart.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/broken_heart.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/broken_heart.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/broken_heart.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cat.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cat.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cat.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cat.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/confused.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/confused.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/confused.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/confused.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cooking.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cooking.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cooking.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cooking.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cowboy.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cowboy.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cowboy.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cowboy.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/crab.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/crab.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/crab.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/crab.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cry.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cry.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/cry.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/cry.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/dancer.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/dancer.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/dancer.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/dancer.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/dog.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/dog.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/dog.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/dog.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/expressionless.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/expressionless.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/expressionless.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/expressionless.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/eyes.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/eyes.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/eyes.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/eyes.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/fish.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/fish.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/fish.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/fish.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/flushed.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/flushed.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/flushed.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/flushed.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/fork_and_knife.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/fork_and_knife.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/fork_and_knife.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/fork_and_knife.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/frowning2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/frowning2.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/frowning2.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/frowning2.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/grinning.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/grinning.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/grinning.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/grinning.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/hearts.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/hearts.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/hearts.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/hearts.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/hugging.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/hugging.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/hugging.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/hugging.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/hushed.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/hushed.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/hushed.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/hushed.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/innocent.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/innocent.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/innocent.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/innocent.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/joy.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/joy.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/joy.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/joy.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/kissing.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/kissing.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/kissing.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/kissing.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/neutral_face.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/neutral_face.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/neutral_face.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/neutral_face.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/ok_hand.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/ok_hand.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/ok_hand.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/ok_hand.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/open_mouth.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/open_mouth.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/open_mouth.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/open_mouth.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/party_popper.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/party_popper.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/party_popper.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/party_popper.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/persevere.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/persevere.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/persevere.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/persevere.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/pile_of_poo.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/pile_of_poo.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/pile_of_poo.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/pile_of_poo.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/rage.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/rage.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/rage.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/rage.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/scream.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/scream.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/scream.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/scream.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/see_no_evil.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/see_no_evil.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/see_no_evil.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/see_no_evil.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/slight_frown.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/slight_frown.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/slight_frown.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/slight_frown.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/slight_smile.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/slight_smile.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/slight_smile.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/slight_smile.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/smile.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/smile.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/smile.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/smile.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/smiling_imp.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/smiling_imp.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/smiling_imp.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/smiling_imp.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/sob.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/sob.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/sob.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/sob.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue_closed_eyes.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue_closed_eyes.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue_closed_eyes.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/stuck_out_tongue_closed_eyes.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/sunglasses.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/sunglasses.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/sunglasses.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/sunglasses.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/sweat.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/sweat.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/sweat.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/sweat.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/thinking.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/thinking.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/thinking.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/thinking.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/thumbsdown.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/thumbsdown.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/thumbsdown.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/thumbsdown.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/thumbsup.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/thumbsup.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/thumbsup.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/thumbsup.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/triumph.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/triumph.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/triumph.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/triumph.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/unamused.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/unamused.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/unamused.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/unamused.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/wink.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/wink.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/wink.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/wink.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/yum.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/yum.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/yum.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/yum.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/zipper_mouth.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/zipper_mouth.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/zipper_mouth.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/zipper_mouth.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/zzz.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/zzz.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/emojis/zzz.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/emojis/zzz.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/equipmentinspector/normal.png b/runelite-client/src/main/resources/net/runelite/client/plugins/equipmentinspector/normal.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/equipmentinspector/normal.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/equipmentinspector/normal.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/feed/icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/feed/icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/feed/icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/feed/icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/feed/osrs.png b/runelite-client/src/main/resources/net/runelite/client/plugins/feed/osrs.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/feed/osrs.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/feed/osrs.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/feed/runelite.png b/runelite-client/src/main/resources/net/runelite/client/plugins/feed/runelite.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/feed/runelite.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/feed/runelite.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/freezetimers/freeze.png b/runelite-client/src/main/resources/net/runelite/client/plugins/freezetimers/freeze.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/freezetimers/freeze.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/freezetimers/freeze.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/freezetimers/teleblock.png b/runelite-client/src/main/resources/net/runelite/client/plugins/freezetimers/teleblock.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/freezetimers/teleblock.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/freezetimers/teleblock.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/freezetimers/veng.png b/runelite-client/src/main/resources/net/runelite/client/plugins/freezetimers/veng.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/freezetimers/veng.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/freezetimers/veng.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/common.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/common.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp_common.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_common.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp_common.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_common.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl rename to runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json similarity index 99% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json index 94bcc83a44..37072ae9b1 100644 --- a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json @@ -3314,7 +3314,7 @@ "21521": 250, "21543": 13000, "21545": 13000, - "21555": 18000, + "21555": 30000, "21622": 13000, "21634": 8, "21637": 5, diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/deadman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/deadman.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/deadman.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/deadman.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/deadman_tournament.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/deadman_tournament.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/deadman_tournament.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/deadman_tournament.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/hiscore.gif b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hiscore.gif similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/hiscore.gif rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hiscore.gif diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/normal.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/normal.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/normal.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/normal.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/seasonal_deadman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/seasonal_deadman.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/seasonal_deadman.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/seasonal_deadman.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/discord_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/discord_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/discord_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/info/discord_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/github_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/github_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/github_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/info/github_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/import_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/import_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/import_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/info/import_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/info_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/info_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/info_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/info/info_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/wiki_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/wiki_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/info/wiki_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/info/wiki_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1017.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1017.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1017.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1017.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1018.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1018.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1018.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1018.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1019.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1019.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1019.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1019.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1020.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1020.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1020.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1020.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1021.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1021.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1021.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1021.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1022.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1022.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1022.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1022.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1023.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1023.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1023.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1023.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1024.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1024.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1024.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1024.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1025.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1025.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1025.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1025.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1031.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1031.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1031.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1031.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1032.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1032.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1032.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1032.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1033.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1033.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1033.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1033.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1034.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1034.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1034.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1034.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1035.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1035.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1035.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1035.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1036.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1036.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1036.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1036.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1037.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1037.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1037.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1037.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1038.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1038.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1038.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1038.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1039.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1039.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1039.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1039.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1053.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1053.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1053.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1053.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1182.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1182.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1182.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1182.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1299.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1299.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1299.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1299.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1414.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1414.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1414.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1414.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1441.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1441.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1441.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1441.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1583.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1583.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1583.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1583.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1584.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1584.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1584.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1584.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1611.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1611.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1611.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1611.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/168.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/168.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/168.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/168.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/169.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/169.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/169.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/169.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1711.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1711.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1711.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/1711.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/201.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/201.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/201.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/201.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/773.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/773.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/773.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/773.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/776.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/776.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/776.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/776.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/780.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/780.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/780.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/780.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/782.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/782.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/782.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/782.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/783.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/783.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/783.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/783.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/788.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/788.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/788.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/788.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/789.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/789.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/789.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/789.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/790.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/790.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/790.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/790.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/791.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/791.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/791.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/791.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/792.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/792.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/792.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/792.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/898.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/898.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/898.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/898.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png new file mode 100644 index 0000000000..80c3b83fc8 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/901.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/901.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/901.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/901.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/902.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/902.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/902.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/902.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/904.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/904.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/904.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/904.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/907.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/907.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/907.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/907.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/908.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/908.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/908.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/908.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/909.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/909.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/909.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/909.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/910.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/910.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/910.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/910.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1026.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1026.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1026.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1026.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1027.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1027.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1027.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1027.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1028.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1028.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1028.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1028.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1029.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1029.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1029.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1029.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_left.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_left.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_left.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_left.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_middle.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_middle.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_middle.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_middle.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_right.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_right.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_right.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_bottom_right.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_left.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_left.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_left.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_left.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_middle.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_middle.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_middle.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_middle.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_right.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_right.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_right.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/widget/1030_top_right.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1026.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1026.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1026.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1026.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1027.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1027.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1027.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1027.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1028.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1028.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1028.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1028.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1029.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1029.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1029.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1029.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1030.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1030.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1030.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1030.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1032.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1032.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1032.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1032.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1033.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1033.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1033.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1033.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1034.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1034.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1034.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1034.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1035.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1035.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1035.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1035.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1036.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1036.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1036.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1036.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1037.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1037.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1037.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1037.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1038.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1038.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1038.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1038.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1039.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1039.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1039.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1039.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1071.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1071.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1071.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1071.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1072.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1072.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1072.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1072.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1173.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1173.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1173.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1173.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1174.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1174.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1174.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1174.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1175.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1175.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1175.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1175.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1176.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1176.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1176.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1176.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1177.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1177.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1177.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1177.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1180.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1180.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1180.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1180.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1181.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1181.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1181.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1181.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1182.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1182.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1182.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1182.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1196.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1196.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1196.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1196.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1197.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1197.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1197.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1197.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1198.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1198.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1198.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1198.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1199.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1199.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1199.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1199.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1438.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1438.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1438.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1438.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1439.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1439.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1439.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1439.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1440.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1440.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1440.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/1440.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/168.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/168.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/168.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/168.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/197.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/197.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/197.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/197.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/198.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/198.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/198.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/198.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/199.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/199.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/199.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/199.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/200.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/200.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/200.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/200.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/201.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/201.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/201.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/201.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/202.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/202.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/202.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/202.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/203.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/203.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/203.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/203.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/204.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/204.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/204.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/204.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/205.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/205.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/205.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/205.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/206.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/206.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/206.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/206.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/207.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/207.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/207.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/207.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/208.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/208.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/208.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/208.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/209.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/209.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/209.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/209.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/210.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/210.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/210.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/210.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/211.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/211.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/211.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/211.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/212.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/212.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/212.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/212.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/213.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/213.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/213.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/213.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/214.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/214.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/214.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/214.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/215.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/215.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/215.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/215.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/216.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/216.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/216.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/216.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/217.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/217.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/217.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/217.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/220.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/220.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/220.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/220.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/221.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/221.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/221.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/221.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/539.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/539.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/539.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/539.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/540.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/540.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/540.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/540.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/541.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/541.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/541.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/541.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/542.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/542.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/542.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/542.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/780.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/780.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/780.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/780.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/782.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/782.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/782.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/782.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/783.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/783.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/783.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/783.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/898.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/898.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/898.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/898.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/900.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/900.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/900.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/900.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/901.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/901.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/901.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/901.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/902.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/902.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/902.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/902.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/904.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/904.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/904.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/904.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/907.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/907.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/907.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/907.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/908.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/908.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/908.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/908.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/909.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/909.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/909.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/909.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/910.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/910.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/910.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/910.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_30px.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_30px.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_large.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_90px.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_large.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_90px.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_30px.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_30px.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_large.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_90px.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_large.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_90px.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/block.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/block.png new file mode 100644 index 0000000000..77517eb945 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/block.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage1.png new file mode 100644 index 0000000000..5163433cfa Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage2.png new file mode 100644 index 0000000000..9c5d8e4a7f Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage3.png new file mode 100644 index 0000000000..fca8c97531 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage4.png new file mode 100644 index 0000000000..8ad76ba881 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/damage4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease1.png new file mode 100644 index 0000000000..4525368ed4 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease2.png new file mode 100644 index 0000000000..a6a6fc7aae Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease3.png new file mode 100644 index 0000000000..c62bdea52f Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease4.png new file mode 100644 index 0000000000..61ac7f13d8 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/disease4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal1.png new file mode 100644 index 0000000000..df99aab44a Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal2.png new file mode 100644 index 0000000000..0d59e3e7c2 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal3.png new file mode 100644 index 0000000000..6bdad62f76 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal4.png new file mode 100644 index 0000000000..2968fe46af Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/heal4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison1.png new file mode 100644 index 0000000000..373ea5038b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison2.png new file mode 100644 index 0000000000..8f26519510 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison3.png new file mode 100644 index 0000000000..b8ae782a2d Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison4.png new file mode 100644 index 0000000000..b46fa29075 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/poison4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield1.png new file mode 100644 index 0000000000..2f1434d1a2 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield2.png new file mode 100644 index 0000000000..f3f5a41bfa Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield3.png new file mode 100644 index 0000000000..d196aadc51 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield4.png new file mode 100644 index 0000000000..fa90ba6bfb Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/shield4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom1.png new file mode 100644 index 0000000000..1c245fc4ba Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom2.png new file mode 100644 index 0000000000..173ddada59 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom3.png new file mode 100644 index 0000000000..aab10a7893 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom4.png new file mode 100644 index 0000000000..5d2162afcb Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/hitsplat/venom4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png new file mode 100644 index 0000000000..b817c474c0 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png new file mode 100644 index 0000000000..a6add2616d Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png new file mode 100644 index 0000000000..015b85e5a0 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png new file mode 100644 index 0000000000..e62c91b16c Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png new file mode 100644 index 0000000000..695cc03088 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/5.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/5.png new file mode 100644 index 0000000000..f69f4eb430 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/5.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/6.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/6.png new file mode 100644 index 0000000000..0d156b6a17 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/6.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png new file mode 100644 index 0000000000..c17114ae82 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/inventorysetups/add_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/inventorysetups/add_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/inventorysetups/add_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/inventorysetups/add_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/inventorysetups/inventorysetups_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/inventorysetups/inventorysetups_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/inventorysetups/inventorysetups_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/inventorysetups/inventorysetups_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/inventorysetups/remove_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/inventorysetups/remove_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/inventorysetups/remove_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/inventorysetups/remove_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/back_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/back_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/back_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/back_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/grouped_loot_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/grouped_loot_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/grouped_loot_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/grouped_loot_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/invisible_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/invisible_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/invisible_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/invisible_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/panel_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/panel_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/panel_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/single_loot_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/single_loot_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/single_loot_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/single_loot_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/visible_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/visible_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/loottracker/visible_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/visible_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/playerindicators/skull.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/skull.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/playerindicators/skull.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/skull.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/altar.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/altar.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/altar.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/altar.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/annakarl.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/annakarl.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/annakarl.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/annakarl.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/ardougne.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/ardougne.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/ardougne.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/ardougne.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/camelot.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/camelot.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/camelot.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/camelot.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/carrallangar.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/carrallangar.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/carrallangar.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/carrallangar.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/catherby.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/catherby.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/catherby.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/catherby.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/digsitependant.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/digsitependant.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/digsitependant.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/digsitependant.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/exitportal.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/exitportal.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/exitportal.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/exitportal.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/falador.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/falador.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/falador.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/falador.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/fishingguild.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/fishingguild.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/fishingguild.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/fishingguild.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/ghorrock.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/ghorrock.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/ghorrock.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/ghorrock.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/glory.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/glory.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/glory.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/glory.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/jewellery.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/jewellery.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/jewellery.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/jewellery.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/kharyll.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/kharyll.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/kharyll.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/kharyll.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/kourend.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/kourend.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/kourend.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/kourend.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/lumbridge.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/lumbridge.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/lumbridge.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/lumbridge.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/lunarisle.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/lunarisle.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/lunarisle.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/lunarisle.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/marim.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/marim.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/marim.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/marim.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/pool.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/pool.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/pool.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/pool.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/portalnexus.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/portalnexus.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/portalnexus.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/portalnexus.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/repair.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/repair.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/repair.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/repair.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/senntisten.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/senntisten.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/senntisten.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/senntisten.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/spellbook.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/spellbook.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/spellbook.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/spellbook.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/transportation.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/transportation.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/transportation.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/transportation.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/trollheim.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/trollheim.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/trollheim.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/trollheim.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/varrock.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/varrock.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/varrock.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/varrock.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/waterbirth.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/waterbirth.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/waterbirth.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/waterbirth.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/xericstalisman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/xericstalisman.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/xericstalisman.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/xericstalisman.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/yanille.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/yanille.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poh/yanille.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poh/yanille.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poison/1067-DISEASE.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poison/1067-DISEASE.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poison/1067-DISEASE.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poison/1067-DISEASE.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poison/1067-POISON.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poison/1067-POISON.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poison/1067-POISON.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poison/1067-POISON.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/poison/1067-VENOM.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poison/1067-VENOM.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/poison/1067-VENOM.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/poison/1067-VENOM.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/profiles/delete_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/profiles/delete_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/profiles/delete_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/profiles/delete_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/profiles/profiles_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/profiles/profiles_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/profiles/profiles_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/profiles/profiles_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/pvptools/skull.png b/runelite-client/src/main/resources/net/runelite/client/plugins/pvptools/skull.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/pvptools/skull.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/pvptools/skull.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/raids/instancereloadhelper.png b/runelite-client/src/main/resources/net/runelite/client/plugins/raids/instancereloadhelper.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/raids/instancereloadhelper.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/raids/instancereloadhelper.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/add_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/add_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/add_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/add_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/border_color_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/border_color_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/border_color_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/border_color_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/cancel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/cancel_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/cancel_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/cancel_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/delete_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/delete_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/delete_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/delete_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/fill_color_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/fill_color_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/fill_color_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/fill_color_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/invisible_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/invisible_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/invisible_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/invisible_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/opacity_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/opacity_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/opacity_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/opacity_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/panel_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/panel_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/panel_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/visible_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/visible_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenmarkers/visible_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/visible_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/calc.png b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/calc.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/calc.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/calc.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json similarity index 95% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json index 69a8d2d54f..0d098baf3a 100644 --- a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json @@ -367,12 +367,30 @@ "name": "Topaz Amulet (U)", "xp": 80 }, + { + "level": 45, + "icon": 6328, + "name": "Snakeskin boots", + "xp": 30 + }, { "level": 46, "icon": 567, "name": "Unpowered Orb", "xp": 52.5 }, + { + "level": 47, + "icon": 6330, + "name": "Snakeskin vambraces", + "xp": 35 + }, + { + "level": 48, + "icon": 6326, + "name": "Snakeskin bandana", + "xp": 45 + }, { "level": 49, "icon": 4542, @@ -385,6 +403,18 @@ "name": "Ruby Amulet (U)", "xp": 85 }, + { + "level": 51, + "icon": 6324, + "name": "Snakeskin chaps", + "xp": 50 + }, + { + "level": 53, + "icon": 6322, + "name": "Snakeskin body", + "xp": 55 + }, { "level": 54, "icon": 1395, diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/view-more-white.png b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/view-more-white.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skillcalculator/view-more-white.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/view-more-white.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt b/runelite-client/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt rename to runelite-client/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/slayer/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/panel_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/slayer/panel_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/slayer/panel_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/slayer/pause_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/pause_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/slayer/pause_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/slayer/pause_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/slayer/play_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/play_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/slayer/play_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/slayer/play_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/back-arrow-white.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/back-arrow-white.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/back-arrow-white.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/back-arrow-white.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/back_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/back_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/back_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/back_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/delete-white.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/delete-white.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/delete-white.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/delete-white.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/grouped_loot_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/grouped_loot_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/grouped_loot_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/grouped_loot_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/invisible_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/invisible_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/invisible_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/invisible_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/panel_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/panel_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/panel_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/refresh-white.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/refresh-white.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/refresh-white.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/refresh-white.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/replay-white.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/replay-white.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/replay-white.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/replay-white.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/single_loot_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/single_loot_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/single_loot_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/single_loot_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/visible_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/visible_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/stonedloottracker/visible_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/stonedloottracker/visible_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/back_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/back_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/back_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/back_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/panel_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/panel_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/panel_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/plus_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/plus_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/plus_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/plus_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/sarabrew.jpg b/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/sarabrew.jpg similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/suppliestracker/sarabrew.jpg rename to runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/sarabrew.jpg diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/add_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/add_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/add_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/add_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/arrow_right.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/arrow_right.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/arrow_right.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/arrow_right.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/delete_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/delete_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/delete_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/delete_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/lap_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/lap_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/lap_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/lap_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/pause_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/pause_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/pause_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/pause_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/reset_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/reset_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/reset_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/reset_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/start_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/start_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/start_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/start_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/watch.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/watch.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/timetracking/watch.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/watch.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/vorkath/acid.png b/runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/acid.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/vorkath/acid.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/acid.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/fire_strike.png b/runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/fire_strike.png new file mode 100644 index 0000000000..eec1fd6bec Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/fire_strike.png differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/vorkath/ice.png b/runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/ice.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/vorkath/ice.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/ice.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/vorkath/magerange.png b/runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/magerange.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/vorkath/magerange.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/vorkath/magerange.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/wiki/fixed_mode_minimap_clickmask.png b/runelite-client/src/main/resources/net/runelite/client/plugins/wiki/fixed_mode_minimap_clickmask.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/wiki/fixed_mode_minimap_clickmask.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/wiki/fixed_mode_minimap_clickmask.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/wiki/wiki.png b/runelite-client/src/main/resources/net/runelite/client/plugins/wiki/wiki.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/wiki/wiki.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/wiki/wiki.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/wiki/wiki_selected.png b/runelite-client/src/main/resources/net/runelite/client/plugins/wiki/wiki_selected.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/wiki/wiki_selected.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/wiki/wiki_selected.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/arrow_down.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/arrow_down.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/arrow_down.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/arrow_down.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_aus.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_aus.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_aus.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_aus.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_ger.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_ger.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_ger.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_ger.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_uk.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_uk.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_uk.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_uk.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_us.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_us.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/flag_us.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/flag_us.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldhopper/icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldhopper/icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/amulet_of_glory_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/amulet_of_glory_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/amulet_of_glory_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/amulet_of_glory_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/annakarl_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/annakarl_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/annakarl_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/annakarl_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon_arceuus.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon_arceuus.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon_arceuus.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ape_atoll_teleport_icon_arceuus.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_cloak_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_cloak_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_cloak_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_cloak_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ardougne_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/barbarian_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/barbarian_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/barbarian_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/barbarian_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/barrows_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/barrows_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/barrows_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/barrows_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/battlefront_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/battlefront_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/battlefront_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/battlefront_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/burning_amulet_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/burning_amulet_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/burning_amulet_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/burning_amulet_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/camelot_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/camelot_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/camelot_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/camelot_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/camulet_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/camulet_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/camulet_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/camulet_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/carrallangar_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/carrallangar_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/carrallangar_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/carrallangar_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/catherby_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/catherby_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/catherby_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/catherby_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/cemetery_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/cemetery_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/cemetery_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/cemetery_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/chronicle_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/chronicle_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/chronicle_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/chronicle_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/combat_bracelet_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/combat_bracelet_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/combat_bracelet_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/combat_bracelet_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/dareeyak_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/dareeyak_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/dareeyak_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/dareeyak_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/desert_amulet_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/desert_amulet_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/desert_amulet_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/desert_amulet_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/digsite_pendant_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/digsite_pendant_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/digsite_pendant_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/digsite_pendant_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/draynor_manor_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/draynor_manor_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/draynor_manor_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/draynor_manor_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ectophial_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ectophial_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ectophial_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ectophial_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/enchanted_lyre_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/enchanted_lyre_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/enchanted_lyre_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/enchanted_lyre_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/explorers_ring_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/explorers_ring_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/explorers_ring_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/explorers_ring_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fairy_ring_travel.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fairy_ring_travel.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fairy_ring_travel.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fairy_ring_travel.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/falador_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/falador_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/falador_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/falador_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fenkenstrains_castle_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fenkenstrains_castle_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fenkenstrains_castle_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fenkenstrains_castle_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fishing_guild_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fishing_guild_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fishing_guild_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fishing_guild_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fremennik_boots_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fremennik_boots_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/fremennik_boots_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/fremennik_boots_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/games_necklace_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/games_necklace_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/games_necklace_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/games_necklace_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ghorrock_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ghorrock_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ghorrock_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ghorrock_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/harmony_island_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/harmony_island_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/harmony_island_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/harmony_island_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/house_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/house_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/house_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/house_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ice_plateau_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ice_plateau_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ice_plateau_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ice_plateau_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/icy_basalt_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/icy_basalt_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/icy_basalt_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/icy_basalt_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kandarin_headgear_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kandarin_headgear_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kandarin_headgear_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kandarin_headgear_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/karamja_gloves_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/karamja_gloves_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/karamja_gloves_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/karamja_gloves_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kharedsts_memoirs_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kharedsts_memoirs_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kharedsts_memoirs_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kharedsts_memoirs_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kharyrll_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kharyrll_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kharyrll_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kharyrll_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/khazard_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/khazard_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/khazard_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/khazard_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kourend_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kourend_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/kourend_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/kourend_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/lassar_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/lassar_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/lassar_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/lassar_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_graveyard_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_graveyard_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_graveyard_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_graveyard_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/lumbridge_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/mind_altar_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/mind_altar_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/mind_altar_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/mind_altar_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/moonclan_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/moonclan_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/moonclan_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/moonclan_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/morytania_legs_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/morytania_legs_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/morytania_legs_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/morytania_legs_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/mythical_cape_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/mythical_cape_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/mythical_cape_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/mythical_cape_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/necklace_of_passage_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/necklace_of_passage_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/necklace_of_passage_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/necklace_of_passage_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/nope_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/nope_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/nope_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/nope_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/obelisk_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/obelisk_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/obelisk_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/obelisk_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ourania_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ourania_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ourania_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ourania_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/paddewwa_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/paddewwa_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/paddewwa_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/paddewwa_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/pharaohs_sceptre_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/pharaohs_sceptre_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/pharaohs_sceptre_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/pharaohs_sceptre_teleport_icon.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_completed_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_completed_icon.png new file mode 100644 index 0000000000..71193ddba2 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_completed_icon.png differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/quest_highlight_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_highlight_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/quest_highlight_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_highlight_icon.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_not_started_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_not_started_icon.png new file mode 100644 index 0000000000..c383d269ce Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_not_started_icon.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_started_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_started_icon.png new file mode 100644 index 0000000000..bd23865486 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/quest_started_icon.png differ diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/radas_blessing_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/radas_blessing_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/radas_blessing_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/radas_blessing_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/respawn_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/respawn_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/respawn_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/respawn_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_dueling_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_dueling_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_dueling_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_dueling_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_wealth_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_wealth_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_wealth_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/ring_of_wealth_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/royal_seed_pod_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/royal_seed_pod_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/royal_seed_pod_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/royal_seed_pod_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/salve_graveyard_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/salve_graveyard_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/salve_graveyard_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/salve_graveyard_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/scroll_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/scroll_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/scroll_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/scroll_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/senntisten_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/senntisten_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/senntisten_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/senntisten_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/skills_necklace_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/skills_necklace_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/skills_necklace_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/skills_necklace_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/skull_sceptre_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/skull_sceptre_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/skull_sceptre_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/skull_sceptre_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/slayer_ring_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/slayer_ring_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/slayer_ring_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/slayer_ring_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/stony_basalt_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/stony_basalt_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/stony_basalt_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/stony_basalt_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/trollheim_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/trollheim_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/trollheim_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/trollheim_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/varrock_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/varrock_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/varrock_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/varrock_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/watchtower_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/watchtower_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/watchtower_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/watchtower_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/waterbirth_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/waterbirth_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/waterbirth_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/waterbirth_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/west_ardougne_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/west_ardougne_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/west_ardougne_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/west_ardougne_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/western_banner_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/western_banner_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/western_banner_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/western_banner_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/wilderness_sword_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/wilderness_sword_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/wilderness_sword_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/wilderness_sword_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/xerics_talisman_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/xerics_talisman_teleport_icon.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/worldmap/xerics_talisman_teleport_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/xerics_talisman_teleport_icon.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_magic.png b/runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_magic.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_magic.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_magic.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_missiles.png b/runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_missiles.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_missiles.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/protect_from_missiles.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_magic.png b/runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_magic.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_magic.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_magic.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_melee.png b/runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_melee.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_melee.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_melee.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_range.png b/runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_range.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_range.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/zulrah/zulrah_range.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/rs/jagex.crt b/runelite-client/src/main/resources/net/runelite/client/rs/jagex.crt similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/rs/jagex.crt rename to runelite-client/src/main/resources/net/runelite/client/rs/jagex.crt diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/runelite.properties b/runelite-client/src/main/resources/net/runelite/client/runelite.properties similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/runelite.properties rename to runelite-client/src/main/resources/net/runelite/client/runelite.properties diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/components/error.png b/runelite-client/src/main/resources/net/runelite/client/ui/components/error.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/ui/components/error.png rename to runelite-client/src/main/resources/net/runelite/client/ui/components/error.png diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/components/loading_spinner.gif b/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner.gif similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/ui/components/loading_spinner.gif rename to runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner.gif diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/components/loading_spinner_darker.gif b/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner_darker.gif similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/ui/components/loading_spinner_darker.gif rename to runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner_darker.gif diff --git a/RuneLitePlus/src/main/resources/net/runelite/client/ui/components/search.png b/runelite-client/src/main/resources/net/runelite/client/ui/components/search.png similarity index 100% rename from RuneLitePlus/src/main/resources/net/runelite/client/ui/components/search.png rename to runelite-client/src/main/resources/net/runelite/client/ui/components/search.png diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/open.png b/runelite-client/src/main/resources/net/runelite/client/ui/open.png similarity index 100% rename from RuneLitePlus/src/main/resources/com/runeswag/client/ui/open.png rename to runelite-client/src/main/resources/net/runelite/client/ui/open.png diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/open_rs.png b/runelite-client/src/main/resources/net/runelite/client/ui/open_rs.png similarity index 100% rename from RuneLitePlus/src/main/resources/com/runeswag/client/ui/open_rs.png rename to runelite-client/src/main/resources/net/runelite/client/ui/open_rs.png diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/runescape.ttf b/runelite-client/src/main/resources/net/runelite/client/ui/runescape.ttf similarity index 100% rename from RuneLitePlus/src/main/resources/com/runeswag/client/ui/runescape.ttf rename to runelite-client/src/main/resources/net/runelite/client/ui/runescape.ttf diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/runescape_bold.ttf b/runelite-client/src/main/resources/net/runelite/client/ui/runescape_bold.ttf similarity index 100% rename from RuneLitePlus/src/main/resources/com/runeswag/client/ui/runescape_bold.ttf rename to runelite-client/src/main/resources/net/runelite/client/ui/runescape_bold.ttf diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/runescape_small.ttf b/runelite-client/src/main/resources/net/runelite/client/ui/runescape_small.ttf similarity index 100% rename from RuneLitePlus/src/main/resources/com/runeswag/client/ui/runescape_small.ttf rename to runelite-client/src/main/resources/net/runelite/client/ui/runescape_small.ttf diff --git a/RuneLitePlus/src/main/resources/com/runeswag/client/ui/RuneLite.colorschemes b/runelite-client/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes similarity index 100% rename from RuneLitePlus/src/main/resources/com/runeswag/client/ui/RuneLite.colorschemes rename to runelite-client/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes diff --git a/RuneLitePlus/src/main/resources/npc_stats.json b/runelite-client/src/main/resources/npc_stats.json similarity index 89% rename from RuneLitePlus/src/main/resources/npc_stats.json rename to runelite-client/src/main/resources/npc_stats.json index 978c1f18ad..a2b4725500 100644 --- a/RuneLitePlus/src/main/resources/npc_stats.json +++ b/runelite-client/src/main/resources/npc_stats.json @@ -4,6 +4,7 @@ "hitpoints": 52, "combatLevel": 51, "slayerLevel": 39, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 50, @@ -19,6 +20,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -35,6 +37,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -51,6 +54,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -67,6 +71,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -83,6 +88,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -99,6 +105,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -115,6 +122,7 @@ "hitpoints": 105, "combatLevel": 115, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 105, @@ -130,6 +138,7 @@ "name": "Death spawn", "hitpoints": 60, "combatLevel": 46, + "attackSpeed": 4, "attackLevel": 67, "strengthLevel": 7, "defenceLevel": 30, @@ -146,6 +155,7 @@ "hitpoints": 105, "combatLevel": 115, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 105, @@ -162,6 +172,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -174,6 +185,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -186,6 +198,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -198,6 +211,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -210,6 +224,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -222,6 +237,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -234,6 +250,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -246,6 +263,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -258,6 +276,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -270,6 +289,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -282,6 +302,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -294,6 +315,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -306,6 +328,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -318,6 +341,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -330,6 +354,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -342,6 +367,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -354,6 +380,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -366,6 +393,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -378,6 +406,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -390,6 +419,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -402,6 +432,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -414,6 +445,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -426,6 +458,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -438,6 +471,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -450,6 +484,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -462,6 +497,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -474,6 +510,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -486,6 +523,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -498,6 +536,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -510,6 +549,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -522,6 +562,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -534,6 +575,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -546,6 +588,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -558,6 +601,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -570,6 +614,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -582,6 +627,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -594,6 +640,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -606,6 +653,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -618,6 +666,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -637,6 +686,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -656,6 +706,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -675,6 +726,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -694,6 +746,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -713,6 +766,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -725,6 +779,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -740,6 +795,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -755,6 +811,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -770,6 +827,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -785,6 +843,7 @@ "hitpoints": 24, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -800,6 +859,7 @@ "hitpoints": 24, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -815,6 +875,7 @@ "hitpoints": 24, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -830,6 +891,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -848,6 +910,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -866,6 +929,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -884,6 +948,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -902,6 +967,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -920,6 +986,7 @@ "hitpoints": 59, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 36, @@ -938,6 +1005,7 @@ "hitpoints": 59, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 36, @@ -956,6 +1024,7 @@ "hitpoints": 17, "combatLevel": 16, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 14, "defenceLevel": 14, @@ -968,6 +1037,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -984,6 +1054,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1000,6 +1071,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1016,6 +1088,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1032,6 +1105,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1048,6 +1122,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1064,6 +1139,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1080,6 +1156,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1096,6 +1173,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1112,6 +1190,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1128,6 +1207,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1144,6 +1224,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1160,6 +1241,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1175,6 +1257,7 @@ "name": "Soulless", "hitpoints": 24, "combatLevel": 18, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1186,6 +1269,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -1196,6 +1280,7 @@ "name": "Rock Crab", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1206,6 +1291,7 @@ "name": "Rocks", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1216,6 +1302,7 @@ "name": "Rock Crab", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1226,6 +1313,7 @@ "name": "Rocks", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1237,6 +1325,7 @@ "hitpoints": 116, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -1248,6 +1337,7 @@ "hitpoints": 116, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -1259,6 +1349,7 @@ "hitpoints": 69, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 52, @@ -1270,6 +1361,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1281,6 +1373,7 @@ "hitpoints": 44, "combatLevel": 38, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 31, "defenceLevel": 32, @@ -1292,6 +1385,7 @@ "hitpoints": 74, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 61, "defenceLevel": 62, @@ -1303,6 +1397,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1314,6 +1409,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -1325,6 +1421,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -1336,6 +1433,7 @@ "hitpoints": 49, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 36, "defenceLevel": 37, @@ -1347,6 +1445,7 @@ "hitpoints": 74, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 61, "defenceLevel": 62, @@ -1358,6 +1457,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1369,6 +1469,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1379,6 +1480,7 @@ "name": "Skeleton", "hitpoints": 29, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -1393,6 +1495,7 @@ "name": "Guard dog", "hitpoints": 49, "combatLevel": 44, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 36, "defenceLevel": 37, @@ -1403,6 +1506,7 @@ "name": "Hobgoblin", "hitpoints": 62, "combatLevel": 54, + "attackSpeed": 6, "attackLevel": 45, "strengthLevel": 43, "defenceLevel": 43, @@ -1417,6 +1521,7 @@ "name": "Troll", "hitpoints": 120, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 100, "defenceLevel": 50, @@ -1432,6 +1537,7 @@ "name": "Huge spider", "hitpoints": 90, "combatLevel": 81, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 70, "defenceLevel": 69, @@ -1442,6 +1548,7 @@ "name": "Hellhound", "hitpoints": 116, "combatLevel": 122, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -1453,6 +1560,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -1465,6 +1573,7 @@ "name": "Baby red dragon", "hitpoints": 65, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 55, @@ -1480,6 +1589,7 @@ "name": "Kalphite Soldier", "hitpoints": 90, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -1495,6 +1605,7 @@ "name": "Steel dragon", "hitpoints": 210, "combatLevel": 246, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -1510,6 +1621,7 @@ "name": "Dagannoth", "hitpoints": 142, "combatLevel": 135, + "attackSpeed": 4, "attackLevel": 114, "strengthLevel": 117, "defenceLevel": 98, @@ -1527,6 +1639,7 @@ "name": "Tok-Xil", "hitpoints": 60, "combatLevel": 135, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 180, "defenceLevel": 90, @@ -1537,6 +1650,7 @@ "name": "Demon", "hitpoints": 79, "combatLevel": 82, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -1547,6 +1661,7 @@ "name": "Rocnar", "hitpoints": 100, "combatLevel": 97, + "attackSpeed": 6, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -1558,6 +1673,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1569,6 +1685,7 @@ "hitpoints": 69, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 52, @@ -1580,6 +1697,7 @@ "hitpoints": 240, "combatLevel": 276, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 240, "strengthLevel": 240, "defenceLevel": 240, @@ -1597,6 +1715,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -1609,6 +1728,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1626,6 +1746,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1643,6 +1764,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1660,6 +1782,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1677,6 +1800,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1694,6 +1818,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1711,6 +1836,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1728,6 +1854,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1745,6 +1872,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1762,6 +1890,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1779,6 +1908,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1796,6 +1926,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1813,6 +1944,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1830,6 +1962,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1847,6 +1980,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1864,6 +1998,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1881,6 +2016,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1898,6 +2034,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1915,6 +2052,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1932,6 +2070,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -1949,6 +2088,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -1966,6 +2106,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -1983,6 +2124,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -2000,6 +2142,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -2017,6 +2160,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2034,6 +2178,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2051,6 +2196,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2068,6 +2214,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2085,6 +2232,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2102,6 +2250,7 @@ "hitpoints": 122, "combatLevel": 131, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 112, "strengthLevel": 112, "defenceLevel": 112, @@ -2119,6 +2268,7 @@ "hitpoints": 122, "combatLevel": 131, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 112, "strengthLevel": 112, "defenceLevel": 112, @@ -2136,6 +2286,7 @@ "hitpoints": 165, "combatLevel": 189, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 165, @@ -2153,6 +2304,7 @@ "hitpoints": 165, "combatLevel": 189, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 165, @@ -2170,6 +2322,7 @@ "hitpoints": 210, "combatLevel": 246, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -2187,6 +2340,7 @@ "hitpoints": 210, "combatLevel": 246, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -2204,6 +2358,7 @@ "hitpoints": 50, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 40, "defenceLevel": 30, @@ -2215,6 +2370,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 6, @@ -2230,6 +2386,7 @@ "hitpoints": 61, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 42, "defenceLevel": 28, @@ -2247,31 +2404,36 @@ "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "293": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "294": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "295": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "296": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 6, @@ -2286,6 +2448,7 @@ "name": "Gunthor the brave", "hitpoints": 35, "combatLevel": 29, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 25, @@ -2302,6 +2465,7 @@ "name": "Jailer", "hitpoints": 47, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -2316,6 +2480,7 @@ "hitpoints": 37, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 26, "defenceLevel": 27, @@ -2332,6 +2497,7 @@ "hitpoints": 37, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 26, "defenceLevel": 27, @@ -2348,6 +2514,7 @@ "hitpoints": 37, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 26, "defenceLevel": 27, @@ -2363,6 +2530,7 @@ "name": "Salarin the twisted", "hitpoints": 70, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 58, "defenceLevel": 62, @@ -2373,6 +2541,7 @@ "name": "Corporeal Beast", "hitpoints": 2000, "combatLevel": 785, + "attackSpeed": 6, "attackLevel": 320, "strengthLevel": 320, "defenceLevel": 310, @@ -2391,6 +2560,7 @@ "name": "Dark energy core", "hitpoints": 25, "combatLevel": 75, + "attackSpeed": 8, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 20, @@ -2401,11 +2571,80 @@ "crushDef": 10, "rangeDef": 10 }, + "397": { + "name": "Town Guard", + "hitpoints": 22, + "combatLevel": 22, + "attackSpeed": 6, + "attackLevel": 15, + "strengthLevel": 15, + "defenceLevel": 16, + "rangeLevel": 26, + "magicLevel": 1, + "stabDef": 5, + "slashDef": 5, + "crushDef": 5, + "rangeDef": 5, + "bonusAttack": 6, + "bonusStrength": 10 + }, + "398": { + "name": "Town Guard", + "hitpoints": 22, + "combatLevel": 22, + "attackSpeed": 6, + "attackLevel": 15, + "strengthLevel": 15, + "defenceLevel": 16, + "rangeLevel": 26, + "magicLevel": 1, + "stabDef": 5, + "slashDef": 5, + "crushDef": 5, + "rangeDef": 5, + "bonusAttack": 6, + "bonusStrength": 10 + }, + "399": { + "name": "Town Guard", + "hitpoints": 22, + "combatLevel": 19, + "attackSpeed": 6, + "attackLevel": 15, + "strengthLevel": 15, + "defenceLevel": 16, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 5, + "slashDef": 5, + "crushDef": 5, + "rangeDef": 5, + "bonusAttack": 6, + "bonusStrength": 10 + }, + "400": { + "name": "Town Guard", + "hitpoints": 22, + "combatLevel": 19, + "attackSpeed": 6, + "attackLevel": 15, + "strengthLevel": 15, + "defenceLevel": 16, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 5, + "slashDef": 5, + "crushDef": 5, + "rangeDef": 5, + "bonusAttack": 6, + "bonusStrength": 10 + }, "406": { "name": "Cave crawler", "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2422,6 +2661,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2438,6 +2678,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2454,6 +2695,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2470,6 +2712,7 @@ "hitpoints": 97, "combatLevel": 106, "slayerLevel": 70, + "attackSpeed": 4, "attackLevel": 67, "strengthLevel": 105, "defenceLevel": 105, @@ -2485,6 +2728,7 @@ "hitpoints": 97, "combatLevel": 106, "slayerLevel": 70, + "attackSpeed": 4, "attackLevel": 67, "strengthLevel": 105, "defenceLevel": 105, @@ -2500,6 +2744,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 105, "defenceLevel": 107, @@ -2515,6 +2760,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 105, "defenceLevel": 107, @@ -2530,6 +2776,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 15, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 15, "defenceLevel": 22, @@ -2546,6 +2793,7 @@ "hitpoints": 150, "combatLevel": 124, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 67, "defenceLevel": 135, @@ -2562,6 +2810,7 @@ "hitpoints": 150, "combatLevel": 124, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 67, "defenceLevel": 135, @@ -2578,6 +2827,7 @@ "hitpoints": 75, "combatLevel": 61, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 45, "defenceLevel": 75, @@ -2592,6 +2842,7 @@ "hitpoints": 75, "combatLevel": 61, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 45, "defenceLevel": 75, @@ -2606,6 +2857,7 @@ "hitpoints": 37, "combatLevel": 37, "slayerLevel": 25, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 37, "defenceLevel": 37, @@ -2620,6 +2872,7 @@ "hitpoints": 37, "combatLevel": 37, "slayerLevel": 25, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 37, "defenceLevel": 37, @@ -2634,6 +2887,7 @@ "hitpoints": 27, "combatLevel": 29, "slayerLevel": 20, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 27, "defenceLevel": 27, @@ -2645,6 +2899,7 @@ "hitpoints": 27, "combatLevel": 29, "slayerLevel": 20, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 27, "defenceLevel": 27, @@ -2656,6 +2911,7 @@ "hitpoints": 105, "combatLevel": 93, "slayerLevel": 65, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 70, "defenceLevel": 40, @@ -2667,6 +2923,7 @@ "hitpoints": 81, "combatLevel": 89, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 88, "defenceLevel": 88, @@ -2680,6 +2937,7 @@ "hitpoints": 79, "combatLevel": 87, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 86, "defenceLevel": 86, @@ -2693,6 +2951,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 84, "defenceLevel": 84, @@ -2706,6 +2965,7 @@ "hitpoints": 76, "combatLevel": 83, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 83, "defenceLevel": 83, @@ -2719,6 +2979,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2734,6 +2995,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2749,6 +3011,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2764,6 +3027,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2779,6 +3043,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2790,6 +3055,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2801,6 +3067,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2812,6 +3079,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2823,6 +3091,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2834,6 +3103,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2845,6 +3115,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2857,6 +3128,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2869,6 +3141,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2881,6 +3154,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2893,6 +3167,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2905,6 +3180,7 @@ "hitpoints": 16, "combatLevel": 8, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 4, "defenceLevel": 4, @@ -2917,6 +3193,7 @@ "hitpoints": 19, "combatLevel": 12, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 7, "defenceLevel": 7, @@ -2929,6 +3206,7 @@ "hitpoints": 19, "combatLevel": 12, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 7, "defenceLevel": 7, @@ -2941,6 +3219,7 @@ "hitpoints": 40, "combatLevel": 42, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 36, "defenceLevel": 35, @@ -2952,6 +3231,7 @@ "hitpoints": 25, "combatLevel": 24, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 22, "defenceLevel": 20, @@ -2967,6 +3247,7 @@ "hitpoints": 25, "combatLevel": 24, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 22, "defenceLevel": 20, @@ -2982,6 +3263,7 @@ "hitpoints": 25, "combatLevel": 24, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 22, "defenceLevel": 20, @@ -2997,6 +3279,7 @@ "hitpoints": 15, "combatLevel": 12, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -3010,6 +3293,7 @@ "hitpoints": 15, "combatLevel": 12, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -3023,6 +3307,7 @@ "hitpoints": 25, "combatLevel": 46, "slayerLevel": 33, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 46, "defenceLevel": 32, @@ -3039,6 +3324,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3056,6 +3342,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3073,6 +3360,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3090,6 +3378,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3107,6 +3396,7 @@ "hitpoints": 51, "combatLevel": 55, "slayerLevel": 37, + "attackSpeed": 2, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -3124,6 +3414,7 @@ "hitpoints": 51, "combatLevel": 55, "slayerLevel": 37, + "attackSpeed": 2, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -3136,11 +3427,48 @@ "magicDef": 20, "bonusAttack": 30 }, + "472": { + "name": "Dark wizard", + "hitpoints": 24, + "combatLevel": 20, + "attackSpeed": 4, + "attackLevel": 5, + "strengthLevel": 2, + "defenceLevel": 5, + "rangeLevel": 1, + "magicLevel": 6, + "magicDef": 3 + }, + "473": { + "name": "Invrigar the Necromancer", + "hitpoints": 24, + "combatLevel": 20, + "attackSpeed": 4, + "attackLevel": 17, + "strengthLevel": 17, + "defenceLevel": 14, + "rangeLevel": 1, + "magicLevel": 18, + "magicDef": 3 + }, + "474": { + "name": "Dark wizard", + "hitpoints": 12, + "combatLevel": 7, + "attackSpeed": 4, + "attackLevel": 5, + "strengthLevel": 2, + "defenceLevel": 5, + "rangeLevel": 1, + "magicLevel": 6, + "magicDef": 3 + }, "475": { "name": "Hole in the wall", "hitpoints": 105, "combatLevel": 49, "slayerLevel": 35, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 16, @@ -3152,6 +3480,7 @@ "hitpoints": 105, "combatLevel": 49, "slayerLevel": 35, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 16, @@ -3162,6 +3491,7 @@ "name": "Giant frog", "hitpoints": 100, "combatLevel": 99, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 80, "defenceLevel": 65, @@ -3172,6 +3502,7 @@ "name": "Big frog", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 20, "defenceLevel": 15, @@ -3183,6 +3514,7 @@ "hitpoints": 25, "combatLevel": 23, "slayerLevel": 17, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 35, @@ -3194,6 +3526,7 @@ "hitpoints": 5, "combatLevel": 6, "slayerLevel": 7, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 6, @@ -3210,6 +3543,7 @@ "hitpoints": 93, "combatLevel": 96, "slayerLevel": 7, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 80, "defenceLevel": 84, @@ -3226,6 +3560,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3237,6 +3572,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3248,6 +3584,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3259,6 +3596,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3270,6 +3608,7 @@ "hitpoints": 125, "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 150, @@ -3281,6 +3620,7 @@ "name": "Whirlpool", "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -3294,6 +3634,7 @@ "hitpoints": 255, "combatLevel": 291, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -3306,6 +3647,7 @@ "name": "Whirlpool", "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -3319,6 +3661,7 @@ "hitpoints": 185, "combatLevel": 160, "slayerLevel": 93, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 130, "defenceLevel": 275, @@ -3334,6 +3677,7 @@ "hitpoints": 240, "combatLevel": 301, "slayerLevel": 93, + "attackSpeed": 2, "attackLevel": 230, "strengthLevel": 220, "defenceLevel": 360, @@ -3347,11 +3691,257 @@ "poisonImmune": true, "venomImmune": true }, + "505": { + "name": "Mugger", + "hitpoints": 8, + "combatLevel": 6, + "attackSpeed": 4, + "attackLevel": 5, + "strengthLevel": 5, + "defenceLevel": 5, + "rangeLevel": 1, + "magicLevel": 1 + }, + "508": { + "name": "Black Knight", + "hitpoints": 42, + "combatLevel": 33, + "attackSpeed": 5, + "attackLevel": 25, + "strengthLevel": 25, + "defenceLevel": 25, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 73, + "slashDef": 76, + "crushDef": 70, + "rangeDef": 72, + "bonusAttack": 18, + "bonusStrength": 16 + }, + "509": { + "name": "Black Knight", + "hitpoints": 42, + "combatLevel": 33, + "attackSpeed": 5, + "attackLevel": 25, + "strengthLevel": 25, + "defenceLevel": 25, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 73, + "slashDef": 76, + "crushDef": 70, + "rangeDef": 72, + "bonusAttack": 18, + "bonusStrength": 16 + }, + "510": { + "name": "Highwayman", + "hitpoints": 13, + "combatLevel": 5, + "attackSpeed": 4, + "attackLevel": 2, + "strengthLevel": 2, + "defenceLevel": 4, + "rangeLevel": 1, + "magicLevel": 1, + "slashDef": 3, + "crushDef": 2, + "rangeDef": 2, + "bonusAttack": 6, + "bonusStrength": 7 + }, + "511": { + "name": "Highwayman", + "hitpoints": 13, + "combatLevel": 5, + "attackSpeed": 4, + "attackLevel": 2, + "strengthLevel": 2, + "defenceLevel": 4, + "rangeLevel": 1, + "magicLevel": 1, + "slashDef": 3, + "crushDef": 2, + "rangeDef": 2, + "bonusAttack": 6, + "bonusStrength": 7 + }, + "512": { + "name": "Chaos druid", + "hitpoints": 20, + "combatLevel": 13, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 8, + "strengthLevel": 8, + "defenceLevel": 12, + "rangeLevel": 1, + "magicLevel": 10 + }, + "513": { + "name": "Pirate", + "hitpoints": 20, + "combatLevel": 23, + "attackSpeed": 5, + "attackLevel": 20, + "strengthLevel": 20, + "defenceLevel": 20, + "rangeLevel": 1, + "magicLevel": 1, + "slashDef": 1, + "bonusAttack": 9, + "bonusStrength": 10 + }, + "514": { + "name": "Pirate", + "hitpoints": 20, + "combatLevel": 23, + "attackSpeed": 5, + "attackLevel": 21, + "strengthLevel": 21, + "defenceLevel": 21, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 3, + "slashDef": 2, + "bonusAttack": 8, + "bonusStrength": 10 + }, + "515": { + "name": "Pirate", + "hitpoints": 23, + "combatLevel": 26, + "attackSpeed": 5, + "attackLevel": 23, + "strengthLevel": 23, + "defenceLevel": 23, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 3, + "slashDef": 2, + "bonusAttack": 8, + "bonusStrength": 10 + }, + "517": { + "name": "Thug", + "hitpoints": 18, + "combatLevel": 10, + "attackSpeed": 6, + "attackLevel": 7, + "strengthLevel": 5, + "defenceLevel": 9, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 2, + "slashDef": 3, + "crushDef": 3, + "bonusAttack": 5, + "bonusStrength": 5 + }, + "518": { + "name": "Rogue", + "hitpoints": 17, + "combatLevel": 15, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 13, + "strengthLevel": 13, + "defenceLevel": 13, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 6, + "slashDef": 9, + "crushDef": 11, + "bonusAttack": 5, + "bonusStrength": 5 + }, + "522": { + "name": "Tribesman", + "hitpoints": 39, + "combatLevel": 32, + "attackSpeed": 4, + "attackLevel": 23, + "strengthLevel": 27, + "defenceLevel": 26, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 4, + "slashDef": 6, + "crushDef": 6, + "bonusAttack": 8, + "bonusStrength": 5 + }, + "523": { + "name": "Dark warrior", + "hitpoints": 17, + "combatLevel": 8, + "slayerLevel": 1, + "attackSpeed": 6, + "attackLevel": 5, + "strengthLevel": 5, + "defenceLevel": 5, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 96, + "slashDef": 79, + "crushDef": 59, + "bonusAttack": 20, + "bonusStrength": 16 + }, + "524": { + "name": "Chaos druid warrior", + "hitpoints": 40, + "combatLevel": 37, + "attackSpeed": 5, + "attackLevel": 32, + "strengthLevel": 34, + "defenceLevel": 25, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 13, + "slashDef": 17, + "crushDef": 14, + "rangeDef": 14, + "bonusAttack": 9, + "bonusStrength": 5 + }, + "525": { + "name": "Necromancer", + "hitpoints": 40, + "combatLevel": 26, + "attackSpeed": 4, + "attackLevel": 18, + "strengthLevel": 18, + "defenceLevel": 18, + "rangeLevel": 1, + "magicLevel": 18 + }, + "537": { + "name": "Zygomite", + "hitpoints": 65, + "combatLevel": 74, + "slayerLevel": 57, + "attackSpeed": 4, + "attackLevel": 65, + "strengthLevel": 65, + "defenceLevel": 65, + "rangeLevel": 65, + "magicLevel": 65, + "stabDef": 10, + "slashDef": 10, + "crushDef": 10, + "rangeDef": 20, + "magicDef": 20, + "bonusAttack": 30 + }, "561": { "name": "Sorebones", "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3364,6 +3954,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3376,6 +3967,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3388,6 +3980,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3400,6 +3993,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3412,6 +4006,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3424,6 +4019,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3436,6 +4032,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3448,6 +4045,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3460,6 +4058,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3472,6 +4071,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3484,6 +4084,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3496,6 +4097,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3508,6 +4110,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3520,6 +4123,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3532,6 +4136,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3544,6 +4149,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3556,6 +4162,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3568,6 +4175,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3580,6 +4188,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3592,6 +4201,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3604,6 +4214,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3616,6 +4227,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3628,6 +4240,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3640,6 +4253,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3652,6 +4266,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3664,6 +4279,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3676,6 +4292,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3688,6 +4305,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3700,6 +4318,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3712,6 +4331,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3724,6 +4344,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3736,6 +4357,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3748,6 +4370,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3760,6 +4383,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3772,6 +4396,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3784,6 +4409,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3796,6 +4422,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3808,6 +4435,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3819,6 +4447,7 @@ "name": "Barrelchest", "hitpoints": 134, "combatLevel": 190, + "attackSpeed": 5, "attackLevel": 170, "strengthLevel": 145, "defenceLevel": 140, @@ -3832,6 +4461,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3844,6 +4474,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3856,6 +4487,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3868,6 +4500,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3880,6 +4513,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3892,6 +4526,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3904,6 +4539,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -3916,6 +4552,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -3928,6 +4565,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -3940,6 +4578,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -3952,6 +4591,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -3964,6 +4604,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -3975,6 +4616,7 @@ "name": "Evil spirit", "hitpoints": 90, "combatLevel": 150, + "attackSpeed": 4, "attackLevel": 170, "strengthLevel": 146, "defenceLevel": 100, @@ -3986,6 +4628,7 @@ "hitpoints": 40, "combatLevel": 49, "slayerLevel": 42, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 30, "defenceLevel": 40, @@ -4006,6 +4649,7 @@ "name": "Tyras guard", "hitpoints": 110, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 85, "strengthLevel": 95, "defenceLevel": 100, @@ -4022,6 +4666,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -4039,6 +4684,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -4056,6 +4702,7 @@ "hitpoints": 70, "combatLevel": 96, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 70, @@ -4067,6 +4714,7 @@ "hitpoints": 70, "combatLevel": 96, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 70, @@ -4078,6 +4726,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4087,6 +4736,7 @@ "hitpoints": 80, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 120, "defenceLevel": 80, @@ -4103,6 +4753,7 @@ "hitpoints": 80, "combatLevel": 123, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 100, @@ -4119,6 +4770,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4135,6 +4787,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4151,6 +4804,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4167,6 +4821,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4183,6 +4838,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4199,6 +4855,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4212,6 +4869,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4225,6 +4883,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4238,6 +4897,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4251,6 +4911,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4264,6 +4925,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4277,6 +4939,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4290,6 +4953,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4303,6 +4967,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4316,6 +4981,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4329,6 +4995,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4342,6 +5009,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4355,6 +5023,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4368,6 +5037,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4381,6 +5051,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4394,6 +5065,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4407,6 +5079,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4419,6 +5092,7 @@ "name": "Giant skeleton", "hitpoints": 110, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 84, "strengthLevel": 80, "defenceLevel": 80, @@ -4433,6 +5107,7 @@ "name": "Giant skeleton", "hitpoints": 110, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 84, "strengthLevel": 80, "defenceLevel": 80, @@ -4447,6 +5122,7 @@ "name": "Damis", "hitpoints": 90, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -4463,6 +5139,7 @@ "name": "Damis", "hitpoints": 200, "combatLevel": 174, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 100, "defenceLevel": 160, @@ -4479,6 +5156,7 @@ "name": "Stranger", "hitpoints": 80, "combatLevel": 95, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 80, "defenceLevel": 80, @@ -4496,6 +5174,7 @@ "name": "Bandit", "hitpoints": 65, "combatLevel": 74, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -4506,6 +5185,7 @@ "name": "Bandit", "hitpoints": 50, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -4517,6 +5197,7 @@ "hitpoints": 80, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 120, "defenceLevel": 80, @@ -4533,6 +5214,7 @@ "hitpoints": 80, "combatLevel": 123, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 100, @@ -4549,6 +5231,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4565,6 +5248,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4581,6 +5265,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4597,6 +5282,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4613,6 +5299,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4629,6 +5316,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4638,6 +5326,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4647,6 +5336,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4656,6 +5346,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4665,6 +5356,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4674,6 +5366,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4681,57 +5374,76 @@ "717": { "name": "Mummy", "hitpoints": 10, + "attackSpeed": 4, "undead": true }, "720": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "721": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "722": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "723": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "724": { "name": "Mummy", "hitpoints": 10, + "attackSpeed": 4, "undead": true }, "725": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "726": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "727": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "728": { "name": "Mummy", + "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "729": { "name": "Scarabs", "hitpoints": 25, "combatLevel": 92, + "attackSpeed": 1, "attackLevel": 255, "strengthLevel": 2, "defenceLevel": 10, @@ -4747,6 +5459,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 70, "defenceLevel": 30, @@ -4762,6 +5475,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 70, "defenceLevel": 30, @@ -4777,6 +5491,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 41, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 20, @@ -4792,6 +5507,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 41, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 20, @@ -4807,6 +5523,7 @@ "name": "Bandit champion", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 80, "defenceLevel": 50, @@ -4821,6 +5538,7 @@ "hitpoints": 50, "combatLevel": 75, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -4832,6 +5550,7 @@ "name": "Giant Roc", "hitpoints": 250, "combatLevel": 172, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 100, @@ -4843,6 +5562,7 @@ "name": "Shadow", "hitpoints": 15, "combatLevel": 73, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 120, "defenceLevel": 5, @@ -4858,6 +5578,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -4868,6 +5589,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -4878,6 +5600,7 @@ "name": "Me", "hitpoints": 45, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 74, @@ -4888,6 +5611,7 @@ "name": "Me", "hitpoints": 45, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 74, @@ -4899,6 +5623,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -4915,6 +5640,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -4931,6 +5657,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -4947,6 +5674,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -4963,6 +5691,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -4979,6 +5708,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -4995,6 +5725,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5006,11 +5737,29 @@ "rangeDef": 50, "magicDef": 90 }, + "794": { + "name": "Scarab mage", + "hitpoints": 50, + "combatLevel": 93, + "slayerLevel": 1, + "attackSpeed": 15, + "attackLevel": 90, + "strengthLevel": 90, + "defenceLevel": 90, + "rangeLevel": 1, + "magicLevel": 70, + "magic": 70, + "stabDef": 40, + "slashDef": 90, + "crushDef": 90, + "magicDef": 34 + }, "795": { "name": "Locust rider", "hitpoints": 90, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 90, @@ -5025,6 +5774,7 @@ "hitpoints": 90, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 105, "strengthLevel": 90, "defenceLevel": 50, @@ -5043,6 +5793,7 @@ "hitpoints": 130, "combatLevel": 191, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 169, "strengthLevel": 190, "defenceLevel": 169, @@ -5059,6 +5810,7 @@ "hitpoints": 130, "combatLevel": 191, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 169, "strengthLevel": 190, "defenceLevel": 169, @@ -5070,10 +5822,29 @@ "rangeDef": 149, "magicDef": 159 }, + "799": { + "name": "Scarab mage", + "hitpoints": 50, + "combatLevel": 66, + "slayerLevel": 1, + "attackSpeed": 15, + "attackLevel": 90, + "strengthLevel": 90, + "defenceLevel": 90, + "rangeLevel": 1, + "magicLevel": 70, + "magic": 70, + "stabDef": 40, + "slashDef": 90, + "crushDef": 90, + "magicDef": 34 + }, "800": { "name": "Locust rider", + "hitpoints": 90, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 90, @@ -5085,8 +5856,10 @@ }, "801": { "name": "Locust rider", + "hitpoints": 90, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 105, "strengthLevel": 90, "defenceLevel": 50, @@ -5105,6 +5878,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -5121,6 +5895,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -5131,6 +5906,7 @@ "name": "Melzar the Mad", "hitpoints": 44, "combatLevel": 43, + "attackSpeed": 4, "attackLevel": 37, "strengthLevel": 37, "defenceLevel": 34, @@ -5144,6 +5920,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5155,6 +5932,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5166,6 +5944,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5177,6 +5956,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5188,6 +5968,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5199,6 +5980,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5210,6 +5992,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5221,6 +6004,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5232,6 +6016,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5243,6 +6028,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5254,6 +6040,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5265,6 +6052,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5276,6 +6064,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5287,6 +6076,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5298,6 +6088,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5309,6 +6100,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5320,6 +6112,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5331,6 +6124,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5341,6 +6135,7 @@ "name": "Zombie", "hitpoints": 50, "combatLevel": 39, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -5352,6 +6147,7 @@ "name": "Slash Bash", "hitpoints": 100, "combatLevel": 111, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 60, @@ -5367,6 +6163,7 @@ "name": "Moss giant", "hitpoints": 120, "combatLevel": 84, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -5384,6 +6181,7 @@ "name": "Agrith Naar", "hitpoints": 100, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 90, "defenceLevel": 82, @@ -5396,6 +6194,7 @@ "hitpoints": 18, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "undead": true }, "925": { @@ -5403,6 +6202,7 @@ "hitpoints": 140, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 70, @@ -5419,6 +6219,7 @@ "hitpoints": 135, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 110, "defenceLevel": 60, @@ -5435,6 +6236,24 @@ "hitpoints": 120, "combatLevel": 91, "slayerLevel": 1, + "attackSpeed": 6, + "attackLevel": 50, + "strengthLevel": 100, + "defenceLevel": 50, + "stabDef": 25, + "slashDef": 25, + "crushDef": 40, + "rangeDef": 200, + "magicDef": 200, + "bonusAttack": 40, + "bonusStrength": 70 + }, + "928": { + "name": "Kraka", + "hitpoints": 120, + "combatLevel": 91, + "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 100, "defenceLevel": 50, @@ -5451,6 +6270,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5463,6 +6283,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5475,6 +6296,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5487,6 +6309,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5499,6 +6322,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5511,6 +6335,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5525,6 +6350,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5539,6 +6365,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5553,6 +6380,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5567,6 +6395,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5581,6 +6410,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5595,6 +6425,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5608,6 +6439,7 @@ "name": "Ghast", "hitpoints": 22, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 18, @@ -5618,30 +6450,35 @@ "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "950": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "951": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "952": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "953": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "955": { @@ -5649,6 +6486,7 @@ "hitpoints": 40, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -5665,6 +6503,7 @@ "hitpoints": 40, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -5680,6 +6519,7 @@ "name": "Kalphite Soldier", "hitpoints": 90, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -5695,6 +6535,7 @@ "name": "Kalphite Soldier", "hitpoints": 90, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -5711,6 +6552,7 @@ "hitpoints": 171, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -5727,6 +6569,7 @@ "hitpoints": 171, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -5743,6 +6586,7 @@ "hitpoints": 40, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -5759,6 +6603,7 @@ "hitpoints": 171, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -5775,6 +6620,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -5791,6 +6637,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -5807,6 +6654,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -5818,6 +6666,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -5829,6 +6678,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -5840,6 +6690,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -5853,6 +6704,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -5866,6 +6718,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -5894,6 +6747,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -5909,6 +6763,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -5924,6 +6779,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -5939,6 +6795,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -5954,6 +6811,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -5969,6 +6827,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -5984,6 +6843,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -5999,6 +6859,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6014,6 +6875,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6029,6 +6891,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6041,6 +6904,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6053,6 +6917,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6065,6 +6930,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6077,6 +6943,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6085,6 +6952,189 @@ "magic": 8, "venomImmune": true }, + "1024": { + "name": "Zygomite", + "hitpoints": 75, + "combatLevel": 86, + "slayerLevel": 57, + "attackSpeed": 4, + "attackLevel": 75, + "strengthLevel": 75, + "defenceLevel": 75, + "rangeLevel": 75, + "magicLevel": 75, + "stabDef": 10, + "slashDef": 10, + "crushDef": 10, + "rangeDef": 20, + "magicDef": 20, + "bonusAttack": 30 + }, + "1037": { + "name": "Snake", + "hitpoints": 25, + "combatLevel": 35, + "attackSpeed": 3, + "attackLevel": 25, + "strengthLevel": 50, + "defenceLevel": 25, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1038": { + "name": "Monkey", + "hitpoints": 6, + "combatLevel": 3, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 2, + "strengthLevel": 3, + "defenceLevel": 2, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1039": { + "name": "Albino bat", + "hitpoints": 33, + "combatLevel": 52, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 57, + "strengthLevel": 57, + "defenceLevel": 30, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1041": { + "name": "Giant mosquito", + "hitpoints": 3, + "combatLevel": 13, + "attackSpeed": 12, + "attackLevel": 5, + "strengthLevel": 1, + "defenceLevel": 45, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 2, + "slashDef": 2, + "crushDef": 5, + "magicDef": 2 + }, + "1042": { + "name": "Jungle horror", + "hitpoints": 45, + "combatLevel": 70, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 70, + "strengthLevel": 70, + "defenceLevel": 55, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1043": { + "name": "Jungle horror", + "hitpoints": 45, + "combatLevel": 70, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 70, + "strengthLevel": 70, + "defenceLevel": 55, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1044": { + "name": "Jungle horror", + "hitpoints": 45, + "combatLevel": 70, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 70, + "strengthLevel": 70, + "defenceLevel": 55, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1045": { + "name": "Jungle horror", + "hitpoints": 45, + "combatLevel": 70, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 70, + "strengthLevel": 70, + "defenceLevel": 55, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1046": { + "name": "Jungle horror", + "hitpoints": 45, + "combatLevel": 70, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 70, + "strengthLevel": 70, + "defenceLevel": 55, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1047": { + "name": "Cave horror", + "hitpoints": 55, + "combatLevel": 80, + "slayerLevel": 58, + "attackLevel": 80, + "strengthLevel": 77, + "defenceLevel": 62, + "rangeLevel": 1, + "magicLevel": 80 + }, + "1048": { + "name": "Cave horror", + "hitpoints": 55, + "combatLevel": 80, + "slayerLevel": 58, + "attackLevel": 80, + "strengthLevel": 77, + "defenceLevel": 62, + "rangeLevel": 1, + "magicLevel": 80 + }, + "1049": { + "name": "Cave horror", + "hitpoints": 55, + "combatLevel": 80, + "slayerLevel": 58, + "attackLevel": 80, + "strengthLevel": 77, + "defenceLevel": 62, + "rangeLevel": 1, + "magicLevel": 80 + }, + "1050": { + "name": "Cave horror", + "hitpoints": 55, + "combatLevel": 80, + "slayerLevel": 58, + "attackLevel": 80, + "strengthLevel": 77, + "defenceLevel": 62, + "rangeLevel": 1, + "magicLevel": 80 + }, + "1051": { + "name": "Cave horror", + "hitpoints": 55, + "combatLevel": 80, + "slayerLevel": 58, + "attackLevel": 80, + "strengthLevel": 77, + "defenceLevel": 62, + "rangeLevel": 1, + "magicLevel": 80 + }, "1060": { "name": "Angry bear", "combatLevel": 40 @@ -6112,42 +7162,111 @@ "1066": { "name": "Fear reaper", "hitpoints": 25, - "combatLevel": 42 + "combatLevel": 42, + "attackSpeed": 4, + "attackLevel": 39, + "strengthLevel": 41, + "defenceLevel": 40, + "rangeLevel": 1, + "magicLevel": 1 }, "1067": { "name": "Confusion beast", - "combatLevel": 43 + "hitpoints": 28, + "combatLevel": 43, + "attackSpeed": 4, + "attackLevel": 42, + "strengthLevel": 41, + "defenceLevel": 40, + "rangeLevel": 1, + "magicLevel": 1, + "poisonImmune": true, + "venomImmune": true }, "1068": { "name": "Confusion beast", - "combatLevel": 43 + "hitpoints": 28, + "combatLevel": 43, + "attackSpeed": 4, + "attackLevel": 42, + "strengthLevel": 41, + "defenceLevel": 40, + "rangeLevel": 1, + "magicLevel": 1, + "poisonImmune": true, + "venomImmune": true }, "1069": { "name": "Confusion beast", - "combatLevel": 43 + "hitpoints": 28, + "combatLevel": 43, + "attackSpeed": 4, + "attackLevel": 42, + "strengthLevel": 41, + "defenceLevel": 40, + "rangeLevel": 1, + "magicLevel": 1, + "poisonImmune": true, + "venomImmune": true }, "1070": { "name": "Confusion beast", - "combatLevel": 43 + "hitpoints": 28, + "combatLevel": 43, + "attackSpeed": 4, + "attackLevel": 42, + "strengthLevel": 41, + "defenceLevel": 40, + "rangeLevel": 1, + "magicLevel": 1, + "poisonImmune": true, + "venomImmune": true }, "1071": { "name": "Confusion beast", - "combatLevel": 43 + "hitpoints": 28, + "combatLevel": 43, + "attackSpeed": 4, + "attackLevel": 42, + "strengthLevel": 41, + "defenceLevel": 40, + "rangeLevel": 1, + "magicLevel": 1, + "poisonImmune": true, + "venomImmune": true }, "1072": { "name": "Hopeless creature", "hitpoints": 25, - "combatLevel": 40 + "combatLevel": 40, + "attackSpeed": 4, + "attackLevel": 38, + "strengthLevel": 36, + "defenceLevel": 39, + "rangeLevel": 1, + "magicLevel": 1 }, "1073": { "name": "Hopeless creature", "hitpoints": 25, - "combatLevel": 40 + "combatLevel": 40, + "attackSpeed": 4, + "attackLevel": 38, + "strengthLevel": 36, + "defenceLevel": 39, + "rangeLevel": 1, + "magicLevel": 1 }, "1074": { "name": "Hopeless creature", "hitpoints": 25, - "combatLevel": 40 + "combatLevel": 40, + "attackSpeed": 4, + "attackLevel": 38, + "strengthLevel": 36, + "defenceLevel": 39, + "rangeLevel": 1, + "magicLevel": 1 }, "1075": { "name": "Tolna", @@ -6165,6 +7284,7 @@ "name": "Tolna", "hitpoints": 37, "combatLevel": 46, + "attackSpeed": 5, "attackLevel": 42, "strengthLevel": 41, "defenceLevel": 40, @@ -6190,6 +7310,7 @@ "hitpoints": 85, "combatLevel": 90, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 70, "defenceLevel": 70, @@ -6201,6 +7322,7 @@ "hitpoints": 50, "combatLevel": 62, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 55, "defenceLevel": 50, @@ -6210,6 +7332,7 @@ "name": "Giant Sea Snake", "hitpoints": 100, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 170, "strengthLevel": 90, "defenceLevel": 160, @@ -6220,6 +7343,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -6235,6 +7359,7 @@ "name": "Mourner", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -6247,6 +7372,7 @@ "1118": { "name": "Man", "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6257,6 +7383,7 @@ "name": "Woman", "hitpoints": 10, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 2, @@ -6267,6 +7394,7 @@ "name": "Barrelchest (hard)", "hitpoints": 255, "combatLevel": 380, + "attackSpeed": 5, "attackLevel": 306, "strengthLevel": 261, "defenceLevel": 140, @@ -6280,6 +7408,7 @@ "hitpoints": 255, "combatLevel": 316, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 305, "strengthLevel": 342, "defenceLevel": 169, @@ -6295,6 +7424,7 @@ "name": "Dessous (hard)", "hitpoints": 255, "combatLevel": 217, + "attackSpeed": 3, "attackLevel": 198, "strengthLevel": 198, "defenceLevel": 99, @@ -6311,6 +7441,7 @@ "hitpoints": 255, "combatLevel": 273, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 380, "strengthLevel": 160, "defenceLevel": 135, @@ -6326,6 +7457,7 @@ "name": "Woman", "hitpoints": 13, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 1, "defenceLevel": 1, @@ -6339,6 +7471,7 @@ "name": "Woman", "hitpoints": 10, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 2, @@ -6349,6 +7482,7 @@ "name": "Damis (hard)", "hitpoints": 198, "combatLevel": 200, + "attackSpeed": 4, "attackLevel": 198, "strengthLevel": 198, "defenceLevel": 90, @@ -6365,6 +7499,7 @@ "name": "Damis (hard)", "hitpoints": 255, "combatLevel": 272, + "attackSpeed": 4, "attackLevel": 320, "strengthLevel": 200, "defenceLevel": 160, @@ -6381,6 +7516,7 @@ "name": "Mourner", "hitpoints": 13, "combatLevel": 18, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -6396,6 +7532,7 @@ "name": "Woman", "hitpoints": 13, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 1, "defenceLevel": 1, @@ -6409,6 +7546,7 @@ "name": "Woman", "hitpoints": 13, "combatLevel": 12, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -6419,6 +7557,7 @@ "name": "Woman", "hitpoints": 10, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 2, @@ -6429,6 +7568,7 @@ "name": "Woman", "hitpoints": 23, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -6439,6 +7579,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -6455,6 +7596,7 @@ "name": "Mourner", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -6468,6 +7610,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -6481,6 +7624,7 @@ "name": "Mourner", "hitpoints": 13, "combatLevel": 12, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -6495,6 +7639,7 @@ "hitpoints": 60, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -6511,16 +7656,42 @@ "hitpoints": 85, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 95, "defenceLevel": 80, "rangeLevel": 1, "magicLevel": 1 }, + "1173": { + "name": "Chicken", + "hitpoints": 3, + "combatLevel": 1, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "1174": { + "name": "Chicken", + "hitpoints": 3, + "combatLevel": 1, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, "1204": { "name": "Alomone", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 4, @@ -6534,6 +7705,7 @@ "name": "Clivet", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 4, @@ -6547,6 +7719,7 @@ "name": "Hazeel Cultist", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 4, @@ -6560,6 +7733,7 @@ "name": "Khazard Guard", "hitpoints": 25, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 18, "defenceLevel": 20, @@ -6575,6 +7749,7 @@ "name": "Khazard Guard", "hitpoints": 25, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 18, "defenceLevel": 20, @@ -6590,6 +7765,7 @@ "name": "Khazard Guard", "hitpoints": 25, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 18, "defenceLevel": 20, @@ -6605,6 +7781,7 @@ "name": "General Khazard", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -6616,6 +7793,7 @@ "hitpoints": 116, "combatLevel": 137, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -6626,6 +7804,7 @@ "name": "Khazard Ogre", "hitpoints": 60, "combatLevel": 63, + "attackSpeed": 6, "attackLevel": 54, "strengthLevel": 53, "defenceLevel": 53, @@ -6638,6 +7817,7 @@ "name": "Khazard Scorpion", "hitpoints": 40, "combatLevel": 44, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 39, "defenceLevel": 34, @@ -6648,10 +7828,15 @@ "crushDef": 15, "rangeDef": 5 }, + "1227": { + "name": "Arzinian Avatar of Strength", + "attackSpeed": 4 + }, "1228": { "name": "Arzinian Avatar of Strength", "hitpoints": 100, "combatLevel": 125, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 100, "defenceLevel": 95, @@ -6665,6 +7850,7 @@ "name": "Arzinian Avatar of Strength", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 65, "defenceLevel": 50, @@ -6674,10 +7860,15 @@ "rangeDef": 40, "magicDef": 10 }, + "1230": { + "name": "Arzinian Avatar of Ranging", + "attackSpeed": 4 + }, "1231": { "name": "Arzinian Avatar of Ranging", "hitpoints": 100, "combatLevel": 125, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 120, @@ -6693,6 +7884,7 @@ "name": "Arzinian Avatar of Ranging", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 40, "defenceLevel": 75, @@ -6704,10 +7896,15 @@ "magicDef": 40, "bonusRangeStrength": 5 }, + "1233": { + "name": "Arzinian Avatar of Magic", + "attackSpeed": 4 + }, "1234": { "name": "Arzinian Avatar of Magic", "hitpoints": 100, "combatLevel": 125, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 90, "defenceLevel": 120, @@ -6722,6 +7919,7 @@ "name": "Arzinian Avatar of Magic", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 50, "defenceLevel": 75, @@ -6736,6 +7934,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6746,6 +7945,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6756,6 +7956,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6766,6 +7967,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6776,6 +7978,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6787,6 +7990,7 @@ "hitpoints": 10, "combatLevel": 31, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 10, @@ -6798,6 +8002,7 @@ "hitpoints": 10, "combatLevel": 31, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 10, @@ -6808,6 +8013,7 @@ "name": "Experiment", "hitpoints": 40, "combatLevel": 51, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 50, @@ -6818,6 +8024,7 @@ "name": "Experiment", "hitpoints": 100, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -6828,6 +8035,7 @@ "name": "Experiment", "hitpoints": 100, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -6839,6 +8047,7 @@ "hitpoints": 38, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 30, "defenceLevel": 26, @@ -6849,6 +8058,7 @@ "hitpoints": 56, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 64, "strengthLevel": 47, "defenceLevel": 42 @@ -6856,8 +8066,9 @@ "1282": { "name": "Riyl Shade", "hitpoints": 76, - "combatLevel": 76, + "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 88, "strengthLevel": 55, "defenceLevel": 60 @@ -6867,6 +8078,7 @@ "hitpoints": 90, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 102, "strengthLevel": 84, "defenceLevel": 70 @@ -6876,6 +8088,7 @@ "hitpoints": 110, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 120, "strengthLevel": 100, "defenceLevel": 85, @@ -6885,6 +8098,7 @@ "name": "Afflicted", "hitpoints": 30, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 40, @@ -6895,6 +8109,7 @@ "name": "Afflicted", "hitpoints": 28, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 38, @@ -6905,6 +8120,7 @@ "name": "Afflicted", "hitpoints": 26, "combatLevel": 32, + "attackSpeed": 4, "attackLevel": 26, "strengthLevel": 26, "defenceLevel": 36, @@ -6915,6 +8131,7 @@ "name": "Afflicted", "hitpoints": 24, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 34, @@ -6926,6 +8143,7 @@ "hitpoints": 6, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6937,6 +8155,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6948,6 +8167,7 @@ "hitpoints": 40, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 35, @@ -6962,6 +8182,7 @@ "hitpoints": 25, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 25, @@ -6976,6 +8197,7 @@ "hitpoints": 25, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 30, "strengthLevel": 60, "defenceLevel": 57, @@ -6989,6 +8211,7 @@ "name": "Slagilith", "hitpoints": 60, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 75, @@ -7005,6 +8228,7 @@ "name": "Slagilith", "hitpoints": 60, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 75, @@ -7021,6 +8245,7 @@ "name": "Fire elemental", "hitpoints": 30, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 35, "defenceLevel": 20, @@ -7031,6 +8256,7 @@ "name": "Earth elemental", "hitpoints": 35, "combatLevel": 35, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 35, "defenceLevel": 35, @@ -7041,6 +8267,7 @@ "name": "Earth elemental", "hitpoints": 35, "combatLevel": 35, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 35, "defenceLevel": 35, @@ -7051,6 +8278,7 @@ "name": "Air elemental", "hitpoints": 30, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 20, "defenceLevel": 30, @@ -7062,6 +8290,7 @@ "hitpoints": 30, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -7072,6 +8301,7 @@ "name": "The Kendal", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 60, @@ -7086,6 +8316,7 @@ "name": "The Kendal", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 60, @@ -7100,6 +8331,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7110,6 +8342,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7120,6 +8353,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7130,6 +8364,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7140,6 +8375,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7150,31 +8386,36 @@ "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1402": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1403": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1404": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1405": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 6, @@ -7189,25 +8430,29 @@ "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1407": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1408": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1409": { "name": "Black Guard", "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7226,6 +8471,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7244,6 +8490,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7262,6 +8509,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7279,6 +8527,7 @@ "name": "Foreman", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7289,6 +8538,7 @@ "name": "Shipyard worker", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -7300,6 +8550,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -7311,6 +8562,7 @@ "name": "Jungle Demon", "hitpoints": 170, "combatLevel": 195, + "attackSpeed": 6, "attackLevel": 170, "strengthLevel": 170, "defenceLevel": 170, @@ -7326,6 +8578,7 @@ "name": "Pirate", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7339,6 +8592,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -7349,6 +8603,7 @@ "name": "Mugger", "hitpoints": 8, "combatLevel": 6, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -7361,16 +8616,11 @@ "combatLevel": 6, "slayerLevel": 1 }, - "1476": { - "name": "Chompy bird", - "hitpoints": 10, - "combatLevel": 6, - "slayerLevel": 1 - }, "1494": { "name": "Kebbit", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7382,6 +8632,7 @@ "hitpoints": 124, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 134, "defenceLevel": 110, @@ -7399,6 +8650,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -7416,6 +8668,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -7432,6 +8685,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -7448,6 +8702,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -7465,6 +8720,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 105, "defenceLevel": 107, @@ -7476,9 +8732,10 @@ "magicDef": 20 }, "1545": { - "name": "Black Knight", + "name": "Black knight", "hitpoints": 42, "combatLevel": 33, + "attackSpeed": 5, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -7495,6 +8752,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -7512,6 +8770,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -7529,6 +8788,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -7546,6 +8806,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -7563,6 +8824,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -7580,6 +8842,7 @@ "name": "Fire wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -7590,6 +8853,7 @@ "name": "Water wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -7600,6 +8864,7 @@ "name": "Earth wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -7610,6 +8875,7 @@ "name": "Air wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -7618,33 +8884,40 @@ }, "1603": { "name": "Kolodion", - "hitpoints": 3 + "hitpoints": 3, + "attackSpeed": 7 }, "1604": { "name": "Kolodion", - "hitpoints": 3 + "hitpoints": 3, + "attackSpeed": 7 }, "1605": { "name": "Kolodion", - "hitpoints": 3 + "hitpoints": 3, + "attackSpeed": 7 }, "1606": { "name": "Kolodion", - "hitpoints": 65 + "hitpoints": 65, + "attackSpeed": 7 }, "1607": { "name": "Kolodion", - "hitpoints": 65 + "hitpoints": 65, + "attackSpeed": 7 }, "1608": { "name": "Kolodion", - "hitpoints": 78 + "hitpoints": 78, + "attackSpeed": 7 }, "1609": { "name": "Kolodion", "hitpoints": 107, "combatLevel": 112, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 98, "defenceLevel": 105, @@ -7655,6 +8928,7 @@ "name": "Battle mage", "hitpoints": 120, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7665,6 +8939,7 @@ "name": "Battle mage", "hitpoints": 120, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7675,6 +8950,7 @@ "name": "Battle mage", "hitpoints": 120, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7684,18 +8960,21 @@ "1667": { "name": "Penance Fighter", "hitpoints": 28, - "combatLevel": 30 + "combatLevel": 30, + "attackSpeed": 4 }, "1668": { "name": "Penance Ranger", "hitpoints": 20, - "combatLevel": 21 + "combatLevel": 21, + "attackSpeed": 4 }, "1672": { "name": "Ahrim the Blighted", "hitpoints": 100, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -7715,6 +8994,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -7733,6 +9013,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -7752,6 +9033,7 @@ "hitpoints": 100, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -7770,6 +9052,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -7788,6 +9071,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -7805,6 +9089,7 @@ "name": "Bloodworm", "hitpoints": 45, "combatLevel": 52, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 20, "defenceLevel": 35, @@ -7816,6 +9101,7 @@ "hitpoints": 35, "combatLevel": 43, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 20, "defenceLevel": 20, @@ -7827,6 +9113,7 @@ "hitpoints": 70, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 65, @@ -7838,6 +9125,7 @@ "hitpoints": 70, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 65, @@ -7849,6 +9137,7 @@ "hitpoints": 70, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 65, @@ -7860,6 +9149,7 @@ "hitpoints": 45, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 47, "defenceLevel": 45, @@ -7876,6 +9166,7 @@ "hitpoints": 80, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 67, "defenceLevel": 65, @@ -7887,6 +9178,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -7902,6 +9194,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -7917,6 +9210,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -7932,6 +9226,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -7970,77 +9265,92 @@ "1694": { "name": "Shifter", "hitpoints": 23, - "combatLevel": 38 + "combatLevel": 38, + "attackSpeed": 4 }, "1695": { "name": "Shifter", "hitpoints": 23, - "combatLevel": 38 + "combatLevel": 38, + "attackSpeed": 4 }, "1696": { "name": "Shifter", "hitpoints": 38, - "combatLevel": 57 + "combatLevel": 57, + "attackSpeed": 4 }, "1697": { "name": "Shifter", "hitpoints": 38, - "combatLevel": 57 + "combatLevel": 57, + "attackSpeed": 4 }, "1698": { "name": "Shifter", "hitpoints": 53, - "combatLevel": 76 + "combatLevel": 76, + "attackSpeed": 4 }, "1699": { "name": "Shifter", "hitpoints": 53, - "combatLevel": 76 + "combatLevel": 76, + "attackSpeed": 4 }, "1700": { "name": "Shifter", "hitpoints": 68, - "combatLevel": 90 + "combatLevel": 90, + "attackSpeed": 4 }, "1701": { "name": "Shifter", "hitpoints": 68, - "combatLevel": 90 + "combatLevel": 90, + "attackSpeed": 4 }, "1702": { "name": "Shifter", "hitpoints": 83, - "combatLevel": 104 + "combatLevel": 104, + "attackSpeed": 4 }, "1703": { "name": "Shifter", "hitpoints": 83, - "combatLevel": 104 + "combatLevel": 104, + "attackSpeed": 4 }, "1704": { "name": "Ravager", "hitpoints": 23, - "combatLevel": 36 + "combatLevel": 36, + "attackSpeed": 4 }, "1705": { "name": "Ravager", "hitpoints": 38, - "combatLevel": 53 + "combatLevel": 53, + "attackSpeed": 4 }, "1706": { "name": "Ravager", "hitpoints": 53, - "combatLevel": 71 + "combatLevel": 71, + "attackSpeed": 4 }, "1707": { "name": "Ravager", "hitpoints": 68, - "combatLevel": 89 + "combatLevel": 89, + "attackSpeed": 4 }, "1708": { "name": "Ravager", "hitpoints": 83, - "combatLevel": 106 + "combatLevel": 106, + "attackSpeed": 4 }, "1709": { "name": "Spinner", @@ -8064,112 +9374,164 @@ }, "1713": { "name": "Spinner", + "hitpoints": 33, "combatLevel": 88 }, "1714": { "name": "Torcher", "hitpoints": 18, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1715": { "name": "Torcher", "hitpoints": 18, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1716": { "name": "Torcher", "hitpoints": 30, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1717": { "name": "Torcher", "hitpoints": 30, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1718": { "name": "Torcher", "hitpoints": 45, - "combatLevel": 66 + "combatLevel": 66, + "attackSpeed": 4 }, "1719": { "name": "Torcher", "hitpoints": 45, - "combatLevel": 66 + "combatLevel": 66, + "attackSpeed": 4 }, "1720": { "name": "Torcher", "hitpoints": 57, - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "1721": { "name": "Torcher", "hitpoints": 57, - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "1722": { "name": "Torcher", "hitpoints": 71, - "combatLevel": 91 + "combatLevel": 91, + "attackSpeed": 4 }, "1723": { "name": "Torcher", "hitpoints": 71, - "combatLevel": 92 + "combatLevel": 92, + "attackSpeed": 4 }, "1724": { "name": "Defiler", "hitpoints": 27, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1725": { "name": "Defiler", "hitpoints": 27, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1726": { "name": "Defiler", "hitpoints": 45, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1727": { "name": "Defiler", "hitpoints": 45, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1728": { "name": "Defiler", "hitpoints": 62, - "combatLevel": 66 + "combatLevel": 66, + "attackSpeed": 4 }, "1729": { "name": "Defiler", "hitpoints": 62, - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "1730": { "name": "Defiler", "hitpoints": 78, - "combatLevel": 91 + "combatLevel": 91, + "attackSpeed": 4 }, "1731": { "name": "Defiler", "hitpoints": 78, - "combatLevel": 91 + "combatLevel": 91, + "attackSpeed": 4 }, "1732": { "name": "Defiler", "hitpoints": 97, - "combatLevel": 92 + "combatLevel": 92, + "attackSpeed": 4 }, "1733": { "name": "Defiler", "hitpoints": 97, - "combatLevel": 92 + "combatLevel": 92, + "attackSpeed": 4 + }, + "1734": { + "name": "Brawler", + "hitpoints": 53, + "combatLevel": 51, + "attackSpeed": 4 + }, + "1735": { + "name": "Brawler", + "hitpoints": 83, + "combatLevel": 76, + "attackSpeed": 4 + }, + "1736": { + "name": "Brawler", + "hitpoints": 97, + "combatLevel": 101, + "attackSpeed": 4 + }, + "1737": { + "name": "Brawler", + "hitpoints": 113, + "combatLevel": 129, + "attackSpeed": 4 + }, + "1738": { + "name": "Brawler", + "hitpoints": 143, + "combatLevel": 158, + "attackSpeed": 4 }, "1777": { "name": "Double agent", "hitpoints": 80, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 43, "defenceLevel": 24, @@ -8183,6 +9545,7 @@ "name": "Double agent", "hitpoints": 120, "combatLevel": 108, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 80, "defenceLevel": 80, @@ -8199,6 +9562,7 @@ "hitpoints": 25, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 1, "attackLevel": 255, "strengthLevel": 5, "defenceLevel": 30, @@ -8214,6 +9578,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8229,6 +9594,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8244,6 +9610,7 @@ "name": "Billy Goat", "hitpoints": 28, "combatLevel": 33, + "attackSpeed": 4, "attackLevel": 31, "strengthLevel": 29, "defenceLevel": 29, @@ -8259,6 +9626,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8274,6 +9642,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8289,6 +9658,7 @@ "name": "Billy Goat", "hitpoints": 28, "combatLevel": 33, + "attackSpeed": 4, "attackLevel": 31, "strengthLevel": 29, "defenceLevel": 29, @@ -8304,6 +9674,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 36, + "attackSpeed": 7, "attackLevel": 27, "strengthLevel": 29, "defenceLevel": 21, @@ -8320,6 +9691,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 38, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 29, "defenceLevel": 25, @@ -8336,6 +9708,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 39, + "attackSpeed": 7, "attackLevel": 32, "strengthLevel": 29, "defenceLevel": 27, @@ -8352,6 +9725,7 @@ "name": "White Knight", "hitpoints": 55, "combatLevel": 42, + "attackSpeed": 7, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 27, @@ -8368,6 +9742,7 @@ "name": "Gorak", "hitpoints": 112, "combatLevel": 145, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 131, @@ -8379,6 +9754,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8390,6 +9766,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8400,6 +9777,7 @@ "name": "Stag", "hitpoints": 19, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 13, "defenceLevel": 13, @@ -8410,6 +9788,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8420,6 +9799,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8429,6 +9809,7 @@ "1861": { "name": "Tree spirit", "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -8438,6 +9819,7 @@ "1862": { "name": "Tree spirit", "combatLevel": 29, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 32, @@ -8446,7 +9828,9 @@ }, "1863": { "name": "Tree spirit", + "hitpoints": 60, "combatLevel": 49, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 48, "defenceLevel": 48, @@ -8457,6 +9841,7 @@ "name": "Tree spirit", "hitpoints": 86, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -8467,6 +9852,7 @@ "name": "Tree spirit", "hitpoints": 120, "combatLevel": 120, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -8477,6 +9863,7 @@ "name": "Tree spirit", "hitpoints": 170, "combatLevel": 159, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -8487,6 +9874,7 @@ "name": "Evil Chicken", "hitpoints": 120, "combatLevel": 159, + "attackSpeed": 4, "defenceLevel": 126, "magicLevel": 200 }, @@ -8495,6 +9883,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -8512,6 +9901,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -8529,6 +9919,7 @@ "hitpoints": 60, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 70, @@ -8545,6 +9936,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -8561,6 +9953,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -8577,6 +9970,7 @@ "hitpoints": 80, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -8593,6 +9987,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8604,6 +9999,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -8616,6 +10012,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -8628,6 +10025,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -8640,6 +10038,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -8652,6 +10051,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -8664,6 +10064,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8676,6 +10077,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8688,6 +10090,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8700,6 +10103,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8712,6 +10116,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8724,6 +10129,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8736,6 +10142,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8748,6 +10155,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -8760,6 +10168,7 @@ "hitpoints": 500, "combatLevel": 725, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 300, @@ -8776,6 +10185,7 @@ "hitpoints": 500, "combatLevel": 725, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 300, @@ -8792,6 +10202,7 @@ "hitpoints": 500, "combatLevel": 725, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 300, @@ -8807,6 +10218,7 @@ "name": "Snakeling", "hitpoints": 1, "combatLevel": 90, + "attackSpeed": 3, "attackLevel": 140, "strengthLevel": 138, "defenceLevel": 1, @@ -8818,6 +10230,7 @@ "name": "Snakeling", "hitpoints": 1, "combatLevel": 90, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8830,6 +10243,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -8842,6 +10256,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -8854,6 +10269,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -8866,6 +10282,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -8878,6 +10295,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -8890,6 +10308,7 @@ "hitpoints": 250, "combatLevel": 305, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 270, "strengthLevel": 270, "defenceLevel": 270, @@ -8905,6 +10324,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -8916,6 +10336,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -8927,6 +10348,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -8938,6 +10360,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -8950,6 +10373,7 @@ "hitpoints": 40, "combatLevel": 46, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -8961,6 +10385,7 @@ "hitpoints": 4, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 2, "defenceLevel": 2, @@ -8972,6 +10397,7 @@ "hitpoints": 34, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 19, @@ -8983,6 +10409,7 @@ "hitpoints": 34, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 19, @@ -8994,6 +10421,7 @@ "hitpoints": 34, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 19, @@ -9005,6 +10433,7 @@ "hitpoints": 36, "combatLevel": 31, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -9019,6 +10448,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -9033,6 +10463,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9048,6 +10479,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9063,6 +10495,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9078,6 +10511,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9093,6 +10527,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9108,6 +10543,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9123,6 +10559,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9138,6 +10575,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9153,6 +10591,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9168,6 +10607,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9183,6 +10623,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9198,6 +10639,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9213,6 +10655,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9228,6 +10671,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9243,6 +10687,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9258,6 +10703,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9271,6 +10717,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9284,6 +10731,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9297,6 +10745,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9309,6 +10758,7 @@ "name": "Jogre", "hitpoints": 60, "combatLevel": 53, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -9323,6 +10773,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -9336,6 +10787,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -9349,6 +10801,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -9360,6 +10813,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -9373,6 +10827,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -9386,6 +10841,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -9399,6 +10855,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -9412,6 +10869,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -9425,6 +10883,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -9435,12 +10894,14 @@ }, "2115": { "name": "Thing under the bed", - "hitpoints": 25 + "hitpoints": 25, + "attackSpeed": 4 }, "2120": { "name": "Market Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 13, @@ -9459,6 +10920,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -9471,6 +10933,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -9483,6 +10946,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -9495,6 +10959,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -9507,6 +10972,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -9519,6 +10985,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -9530,6 +10997,7 @@ "name": "Giant frog", "hitpoints": 23, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 8, "defenceLevel": 6, @@ -9540,6 +11008,7 @@ "name": "Big frog", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 4, @@ -9550,6 +11019,7 @@ "name": "Frog", "hitpoints": 8, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 4, "defenceLevel": 3, @@ -9561,6 +11031,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -9572,6 +11043,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -9583,6 +11055,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -9594,6 +11067,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -9605,6 +11079,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -9616,6 +11091,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -9627,6 +11103,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -9638,6 +11115,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -9649,6 +11127,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -9660,6 +11139,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -9671,6 +11151,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -9682,6 +11163,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -9693,6 +11175,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -9704,6 +11187,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -9715,6 +11199,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -9726,6 +11211,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -9737,6 +11223,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -9748,6 +11235,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -9759,6 +11247,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -9770,6 +11259,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -9781,6 +11271,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -9792,6 +11283,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -9803,6 +11295,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -9814,6 +11307,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -9825,6 +11319,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -9836,6 +11331,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -9847,6 +11343,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -9858,6 +11355,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -9869,6 +11367,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -9880,6 +11379,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -9891,6 +11391,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -9902,6 +11403,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -9913,6 +11415,7 @@ "hitpoints": 255, "combatLevel": 596, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 280, "strengthLevel": 196, "defenceLevel": 300, @@ -9933,6 +11436,7 @@ "name": "Starlight", "hitpoints": 160, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 125, "defenceLevel": 120, @@ -9950,6 +11454,7 @@ "name": "Growler", "hitpoints": 146, "combatLevel": 139, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 101, "defenceLevel": 120, @@ -9967,6 +11472,7 @@ "name": "Bree", "hitpoints": 162, "combatLevel": 146, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 80, "defenceLevel": 130, @@ -9984,6 +11490,7 @@ "name": "Saradomin priest", "hitpoints": 89, "combatLevel": 113, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 46, "defenceLevel": 120, @@ -10002,6 +11509,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 106, "defenceLevel": 110, @@ -10020,6 +11528,7 @@ "hitpoints": 106, "combatLevel": 122, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -10036,6 +11545,7 @@ "hitpoints": 85, "combatLevel": 120, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 86, @@ -10051,6 +11561,7 @@ "name": "Knight of Saradomin", "hitpoints": 135, "combatLevel": 103, + "attackSpeed": 6, "attackLevel": 70, "strengthLevel": 85, "defenceLevel": 70, @@ -10067,6 +11578,7 @@ "name": "Knight of Saradomin", "hitpoints": 108, "combatLevel": 101, + "attackSpeed": 6, "attackLevel": 75, "strengthLevel": 90, "defenceLevel": 82, @@ -10084,6 +11596,7 @@ "hitpoints": 255, "combatLevel": 624, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 280, "strengthLevel": 350, "defenceLevel": 250, @@ -10106,6 +11619,7 @@ "hitpoints": 128, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 124, "strengthLevel": 118, "defenceLevel": 125, @@ -10118,6 +11632,7 @@ "hitpoints": 127, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 150, @@ -10130,6 +11645,7 @@ "hitpoints": 146, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 132, @@ -10143,6 +11659,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10160,6 +11677,7 @@ "hitpoints": 70, "combatLevel": 58, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 46, "strengthLevel": 48, "defenceLevel": 43, @@ -10172,6 +11690,7 @@ "name": "Jogre", "hitpoints": 70, "combatLevel": 58, + "attackSpeed": 6, "attackLevel": 46, "strengthLevel": 48, "defenceLevel": 43, @@ -10186,6 +11705,7 @@ "hitpoints": 110, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 48, @@ -10198,6 +11718,7 @@ "hitpoints": 110, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 48, @@ -10209,6 +11730,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10226,6 +11748,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10243,6 +11766,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10260,6 +11784,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10278,6 +11803,7 @@ "hitpoints": 52, "combatLevel": 47, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 39, "strengthLevel": 39, "defenceLevel": 35, @@ -10289,6 +11815,7 @@ "hitpoints": 131, "combatLevel": 115, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -10305,6 +11832,7 @@ "hitpoints": 131, "combatLevel": 134, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 116, "strengthLevel": 120, "defenceLevel": 100, @@ -10323,6 +11851,7 @@ "hitpoints": 106, "combatLevel": 121, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 103, @@ -10339,6 +11868,7 @@ "hitpoints": 18, "combatLevel": 17, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 14, "strengthLevel": 16, "defenceLevel": 14, @@ -10350,6 +11880,7 @@ "hitpoints": 3, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 6, "defenceLevel": 19, @@ -10361,6 +11892,7 @@ "hitpoints": 15, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 6, "defenceLevel": 13, @@ -10372,6 +11904,7 @@ "hitpoints": 16, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 16, "strengthLevel": 6, "defenceLevel": 19, @@ -10383,6 +11916,7 @@ "hitpoints": 13, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 11, "strengthLevel": 6, "defenceLevel": 20, @@ -10394,6 +11928,7 @@ "hitpoints": 85, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 75, @@ -10408,6 +11943,7 @@ "name": "Giant Rock Crab", "hitpoints": 180, "combatLevel": 137, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 80, "defenceLevel": 200, @@ -10422,6 +11958,7 @@ "name": "Bardur", "hitpoints": 99, "combatLevel": 94, + "attackSpeed": 6, "attackLevel": 99, "strengthLevel": 40, "defenceLevel": 99, @@ -10440,6 +11977,7 @@ "hitpoints": 100, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -10451,6 +11989,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 128, @@ -10467,6 +12006,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -10482,6 +12022,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -10497,6 +12038,7 @@ "hitpoints": 26, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 25, "strengthLevel": 18, "defenceLevel": 25, @@ -10515,6 +12057,7 @@ "hitpoints": 26, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 16, "defenceLevel": 22, @@ -10530,6 +12073,7 @@ "hitpoints": 61, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 42, "defenceLevel": 28, @@ -10547,6 +12091,7 @@ "name": "Animated Bronze Armour", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -10564,6 +12109,7 @@ "name": "Animated Iron Armour", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -10581,6 +12127,7 @@ "name": "Animated Steel Armour", "hitpoints": 40, "combatLevel": 46, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -10598,6 +12145,7 @@ "name": "Animated Black Armour", "hitpoints": 60, "combatLevel": 69, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10615,6 +12163,7 @@ "name": "Animated Mithril Armour", "hitpoints": 80, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10632,6 +12181,7 @@ "name": "Animated Adamant Armour", "hitpoints": 99, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -10649,6 +12199,7 @@ "name": "Animated Rune Armour", "hitpoints": 120, "combatLevel": 138, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -10667,6 +12218,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -10678,6 +12230,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -10689,6 +12242,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -10700,6 +12254,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -10711,6 +12266,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -10722,6 +12278,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -10733,6 +12290,7 @@ "hitpoints": 40, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 40, "defenceLevel": 40, @@ -10749,6 +12307,7 @@ "hitpoints": 70, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 50, "defenceLevel": 50, @@ -10765,6 +12324,7 @@ "hitpoints": 50, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 60, "defenceLevel": 60, @@ -10781,6 +12341,7 @@ "hitpoints": 50, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 41, "strengthLevel": 51, "defenceLevel": 31, @@ -10792,6 +12353,7 @@ "hitpoints": 22, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 21, "strengthLevel": 21, "defenceLevel": 21, @@ -10809,19 +12371,22 @@ "name": "Scorpion", "hitpoints": 55, "combatLevel": 59, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "2480": { "name": "Scorpion", "hitpoints": 37, "combatLevel": 37, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "2481": { "name": "Minotaur", "hitpoints": 10, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 12, "strengthLevel": 10, "defenceLevel": 10, @@ -10833,6 +12398,7 @@ "hitpoints": 22, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 25, "defenceLevel": 25, @@ -10844,6 +12410,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -10857,6 +12424,7 @@ "hitpoints": 16, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 13, "defenceLevel": 7, @@ -10873,6 +12441,7 @@ "hitpoints": 7, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 3, "defenceLevel": 7, @@ -10886,6 +12455,7 @@ "hitpoints": 22, "combatLevel": 16, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 13, "strengthLevel": 11, "defenceLevel": 14, @@ -10899,6 +12469,7 @@ "hitpoints": 26, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 17, @@ -10915,6 +12486,7 @@ "hitpoints": 22, "combatLevel": 16, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 13, "strengthLevel": 11, "defenceLevel": 14, @@ -10928,6 +12500,7 @@ "hitpoints": 15, "combatLevel": 14, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 15, "defenceLevel": 10, @@ -10939,6 +12512,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -10950,6 +12524,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2498": { @@ -10957,6 +12532,7 @@ "hitpoints": 26, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 2, "defenceLevel": 10, @@ -10973,6 +12549,7 @@ "hitpoints": 26, "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 80, "strengthLevel": 2, "defenceLevel": 10, @@ -10989,6 +12566,7 @@ "hitpoints": 26, "combatLevel": 41, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 100, "strengthLevel": 2, "defenceLevel": 10, @@ -11005,6 +12583,7 @@ "hitpoints": 30, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11024,6 +12603,7 @@ "hitpoints": 30, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11043,6 +12623,7 @@ "hitpoints": 30, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11062,6 +12643,7 @@ "hitpoints": 41, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11081,6 +12663,7 @@ "hitpoints": 41, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11100,6 +12683,7 @@ "hitpoints": 41, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11116,8 +12700,10 @@ }, "2507": { "name": "Zombie", + "hitpoints": 71, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11134,8 +12720,10 @@ }, "2508": { "name": "Zombie", + "hitpoints": 71, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11152,8 +12740,10 @@ }, "2509": { "name": "Zombie", + "hitpoints": 71, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11173,6 +12763,7 @@ "hitpoints": 25, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 22, @@ -11184,6 +12775,7 @@ "hitpoints": 25, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 22, @@ -11195,6 +12787,7 @@ "hitpoints": 25, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 22, @@ -11206,6 +12799,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2514": { @@ -11213,6 +12807,7 @@ "hitpoints": 60, "combatLevel": 75, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 60, @@ -11225,6 +12820,7 @@ "hitpoints": 65, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 70, @@ -11237,6 +12833,7 @@ "hitpoints": 70, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -11249,6 +12846,7 @@ "hitpoints": 60, "combatLevel": 75, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 60, @@ -11261,6 +12859,7 @@ "hitpoints": 65, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 70, @@ -11273,6 +12872,7 @@ "hitpoints": 70, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -11285,6 +12885,7 @@ "hitpoints": 70, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 50, "defenceLevel": 60, @@ -11300,6 +12901,7 @@ "hitpoints": 70, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -11315,6 +12917,7 @@ "hitpoints": 70, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -11330,6 +12933,7 @@ "hitpoints": 70, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -11345,6 +12949,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 74, "defenceLevel": 74, @@ -11364,6 +12969,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 74, "defenceLevel": 74, @@ -11383,6 +12989,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 74, "defenceLevel": 74, @@ -11399,140 +13006,129 @@ }, "2527": { "name": "Ghost", - "hitpoints": 80, - "combatLevel": 77, + "hitpoints": 75, + "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 55, - "slashDef": 55, + "stabDef": 45, + "slashDef": 45, "crushDef": 5, - "rangeDef": 55, - "magicDef": 55, + "rangeDef": 45, "undead": true }, "2528": { "name": "Ghost", - "hitpoints": 80, - "combatLevel": 77, + "hitpoints": 75, + "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 55, - "slashDef": 55, + "stabDef": 45, + "slashDef": 45, "crushDef": 5, - "rangeDef": 55, - "magicDef": 55, + "rangeDef": 45, "undead": true }, "2529": { "name": "Ghost", - "hitpoints": 80, - "combatLevel": 77, + "hitpoints": 75, + "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 55, - "slashDef": 55, + "stabDef": 45, + "slashDef": 45, "crushDef": 5, - "rangeDef": 55, - "magicDef": 55, + "rangeDef": 45, "undead": true }, "2530": { "name": "Ghost", - "hitpoints": 80, - "combatLevel": 77, + "hitpoints": 75, + "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 55, - "slashDef": 55, + "stabDef": 45, + "slashDef": 45, "crushDef": 5, - "rangeDef": 55, - "magicDef": 55, + "rangeDef": 45, "undead": true }, "2531": { "name": "Ghost", - "hitpoints": 75, - "combatLevel": 76, + "hitpoints": 30, + "combatLevel": 24, "slayerLevel": 1, - "attackLevel": 63, - "strengthLevel": 63, - "defenceLevel": 68, + "attackSpeed": 4, + "attackLevel": 23, + "strengthLevel": 23, + "defenceLevel": 20, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 45, - "slashDef": 45, - "crushDef": 5, - "rangeDef": 45, "undead": true }, "2532": { "name": "Ghost", - "hitpoints": 75, - "combatLevel": 76, + "hitpoints": 30, + "combatLevel": 24, "slayerLevel": 1, - "attackLevel": 63, - "strengthLevel": 63, - "defenceLevel": 68, + "attackSpeed": 4, + "attackLevel": 23, + "strengthLevel": 23, + "defenceLevel": 20, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 45, - "slashDef": 45, - "crushDef": 5, - "rangeDef": 45, "undead": true }, "2533": { "name": "Ghost", - "hitpoints": 75, - "combatLevel": 76, + "hitpoints": 30, + "combatLevel": 24, "slayerLevel": 1, - "attackLevel": 63, - "strengthLevel": 63, - "defenceLevel": 68, + "attackSpeed": 4, + "attackLevel": 23, + "strengthLevel": 23, + "defenceLevel": 20, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 45, - "slashDef": 45, - "crushDef": 5, - "rangeDef": 45, "undead": true }, "2534": { "name": "Ghost", - "hitpoints": 75, - "combatLevel": 76, + "hitpoints": 30, + "combatLevel": 24, "slayerLevel": 1, - "attackLevel": 63, - "strengthLevel": 63, - "defenceLevel": 68, + "attackSpeed": 4, + "attackLevel": 23, + "strengthLevel": 23, + "defenceLevel": 20, "rangeLevel": 1, "magicLevel": 1, - "stabDef": 45, - "slashDef": 45, - "crushDef": 5, - "rangeDef": 45, "undead": true }, "2536": { "name": "H.A.M. Guard", "hitpoints": 15, "combatLevel": 12, + "attackSpeed": 7, "attackLevel": 8, "strengthLevel": 12, "defenceLevel": 8, @@ -11546,6 +13142,7 @@ "name": "H.A.M. Guard", "hitpoints": 20, "combatLevel": 18, + "attackSpeed": 6, "attackLevel": 14, "strengthLevel": 18, "defenceLevel": 12, @@ -11559,6 +13156,7 @@ "name": "H.A.M. Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -11572,6 +13170,7 @@ "name": "Monk", "hitpoints": 15, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 3, @@ -11582,6 +13181,7 @@ "name": "Abyssal leech", "hitpoints": 10, "combatLevel": 41, + "attackSpeed": 2, "attackLevel": 95, "strengthLevel": 5, "defenceLevel": 25, @@ -11599,6 +13199,7 @@ "name": "Abyssal guardian", "hitpoints": 55, "combatLevel": 59, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 90, "defenceLevel": 30, @@ -11616,6 +13217,7 @@ "name": "Abyssal walker", "hitpoints": 95, "combatLevel": 81, + "attackSpeed": 5, "attackLevel": 5, "strengthLevel": 100, "defenceLevel": 95, @@ -11634,6 +13236,7 @@ "hitpoints": 48, "combatLevel": 60, "slayerLevel": 32, + "attackSpeed": 6, "attackLevel": 58, "strengthLevel": 55, "defenceLevel": 48, @@ -11649,6 +13252,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11661,6 +13265,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11673,6 +13278,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11685,6 +13291,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11697,6 +13304,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11709,6 +13317,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11721,6 +13330,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11733,6 +13343,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11745,6 +13356,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11757,6 +13369,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11769,6 +13382,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11781,6 +13395,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11793,6 +13408,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11805,6 +13421,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11817,6 +13434,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11829,6 +13447,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11841,6 +13460,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11853,6 +13473,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11865,6 +13486,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11877,6 +13499,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -11888,6 +13511,7 @@ "name": "Boris", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11898,6 +13522,7 @@ "name": "Imre", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11908,6 +13533,7 @@ "name": "Yuri", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11918,6 +13544,7 @@ "name": "Joseph", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11928,6 +13555,7 @@ "name": "Nikolai", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11938,6 +13566,7 @@ "name": "Eduard", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11948,6 +13577,7 @@ "name": "Lev", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11958,6 +13588,7 @@ "name": "Georgy", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11968,6 +13599,7 @@ "name": "Svetlana", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11978,6 +13610,7 @@ "name": "Irina", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11988,6 +13621,7 @@ "name": "Alexis", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11998,6 +13632,7 @@ "name": "Milla", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12008,6 +13643,7 @@ "name": "Galina", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12018,6 +13654,7 @@ "name": "Sofiya", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12028,6 +13665,7 @@ "name": "Ksenia", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12038,6 +13676,7 @@ "name": "Yadviga", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12048,6 +13687,7 @@ "name": "Nikita", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12058,6 +13698,7 @@ "name": "Vera", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12068,6 +13709,7 @@ "name": "Zoja", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12078,6 +13720,7 @@ "name": "Liliya", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12088,6 +13731,7 @@ "name": "Myre Blamish Snail", "hitpoints": 8, "combatLevel": 9, + "attackSpeed": 4, "defenceLevel": 22, "rangeLevel": 5, "magicLevel": 1, @@ -12103,6 +13747,7 @@ "name": "Blood Blamish Snail", "hitpoints": 13, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 45, "rangeLevel": 12, "magicLevel": 1, @@ -12117,6 +13762,7 @@ "name": "Ochre Blamish Snail", "hitpoints": 10, "combatLevel": 10, + "attackSpeed": 6, "defenceLevel": 18, "rangeLevel": 7, "magicLevel": 1, @@ -12132,6 +13778,7 @@ "name": "Bruise Blamish Snail", "hitpoints": 12, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 15, "magicLevel": 1, @@ -12147,6 +13794,7 @@ "name": "Bark Blamish Snail", "hitpoints": 22, "combatLevel": 15, + "attackSpeed": 6, "defenceLevel": 20, "rangeLevel": 10, "magicLevel": 1, @@ -12162,6 +13810,7 @@ "name": "Myre Blamish Snail", "hitpoints": 13, "combatLevel": 10, + "attackSpeed": 4, "defenceLevel": 12, "rangeLevel": 8, "magicLevel": 1, @@ -12177,6 +13826,7 @@ "name": "Blood Blamish Snail", "hitpoints": 10, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 30, "rangeLevel": 21, "magicLevel": 1, @@ -12191,6 +13841,7 @@ "name": "Ochre Blamish Snail", "hitpoints": 20, "combatLevel": 15, + "attackSpeed": 6, "defenceLevel": 25, "rangeLevel": 8, "magicLevel": 1, @@ -12206,6 +13857,7 @@ "name": "Bruise Blamish Snail", "hitpoints": 15, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 27, "rangeLevel": 20, "magicLevel": 1, @@ -12217,44 +13869,120 @@ "bonusAttack": 10, "bonusStrength": 10 }, - "2692": { - "name": "Chicken", - "hitpoints": 3, - "combatLevel": 1, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2693": { - "name": "Chicken", - "hitpoints": 3, - "combatLevel": 1, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, "2694": { - "name": "Rooster", + "name": "Sheep", "hitpoints": 7, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 1, "rangeLevel": 1, "magicLevel": 1 }, - "2805": { + "2790": { "name": "Cow", "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2791": { + "name": "Cow", + "hitpoints": 8, + "combatLevel": 2, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2792": { + "name": "Cow calf", + "hitpoints": 6, + "combatLevel": 2, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2793": { + "name": "Cow", + "hitpoints": 8, + "combatLevel": 2, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2794": { + "name": "Cow calf", + "hitpoints": 6, + "combatLevel": 2, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2795": { + "name": "Cow", + "hitpoints": 8, + "combatLevel": 2, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2801": { + "name": "Cow calf", + "hitpoints": 6, + "combatLevel": 2, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2804": { + "name": "Chicken", + "hitpoints": 3, + "combatLevel": 1, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 1, + "rangeLevel": 1, + "magicLevel": 1 + }, + "2805": { + "name": "Chicken", + "hitpoints": 3, + "combatLevel": 1, + "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12262,98 +13990,11 @@ "magicLevel": 1 }, "2806": { - "name": "Cow", - "hitpoints": 8, - "combatLevel": 2, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2807": { - "name": "Cow calf", - "hitpoints": 6, - "combatLevel": 2, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2808": { - "name": "Cow", - "hitpoints": 8, - "combatLevel": 2, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2809": { - "name": "Cow calf", - "hitpoints": 6, - "combatLevel": 2, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2810": { - "name": "Cow", - "hitpoints": 8, - "combatLevel": 2, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2816": { - "name": "Cow calf", - "hitpoints": 6, - "combatLevel": 2, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2819": { - "name": "Chicken", - "hitpoints": 3, - "combatLevel": 1, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2820": { - "name": "Chicken", - "hitpoints": 3, - "combatLevel": 1, - "slayerLevel": 1, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2821": { "name": "Chicken", "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12365,6 +14006,7 @@ "hitpoints": 8, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -12380,6 +14022,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -12395,6 +14038,7 @@ "name": "Unicorn", "hitpoints": 19, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 13, "defenceLevel": 13, @@ -12406,6 +14050,7 @@ "hitpoints": 27, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 15, @@ -12417,6 +14062,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 16, "defenceLevel": 13 @@ -12426,6 +14072,7 @@ "hitpoints": 54, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 42, "defenceLevel": 42, @@ -12441,6 +14088,7 @@ "name": "Ice warrior", "hitpoints": 59, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 47, "strengthLevel": 47, "defenceLevel": 47, @@ -12456,6 +14104,7 @@ "name": "Ice warrior", "hitpoints": 59, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 47, "strengthLevel": 47, "defenceLevel": 47, @@ -12472,6 +14121,7 @@ "hitpoints": 66, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 56, "defenceLevel": 46, @@ -12487,6 +14137,7 @@ "hitpoints": 45, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 29, @@ -12502,6 +14153,7 @@ "name": "Snake", "hitpoints": 6, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 4, "strengthLevel": 5, "defenceLevel": 3, @@ -12513,6 +14165,7 @@ "hitpoints": 6, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -12523,6 +14176,7 @@ "name": "Black unicorn", "hitpoints": 29, "combatLevel": 27, + "attackSpeed": 4, "attackLevel": 21, "strengthLevel": 23, "defenceLevel": 23, @@ -12533,6 +14187,7 @@ "name": "Ice warrior", "hitpoints": 59, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 47, "strengthLevel": 47, "defenceLevel": 47, @@ -12549,6 +14204,7 @@ "hitpoints": 67, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 36, "strengthLevel": 36, "defenceLevel": 33, @@ -12565,6 +14221,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2855": { @@ -12572,6 +14229,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2856": { @@ -12579,6 +14237,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -12590,6 +14249,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -12601,6 +14261,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -12612,6 +14273,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -12623,6 +14285,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -12634,6 +14297,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -12645,6 +14309,7 @@ "hitpoints": 10, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 2, @@ -12656,6 +14321,7 @@ "hitpoints": 10, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 2, @@ -12667,6 +14333,7 @@ "hitpoints": 10, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 2, @@ -12678,6 +14345,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12689,6 +14357,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12700,206 +14369,18 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, "rangeLevel": 1, "magicLevel": 1 }, - "2868": { - "name": "Dark wizard", - "hitpoints": 24, - "combatLevel": 20, - "attackLevel": 5, - "strengthLevel": 2, - "defenceLevel": 5, - "rangeLevel": 1, - "magicLevel": 6, - "magicDef": 3 - }, - "2869": { - "name": "Invrigar the Necromancer", - "hitpoints": 24, - "combatLevel": 20, - "attackLevel": 17, - "strengthLevel": 17, - "defenceLevel": 14, - "rangeLevel": 1, - "magicLevel": 18, - "magicDef": 3 - }, - "2870": { - "name": "Dark wizard", - "hitpoints": 12, - "combatLevel": 7, - "attackLevel": 5, - "strengthLevel": 2, - "defenceLevel": 5, - "rangeLevel": 1, - "magicLevel": 6, - "magicDef": 3 - }, - "2871": { - "name": "Mugger", - "hitpoints": 8, - "combatLevel": 6, - "attackLevel": 5, - "strengthLevel": 5, - "defenceLevel": 5, - "rangeLevel": 1, - "magicLevel": 1 - }, - "2874": { - "name": "Black Knight", - "hitpoints": 42, - "combatLevel": 33, - "attackLevel": 25, - "strengthLevel": 25, - "defenceLevel": 25, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 73, - "slashDef": 76, - "crushDef": 70, - "rangeDef": 72, - "bonusAttack": 18, - "bonusStrength": 16 - }, - "2875": { - "name": "Black Knight", - "hitpoints": 42, - "combatLevel": 33, - "attackLevel": 25, - "strengthLevel": 25, - "defenceLevel": 25, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 73, - "slashDef": 76, - "crushDef": 70, - "rangeDef": 72, - "bonusAttack": 18, - "bonusStrength": 16 - }, - "2876": { - "name": "Highwayman", - "hitpoints": 13, - "combatLevel": 5, - "attackLevel": 2, - "strengthLevel": 2, - "defenceLevel": 4, - "rangeLevel": 1, - "magicLevel": 1, - "stab": 6, - "slashDef": 3, - "crushDef": 2, - "rangeDef": 2, - "bonusAttack": 6, - "bonusStrength": 7 - }, - "2877": { - "name": "Highwayman", - "hitpoints": 13, - "combatLevel": 5, - "attackLevel": 2, - "strengthLevel": 2, - "defenceLevel": 4, - "rangeLevel": 1, - "magicLevel": 1, - "stab": 6, - "slashDef": 3, - "crushDef": 2, - "rangeDef": 2, - "bonusAttack": 6, - "bonusStrength": 7 - }, - "2878": { - "name": "Chaos druid", - "hitpoints": 20, - "combatLevel": 13, - "slayerLevel": 1, - "attackLevel": 8, - "strengthLevel": 8, - "defenceLevel": 12, - "rangeLevel": 1, - "magicLevel": 10 - }, - "2879": { - "name": "Pirate", - "hitpoints": 20, - "combatLevel": 23, - "attackLevel": 20, - "strengthLevel": 20, - "defenceLevel": 20, - "rangeLevel": 1, - "magicLevel": 1, - "slashDef": 1, - "bonusAttack": 9, - "bonusStrength": 10 - }, - "2880": { - "name": "Pirate", - "hitpoints": 20, - "combatLevel": 23, - "attackLevel": 21, - "strengthLevel": 21, - "defenceLevel": 21, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 3, - "slashDef": 2, - "bonusAttack": 8, - "bonusStrength": 10 - }, - "2881": { - "name": "Pirate", - "hitpoints": 23, - "combatLevel": 26, - "attackLevel": 23, - "strengthLevel": 23, - "defenceLevel": 23, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 3, - "slashDef": 2, - "bonusAttack": 8, - "bonusStrength": 10 - }, - "2883": { - "name": "Thug", - "hitpoints": 18, - "combatLevel": 10, - "attackLevel": 7, - "strengthLevel": 5, - "defenceLevel": 9, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 2, - "slashDef": 3, - "crushDef": 3, - "bonusAttack": 5, - "bonusStrength": 5 - }, - "2884": { - "name": "Rogue", - "hitpoints": 17, - "combatLevel": 15, - "slayerLevel": 1, - "attackLevel": 13, - "strengthLevel": 13, - "defenceLevel": 13, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 6, - "slashDef": 9, - "crushDef": 11, - "bonusAttack": 5, - "bonusStrength": 5 - }, "2885": { "name": "Monk of Zamorak", "hitpoints": 20, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 22, @@ -12910,6 +14391,7 @@ "name": "Monk of Zamorak", "hitpoints": 10, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -12917,77 +14399,22 @@ "magicLevel": 25 }, "2887": { - "name": "Monk of Zamorak", + "name": "Fancy dress shop owner", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 42, "rangeLevel": 1, "magicLevel": 40 }, - "2888": { - "name": "Tribesman", - "hitpoints": 39, - "combatLevel": 32, - "attackLevel": 23, - "strengthLevel": 27, - "defenceLevel": 26, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 4, - "slashDef": 6, - "crushDef": 6, - "bonusAttack": 8, - "bonusStrength": 5 - }, - "2889": { - "name": "Dark warrior", - "hitpoints": 17, - "combatLevel": 8, - "slayerLevel": 1, - "attackLevel": 5, - "strengthLevel": 5, - "defenceLevel": 5, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 96, - "slashDef": 79, - "crushDef": 59, - "bonusAttack": 20, - "bonusStrength": 16 - }, - "2890": { - "name": "Chaos druid warrior", - "hitpoints": 40, - "combatLevel": 37, - "attackLevel": 32, - "strengthLevel": 34, - "defenceLevel": 25, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 13, - "slashDef": 17, - "crushDef": 14, - "rangeDef": 14, - "bonusAttack": 9, - "bonusStrength": 5 - }, - "2891": { - "name": "Necromancer", - "hitpoints": 40, - "combatLevel": 26, - "attackLevel": 18, - "strengthLevel": 18, - "defenceLevel": 18, - "rangeLevel": 1, - "magicLevel": 18 - }, "2892": { - "name": "Bandit", + "name": "Brian", "hitpoints": 27, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -12998,29 +14425,12 @@ "crushDef": 2, "bonusStrength": 12 }, - "2893": { - "name": "Guard Bandit", - "hitpoints": 27, - "combatLevel": 22, - "slayerLevel": 1, - "attackLevel": 17, - "strengthLevel": 17, - "defenceLevel": 17, - "rangeLevel": 1, - "magicLevel": 1, - "stab": 11, - "stabDef": 4, - "slashDef": 8, - "crushDef": 5, - "rangeDef": 4, - "magicDef": 1, - "bonusStrength": 12 - }, "2916": { "name": "Waterfiend", "hitpoints": 130, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 4, "defenceLevel": 128, "rangeLevel": 105, "magicLevel": 105, @@ -13037,6 +14447,7 @@ "hitpoints": 130, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 4, "defenceLevel": 128, "rangeLevel": 105, "magicLevel": 105, @@ -13053,6 +14464,7 @@ "hitpoints": 175, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 168, "defenceLevel": 168, @@ -13071,6 +14483,7 @@ "hitpoints": 254, "combatLevel": 304, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 268, "defenceLevel": 268, @@ -13088,6 +14501,7 @@ "name": "Confused barbarian", "hitpoints": 124, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -13103,6 +14517,7 @@ "name": "Lost barbarian", "hitpoints": 124, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -13113,6 +14528,7 @@ "name": "Nail beast", "hitpoints": 55, "combatLevel": 69, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 6, "defenceLevel": 2, @@ -13123,6 +14539,7 @@ "name": "Nail beast", "hitpoints": 65, "combatLevel": 98, + "attackSpeed": 8, "attackLevel": 215, "strengthLevel": 16, "defenceLevel": 30, @@ -13133,6 +14550,7 @@ "name": "Nail beast", "hitpoints": 75, "combatLevel": 141, + "attackSpeed": 8, "attackLevel": 320, "strengthLevel": 26, "defenceLevel": 40, @@ -13143,6 +14561,7 @@ "name": "Zamorak wizard", "hitpoints": 73, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -13154,6 +14573,7 @@ "name": "Saradomin wizard", "hitpoints": 120, "combatLevel": 108, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 80, "defenceLevel": 80, @@ -13167,6 +14587,7 @@ "name": "Big Snake", "hitpoints": 120, "combatLevel": 84, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -13180,6 +14601,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13192,6 +14614,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13204,6 +14627,7 @@ "hitpoints": 32, "combatLevel": 32, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 26, "defenceLevel": 40, @@ -13219,6 +14643,7 @@ "hitpoints": 51, "combatLevel": 59, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 62, "defenceLevel": 38, @@ -13230,6 +14655,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -13247,6 +14673,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -13264,6 +14691,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13275,6 +14703,7 @@ "hitpoints": 55, "combatLevel": 52, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 44, "strengthLevel": 42, "defenceLevel": 44, @@ -13291,6 +14720,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13302,6 +14732,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 24, "defenceLevel": 21, @@ -13313,6 +14744,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13324,6 +14756,7 @@ "hitpoints": 50, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 35, @@ -13340,6 +14773,7 @@ "hitpoints": 35, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -13356,6 +14790,7 @@ "hitpoints": 65, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 43, @@ -13372,6 +14807,7 @@ "hitpoints": 64, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 52, "defenceLevel": 58, @@ -13388,6 +14824,7 @@ "hitpoints": 17, "combatLevel": 14, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 11, "strengthLevel": 12, "defenceLevel": 11, @@ -13403,6 +14840,7 @@ "hitpoints": 23, "combatLevel": 20, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 16, "strengthLevel": 17, "defenceLevel": 15, @@ -13418,6 +14856,7 @@ "hitpoints": 32, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 23, @@ -13431,6 +14870,7 @@ "hitpoints": 30, "combatLevel": 32, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 29, "defenceLevel": 23, @@ -13446,6 +14886,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13457,6 +14898,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13468,6 +14910,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13479,6 +14922,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13490,6 +14934,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13501,6 +14946,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13512,6 +14958,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13523,6 +14970,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13534,6 +14982,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13545,6 +14994,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13556,6 +15006,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13567,6 +15018,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13578,6 +15030,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13589,6 +15042,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13600,6 +15054,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13611,6 +15066,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13622,6 +15078,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13633,6 +15090,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -13646,6 +15104,7 @@ "hitpoints": 16, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 13, "defenceLevel": 7, @@ -13662,6 +15121,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -13675,6 +15135,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -13688,6 +15149,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -13699,6 +15161,7 @@ "hitpoints": 49, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 33, "strengthLevel": 31, "defenceLevel": 36, @@ -13712,6 +15175,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13723,6 +15187,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13734,6 +15199,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13745,6 +15211,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13755,13 +15222,13 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, - "attackLevel": 8, - "strengthLevel": 7, - "defenceLevel": 3, + "attackSpeed": 4, + "attackLevel": 15, + "strengthLevel": 14, + "defenceLevel": 10, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13771,13 +15238,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13787,13 +15254,13 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, - "attackLevel": 8, - "strengthLevel": 7, - "defenceLevel": 3, + "attackSpeed": 4, + "attackLevel": 15, + "strengthLevel": 14, + "defenceLevel": 10, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13803,13 +15270,13 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, - "attackLevel": 8, - "strengthLevel": 7, - "defenceLevel": 3, + "attackSpeed": 4, + "attackLevel": 15, + "strengthLevel": 14, + "defenceLevel": 10, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13819,13 +15286,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13835,13 +15302,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13851,13 +15318,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13867,13 +15334,13 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, - "attackLevel": 8, - "strengthLevel": 7, - "defenceLevel": 3, + "attackSpeed": 4, + "attackLevel": 15, + "strengthLevel": 14, + "defenceLevel": 10, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13883,13 +15350,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13899,13 +15366,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13915,13 +15382,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13931,13 +15398,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13947,13 +15414,13 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 15, - "attackLevel": 8, - "strengthLevel": 7, - "defenceLevel": 3, - "rangeLevel": 1, + "attackSpeed": 4, + "attackLevel": 15, + "strengthLevel": 3, + "defenceLevel": 10, + "rangeLevel": 15, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13963,13 +15430,13 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, - "attackLevel": 8, - "strengthLevel": 7, - "defenceLevel": 3, + "attackSpeed": 4, + "attackLevel": 15, + "strengthLevel": 14, + "defenceLevel": 10, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13979,13 +15446,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -13995,13 +15462,13 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, + "slashDef": 3, "crushDef": 2, "rangeDef": 2, "bonusAttack": 9, @@ -14009,25 +15476,27 @@ }, "3072": { "name": "Barbarian", - "hitpoints": 18, + "hitpoints": 20, "combatLevel": 9, - "attackLevel": 8, + "attackSpeed": 4, + "attackLevel": 6, "strengthLevel": 7, "defenceLevel": 3, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, - "crushDef": 2, - "rangeDef": 2, + "stabDef": 9, + "slashDef": 10, + "crushDef": 10, + "rangeDef": 5, "bonusAttack": 9, - "bonusStrength": 15 + "bonusStrength": 16 }, "3073": { "name": "Goblin", "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14041,6 +15510,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14054,6 +15524,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14067,6 +15538,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14079,6 +15551,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14089,6 +15562,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14099,6 +15573,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14109,6 +15584,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14119,6 +15595,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14129,6 +15606,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14139,6 +15617,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14149,6 +15628,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14159,6 +15639,7 @@ "name": "Farmer", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 4, "defenceLevel": 8, @@ -14171,6 +15652,7 @@ "name": "Farmer", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 4, "defenceLevel": 8, @@ -14183,6 +15665,7 @@ "name": "Farmer", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 4, "defenceLevel": 8, @@ -14195,6 +15678,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -14205,6 +15689,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -14215,6 +15700,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -14228,10 +15714,15 @@ "bonusAttack": 4, "bonusStrength": 5 }, + "3096": { + "name": "Barbarian", + "combatLevel": 7 + }, "3097": { "name": "Wizard", "hitpoints": 14, "combatLevel": 9, + "attackSpeed": 3, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 5, @@ -14243,6 +15734,7 @@ "name": "Druid", "hitpoints": 30, "combatLevel": 33, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 32, @@ -14253,6 +15745,7 @@ "name": "Warrior woman", "hitpoints": 20, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -14263,6 +15756,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14273,22 +15767,22 @@ "name": "Barbarian", "hitpoints": 14, "combatLevel": 8, - "attackLevel": 8, - "strengthLevel": 7, - "defenceLevel": 3, + "attackSpeed": 6, + "attackLevel": 6, + "strengthLevel": 5, + "defenceLevel": 5, "rangeLevel": 1, "magicLevel": 1, - "crush": 9, - "slashDef": 2, - "crushDef": 2, - "rangeDef": 2, - "bonusAttack": 9, - "bonusStrength": 15 + "stabDef": 1, + "slashDef": 1, + "bonusAttack": 8, + "bonusStrength": 10 }, "3103": { "name": "Al-Kharid warrior", "hitpoints": 19, "combatLevel": 9, + "attackSpeed": 4, "attackLevel": 7, "strengthLevel": 5, "defenceLevel": 4, @@ -14310,6 +15804,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -14326,6 +15821,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -14342,6 +15838,7 @@ "name": "Hero", "hitpoints": 82, "combatLevel": 69, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 55, "defenceLevel": 54, @@ -14358,9 +15855,10 @@ "name": "Knight of Ardougne", "hitpoints": 52, "combatLevel": 46, + "attackSpeed": 5, "attackLevel": 38, "strengthLevel": 40, - "defenceLevel": 41, + "defenceLevel": 31, "rangeLevel": 1, "magicLevel": 1, "stabDef": 39, @@ -14374,6 +15872,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14384,6 +15883,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14394,9 +15894,10 @@ "name": "Knight of Ardougne", "hitpoints": 52, "combatLevel": 46, + "attackSpeed": 5, "attackLevel": 38, "strengthLevel": 40, - "defenceLevel": 41, + "defenceLevel": 31, "rangeLevel": 1, "magicLevel": 1, "stabDef": 39, @@ -14410,6 +15911,7 @@ "name": "Archer", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -14428,6 +15930,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -14439,6 +15942,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -14450,6 +15954,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -14461,6 +15966,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -14472,6 +15978,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -14483,6 +15990,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -14494,6 +16002,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -14505,6 +16014,7 @@ "hitpoints": 80, "combatLevel": 180, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 240, "defenceLevel": 120, @@ -14516,6 +16026,7 @@ "hitpoints": 80, "combatLevel": 180, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 240, "defenceLevel": 120, @@ -14527,6 +16038,7 @@ "hitpoints": 160, "combatLevel": 360, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 320, "strengthLevel": 480, "defenceLevel": 240, @@ -14539,6 +16051,7 @@ "hitpoints": 160, "combatLevel": 360, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 320, "strengthLevel": 480, "defenceLevel": 240, @@ -14551,6 +16064,7 @@ "hitpoints": 250, "combatLevel": 702, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 640, "strengthLevel": 960, "defenceLevel": 480, @@ -14563,6 +16077,7 @@ "hitpoints": 60, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 60, @@ -14576,6 +16091,7 @@ "hitpoints": 255, "combatLevel": 650, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 340, "strengthLevel": 300, "defenceLevel": 270, @@ -14595,6 +16111,7 @@ "hitpoints": 142, "combatLevel": 145, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 124, "strengthLevel": 118, "defenceLevel": 125, @@ -14608,6 +16125,7 @@ "hitpoints": 150, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 83, "strengthLevel": 76, "defenceLevel": 127, @@ -14622,6 +16140,7 @@ "hitpoints": 161, "combatLevel": 151, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 115, "strengthLevel": 60, "defenceLevel": 153, @@ -14635,6 +16154,7 @@ "hitpoints": 116, "combatLevel": 127, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 107, "strengthLevel": 116, "defenceLevel": 106, @@ -14645,6 +16165,7 @@ "name": "Imp", "hitpoints": 10, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 6, @@ -14656,6 +16177,7 @@ "hitpoints": 92, "combatLevel": 93, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 77, "strengthLevel": 76, "defenceLevel": 85, @@ -14667,6 +16189,7 @@ "hitpoints": 92, "combatLevel": 93, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 77, "strengthLevel": 76, "defenceLevel": 85, @@ -14678,6 +16201,7 @@ "hitpoints": 60, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 66, "defenceLevel": 81, @@ -14689,17 +16213,35 @@ "hitpoints": 134, "combatLevel": 81, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 46, "defenceLevel": 30, "rangeLevel": 1, "magicLevel": 1 }, + "3139": { + "name": "Pyrefiend", + "hitpoints": 48, + "combatLevel": 48, + "slayerLevel": 30, + "attackSpeed": 4, + "attackLevel": 60, + "strengthLevel": 36, + "defenceLevel": 22, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 10, + "slashDef": 10, + "crushDef": 10, + "rangeDef": 10 + }, "3140": { "name": "Icefiend", "hitpoints": 20, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 16, "defenceLevel": 19, @@ -14710,6 +16252,7 @@ "name": "Gorak", "hitpoints": 128, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 133, "strengthLevel": 126, "defenceLevel": 135, @@ -14721,6 +16264,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -14732,6 +16276,7 @@ "hitpoints": 120, "combatLevel": 118, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -14743,6 +16288,7 @@ "hitpoints": 75, "combatLevel": 121, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 61, @@ -14754,6 +16300,7 @@ "hitpoints": 255, "combatLevel": 580, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 300, "strengthLevel": 200, "defenceLevel": 260, @@ -14774,6 +16321,7 @@ "hitpoints": 121, "combatLevel": 143, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 160, @@ -14787,6 +16335,7 @@ "hitpoints": 132, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 175, @@ -14800,6 +16349,7 @@ "hitpoints": 133, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 124, "strengthLevel": 118, "defenceLevel": 175, @@ -14812,6 +16362,7 @@ "hitpoints": 98, "combatLevel": 123, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 120, @@ -14828,6 +16379,7 @@ "hitpoints": 89, "combatLevel": 127, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -14844,6 +16396,7 @@ "hitpoints": 75, "combatLevel": 123, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 111, @@ -14860,6 +16413,7 @@ "hitpoints": 70, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -14871,6 +16425,7 @@ "hitpoints": 83, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -14882,6 +16437,7 @@ "hitpoints": 86, "combatLevel": 84, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -14893,6 +16449,7 @@ "hitpoints": 86, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -14904,6 +16461,7 @@ "hitpoints": 95, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -14915,6 +16473,7 @@ "hitpoints": 98, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -14926,6 +16485,7 @@ "hitpoints": 124, "combatLevel": 137, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 160, @@ -14937,6 +16497,7 @@ "hitpoints": 139, "combatLevel": 148, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 160, @@ -14948,6 +16509,7 @@ "hitpoints": 63, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 55, @@ -14959,6 +16521,7 @@ "hitpoints": 67, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 55, @@ -14970,6 +16533,7 @@ "hitpoints": 77, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 55, @@ -14981,6 +16545,7 @@ "hitpoints": 69, "combatLevel": 89, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 115, @@ -14992,6 +16557,7 @@ "hitpoints": 75, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 115, @@ -15003,6 +16569,7 @@ "hitpoints": 79, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 115, @@ -15014,6 +16581,7 @@ "hitpoints": 115, "combatLevel": 131, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 175, @@ -15025,6 +16593,7 @@ "hitpoints": 35, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 35, "defenceLevel": 25, @@ -15036,6 +16605,7 @@ "hitpoints": 95, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 65, @@ -15049,166 +16619,11 @@ "bonusAttack": 50, "bonusStrength": 50 }, - "3199": { - "name": "Snake", - "hitpoints": 25, - "combatLevel": 35, - "attackLevel": 25, - "strengthLevel": 50, - "defenceLevel": 25, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3200": { - "name": "Monkey", - "hitpoints": 6, - "combatLevel": 3, - "slayerLevel": 1, - "attackLevel": 2, - "strengthLevel": 3, - "defenceLevel": 2, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3201": { - "name": "Albino bat", - "hitpoints": 33, - "combatLevel": 52, - "slayerLevel": 1, - "attackLevel": 57, - "strengthLevel": 57, - "defenceLevel": 30, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3203": { - "name": "Giant mosquito", - "hitpoints": 3, - "combatLevel": 13, - "attackLevel": 5, - "strengthLevel": 1, - "defenceLevel": 45, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 2, - "slashDef": 2, - "crushDef": 5, - "magicDef": 2 - }, - "3204": { - "name": "Jungle horror", - "hitpoints": 45, - "combatLevel": 70, - "slayerLevel": 1, - "attackLevel": 70, - "strengthLevel": 70, - "defenceLevel": 55, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3205": { - "name": "Jungle horror", - "hitpoints": 45, - "combatLevel": 70, - "slayerLevel": 1, - "attackLevel": 70, - "strengthLevel": 70, - "defenceLevel": 55, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3206": { - "name": "Jungle horror", - "hitpoints": 45, - "combatLevel": 70, - "slayerLevel": 1, - "attackLevel": 70, - "strengthLevel": 70, - "defenceLevel": 55, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3207": { - "name": "Jungle horror", - "hitpoints": 45, - "combatLevel": 70, - "slayerLevel": 1, - "attackLevel": 70, - "strengthLevel": 70, - "defenceLevel": 55, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3208": { - "name": "Jungle horror", - "hitpoints": 45, - "combatLevel": 70, - "slayerLevel": 1, - "attackLevel": 70, - "strengthLevel": 70, - "defenceLevel": 55, - "rangeLevel": 1, - "magicLevel": 1 - }, - "3209": { - "name": "Cave horror", - "hitpoints": 55, - "combatLevel": 80, - "slayerLevel": 58, - "attackLevel": 80, - "strengthLevel": 77, - "defenceLevel": 62, - "rangeLevel": 1, - "magicLevel": 80 - }, - "3210": { - "name": "Cave horror", - "hitpoints": 55, - "combatLevel": 80, - "slayerLevel": 58, - "attackLevel": 80, - "strengthLevel": 77, - "defenceLevel": 62, - "rangeLevel": 1, - "magicLevel": 80 - }, - "3211": { - "name": "Cave horror", - "hitpoints": 55, - "combatLevel": 80, - "slayerLevel": 58, - "attackLevel": 80, - "strengthLevel": 77, - "defenceLevel": 62, - "rangeLevel": 1, - "magicLevel": 80 - }, - "3212": { - "name": "Cave horror", - "hitpoints": 55, - "combatLevel": 80, - "slayerLevel": 58, - "attackLevel": 80, - "strengthLevel": 77, - "defenceLevel": 62, - "rangeLevel": 1, - "magicLevel": 80 - }, - "3213": { - "name": "Cave horror", - "hitpoints": 55, - "combatLevel": 80, - "slayerLevel": 58, - "attackLevel": 80, - "strengthLevel": 77, - "defenceLevel": 62, - "rangeLevel": 1, - "magicLevel": 80 - }, "3233": { "name": "Leech", "hitpoints": 45, "combatLevel": 52, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 20, "defenceLevel": 35, @@ -15220,6 +16635,7 @@ "hitpoints": 50, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 70, "defenceLevel": 65, @@ -15231,6 +16647,7 @@ "hitpoints": 40, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 60, "defenceLevel": 55, @@ -15241,6 +16658,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15258,6 +16676,7 @@ "name": "Watchman", "hitpoints": 22, "combatLevel": 33, + "attackSpeed": 6, "attackLevel": 31, "strengthLevel": 31, "defenceLevel": 31, @@ -15272,6 +16691,7 @@ "name": "Soldier", "hitpoints": 22, "combatLevel": 28, + "attackSpeed": 5, "attackLevel": 26, "strengthLevel": 25, "defenceLevel": 26, @@ -15288,6 +16708,7 @@ "name": "Shipyard worker", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -15298,6 +16719,7 @@ "name": "Shipyard worker", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -15308,6 +16730,7 @@ "name": "Market Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 13, @@ -15325,6 +16748,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15335,6 +16759,7 @@ "name": "Drunken man", "hitpoints": 7, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 3, "defenceLevel": 1, @@ -15345,6 +16770,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15355,6 +16781,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15365,6 +16792,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15375,6 +16803,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15385,6 +16814,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15395,6 +16825,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15412,6 +16843,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15429,6 +16861,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15446,6 +16879,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15463,6 +16897,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15480,6 +16915,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15497,6 +16933,7 @@ "name": "Gardener", "hitpoints": 7, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 7, @@ -15507,6 +16944,7 @@ "name": "Gardener", "hitpoints": 7, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 1, "defenceLevel": 5, @@ -15517,6 +16955,7 @@ "name": "Cuffs", "hitpoints": 7, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15532,6 +16971,7 @@ "name": "Narf", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15542,6 +16982,7 @@ "name": "Rusty", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15552,6 +16993,7 @@ "name": "Jeff", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15562,6 +17004,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15579,6 +17022,7 @@ "name": "Hengel", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15589,6 +17033,7 @@ "name": "Anja", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15600,6 +17045,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15611,6 +17057,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15622,6 +17069,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15633,6 +17081,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15644,6 +17093,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -15655,6 +17105,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -15666,6 +17117,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -15676,6 +17128,7 @@ "name": "Earth Warrior Champion", "hitpoints": 108, "combatLevel": 102, + "attackSpeed": 4, "attackLevel": 84, "strengthLevel": 84, "defenceLevel": 84, @@ -15686,6 +17139,7 @@ "name": "Giant Champion", "hitpoints": 70, "combatLevel": 56, + "attackSpeed": 6, "attackLevel": 36, "strengthLevel": 44, "defenceLevel": 52, @@ -15695,12 +17149,14 @@ "3330": { "name": "Ghoul Champion", "hitpoints": 100, - "combatLevel": 85 + "combatLevel": 85, + "attackSpeed": 4 }, "3353": { "name": "Goblin Champion", "hitpoints": 32, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 14, @@ -15711,6 +17167,7 @@ "name": "Hobgoblin Champion", "hitpoints": 58, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 44, "strengthLevel": 48, "defenceLevel": 48, @@ -15721,6 +17178,7 @@ "name": "Imp Champion", "hitpoints": 40, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -15731,6 +17189,7 @@ "name": "Jogre Champion", "hitpoints": 120, "combatLevel": 107, + "attackSpeed": 4, "attackLevel": 86, "strengthLevel": 86, "defenceLevel": 86, @@ -15741,6 +17200,7 @@ "name": "Lesser Demon Champion", "hitpoints": 148, "combatLevel": 162, + "attackSpeed": 4, "attackLevel": 136, "strengthLevel": 140, "defenceLevel": 142, @@ -15751,6 +17211,7 @@ "name": "Skeleton Champion", "hitpoints": 58, "combatLevel": 40, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 34, @@ -15761,6 +17222,7 @@ "name": "Zombies Champion", "hitpoints": 60, "combatLevel": 51, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 42, "defenceLevel": 42, @@ -15770,12 +17232,14 @@ "3360": { "name": "Leon d'Cour", "hitpoints": 123, - "combatLevel": 141 + "combatLevel": 141, + "attackSpeed": 4 }, "3361": { "name": "Kourend guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -15792,6 +17256,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -15802,6 +17267,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15812,6 +17278,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15822,6 +17289,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15833,6 +17301,7 @@ "hitpoints": 35, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 36, "defenceLevel": 35, @@ -15844,6 +17313,7 @@ "hitpoints": 35, "combatLevel": 33, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 26, "defenceLevel": 25, @@ -15855,6 +17325,7 @@ "hitpoints": 35, "combatLevel": 36, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 28, @@ -15866,6 +17337,7 @@ "hitpoints": 85, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 75, @@ -15877,6 +17349,7 @@ "hitpoints": 105, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 80, @@ -15893,6 +17366,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -15907,6 +17381,7 @@ "name": "Tyras guard", "hitpoints": 110, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 85, "strengthLevel": 95, "defenceLevel": 100, @@ -15922,6 +17397,7 @@ "name": "Tyras guard", "hitpoints": 110, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 85, "strengthLevel": 95, "defenceLevel": 100, @@ -15937,6 +17413,7 @@ "name": "Lucien", "hitpoints": 17, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 12, "strengthLevel": 11, "defenceLevel": 10, @@ -15953,6 +17430,7 @@ "name": "Lucien", "hitpoints": 17, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 12, "strengthLevel": 11, "defenceLevel": 10, @@ -15969,6 +17447,7 @@ "name": "Guardian of Armadyl", "hitpoints": 50, "combatLevel": 45, + "attackSpeed": 5, "attackLevel": 37, "strengthLevel": 37, "defenceLevel": 37, @@ -15985,6 +17464,7 @@ "name": "Guardian of Armadyl", "hitpoints": 40, "combatLevel": 43, + "attackSpeed": 5, "attackLevel": 37, "strengthLevel": 37, "defenceLevel": 37, @@ -16001,6 +17481,7 @@ "name": "Fire Warrior of Lesarkus", "hitpoints": 59, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 78, @@ -16016,6 +17497,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -16026,6 +17508,7 @@ "name": "Fareed", "hitpoints": 130, "combatLevel": 167, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 120, "defenceLevel": 135, @@ -16041,6 +17524,7 @@ "hitpoints": 130, "combatLevel": 154, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 80, "defenceLevel": 135, @@ -16056,6 +17540,7 @@ "name": "Dessous", "hitpoints": 200, "combatLevel": 139, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -16071,6 +17556,7 @@ "name": "Dessous", "hitpoints": 200, "combatLevel": 139, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -16086,6 +17572,7 @@ "name": "The Inadequacy", "hitpoints": 180, "combatLevel": 343, + "attackSpeed": 4, "attackLevel": 564, "strengthLevel": 170, "defenceLevel": 240, @@ -16096,6 +17583,7 @@ "name": "The Everlasting", "hitpoints": 230, "combatLevel": 223, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 231, "defenceLevel": 120, @@ -16106,6 +17594,7 @@ "name": "The Untouchable", "hitpoints": 90, "combatLevel": 274, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 255, "defenceLevel": 434, @@ -16115,22 +17604,26 @@ "3476": { "name": "The Illusive", "hitpoints": 140, - "combatLevel": 108 + "combatLevel": 108, + "attackSpeed": 6 }, "3477": { "name": "A Doubt", "hitpoints": 50, - "combatLevel": 78 + "combatLevel": 78, + "attackSpeed": 6 }, "3478": { "name": "The Illusive", "hitpoints": 140, - "combatLevel": 108 + "combatLevel": 108, + "attackSpeed": 6 }, "3481": { "name": "Count Draynor", "hitpoints": 35, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -16144,6 +17637,7 @@ "name": "Count Draynor", "hitpoints": 35, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -16157,6 +17651,7 @@ "name": "Monk of Zamorak", "hitpoints": 20, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 22, @@ -16167,6 +17662,7 @@ "name": "Monk of Zamorak", "hitpoints": 10, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -16177,6 +17673,7 @@ "name": "Monk of Zamorak", "hitpoints": 25, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -16187,6 +17684,7 @@ "name": "Bouncer", "hitpoints": 120, "combatLevel": 160, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 145, "defenceLevel": 145, @@ -16197,6 +17695,7 @@ "name": "Bouncer", "hitpoints": 120, "combatLevel": 160, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 145, "defenceLevel": 145, @@ -16207,6 +17706,7 @@ "name": "Renegade Knight", "hitpoints": 48, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 28, @@ -16222,6 +17722,7 @@ "name": "Thrantax the Mighty", "hitpoints": 80, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -16232,6 +17733,7 @@ "name": "Sir Mordred", "hitpoints": 38, "combatLevel": 39, + "attackSpeed": 4, "attackLevel": 33, "strengthLevel": 33, "defenceLevel": 33, @@ -16247,6 +17749,7 @@ "name": "Desert snake", "hitpoints": 6, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 4, "strengthLevel": 5, "defenceLevel": 3, @@ -16257,6 +17760,7 @@ "name": "Menaphite Thug", "hitpoints": 60, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 50, "defenceLevel": 20, @@ -16270,6 +17774,7 @@ "name": "Menaphite Thug", "hitpoints": 60, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 50, "defenceLevel": 20, @@ -16283,6 +17788,7 @@ "name": "Tough Guy", "hitpoints": 75, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 50, "defenceLevel": 50, @@ -16297,12 +17803,14 @@ "name": "Skeleton", "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "undead": true }, "3600": { "name": "Frogeel", "hitpoints": 90, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 91, "strengthLevel": 89, "defenceLevel": 90, @@ -16313,6 +17821,7 @@ "name": "Unicow", "hitpoints": 24, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 26, "defenceLevel": 22, @@ -16323,6 +17832,7 @@ "name": "Spidine", "hitpoints": 35, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 37, "strengthLevel": 40, "defenceLevel": 36, @@ -16333,6 +17843,7 @@ "name": "Swordchick", "hitpoints": 35, "combatLevel": 46, + "attackSpeed": 4, "attackLevel": 41, "strengthLevel": 42, "defenceLevel": 45, @@ -16343,6 +17854,7 @@ "name": "Jubster", "hitpoints": 60, "combatLevel": 87, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 78, "defenceLevel": 81, @@ -16353,6 +17865,7 @@ "name": "Newtroost", "hitpoints": 18, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 16, "defenceLevel": 17, @@ -16364,6 +17877,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -16375,6 +17889,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -16386,6 +17901,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -16396,6 +17912,7 @@ "name": "Possessed pickaxe", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -16412,6 +17929,7 @@ "hitpoints": 39, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 38, @@ -16429,6 +17947,7 @@ "name": "Treus Dayth", "hitpoints": 100, "combatLevel": 95, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 100, @@ -16443,6 +17962,7 @@ "name": "Gardener", "hitpoints": 7, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 7, @@ -16454,6 +17974,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16465,6 +17986,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16476,6 +17998,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16486,6 +18009,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16496,6 +18020,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16506,6 +18031,7 @@ "name": "Ragnar", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16516,6 +18042,7 @@ "name": "Einar", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16526,6 +18053,7 @@ "name": "Alrik", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16536,6 +18064,7 @@ "name": "Thorhild", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16546,6 +18075,7 @@ "name": "Halla", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16556,6 +18086,7 @@ "name": "Rannveig", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16566,6 +18097,7 @@ "name": "Thora", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16576,6 +18108,7 @@ "name": "Valgerd", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16586,6 +18119,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16596,6 +18130,7 @@ "name": "Broddi", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16606,6 +18141,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16616,6 +18152,7 @@ "name": "Ragnvald", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16626,6 +18163,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16636,6 +18174,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16647,6 +18186,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16658,6 +18198,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16668,6 +18209,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16678,6 +18220,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16689,6 +18232,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16700,6 +18244,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16710,6 +18255,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16720,6 +18266,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16731,6 +18278,7 @@ "hitpoints": 80, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 30, "defenceLevel": 60, @@ -16742,6 +18290,7 @@ "hitpoints": 80, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 30, "defenceLevel": 60, @@ -16753,6 +18302,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -16764,6 +18314,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -16775,6 +18326,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -16786,6 +18338,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -16797,6 +18350,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -16808,6 +18362,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -16819,6 +18374,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -16830,6 +18386,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -16841,6 +18398,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -16852,6 +18410,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -16863,6 +18422,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -16874,6 +18434,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -16885,6 +18446,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -16896,6 +18458,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -16907,6 +18470,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -16918,6 +18482,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -16929,6 +18494,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -16940,6 +18506,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -16951,6 +18518,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -16962,6 +18530,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -16973,6 +18542,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -16984,6 +18554,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -16995,6 +18566,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17006,6 +18578,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17016,6 +18589,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17028,6 +18602,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17040,6 +18615,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17052,6 +18628,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17064,6 +18641,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17076,6 +18654,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17089,6 +18668,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17100,6 +18680,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17111,6 +18692,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17122,6 +18704,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17133,6 +18716,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17144,6 +18728,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17155,6 +18740,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17166,6 +18752,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17177,6 +18764,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17188,6 +18776,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17199,6 +18788,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17210,6 +18800,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17221,6 +18812,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17232,6 +18824,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17243,6 +18836,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17254,6 +18848,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17265,6 +18860,7 @@ "hitpoints": 85, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -17278,6 +18874,7 @@ "hitpoints": 85, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -17290,6 +18887,7 @@ "name": "Jake", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 27, "strengthLevel": 31, "defenceLevel": 25, @@ -17300,6 +18898,7 @@ "name": "Wilson", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 27, "strengthLevel": 31, "defenceLevel": 25, @@ -17310,6 +18909,7 @@ "name": "Palmer", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 27, "strengthLevel": 31, "defenceLevel": 25, @@ -17318,24 +18918,29 @@ }, "3897": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3898": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3899": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3900": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3901": { "name": "Fox", "hitpoints": 30, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 20, "defenceLevel": 20, @@ -17354,6 +18959,7 @@ "hitpoints": 20, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 15, "defenceLevel": 10, @@ -17365,6 +18971,7 @@ "hitpoints": 20, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 15, "defenceLevel": 10, @@ -17375,6 +18982,7 @@ "name": "Unicorn Foal", "hitpoints": 15, "combatLevel": 12, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -17385,6 +18993,7 @@ "name": "Black unicorn Foal", "hitpoints": 25, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 18, @@ -17396,6 +19005,7 @@ "hitpoints": 69, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 52, @@ -17406,6 +19016,7 @@ "name": "The Draugen", "hitpoints": 60, "combatLevel": 69, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -17424,6 +19035,7 @@ "name": "Freidir", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17435,6 +19047,7 @@ "name": "Borrokar", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17446,6 +19059,7 @@ "name": "Lanzig", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17457,6 +19071,7 @@ "name": "Freygerd", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17468,6 +19083,7 @@ "name": "Lensa", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17479,6 +19095,7 @@ "name": "Jennella", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17490,6 +19107,7 @@ "name": "Market Guard", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 3, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17507,6 +19125,7 @@ "name": "Warrior", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 3, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17524,6 +19143,7 @@ "name": "Ungadulu", "hitpoints": 65, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 57, "strengthLevel": 65, "defenceLevel": 61, @@ -17535,6 +19155,7 @@ "name": "Ungadulu", "hitpoints": 150, "combatLevel": 169, + "attackSpeed": 4, "attackLevel": 147, "strengthLevel": 147, "defenceLevel": 147, @@ -17545,6 +19166,7 @@ "name": "Jungle savage", "hitpoints": 90, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 76, "defenceLevel": 76, @@ -17555,6 +19177,7 @@ "name": "Nezikchened", "hitpoints": 150, "combatLevel": 187, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 168, "defenceLevel": 167, @@ -17566,6 +19189,7 @@ "name": "Viyeldi", "hitpoints": 80, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 62, "strengthLevel": 66, "defenceLevel": 70, @@ -17576,6 +19200,7 @@ "name": "San Tojalon", "hitpoints": 120, "combatLevel": 106, + "attackSpeed": 4, "attackLevel": 86, "strengthLevel": 84, "defenceLevel": 86, @@ -17590,6 +19215,7 @@ "name": "Irvig Senay", "hitpoints": 125, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 74, "defenceLevel": 81, @@ -17604,6 +19230,7 @@ "name": "Ranalph Devere", "hitpoints": 130, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 66, "strengthLevel": 67, "defenceLevel": 66, @@ -17619,6 +19246,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -17630,6 +19258,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -17641,6 +19270,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -17652,6 +19282,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -17670,6 +19301,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -17688,6 +19320,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -17706,6 +19339,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17722,6 +19356,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17738,6 +19373,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17754,6 +19390,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17770,6 +19407,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17786,6 +19424,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -17805,6 +19444,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -17824,6 +19464,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -17835,6 +19476,7 @@ "name": "Witch's experiment", "hitpoints": 21, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 10, "defenceLevel": 19, @@ -17845,6 +19487,7 @@ "name": "Witch's experiment (second form)", "hitpoints": 31, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 20, "defenceLevel": 29, @@ -17855,6 +19498,7 @@ "name": "Witch's experiment (third form)", "hitpoints": 41, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 30, "defenceLevel": 39, @@ -17865,6 +19509,7 @@ "name": "Witch's experiment (fourth form)", "hitpoints": 51, "combatLevel": 53, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 40, "defenceLevel": 49, @@ -17875,6 +19520,7 @@ "name": "Shadow", "hitpoints": 15, "combatLevel": 73, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 120, "defenceLevel": 5, @@ -17891,6 +19537,7 @@ "hitpoints": 220, "combatLevel": 182, "slayerLevel": 90, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 160, "defenceLevel": 120, @@ -17907,6 +19554,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -17917,10 +19565,51 @@ "rangeDef": 50, "magicDef": 60 }, + "4043": { + "name": "Pirate", + "hitpoints": 20 + }, + "4044": { + "name": "Pirate", + "hitpoints": 20 + }, + "4045": { + "name": "Pirate", + "hitpoints": 20 + }, + "4046": { + "name": "Pirate", + "hitpoints": 20 + }, + "4047": { + "name": "Pirate", + "hitpoints": 20 + }, + "4048": { + "name": "Pirate", + "hitpoints": 20 + }, + "4049": { + "name": "Pirate", + "hitpoints": 20 + }, + "4050": { + "name": "Pirate", + "hitpoints": 20 + }, + "4051": { + "name": "Pirate", + "hitpoints": 20 + }, + "4052": { + "name": "Pirate", + "hitpoints": 20 + }, "4067": { "name": "Black Knight Titan", "hitpoints": 142, "combatLevel": 120, + "attackSpeed": 7, "attackLevel": 91, "strengthLevel": 100, "defenceLevel": 91, @@ -17938,6 +19627,7 @@ "name": "Soldier", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17953,12 +19643,14 @@ "4095": { "name": "Eadburg", "hitpoints": 10, - "combatLevel": 4 + "combatLevel": 4, + "attackSpeed": 4 }, "4096": { "name": "Archer", "hitpoints": 50, "combatLevel": 42, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 40, "magicLevel": 1, @@ -17973,6 +19665,7 @@ "name": "Archer", "hitpoints": 50, "combatLevel": 42, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 40, "magicLevel": 1, @@ -17987,6 +19680,7 @@ "name": "Archer", "hitpoints": 50, "combatLevel": 42, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 40, "magicLevel": 1, @@ -18001,6 +19695,7 @@ "name": "Guard", "hitpoints": 40, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -18016,6 +19711,7 @@ "name": "Guard", "hitpoints": 40, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -18031,6 +19727,7 @@ "name": "Breoca", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -18041,6 +19738,7 @@ "name": "Ocga", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -18051,6 +19749,7 @@ "name": "Penda", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -18061,6 +19760,7 @@ "name": "Hygd", "hitpoints": 10, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 2, "defenceLevel": 3, @@ -18071,6 +19771,7 @@ "name": "White Knight", "hitpoints": 55, "combatLevel": 42, + "attackSpeed": 7, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 27, @@ -18087,6 +19788,7 @@ "name": "Fareed (hard)", "hitpoints": 255, "combatLevel": 299, + "attackSpeed": 4, "attackLevel": 380, "strengthLevel": 240, "defenceLevel": 135, @@ -18102,6 +19804,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -18118,6 +19821,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -18134,6 +19838,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -18150,6 +19855,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18164,6 +19870,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18178,6 +19885,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18192,6 +19900,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18206,6 +19915,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18220,6 +19930,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18234,6 +19945,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18248,7 +19960,8 @@ "hitpoints": 120, "combatLevel": 101, "slayerLevel": 1, - "attackLevel": 120, + "attackSpeed": 8, + "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 50, "stabDef": 25, @@ -18263,6 +19976,7 @@ "name": "Twig", "hitpoints": 90, "combatLevel": 71, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18277,6 +19991,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18290,6 +20005,7 @@ "name": "Twig", "hitpoints": 90, "combatLevel": 71, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18304,6 +20020,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18318,6 +20035,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18330,6 +20048,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18342,6 +20061,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18354,6 +20074,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18366,6 +20087,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18378,6 +20100,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18391,6 +20114,7 @@ "name": "King Roald", "hitpoints": 60, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 30, "defenceLevel": 30, @@ -18401,6 +20125,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18411,6 +20136,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18421,6 +20147,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18431,6 +20158,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18441,6 +20169,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18451,6 +20180,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18461,6 +20191,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18471,6 +20202,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18481,6 +20213,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18491,6 +20224,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18502,6 +20236,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -18513,6 +20248,7 @@ "hitpoints": 27, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 15, @@ -18523,6 +20259,7 @@ "name": "Locust", "hitpoints": 27, "combatLevel": 18, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 1, @@ -18533,6 +20270,7 @@ "name": "Plague frog", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 10, "defenceLevel": 1, @@ -18544,6 +20282,7 @@ "hitpoints": 25, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 1, "attackLevel": 255, "strengthLevel": 5, "defenceLevel": 30, @@ -18557,12 +20296,14 @@ }, "4195": { "name": "Het", - "combatLevel": 81 + "combatLevel": 81, + "attackSpeed": 4 }, "4196": { "name": "Apmeken", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 40, "defenceLevel": 60, @@ -18575,12 +20316,14 @@ }, "4197": { "name": "Scabaras", - "combatLevel": 75 + "combatLevel": 75, + "attackSpeed": 4 }, "4198": { "name": "Crondis", "hitpoints": 60, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 35, @@ -18596,6 +20339,7 @@ "name": "Possessed Priest", "hitpoints": 90, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 40, @@ -18609,6 +20353,7 @@ "name": "Monk", "hitpoints": 5, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 3, @@ -18618,6 +20363,7 @@ "4247": { "name": "Thief", "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -18628,6 +20374,7 @@ "name": "Head Thief", "hitpoints": 37, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 24, "strengthLevel": 18, "defenceLevel": 16, @@ -18643,6 +20390,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18660,6 +20408,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18677,6 +20426,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18694,6 +20444,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18712,6 +20463,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -18728,6 +20480,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -18743,6 +20496,7 @@ "name": "Sea troll", "hitpoints": 100, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -18753,6 +20507,7 @@ "name": "Sea troll", "hitpoints": 80, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -18763,6 +20518,7 @@ "name": "Sea troll", "hitpoints": 80, "combatLevel": 87, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 75, @@ -18773,6 +20529,7 @@ "name": "Sea troll", "hitpoints": 80, "combatLevel": 101, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -18783,6 +20540,7 @@ "name": "Sea Troll Queen", "hitpoints": 200, "combatLevel": 170, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 70, "defenceLevel": 100, @@ -18800,6 +20558,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 60, @@ -18812,6 +20571,7 @@ "name": "Renegade Knight", "hitpoints": 48, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 28, @@ -18827,6 +20587,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -18839,6 +20600,7 @@ "name": "Black Knight", "hitpoints": 42, "combatLevel": 33, + "attackSpeed": 5, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -18855,6 +20617,7 @@ "name": "Sir Lucan", "hitpoints": 105, "combatLevel": 120, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 110, "defenceLevel": 99, @@ -18870,6 +20633,7 @@ "name": "Sir Palomedes", "hitpoints": 100, "combatLevel": 118, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 105, "defenceLevel": 100, @@ -18885,6 +20649,7 @@ "name": "Sir Lancelot", "hitpoints": 115, "combatLevel": 127, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -18900,6 +20665,7 @@ "name": "Sir Bedivere", "hitpoints": 90, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 95, "defenceLevel": 99, @@ -18914,6 +20680,7 @@ "name": "Sir Tristram", "hitpoints": 105, "combatLevel": 115, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -18927,6 +20694,7 @@ "name": "Sir Pelleas", "hitpoints": 99, "combatLevel": 112, + "attackSpeed": 5, "attackLevel": 95, "strengthLevel": 99, "defenceLevel": 98, @@ -18941,6 +20709,7 @@ "name": "Sir Gawain", "hitpoints": 110, "combatLevel": 122, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 105, "defenceLevel": 100, @@ -18956,6 +20725,7 @@ "name": "Sir Kay", "hitpoints": 110, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 100, @@ -18971,6 +20741,7 @@ "name": "Sir Lancelot", "hitpoints": 115, "combatLevel": 127, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -18986,6 +20757,7 @@ "name": "Sir Kay", "hitpoints": 110, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 100, @@ -19001,6 +20773,7 @@ "name": "Sir Gawain", "hitpoints": 110, "combatLevel": 122, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 105, "defenceLevel": 100, @@ -19016,6 +20789,7 @@ "name": "Sir Lucan", "hitpoints": 105, "combatLevel": 120, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 110, "defenceLevel": 99, @@ -19031,6 +20805,7 @@ "name": "Sir Palomedes", "hitpoints": 100, "combatLevel": 118, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 105, "defenceLevel": 100, @@ -19046,6 +20821,7 @@ "name": "Sir Tristram", "hitpoints": 105, "combatLevel": 115, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -19059,6 +20835,7 @@ "name": "Sir Pelleas", "hitpoints": 99, "combatLevel": 112, + "attackSpeed": 5, "attackLevel": 95, "strengthLevel": 99, "defenceLevel": 98, @@ -19073,6 +20850,7 @@ "name": "Sir Bedivere", "hitpoints": 90, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 95, "defenceLevel": 99, @@ -19088,6 +20866,7 @@ "hitpoints": 60, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 71, "defenceLevel": 75, @@ -19104,6 +20883,7 @@ "hitpoints": 60, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 71, "defenceLevel": 75, @@ -19120,6 +20900,7 @@ "hitpoints": 80, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -19136,6 +20917,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -19152,6 +20934,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -19167,6 +20950,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19177,6 +20961,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19187,6 +20972,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19198,6 +20984,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -19214,6 +21001,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19224,6 +21012,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19234,6 +21023,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19244,6 +21034,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19254,6 +21045,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19264,6 +21056,7 @@ "name": "Tower guard", "hitpoints": 22, "combatLevel": 28, + "attackSpeed": 4, "attackLevel": 26, "strengthLevel": 26, "defenceLevel": 26, @@ -19279,6 +21072,7 @@ "name": "Colonel Radick", "hitpoints": 65, "combatLevel": 38, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -19295,6 +21089,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19306,6 +21101,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19316,6 +21112,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19326,6 +21123,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19336,6 +21134,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19347,6 +21146,7 @@ "hitpoints": 80, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 30, "defenceLevel": 60, @@ -19357,6 +21157,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19368,6 +21169,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19379,6 +21181,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19390,6 +21193,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19401,6 +21205,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19411,6 +21216,7 @@ "name": "Vampyre Juvinate", "hitpoints": 110, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 50, "defenceLevel": 35, @@ -19421,6 +21227,7 @@ "name": "Vampyre Juvinate", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 37, "defenceLevel": 30, @@ -19431,6 +21238,7 @@ "name": "Gadderanks", "hitpoints": 20, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 70, @@ -19448,6 +21256,7 @@ "name": "Gadderanks", "hitpoints": 20, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 70, @@ -19465,6 +21274,7 @@ "name": "Gadderanks", "hitpoints": 20, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 70, @@ -19482,6 +21292,7 @@ "name": "Vampyre Juvinate", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 37, "defenceLevel": 30, @@ -19492,6 +21303,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19503,6 +21315,7 @@ "hitpoints": 25, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 53, "strengthLevel": 30, "defenceLevel": 30, @@ -19520,6 +21333,7 @@ "hitpoints": 25, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 53, "strengthLevel": 30, "defenceLevel": 30, @@ -19537,6 +21351,7 @@ "hitpoints": 25, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 53, "strengthLevel": 30, "defenceLevel": 30, @@ -19554,6 +21369,7 @@ "hitpoints": 35, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 43, "defenceLevel": 35, @@ -19571,6 +21387,7 @@ "hitpoints": 35, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 43, "defenceLevel": 35, @@ -19588,6 +21405,7 @@ "hitpoints": 35, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 43, "defenceLevel": 35, @@ -19605,6 +21423,7 @@ "hitpoints": 40, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 54, "defenceLevel": 40, @@ -19622,6 +21441,7 @@ "hitpoints": 40, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 54, "defenceLevel": 40, @@ -19639,6 +21459,7 @@ "hitpoints": 40, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 54, "defenceLevel": 40, @@ -19655,6 +21476,7 @@ "name": "Ulfric", "hitpoints": 60, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 82, "defenceLevel": 100, @@ -19666,6 +21488,7 @@ "hitpoints": 50, "combatLevel": 70, "slayerLevel": 47, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 79, "defenceLevel": 40, @@ -19677,6 +21500,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -19692,6 +21516,7 @@ "name": "Ulfric", "hitpoints": 60, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 82, "defenceLevel": 100, @@ -19702,6 +21527,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19715,6 +21541,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19728,6 +21555,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19741,6 +21569,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19754,6 +21583,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19768,6 +21598,7 @@ "hitpoints": 32, "combatLevel": 39, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 35, "defenceLevel": 35, @@ -19784,6 +21615,7 @@ "hitpoints": 30, "combatLevel": 9, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 1, "defenceLevel": 1, @@ -19795,6 +21627,7 @@ "hitpoints": 30, "combatLevel": 9, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 1, "defenceLevel": 1, @@ -19805,6 +21638,7 @@ "name": "Sir Jerro", "hitpoints": 57, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -19821,6 +21655,7 @@ "name": "Sir Carl", "hitpoints": 57, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -19837,6 +21672,7 @@ "name": "Sir Harry", "hitpoints": 57, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -19853,6 +21689,7 @@ "name": "Kalrag", "hitpoints": 78, "combatLevel": 89, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 78, @@ -19868,6 +21705,7 @@ "name": "Othainian", "hitpoints": 87, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 77, @@ -19878,6 +21716,7 @@ "name": "Doomion", "hitpoints": 87, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 77, @@ -19888,6 +21727,7 @@ "name": "Holthion", "hitpoints": 87, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 77, @@ -19898,6 +21738,7 @@ "name": "Disciple of Iban", "hitpoints": 20, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -19909,6 +21750,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19919,6 +21761,7 @@ "name": "Rowdy slave", "hitpoints": 16, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 7, "strengthLevel": 7, "defenceLevel": 7 @@ -19927,6 +21770,7 @@ "name": "Mercenary Captain", "hitpoints": 80, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 29, "defenceLevel": 32, @@ -19941,6 +21785,7 @@ "name": "Shantay Guard", "hitpoints": 32, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 16, @@ -19956,6 +21801,7 @@ "name": "Shantay Guard", "hitpoints": 32, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 16, @@ -19972,6 +21818,7 @@ "hitpoints": 34, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 21, "defenceLevel": 22 @@ -19981,6 +21828,7 @@ "hitpoints": 34, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 21, "defenceLevel": 22 @@ -19990,6 +21838,7 @@ "hitpoints": 34, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 21, "defenceLevel": 22 @@ -19998,6 +21847,7 @@ "name": "Ugthanki", "hitpoints": 45, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 35, "defenceLevel": 35 @@ -20006,6 +21856,7 @@ "name": "Bedabin Nomad Fighter", "hitpoints": 50, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 60, @@ -20016,6 +21867,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20030,6 +21882,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20044,6 +21897,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20058,6 +21912,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20072,6 +21927,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20086,6 +21942,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20100,6 +21957,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20114,6 +21972,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20128,6 +21987,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20142,6 +22002,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20156,6 +22017,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20170,6 +22032,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20184,6 +22047,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20198,6 +22062,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20211,12 +22076,14 @@ "4682": { "name": "Sir Leye", "hitpoints": 20, - "combatLevel": 20 + "combatLevel": 20, + "attackSpeed": 5 }, "4688": { "name": "Angry unicorn", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20227,6 +22094,7 @@ "name": "Angry giant rat", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20237,6 +22105,7 @@ "name": "Angry giant rat", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20247,6 +22116,7 @@ "name": "Angry goblin", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20257,6 +22127,7 @@ "name": "Angry bear", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20267,6 +22138,7 @@ "name": "Fear reaper", "hitpoints": 57, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 48, "defenceLevel": 45, @@ -20277,6 +22149,7 @@ "name": "Confusion beast", "hitpoints": 64, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 55, "defenceLevel": 52, @@ -20287,6 +22160,7 @@ "name": "Hopeless creature", "hitpoints": 71, "combatLevel": 71, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 62, "defenceLevel": 59, @@ -20297,6 +22171,7 @@ "name": "The Shaikahan", "hitpoints": 100, "combatLevel": 83, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 25, @@ -20309,6 +22184,7 @@ "name": "The Shaikahan", "hitpoints": 100, "combatLevel": 83, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 25, @@ -20321,6 +22197,7 @@ "name": "Black golem", "hitpoints": 80, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 80, @@ -20336,6 +22213,7 @@ "name": "White golem", "hitpoints": 80, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 80, @@ -20351,6 +22229,7 @@ "name": "Grey golem", "hitpoints": 80, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 80, @@ -20366,6 +22245,7 @@ "name": "Poltenip", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -20382,6 +22262,7 @@ "name": "Radat", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -20398,6 +22279,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20414,6 +22296,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20430,6 +22313,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20446,6 +22330,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20462,6 +22347,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20478,6 +22364,7 @@ "name": "Slug Prince", "hitpoints": 70, "combatLevel": 62, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -20493,6 +22380,7 @@ "name": "Slug Prince", "hitpoints": 70, "combatLevel": 62, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -20508,19 +22396,22 @@ "name": "Giant lobster", "hitpoints": 50, "combatLevel": 45, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "4800": { "name": "Giant lobster", "hitpoints": 50, "combatLevel": 45, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "4805": { "name": "Hobgoblin", "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -20532,6 +22423,7 @@ "hitpoints": 15, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 12, @@ -20542,6 +22434,7 @@ "name": "Crab", "hitpoints": 19, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 20, "defenceLevel": 26, @@ -20552,6 +22445,7 @@ "name": "Mudskipper", "hitpoints": 20, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 29, "strengthLevel": 29, "defenceLevel": 26, @@ -20562,6 +22456,7 @@ "name": "Mudskipper", "hitpoints": 20, "combatLevel": 31, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 29, @@ -20572,6 +22467,7 @@ "name": "Crab", "hitpoints": 18, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 22, @@ -20582,6 +22478,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20604,6 +22501,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20614,6 +22512,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20624,6 +22523,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20634,6 +22534,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20644,6 +22545,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20654,6 +22556,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20664,6 +22567,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20674,6 +22578,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20684,6 +22589,7 @@ "name": "Agrith-Na-Na", "hitpoints": 200, "combatLevel": 146, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 150, "defenceLevel": 82, @@ -20700,6 +22606,7 @@ "name": "Flambeed", "hitpoints": 210, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 75, @@ -20716,6 +22623,7 @@ "name": "Karamel", "hitpoints": 250, "combatLevel": 136, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -20736,6 +22644,7 @@ "name": "Dessourt", "hitpoints": 130, "combatLevel": 121, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -20751,6 +22660,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -20766,6 +22676,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -20781,6 +22692,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -20796,6 +22708,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -20811,6 +22724,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -20826,6 +22740,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -20841,6 +22756,7 @@ "name": "Grip", "hitpoints": 25, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 17, "defenceLevel": 18, @@ -20856,6 +22772,7 @@ "name": "Ice Queen", "hitpoints": 105, "combatLevel": 111, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 94, "defenceLevel": 95, @@ -20871,6 +22788,7 @@ "name": "Pirate Guard", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 16, "defenceLevel": 10, @@ -20887,6 +22805,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -20895,30 +22814,53 @@ }, "4930": { "name": "Solus Dellagar", - "hitpoints": 40 + "hitpoints": 40, + "attackSpeed": 3 }, "4933": { "name": "Solus Dellagar", - "hitpoints": 40 + "hitpoints": 40, + "attackSpeed": 3 + }, + "4934": { + "name": "Black Knight", + "hitpoints": 42, + "combatLevel": 32, + "attackSpeed": 5 }, "4958": { "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, "rangeLevel": 1, "magicLevel": 1 }, + "4959": { + "name": "Black Knight", + "hitpoints": 42, + "combatLevel": 32, + "attackSpeed": 5 + }, + "4960": { + "name": "Black Knight", + "hitpoints": 42, + "combatLevel": 32, + "attackSpeed": 5 + }, "4962": { "name": "Solus Dellagar", - "hitpoints": 40 + "hitpoints": 40, + "attackSpeed": 3 }, "4969": { "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -20934,6 +22876,7 @@ "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -20949,6 +22892,7 @@ "name": "Khazard commander", "hitpoints": 22, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 45, "defenceLevel": 50, @@ -20959,6 +22903,7 @@ "name": "Gnome troop", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -20977,6 +22922,7 @@ "name": "Gnome troop", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -20995,6 +22941,7 @@ "name": "Chronozon", "hitpoints": 60, "combatLevel": 170, + "attackSpeed": 4, "attackLevel": 173, "strengthLevel": 172, "defenceLevel": 173, @@ -21006,6 +22953,7 @@ "name": "Imp", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21016,6 +22964,7 @@ "name": "Suit of armour", "hitpoints": 29, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 14, "defenceLevel": 9, @@ -21033,6 +22982,7 @@ "hitpoints": 55, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 100, @@ -21049,6 +22999,7 @@ "name": "Dark wizard", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21060,6 +23011,7 @@ "name": "Dark wizard", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21071,6 +23023,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21082,6 +23035,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21093,6 +23047,7 @@ "name": "Experiment No.2", "hitpoints": 95, "combatLevel": 109, + "attackSpeed": 4, "attackLevel": 104, "strengthLevel": 92, "defenceLevel": 90, @@ -21108,6 +23063,7 @@ "name": "Glod", "hitpoints": 160, "combatLevel": 138, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 120, "defenceLevel": 110, @@ -21123,6 +23079,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21136,6 +23093,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21149,6 +23107,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21162,6 +23121,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21175,6 +23135,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21188,6 +23149,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21201,6 +23163,7 @@ "name": "H.A.M. Archer", "hitpoints": 35, "combatLevel": 30, + "attackSpeed": 10, "defenceLevel": 30, "rangeLevel": 30, "stabDef": 5, @@ -21211,6 +23174,7 @@ "name": "H.A.M. Mage", "hitpoints": 35, "combatLevel": 30, + "attackSpeed": 6, "defenceLevel": 30, "rangeLevel": 1, "magicLevel": 30, @@ -21224,6 +23188,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21242,6 +23207,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21260,6 +23226,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21278,6 +23245,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21296,6 +23264,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21314,6 +23283,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21325,6 +23295,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21336,6 +23307,7 @@ "hitpoints": 52, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -21353,6 +23325,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21364,6 +23337,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21375,6 +23349,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21386,6 +23361,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21397,6 +23373,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21408,6 +23385,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21419,6 +23397,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21430,6 +23409,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21441,6 +23421,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21452,6 +23433,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21463,6 +23445,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21474,6 +23457,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21485,6 +23469,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21496,6 +23481,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21506,6 +23492,7 @@ "name": "Weaponsmaster", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 5, "attackLevel": 21, "strengthLevel": 21, "defenceLevel": 21, @@ -21522,6 +23509,7 @@ "name": "Jonny the beard", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21532,6 +23520,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21542,6 +23531,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21552,6 +23542,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21562,6 +23553,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21572,6 +23564,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21586,6 +23579,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -21599,6 +23593,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21614,6 +23609,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21629,6 +23625,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -21640,6 +23637,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -21648,14 +23646,17 @@ }, "5242": { "name": "Scorpion", + "hitpoints": 15, "combatLevel": 38, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "5243": { "name": "Jungle spider", "hitpoints": 35, "combatLevel": 37, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 30, "defenceLevel": 10, @@ -21668,6 +23669,7 @@ "name": "Snake", "hitpoints": 36, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 25, "defenceLevel": 10, @@ -21680,6 +23682,7 @@ "name": "Padulah", "hitpoints": 130, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -21692,6 +23695,7 @@ "hitpoints": 130, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -21703,6 +23707,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -21714,6 +23719,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -21725,6 +23731,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -21736,6 +23743,7 @@ "hitpoints": 130, "combatLevel": 167, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 200, @@ -21748,6 +23756,7 @@ "hitpoints": 130, "combatLevel": 167, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 200, @@ -21760,6 +23769,7 @@ "hitpoints": 60, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 60, "defenceLevel": 60, @@ -21773,6 +23783,7 @@ "hitpoints": 90, "combatLevel": 129, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 110, "defenceLevel": 90, @@ -21786,6 +23797,7 @@ "hitpoints": 60, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 60, "defenceLevel": 60, @@ -21798,6 +23810,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -21813,6 +23826,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -21828,6 +23842,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -21844,6 +23859,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -21859,6 +23875,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -21874,6 +23891,7 @@ "hitpoints": 105, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 80, @@ -21890,6 +23908,7 @@ "hitpoints": 105, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 80, @@ -21906,6 +23925,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -21921,6 +23941,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -21935,6 +23956,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21949,6 +23971,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -21960,6 +23983,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -21971,6 +23995,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -21982,6 +24007,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -21993,6 +24019,7 @@ "hitpoints": 26, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 16, "defenceLevel": 22, @@ -22007,6 +24034,7 @@ "hitpoints": 26, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 16, "defenceLevel": 22, @@ -22021,6 +24049,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22032,6 +24061,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22043,6 +24073,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22054,6 +24085,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22065,6 +24097,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22075,6 +24108,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22085,6 +24119,7 @@ "hitpoints": 47, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 55, @@ -22102,6 +24137,7 @@ "hitpoints": 47, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 55, @@ -22119,6 +24155,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22129,6 +24166,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22139,6 +24177,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22149,6 +24188,7 @@ "hitpoints": 59, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -22161,6 +24201,7 @@ "hitpoints": 59, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -22173,6 +24214,7 @@ "hitpoints": 59, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -22184,6 +24226,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80 @@ -22192,6 +24235,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 68, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 54, "defenceLevel": 58, @@ -22207,6 +24251,7 @@ "name": "Nazastarool", "hitpoints": 80, "combatLevel": 93, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80, @@ -22222,6 +24267,7 @@ "name": "Goblin guard", "hitpoints": 43, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 37, "defenceLevel": 37, @@ -22238,6 +24284,7 @@ "hitpoints": 20, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 20, @@ -22250,6 +24297,7 @@ "hitpoints": 7, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 12, "defenceLevel": 14, @@ -22262,12 +24310,14 @@ "name": "Poison spider", "hitpoints": 64, "combatLevel": 31, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "5512": { "name": "Gardener", "hitpoints": 7, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 7, @@ -22278,6 +24328,7 @@ "name": "Whirlpool", "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -22291,6 +24342,7 @@ "hitpoints": 120, "combatLevel": 112, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -22304,6 +24356,7 @@ "name": "Angry barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22319,6 +24372,7 @@ "name": "Enraged barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22334,6 +24388,7 @@ "name": "Berserk barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22349,6 +24404,7 @@ "name": "Ferocious barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22364,6 +24420,7 @@ "name": "Swamp snake", "hitpoints": 120, "combatLevel": 80, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 70, @@ -22374,6 +24431,7 @@ "name": "Swamp snake", "hitpoints": 125, "combatLevel": 109, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 80, @@ -22384,6 +24442,7 @@ "name": "Swamp snake", "hitpoints": 130, "combatLevel": 139, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 170, "defenceLevel": 90, @@ -22394,6 +24453,7 @@ "name": "Ghast", "hitpoints": 115, "combatLevel": 79, + "attackSpeed": 8, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 60, @@ -22405,6 +24465,7 @@ "name": "Ghast", "hitpoints": 135, "combatLevel": 109, + "attackSpeed": 8, "attackLevel": 110, "strengthLevel": 70, "defenceLevel": 70, @@ -22416,6 +24477,7 @@ "name": "Ghast", "hitpoints": 160, "combatLevel": 139, + "attackSpeed": 8, "attackLevel": 135, "strengthLevel": 110, "defenceLevel": 80, @@ -22427,6 +24489,7 @@ "name": "Giant snail", "hitpoints": 125, "combatLevel": 80, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 60, @@ -22437,6 +24500,7 @@ "name": "Giant snail", "hitpoints": 150, "combatLevel": 109, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 75, @@ -22447,6 +24511,7 @@ "name": "Giant snail", "hitpoints": 160, "combatLevel": 139, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 86, @@ -22458,6 +24523,7 @@ "hitpoints": 115, "combatLevel": 140, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 136, "defenceLevel": 100, @@ -22469,6 +24535,7 @@ "name": "Vampyre Juvinate", "hitpoints": 50, "combatLevel": 59, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 16, "defenceLevel": 45, @@ -22479,6 +24546,7 @@ "name": "Vampyre Juvinate", "hitpoints": 100, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 113, "strengthLevel": 46, "defenceLevel": 55, @@ -22489,6 +24557,7 @@ "name": "Vampyre Juvinate", "hitpoints": 150, "combatLevel": 119, + "attackSpeed": 4, "attackLevel": 127, "strengthLevel": 76, "defenceLevel": 65, @@ -22499,6 +24568,7 @@ "name": "Vampyre Juvinate", "hitpoints": 50, "combatLevel": 59, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 16, "defenceLevel": 45, @@ -22509,6 +24579,7 @@ "name": "Vampyre Juvinate", "hitpoints": 100, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 113, "strengthLevel": 46, "defenceLevel": 55, @@ -22519,6 +24590,7 @@ "name": "Vampyre Juvinate", "hitpoints": 150, "combatLevel": 119, + "attackSpeed": 4, "attackLevel": 127, "strengthLevel": 76, "defenceLevel": 65, @@ -22530,6 +24602,7 @@ "hitpoints": 75, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 46, "defenceLevel": 30 @@ -22539,6 +24612,7 @@ "hitpoints": 135, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 76, "defenceLevel": 30 @@ -22548,6 +24622,7 @@ "hitpoints": 185, "combatLevel": 130, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 30 @@ -22556,6 +24631,7 @@ "name": "Tentacle", "hitpoints": 75, "combatLevel": 99, + "attackSpeed": 6, "attackLevel": 115, "strengthLevel": 76, "defenceLevel": 75, @@ -22566,6 +24642,7 @@ "name": "Head", "hitpoints": 150, "combatLevel": 140, + "attackSpeed": 10, "attackLevel": 73, "strengthLevel": 186, "defenceLevel": 75, @@ -22576,6 +24653,7 @@ "name": "Head", "hitpoints": 150, "combatLevel": 140, + "attackSpeed": 10, "attackLevel": 73, "strengthLevel": 186, "defenceLevel": 75, @@ -22586,6 +24664,7 @@ "name": "Tentacle", "hitpoints": 75, "combatLevel": 99, + "attackSpeed": 6, "attackLevel": 115, "strengthLevel": 76, "defenceLevel": 75, @@ -22608,6 +24687,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22616,6 +24696,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22624,6 +24705,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22632,6 +24714,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22640,6 +24723,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22648,6 +24732,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22656,6 +24741,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22664,6 +24750,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22672,6 +24759,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22680,6 +24768,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22688,6 +24777,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22696,6 +24786,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22704,6 +24795,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22712,6 +24804,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22720,6 +24813,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22728,6 +24822,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22737,6 +24832,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22749,6 +24845,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22761,6 +24858,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22773,6 +24871,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22785,6 +24884,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22797,6 +24897,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22809,6 +24910,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22821,6 +24923,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -22833,6 +24936,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22845,6 +24949,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22857,6 +24962,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22869,6 +24975,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22881,6 +24988,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22893,6 +25001,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22905,6 +25014,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22917,6 +25027,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -22929,6 +25040,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -22941,6 +25053,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -22953,6 +25066,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -22965,6 +25079,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -22977,6 +25092,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -22989,6 +25105,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23001,6 +25118,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23013,6 +25131,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23024,6 +25143,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23032,6 +25152,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23040,6 +25161,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23048,6 +25170,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23056,6 +25179,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23064,6 +25188,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23072,6 +25197,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23080,6 +25206,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23089,6 +25216,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23101,6 +25229,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23113,6 +25242,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23125,6 +25255,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23137,6 +25268,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23149,6 +25281,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23161,6 +25294,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23173,6 +25307,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23184,6 +25319,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23192,6 +25328,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23200,6 +25337,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23208,6 +25346,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23216,6 +25355,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23224,6 +25364,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23232,6 +25373,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23240,6 +25382,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23248,6 +25391,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23256,6 +25400,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23264,6 +25409,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23272,6 +25418,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23280,6 +25427,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23288,6 +25436,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23296,6 +25445,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23304,6 +25454,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23311,97 +25462,116 @@ "5739": { "name": "Penance Fighter", "hitpoints": 28, - "combatLevel": 30 + "combatLevel": 30, + "attackSpeed": 4 }, "5740": { "name": "Penance Fighter", "hitpoints": 29, - "combatLevel": 32 + "combatLevel": 32, + "attackSpeed": 4 }, "5741": { "name": "Penance Fighter", "hitpoints": 32, - "combatLevel": 37 + "combatLevel": 37, + "attackSpeed": 4 }, "5742": { "name": "Penance Fighter", "hitpoints": 37, - "combatLevel": 42 + "combatLevel": 42, + "attackSpeed": 4 }, "5743": { "name": "Penance Fighter", "hitpoints": 38, - "combatLevel": 47 + "combatLevel": 47, + "attackSpeed": 4 }, "5744": { "name": "Penance Fighter", "hitpoints": 49, - "combatLevel": 56 + "combatLevel": 56, + "attackSpeed": 4 }, "5745": { "name": "Penance Fighter", "hitpoints": 50, - "combatLevel": 61 + "combatLevel": 61, + "attackSpeed": 4 }, "5746": { "name": "Penance Fighter", "hitpoints": 55, - "combatLevel": 68 + "combatLevel": 68, + "attackSpeed": 4 }, "5747": { "name": "Penance Fighter", "hitpoints": 56, - "combatLevel": 77 + "combatLevel": 77, + "attackSpeed": 4 }, "5757": { "name": "Penance Ranger", "hitpoints": 20, - "combatLevel": 21 + "combatLevel": 21, + "attackSpeed": 4 }, "5758": { "name": "Penance Ranger", "hitpoints": 29, - "combatLevel": 25 + "combatLevel": 25, + "attackSpeed": 4 }, "5759": { "name": "Penance Ranger", "hitpoints": 32, - "combatLevel": 32 + "combatLevel": 32, + "attackSpeed": 4 }, "5760": { "name": "Penance Ranger", "hitpoints": 34, - "combatLevel": 38 + "combatLevel": 38, + "attackSpeed": 4 }, "5761": { "name": "Penance Ranger", "hitpoints": 41, - "combatLevel": 43 + "combatLevel": 43, + "attackSpeed": 4 }, "5762": { "name": "Penance Ranger", "hitpoints": 50, - "combatLevel": 51 + "combatLevel": 51, + "attackSpeed": 4 }, "5763": { "name": "Penance Ranger", "hitpoints": 50, - "combatLevel": 57 + "combatLevel": 57, + "attackSpeed": 4 }, "5764": { "name": "Penance Ranger", "hitpoints": 55, - "combatLevel": 64 + "combatLevel": 64, + "attackSpeed": 4 }, "5765": { "name": "Penance Ranger", "hitpoints": 58, - "combatLevel": 72 + "combatLevel": 72, + "attackSpeed": 4 }, "5775": { "name": "Penance Queen", "hitpoints": 250, "combatLevel": 209, + "attackSpeed": 4, "attackLevel": 260, "strengthLevel": 92, "defenceLevel": 132, @@ -23412,6 +25582,7 @@ "name": "Queen spawn", "hitpoints": 45, "combatLevel": 63, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 62, "defenceLevel": 50, @@ -23424,6 +25595,7 @@ "hitpoints": 200, "combatLevel": 230, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -23439,6 +25611,7 @@ "name": "Yak", "hitpoints": 50, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 10, "defenceLevel": 1, @@ -23451,6 +25624,7 @@ "hitpoints": 150, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 80, @@ -23469,6 +25643,7 @@ "hitpoints": 60, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 70, @@ -23485,6 +25660,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23501,6 +25677,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23517,6 +25694,7 @@ "hitpoints": 60, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 70, @@ -23533,6 +25711,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23549,6 +25728,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23565,6 +25745,7 @@ "hitpoints": 80, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -23581,6 +25762,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -23591,6 +25773,7 @@ "name": "Tanglefoot", "hitpoints": 102, "combatLevel": 111, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 91, @@ -23601,6 +25784,7 @@ "name": "Baby tanglefoot", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 38, "defenceLevel": 40, @@ -23611,6 +25795,7 @@ "name": "Baby tanglefoot", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 38, "defenceLevel": 40, @@ -23622,6 +25807,7 @@ "hitpoints": 600, "combatLevel": 318, "slayerLevel": 91, + "attackSpeed": 6, "attackLevel": 220, "strengthLevel": 220, "defenceLevel": 100, @@ -23644,6 +25830,7 @@ "hitpoints": 600, "combatLevel": 318, "slayerLevel": 91, + "attackSpeed": 6, "attackLevel": 220, "strengthLevel": 220, "defenceLevel": 100, @@ -23666,6 +25853,7 @@ "hitpoints": 600, "combatLevel": 318, "slayerLevel": 91, + "attackSpeed": 6, "attackLevel": 220, "strengthLevel": 220, "defenceLevel": 100, @@ -23688,6 +25876,7 @@ "hitpoints": 52, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -23705,6 +25894,7 @@ "hitpoints": 52, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -23722,6 +25912,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -23734,6 +25925,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -23746,6 +25938,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -23758,6 +25951,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -23770,6 +25964,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -23787,6 +25982,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -23804,6 +26000,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -23821,6 +26018,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -23838,6 +26036,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -23855,6 +26054,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -23866,8 +26066,6 @@ "rangeDef": 60, "magicDef": 20, "bonusAttack": 65, - "poisonImmune": true, - "venomImmune": true, "demon": true }, "5887": { @@ -23875,6 +26073,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -23886,8 +26085,6 @@ "rangeDef": 60, "magicDef": 20, "bonusAttack": 65, - "poisonImmune": true, - "venomImmune": true, "demon": true }, "5888": { @@ -23895,6 +26092,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -23906,8 +26104,6 @@ "rangeDef": 60, "magicDef": 20, "bonusAttack": 65, - "poisonImmune": true, - "venomImmune": true, "demon": true }, "5889": { @@ -23915,6 +26111,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -23926,8 +26123,6 @@ "rangeDef": 60, "magicDef": 20, "bonusAttack": 65, - "poisonImmune": true, - "venomImmune": true, "demon": true }, "5890": { @@ -23935,6 +26130,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -23946,8 +26142,6 @@ "rangeDef": 60, "magicDef": 20, "bonusAttack": 65, - "poisonImmune": true, - "venomImmune": true, "demon": true }, "5891": { @@ -23955,6 +26149,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -23966,8 +26161,6 @@ "rangeDef": 60, "magicDef": 20, "bonusAttack": 65, - "poisonImmune": true, - "venomImmune": true, "demon": true }, "5908": { @@ -23975,6 +26168,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -23986,14 +26180,13 @@ "rangeDef": 60, "magicDef": 20, "bonusAttack": 65, - "poisonImmune": true, - "venomImmune": true, "demon": true }, "5916": { "name": "Spawn", "hitpoints": 15, "combatLevel": 60, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 30, "defenceLevel": 30, @@ -24006,6 +26199,7 @@ "name": "Spawn", "hitpoints": 15, "combatLevel": 60, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 30, "defenceLevel": 30, @@ -24018,6 +26212,7 @@ "name": "Scion", "hitpoints": 50, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 80, @@ -24033,6 +26228,7 @@ "name": "Sand Crab", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24043,6 +26239,7 @@ "name": "Sandy rocks", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24053,6 +26250,7 @@ "name": "Wallasalki", "hitpoints": 120, "combatLevel": 98, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -24067,6 +26265,7 @@ "name": "Wallasalki", "hitpoints": 120, "combatLevel": 98, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -24081,6 +26280,7 @@ "name": "Giant Rock Crab", "hitpoints": 180, "combatLevel": 137, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 80, "defenceLevel": 200, @@ -24096,6 +26296,7 @@ "hitpoints": 85, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 75, @@ -24111,6 +26312,7 @@ "hitpoints": 95, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 65, @@ -24128,6 +26330,7 @@ "name": "Rock lobster", "hitpoints": 150, "combatLevel": 127, + "attackSpeed": 2, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -24142,6 +26345,7 @@ "5947": { "name": "Spinolyp", "hitpoints": 100, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24156,6 +26360,7 @@ "5961": { "name": "Spinolyp", "hitpoints": 100, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24170,6 +26375,7 @@ "5963": { "name": "Spinolyp", "hitpoints": 100, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24185,6 +26391,7 @@ "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -24200,6 +26407,7 @@ "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -24215,6 +26423,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 3, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24226,6 +26435,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24237,6 +26447,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 3, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24249,6 +26460,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -24263,6 +26475,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -24277,6 +26490,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -24290,6 +26504,7 @@ "name": "Justiciar Zachariah", "hitpoints": 320, "combatLevel": 348, + "attackSpeed": 6, "attackLevel": 500, "strengthLevel": 250, "defenceLevel": 100, @@ -24310,6 +26525,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24327,6 +26543,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24344,6 +26561,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24361,6 +26579,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24378,6 +26597,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -24395,6 +26615,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -24412,6 +26633,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -24428,6 +26650,7 @@ "name": "Guard", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -24446,6 +26669,7 @@ "name": "Tower Archer", "hitpoints": 30, "combatLevel": 19, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24459,6 +26683,7 @@ "name": "Tower Archer", "hitpoints": 50, "combatLevel": 34, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24472,6 +26697,7 @@ "name": "Tower Archer", "hitpoints": 70, "combatLevel": 49, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24485,6 +26711,7 @@ "name": "Tower Archer", "hitpoints": 90, "combatLevel": 64, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24498,6 +26725,7 @@ "name": "Tortoise", "hitpoints": 100, "combatLevel": 79, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 90, "defenceLevel": 80, @@ -24508,6 +26736,7 @@ "name": "Tortoise", "hitpoints": 120, "combatLevel": 92, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 100, "defenceLevel": 80, @@ -24518,6 +26747,7 @@ "name": "Gnome child", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24528,6 +26758,7 @@ "name": "Gnome child", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24538,6 +26769,7 @@ "name": "Gnome child", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24548,6 +26780,7 @@ "name": "Gnome guard", "hitpoints": 31, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -24560,6 +26793,7 @@ "name": "Gnome guard", "hitpoints": 31, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -24572,6 +26806,7 @@ "name": "Gnome woman", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24582,6 +26817,7 @@ "name": "Gnome woman", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24592,6 +26828,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24603,6 +26840,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24614,6 +26852,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24625,6 +26864,7 @@ "name": "Gnome Archer", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24635,6 +26875,7 @@ "name": "Gnome Driver", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 6, "attackLevel": 3, "strengthLevel": 5, "defenceLevel": 3, @@ -24645,6 +26886,7 @@ "name": "Gnome Mage", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 6, "attackLevel": 3, "strengthLevel": 1, "defenceLevel": 1, @@ -24655,6 +26897,7 @@ "name": "Bush snake", "hitpoints": 25, "combatLevel": 35, + "attackSpeed": 3, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 50, @@ -24665,6 +26908,7 @@ "name": "Bush snake", "hitpoints": 25, "combatLevel": 35, + "attackSpeed": 3, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 50, @@ -24676,6 +26920,7 @@ "hitpoints": 240, "combatLevel": 214, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 210, "strengthLevel": 210, "defenceLevel": 70, @@ -24691,6 +26936,7 @@ "name": "The Inadequacy (hard)", "hitpoints": 255, "combatLevel": 600, + "attackSpeed": 4, "attackLevel": 1128, "strengthLevel": 340, "defenceLevel": 240, @@ -24701,6 +26947,7 @@ "name": "The Everlasting (hard)", "hitpoints": 255, "combatLevel": 365, + "attackSpeed": 6, "attackLevel": 374, "strengthLevel": 462, "defenceLevel": 120, @@ -24711,6 +26958,7 @@ "name": "The Untouchable (hard)", "hitpoints": 180, "combatLevel": 440, + "attackSpeed": 6, "attackLevel": 374, "strengthLevel": 510, "defenceLevel": 434, @@ -24721,6 +26969,7 @@ "name": "Scion", "hitpoints": 50, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 80, @@ -24737,6 +26986,7 @@ "hitpoints": 50, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 35, @@ -24753,6 +27003,7 @@ "hitpoints": 50, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 35, @@ -24768,6 +27019,7 @@ "name": "Large mosquito", "hitpoints": 3, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 1, "defenceLevel": 45, @@ -24782,6 +27034,7 @@ "name": "Mosquito swarm", "hitpoints": 9, "combatLevel": 17, + "attackSpeed": 3, "attackLevel": 10, "strengthLevel": 1, "defenceLevel": 45, @@ -24796,6 +27049,7 @@ "name": "Tanglefoot (hard)", "hitpoints": 204, "combatLevel": 199, + "attackSpeed": 4, "attackLevel": 194, "strengthLevel": 194, "defenceLevel": 91, @@ -24806,6 +27060,7 @@ "name": "Chronozon (hard)", "hitpoints": 120, "combatLevel": 297, + "attackSpeed": 4, "attackLevel": 346, "strengthLevel": 344, "defenceLevel": 173, @@ -24817,6 +27072,7 @@ "name": "Bouncer (hard)", "hitpoints": 232, "combatLevel": 244, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 240, "defenceLevel": 120, @@ -24828,6 +27084,7 @@ "hitpoints": 255, "combatLevel": 213, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 80, @@ -24846,6 +27103,7 @@ "hitpoints": 157, "combatLevel": 292, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 290, "strengthLevel": 296, "defenceLevel": 152, @@ -24857,6 +27115,7 @@ "name": "Glod (hard)", "hitpoints": 255, "combatLevel": 276, + "attackSpeed": 4, "attackLevel": 230, "strengthLevel": 240, "defenceLevel": 110, @@ -24872,6 +27131,7 @@ "name": "Treus Dayth (hard)", "hitpoints": 240, "combatLevel": 194, + "attackSpeed": 4, "attackLevel": 168, "strengthLevel": 168, "defenceLevel": 100, @@ -24886,6 +27146,7 @@ "name": "Black Knight Titan (hard)", "hitpoints": 255, "combatLevel": 210, + "attackSpeed": 7, "attackLevel": 182, "strengthLevel": 200, "defenceLevel": 91, @@ -24903,6 +27164,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -24918,6 +27180,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -24933,6 +27196,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -24948,6 +27212,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -24963,6 +27228,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -24978,6 +27244,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -24993,6 +27260,7 @@ "name": "Culinaromancer (hard)", "hitpoints": 255, "combatLevel": 209, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 400, "defenceLevel": 10, @@ -25003,6 +27271,7 @@ "name": "Agrith-Na-Na (hard)", "hitpoints": 255, "combatLevel": 235, + "attackSpeed": 4, "attackLevel": 166, "strengthLevel": 300, "defenceLevel": 82, @@ -25017,23 +27286,26 @@ }, "6309": { "name": "Flambeed (hard)", - "hitpoints": 240, - "combatLevel": 201, - "attackLevel": 186, - "strengthLevel": 186, - "defenceLevel": 81, - "rangeLevel": 120, + "hitpoints": 255, + "combatLevel": 238, + "attackSpeed": 4, + "attackLevel": 240, + "strengthLevel": 240, + "defenceLevel": 75, + "rangeLevel": 1, "magicLevel": 1, - "stabDef": 150, - "slashDef": 150, - "crushDef": 150, + "stabDef": 50, + "slashDef": 50, + "crushDef": 5, "rangeDef": 50, - "magicDef": 50 + "magicDef": 5, + "bonusAttack": 100 }, "6310": { "name": "Karamel (hard)", "hitpoints": 255, "combatLevel": 186, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -25054,6 +27326,7 @@ "name": "Dessourt (hard)", "hitpoints": 255, "combatLevel": 217, + "attackSpeed": 3, "attackLevel": 198, "strengthLevel": 198, "defenceLevel": 198, @@ -25065,10 +27338,107 @@ "bonusAttack": 50, "bonusStrength": 50 }, + "6312": { + "name": "Gelatinnoth Mother (hard)", + "hitpoints": 240, + "combatLevel": 201, + "attackSpeed": 4, + "attackLevel": 186, + "strengthLevel": 186, + "defenceLevel": 81, + "rangeLevel": 120, + "magicLevel": 1, + "stabDef": 150, + "slashDef": 150, + "crushDef": 150, + "rangeDef": 50, + "magicDef": 50 + }, + "6313": { + "name": "Gelatinnoth Mother (hard)", + "hitpoints": 240, + "combatLevel": 201, + "attackSpeed": 4, + "attackLevel": 186, + "strengthLevel": 186, + "defenceLevel": 81, + "rangeLevel": 120, + "magicLevel": 1, + "stabDef": 150, + "slashDef": 150, + "crushDef": 150, + "rangeDef": 50, + "magicDef": 50 + }, + "6314": { + "name": "Gelatinnoth Mother (hard)", + "hitpoints": 240, + "combatLevel": 201, + "attackSpeed": 4, + "attackLevel": 186, + "strengthLevel": 186, + "defenceLevel": 81, + "rangeLevel": 120, + "magicLevel": 1, + "stabDef": 150, + "slashDef": 150, + "crushDef": 150, + "rangeDef": 50, + "magicDef": 50 + }, + "6315": { + "name": "Gelatinnoth Mother (hard)", + "hitpoints": 240, + "combatLevel": 201, + "attackSpeed": 4, + "attackLevel": 186, + "strengthLevel": 186, + "defenceLevel": 81, + "rangeLevel": 120, + "magicLevel": 1, + "stabDef": 150, + "slashDef": 150, + "crushDef": 150, + "rangeDef": 50, + "magicDef": 50 + }, + "6316": { + "name": "Gelatinnoth Mother (hard)", + "hitpoints": 240, + "combatLevel": 201, + "attackSpeed": 4, + "attackLevel": 186, + "strengthLevel": 186, + "defenceLevel": 81, + "rangeLevel": 120, + "magicLevel": 1, + "stabDef": 150, + "slashDef": 150, + "crushDef": 150, + "rangeDef": 50, + "magicDef": 50 + }, + "6317": { + "name": "Gelatinnoth Mother (hard)", + "hitpoints": 240, + "combatLevel": 201, + "attackSpeed": 4, + "attackLevel": 186, + "strengthLevel": 186, + "defenceLevel": 81, + "rangeLevel": 120, + "magicLevel": 1, + "stabDef": 150, + "slashDef": 150, + "crushDef": 150, + "rangeDef": 50, + "magicDef": 50 + }, "6318": { "name": "Nezikchened (hard)", "hitpoints": 150, "combatLevel": 295, + "attackSpeed": 5, "attackLevel": 330, "strengthLevel": 336, "defenceLevel": 167, @@ -25081,6 +27451,7 @@ "hitpoints": 187, "combatLevel": 199, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 209, "defenceLevel": 80, @@ -25091,6 +27462,7 @@ "name": "Me (hard)", "hitpoints": 135, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 234, "defenceLevel": 74, @@ -25101,6 +27473,7 @@ "name": "Jungle Demon (hard)", "hitpoints": 255, "combatLevel": 327, + "attackSpeed": 6, "attackLevel": 340, "strengthLevel": 340, "defenceLevel": 170, @@ -25116,6 +27489,7 @@ "name": "The Kendal (hard)", "hitpoints": 150, "combatLevel": 210, + "attackSpeed": 4, "attackLevel": 195, "strengthLevel": 195, "defenceLevel": 60, @@ -25130,6 +27504,7 @@ "name": "Giant Roc (hard)", "hitpoints": 255, "combatLevel": 257, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 260, "defenceLevel": 100, @@ -25141,6 +27516,7 @@ "name": "Slagilith (hard)", "hitpoints": 150, "combatLevel": 202, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 300, "defenceLevel": 75, @@ -25157,6 +27533,7 @@ "name": "Moss giant (hard)", "hitpoints": 240, "combatLevel": 182, + "attackSpeed": 6, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 60, @@ -25174,6 +27551,7 @@ "name": "Skeleton Hellhound (hard)", "hitpoints": 132, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 168, "strengthLevel": 264, "defenceLevel": 100, @@ -25184,6 +27562,7 @@ "name": "Agrith Naar (hard)", "hitpoints": 209, "combatLevel": 196, + "attackSpeed": 4, "attackLevel": 182, "strengthLevel": 198, "defenceLevel": 82, @@ -25195,6 +27574,7 @@ "name": "King Roald (hard)", "hitpoints": 150, "combatLevel": 188, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 120, "defenceLevel": 30, @@ -25205,6 +27585,7 @@ "name": "Khazard warlord (hard)", "hitpoints": 255, "combatLevel": 192, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 170, "defenceLevel": 80, @@ -25216,6 +27597,7 @@ "hitpoints": 240, "combatLevel": 201, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 132, "strengthLevel": 264, "defenceLevel": 50, @@ -25232,6 +27614,7 @@ "hitpoints": 255, "combatLevel": 210, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 280, "defenceLevel": 40, @@ -25248,6 +27631,7 @@ "name": "Count Draynor (hard)", "hitpoints": 210, "combatLevel": 177, + "attackSpeed": 4, "attackLevel": 198, "strengthLevel": 165, "defenceLevel": 30, @@ -25261,6 +27645,7 @@ "name": "Witch's experiment (hard)", "hitpoints": 63, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 30, "defenceLevel": 19, @@ -25271,6 +27656,7 @@ "name": "Witch's experiment (second form) (hard)", "hitpoints": 93, "combatLevel": 77, + "attackSpeed": 4, "attackLevel": 84, "strengthLevel": 60, "defenceLevel": 29, @@ -25281,6 +27667,7 @@ "name": "Witch's experiment (third form) (hard)", "hitpoints": 103, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 39, @@ -25291,6 +27678,7 @@ "name": "Witch's experiment (fourth form) (hard)", "hitpoints": 113, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 88, "defenceLevel": 49, @@ -25301,6 +27689,7 @@ "name": "Nazastarool (hard)", "hitpoints": 154, "combatLevel": 176, + "attackSpeed": 4, "attackLevel": 187, "strengthLevel": 176, "defenceLevel": 80, @@ -25316,6 +27705,7 @@ "name": "Nazastarool (hard)", "hitpoints": 180, "combatLevel": 153, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 58, @@ -25331,6 +27721,7 @@ "name": "Nazastarool (hard)", "hitpoints": 176, "combatLevel": 181, + "attackSpeed": 4, "attackLevel": 187, "strengthLevel": 176, "defenceLevel": 80, @@ -25344,13 +27735,16 @@ }, "6340": { "name": "Cow (hard)", + "hitpoints": 8, "combatLevel": 170, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "6342": { "name": "Barrelchest", "hitpoints": 134, "combatLevel": 190, + "attackSpeed": 5, "attackLevel": 170, "strengthLevel": 145, "defenceLevel": 140, @@ -25364,6 +27758,7 @@ "hitpoints": 130, "combatLevel": 191, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 169, "strengthLevel": 190, "defenceLevel": 169, @@ -25379,6 +27774,7 @@ "name": "Dessous", "hitpoints": 200, "combatLevel": 139, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -25395,6 +27791,7 @@ "hitpoints": 130, "combatLevel": 154, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 80, "defenceLevel": 135, @@ -25410,6 +27807,7 @@ "name": "Damis", "hitpoints": 90, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -25426,6 +27824,7 @@ "name": "Damis", "hitpoints": 200, "combatLevel": 174, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 100, "defenceLevel": 160, @@ -25442,6 +27841,7 @@ "name": "Fareed", "hitpoints": 130, "combatLevel": 167, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 120, "defenceLevel": 135, @@ -25457,6 +27857,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -25472,6 +27873,7 @@ "name": "The Inadequacy", "hitpoints": 180, "combatLevel": 343, + "attackSpeed": 4, "attackLevel": 564, "strengthLevel": 170, "defenceLevel": 240, @@ -25482,6 +27884,7 @@ "name": "The Everlasting", "hitpoints": 230, "combatLevel": 223, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 231, "defenceLevel": 120, @@ -25492,6 +27895,7 @@ "name": "The Untouchable", "hitpoints": 90, "combatLevel": 274, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 255, "defenceLevel": 434, @@ -25502,6 +27906,7 @@ "name": "Tanglefoot", "hitpoints": 102, "combatLevel": 111, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 91, @@ -25512,6 +27917,7 @@ "name": "Chronozon", "hitpoints": 60, "combatLevel": 170, + "attackSpeed": 4, "attackLevel": 173, "strengthLevel": 172, "defenceLevel": 173, @@ -25524,6 +27930,7 @@ "hitpoints": 116, "combatLevel": 137, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -25535,6 +27942,7 @@ "hitpoints": 150, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 80, @@ -25553,6 +27961,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -25564,6 +27973,7 @@ "name": "Glod", "hitpoints": 160, "combatLevel": 138, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 120, "defenceLevel": 110, @@ -25579,6 +27989,7 @@ "name": "Treus Dayth", "hitpoints": 100, "combatLevel": 95, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 100, @@ -25593,6 +28004,7 @@ "name": "Black Knight Titan", "hitpoints": 142, "combatLevel": 120, + "attackSpeed": 7, "attackLevel": 91, "strengthLevel": 100, "defenceLevel": 91, @@ -25610,6 +28022,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25625,6 +28038,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25640,6 +28054,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25655,6 +28070,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25670,6 +28086,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25685,6 +28102,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25700,6 +28118,7 @@ "name": "Evil Chicken", "hitpoints": 120, "combatLevel": 159, + "attackSpeed": 4, "defenceLevel": 126, "magicLevel": 200 }, @@ -25707,6 +28126,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -25717,6 +28137,7 @@ "name": "Agrith-Na-Na", "hitpoints": 200, "combatLevel": 146, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 150, "defenceLevel": 82, @@ -25733,6 +28154,7 @@ "name": "Flambeed", "hitpoints": 210, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 75, @@ -25749,6 +28171,7 @@ "name": "Karamel", "hitpoints": 250, "combatLevel": 136, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -25769,6 +28192,7 @@ "name": "Dessourt", "hitpoints": 130, "combatLevel": 121, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -25784,6 +28208,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25799,6 +28224,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25814,6 +28240,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25829,6 +28256,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25844,6 +28272,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25859,6 +28288,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25874,6 +28304,7 @@ "name": "Nezikchened", "hitpoints": 150, "combatLevel": 187, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 168, "defenceLevel": 167, @@ -25886,6 +28317,7 @@ "hitpoints": 85, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 95, "defenceLevel": 80, @@ -25896,6 +28328,7 @@ "name": "Me", "hitpoints": 45, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 74, @@ -25906,6 +28339,7 @@ "name": "Jungle Demon", "hitpoints": 170, "combatLevel": 195, + "attackSpeed": 6, "attackLevel": 170, "strengthLevel": 170, "defenceLevel": 170, @@ -25921,6 +28355,7 @@ "name": "The Kendal", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 60, @@ -25935,6 +28370,7 @@ "name": "Giant Roc", "hitpoints": 250, "combatLevel": 172, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 100, @@ -25946,6 +28382,7 @@ "name": "Slagilith", "hitpoints": 60, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 75, @@ -25962,6 +28399,7 @@ "name": "Moss giant", "hitpoints": 120, "combatLevel": 84, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -25980,6 +28418,7 @@ "hitpoints": 55, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 100, @@ -25990,6 +28429,7 @@ "name": "Agrith Naar", "hitpoints": 100, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 90, "defenceLevel": 82, @@ -26001,6 +28441,7 @@ "name": "King Roald", "hitpoints": 60, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 30, "defenceLevel": 30, @@ -26011,6 +28452,7 @@ "name": "Khazard warlord", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -26022,7 +28464,8 @@ "hitpoints": 120, "combatLevel": 101, "slayerLevel": 1, - "attackLevel": 120, + "attackSpeed": 8, + "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 50, "stabDef": 25, @@ -26038,6 +28481,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -26054,6 +28498,7 @@ "name": "Count Draynor", "hitpoints": 35, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -26067,6 +28512,7 @@ "name": "Witch's experiment", "hitpoints": 21, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 10, "defenceLevel": 19, @@ -26077,6 +28523,7 @@ "name": "Witch's experiment (second form)", "hitpoints": 31, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 20, "defenceLevel": 29, @@ -26087,6 +28534,7 @@ "name": "Witch's experiment (third form)", "hitpoints": 41, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 30, "defenceLevel": 39, @@ -26097,6 +28545,7 @@ "name": "Witch's experiment (fourth form)", "hitpoints": 51, "combatLevel": 53, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 40, "defenceLevel": 49, @@ -26107,6 +28556,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80 @@ -26115,6 +28565,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 68, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 54, "defenceLevel": 58, @@ -26130,6 +28581,7 @@ "name": "Nazastarool", "hitpoints": 80, "combatLevel": 93, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80, @@ -26146,6 +28598,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26156,6 +28609,7 @@ "name": "Mosquito swarm", "hitpoints": 15, "combatLevel": 20, + "attackSpeed": 3, "attackLevel": 15, "strengthLevel": 1, "defenceLevel": 45, @@ -26170,6 +28624,7 @@ "name": "Tribesman", "hitpoints": 39, "combatLevel": 32, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 27, "defenceLevel": 26, @@ -26185,6 +28640,7 @@ "name": "Tribesman", "hitpoints": 39, "combatLevel": 32, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 27, "defenceLevel": 26, @@ -26200,6 +28656,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26212,6 +28669,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26224,6 +28682,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26236,6 +28695,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26248,6 +28708,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26260,6 +28721,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26273,6 +28735,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26284,6 +28747,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26295,6 +28759,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26306,6 +28771,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26316,6 +28782,7 @@ "name": "Animated steel armour", "hitpoints": 50, "combatLevel": 53, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 2, @@ -26336,6 +28803,7 @@ "hitpoints": 70, "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -26348,6 +28816,7 @@ "hitpoints": 85, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 70, "strengthLevel": 80, "defenceLevel": 60, @@ -26364,6 +28833,7 @@ "hitpoints": 80, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 60, "defenceLevel": 60, @@ -26380,6 +28850,7 @@ "hitpoints": 71, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 64, "defenceLevel": 80, @@ -26395,6 +28866,7 @@ "hitpoints": 40, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -26410,6 +28882,7 @@ "hitpoints": 53, "combatLevel": 59, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 46, "defenceLevel": 62, @@ -26425,6 +28898,7 @@ "hitpoints": 42, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 36, "strengthLevel": 38, "defenceLevel": 30, @@ -26440,6 +28914,7 @@ "hitpoints": 58, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 61, "defenceLevel": 45, @@ -26455,6 +28930,7 @@ "hitpoints": 26, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 33, "strengthLevel": 31, "defenceLevel": 52, @@ -26470,6 +28946,7 @@ "hitpoints": 38, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 36, "strengthLevel": 35, "defenceLevel": 33, @@ -26486,6 +28963,7 @@ "hitpoints": 40, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 39, "strengthLevel": 35, "defenceLevel": 35, @@ -26502,6 +28980,7 @@ "hitpoints": 42, "combatLevel": 47, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 39, "defenceLevel": 42, @@ -26518,6 +28997,7 @@ "hitpoints": 48, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 44, "strengthLevel": 42, "defenceLevel": 44, @@ -26534,6 +29014,7 @@ "hitpoints": 50, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 47, @@ -26550,6 +29031,7 @@ "hitpoints": 57, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 55, "defenceLevel": 50, @@ -26566,6 +29048,7 @@ "hitpoints": 63, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 58, "defenceLevel": 60, @@ -26582,6 +29065,7 @@ "hitpoints": 65, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 60, "defenceLevel": 61, @@ -26598,6 +29082,7 @@ "hitpoints": 68, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 63, "defenceLevel": 62, @@ -26614,6 +29099,7 @@ "hitpoints": 71, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 69, "strengthLevel": 65, "defenceLevel": 62, @@ -26630,6 +29116,7 @@ "hitpoints": 73, "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 73, "defenceLevel": 62, @@ -26646,6 +29133,7 @@ "hitpoints": 75, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 71, "strengthLevel": 81, "defenceLevel": 70, @@ -26662,6 +29150,7 @@ "hitpoints": 76, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 80, "defenceLevel": 71, @@ -26678,6 +29167,7 @@ "hitpoints": 81, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 80, "defenceLevel": 72, @@ -26694,6 +29184,7 @@ "hitpoints": 92, "combatLevel": 95, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 75, @@ -26710,6 +29201,7 @@ "hitpoints": 96, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 83, "defenceLevel": 81, @@ -26726,6 +29218,7 @@ "hitpoints": 102, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 86, "strengthLevel": 83, "defenceLevel": 81, @@ -26742,6 +29235,7 @@ "hitpoints": 76, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 69, "strengthLevel": 70, "defenceLevel": 71, @@ -26758,6 +29252,7 @@ "hitpoints": 69, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 61, "defenceLevel": 45, @@ -26774,6 +29269,7 @@ "hitpoints": 92, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 80, "defenceLevel": 55, @@ -26789,6 +29285,7 @@ "name": "Possessed pickaxe", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -26804,6 +29301,7 @@ "name": "Animated spade", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -26820,6 +29318,7 @@ "hitpoints": 87, "combatLevel": 110, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 104, "defenceLevel": 78, @@ -26832,6 +29331,7 @@ "hitpoints": 82, "combatLevel": 100, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 74, @@ -26844,6 +29344,7 @@ "hitpoints": 80, "combatLevel": 69, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 80, "defenceLevel": 40, @@ -26860,6 +29361,7 @@ "hitpoints": 80, "combatLevel": 69, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 80, "defenceLevel": 40, @@ -26876,6 +29378,7 @@ "hitpoints": 255, "combatLevel": 580, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 300, "strengthLevel": 200, "defenceLevel": 260, @@ -26896,6 +29399,7 @@ "hitpoints": 255, "combatLevel": 596, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 280, "strengthLevel": 196, "defenceLevel": 300, @@ -26917,6 +29421,7 @@ "hitpoints": 255, "combatLevel": 624, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 280, "strengthLevel": 350, "defenceLevel": 250, @@ -26939,6 +29444,7 @@ "hitpoints": 255, "combatLevel": 650, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 340, "strengthLevel": 300, "defenceLevel": 270, @@ -26958,6 +29464,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 128, @@ -26974,6 +29481,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -26989,6 +29497,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -27004,6 +29513,7 @@ "hitpoints": 200, "combatLevel": 230, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -27020,6 +29530,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -27036,6 +29547,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -27052,6 +29564,7 @@ "hitpoints": 255, "combatLevel": 470, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 350, "strengthLevel": 370, "defenceLevel": 440, @@ -27088,6 +29601,7 @@ "hitpoints": 250, "combatLevel": 305, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 270, "strengthLevel": 270, "defenceLevel": 270, @@ -27104,6 +29618,7 @@ "hitpoints": 250, "combatLevel": 702, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 640, "strengthLevel": 960, "defenceLevel": 480, @@ -27111,21 +29626,11 @@ "magicLevel": 480, "magic": 60 }, - "6529": { - "name": "Feral Vampyre", - "hitpoints": 50, - "combatLevel": 72, - "slayerLevel": 1, - "attackLevel": 65, - "strengthLevel": 70, - "defenceLevel": 65, - "rangeLevel": 1, - "magicLevel": 50 - }, "6574": { "name": "Gnome guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27142,6 +29647,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27158,6 +29664,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27174,6 +29681,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27190,6 +29698,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27206,6 +29715,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27222,6 +29732,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27238,6 +29749,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27255,6 +29767,7 @@ "hitpoints": 132, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 82, @@ -27266,6 +29779,7 @@ "name": "Bandosian guard", "hitpoints": 130, "combatLevel": 125, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 115, "defenceLevel": 80, @@ -27284,6 +29798,7 @@ "hitpoints": 230, "combatLevel": 252, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 220, "defenceLevel": 220, @@ -27301,6 +29816,7 @@ "hitpoints": 105, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 95, "defenceLevel": 75, @@ -27317,6 +29833,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27329,6 +29846,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27341,6 +29859,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27352,6 +29871,7 @@ "name": "Runite Golem", "hitpoints": 170, "combatLevel": 178, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 150, "defenceLevel": 165, @@ -27363,6 +29883,7 @@ "hitpoints": 125, "combatLevel": 135, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 150, @@ -27374,6 +29895,7 @@ "hitpoints": 130, "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 55, "strengthLevel": 60, "defenceLevel": 50, @@ -27385,6 +29907,7 @@ "hitpoints": 155, "combatLevel": 130, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 57, "strengthLevel": 57, "defenceLevel": 57, @@ -27400,6 +29923,7 @@ "hitpoints": 137, "combatLevel": 145, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 55, @@ -27414,6 +29938,7 @@ "hitpoints": 150, "combatLevel": 129, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 98, "strengthLevel": 65, "defenceLevel": 98, @@ -27425,6 +29950,7 @@ "hitpoints": 70, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -27437,6 +29963,7 @@ "hitpoints": 255, "combatLevel": 470, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 350, "strengthLevel": 370, "defenceLevel": 440, @@ -27473,6 +30000,7 @@ "hitpoints": 255, "combatLevel": 454, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 430, "strengthLevel": 430, "defenceLevel": 395, @@ -27489,6 +30017,7 @@ "hitpoints": 255, "combatLevel": 454, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 430, "strengthLevel": 430, "defenceLevel": 395, @@ -27505,6 +30034,7 @@ "hitpoints": 110, "combatLevel": 214, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 210, "strengthLevel": 250, "defenceLevel": 150, @@ -27522,6 +30052,7 @@ "hitpoints": 190, "combatLevel": 281, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 310, "defenceLevel": 220, @@ -27539,6 +30070,7 @@ "hitpoints": 200, "combatLevel": 225, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 180, @@ -27556,6 +30088,7 @@ "hitpoints": 2, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -27579,6 +30112,7 @@ "hitpoints": 225, "combatLevel": 204, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 160, "strengthLevel": 90, "defenceLevel": 240, @@ -27598,6 +30132,7 @@ "hitpoints": 225, "combatLevel": 202, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 220, @@ -27618,6 +30153,7 @@ "name": "Ghost guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27634,6 +30170,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27650,6 +30187,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27666,6 +30204,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27682,6 +30221,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27698,6 +30238,7 @@ "name": "Chaotic death spawn", "hitpoints": 50, "combatLevel": 215, + "attackSpeed": 3, "attackLevel": 380, "strengthLevel": 1, "defenceLevel": 70, @@ -27709,6 +30250,7 @@ "name": "Chaotic death spawn", "hitpoints": 50, "combatLevel": 215, + "attackSpeed": 3, "attackLevel": 380, "strengthLevel": 1, "defenceLevel": 70, @@ -27718,24 +30260,29 @@ }, "6725": { "name": "Rock Golem", - "combatLevel": 14 + "combatLevel": 14, + "attackSpeed": 4 }, "6726": { "name": "Rock Golem", - "combatLevel": 29 + "combatLevel": 29, + "attackSpeed": 4 }, "6727": { "name": "Rock Golem", - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "6728": { "name": "Rock Golem", - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "6729": { "name": "Rock Golem", "hitpoints": 120, "combatLevel": 120, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -27746,6 +30293,7 @@ "name": "Rock Golem", "hitpoints": 170, "combatLevel": 159, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -27756,6 +30304,7 @@ "name": "River troll", "combatLevel": 14, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -27766,6 +30315,7 @@ "name": "River troll", "combatLevel": 29, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 32, @@ -27776,6 +30326,7 @@ "name": "River troll", "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 48, "defenceLevel": 48, @@ -27787,6 +30338,7 @@ "hitpoints": 85, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -27798,6 +30350,7 @@ "hitpoints": 120, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -27809,6 +30362,7 @@ "hitpoints": 170, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -27819,6 +30373,7 @@ "name": "Evil Chicken", "hitpoints": 120, "combatLevel": 159, + "attackSpeed": 4, "defenceLevel": 126, "magicLevel": 200 }, @@ -27827,6 +30382,7 @@ "hitpoints": 170, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -27839,6 +30395,7 @@ "hitpoints": 170, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -27851,6 +30408,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -27869,6 +30427,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -27887,6 +30446,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -27897,6 +30457,7 @@ "name": "Kruk", "hitpoints": 210, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 150, @@ -27917,6 +30478,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -27928,6 +30490,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27944,6 +30507,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27960,6 +30524,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27976,6 +30541,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27992,6 +30558,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28008,6 +30575,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28024,6 +30592,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28040,6 +30609,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28056,6 +30626,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -28071,6 +30642,7 @@ "name": "Gangster", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 50, @@ -28084,6 +30656,7 @@ "name": "Gangster", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 50, @@ -28097,6 +30670,7 @@ "name": "Gangster", "hitpoints": 50, "combatLevel": 50, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 40, "defenceLevel": 40, @@ -28110,6 +30684,7 @@ "name": "Gangster", "hitpoints": 50, "combatLevel": 50, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 40, "defenceLevel": 40, @@ -28123,6 +30698,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 83, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28135,6 +30711,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 83, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28147,6 +30724,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 76, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28159,6 +30737,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 76, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28171,6 +30750,7 @@ "name": "Soldier (tier 1)", "hitpoints": 50, "combatLevel": 39, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -28185,6 +30765,7 @@ "name": "Soldier (tier 1)", "hitpoints": 50, "combatLevel": 39, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -28199,6 +30780,7 @@ "name": "Soldier (tier 2)", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -28213,6 +30795,7 @@ "name": "Soldier (tier 2)", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -28227,6 +30810,7 @@ "name": "Soldier (tier 3)", "hitpoints": 55, "combatLevel": 58, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -28241,6 +30825,7 @@ "name": "Soldier (tier 3)", "hitpoints": 55, "combatLevel": 58, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -28255,6 +30840,7 @@ "name": "Soldier (tier 4)", "hitpoints": 65, "combatLevel": 70, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -28271,6 +30857,7 @@ "name": "Soldier (tier 4)", "hitpoints": 65, "combatLevel": 70, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -28287,6 +30874,7 @@ "name": "Soldier (tier 5)", "hitpoints": 90, "combatLevel": 99, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 85, "defenceLevel": 86, @@ -28301,6 +30889,7 @@ "name": "Soldier (tier 5)", "hitpoints": 90, "combatLevel": 99, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 85, "defenceLevel": 86, @@ -28316,6 +30905,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -28332,6 +30922,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -28348,6 +30939,7 @@ "hitpoints": 60, "combatLevel": 62, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 53, "defenceLevel": 52, @@ -28365,6 +30957,7 @@ "hitpoints": 60, "combatLevel": 62, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 53, "defenceLevel": 52, @@ -28382,6 +30975,7 @@ "hitpoints": 60, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -28399,6 +30993,7 @@ "hitpoints": 60, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -28415,6 +31010,7 @@ "name": "Monk", "hitpoints": 5, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 3, @@ -28425,6 +31021,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28435,6 +31032,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28445,6 +31043,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28455,6 +31054,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28465,6 +31065,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28475,6 +31076,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28485,6 +31087,7 @@ "name": "Mugger", "hitpoints": 8, "combatLevel": 6, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -28495,6 +31098,7 @@ "name": "Kourend guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -28506,6 +31110,7 @@ "name": "Kourend head guard", "hitpoints": 86, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 73, "defenceLevel": 61, @@ -28520,109 +31125,122 @@ }, "7018": { "name": "Reanimated goblin", - "hitpoints": 5 + "hitpoints": 5, + "attackSpeed": 4 }, "7019": { "name": "Reanimated monkey", - "hitpoints": 5 + "hitpoints": 5, + "attackSpeed": 4 }, "7020": { "name": "Reanimated imp", - "hitpoints": 5 + "hitpoints": 5, + "attackSpeed": 4 }, "7021": { "name": "Reanimated minotaur", - "hitpoints": 10 + "hitpoints": 10, + "attackSpeed": 4 }, "7022": { "name": "Reanimated scorpion", - "hitpoints": 15 + "hitpoints": 15, + "attackSpeed": 4 }, "7023": { "name": "Reanimated bear", - "hitpoints": 15 + "hitpoints": 15, + "attackSpeed": 4 }, "7024": { "name": "Reanimated unicorn", - "hitpoints": 15 + "hitpoints": 15, + "attackSpeed": 4 }, "7025": { "name": "Reanimated dog", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 4 }, "7026": { "name": "Reanimated chaos druid", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 4 }, "7027": { "name": "Reanimated giant", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7028": { "name": "Reanimated ogre", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 5 }, "7029": { "name": "Reanimated elf", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7030": { "name": "Reanimated troll", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7031": { "name": "Reanimated horror", "hitpoints": 35, - "slayerLevel": 58 + "slayerLevel": 58, + "attackSpeed": 4 }, "7032": { "name": "Reanimated kalphite", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7033": { "name": "Reanimated dagannoth", "hitpoints": 35, "slayerLevel": 1, - "strengthLevel": 1000, - "defenceLevel": 140, - "rangeLevel": 1, - "magicLevel": 480, - "stab": 1, - "slash": 1, - "crush": 2, - "range": 48, - "magic": 100000 + "attackSpeed": 4 }, "7034": { "name": "Reanimated bloodveld", "hitpoints": 35, - "slayerLevel": 50 + "slayerLevel": 50, + "attackSpeed": 4 }, "7035": { "name": "Reanimated TzHaar", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 5 }, "7036": { "name": "Reanimated demon", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 4 }, "7037": { "name": "Reanimated aviansie", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7038": { "name": "Reanimated abyssal", "hitpoints": 35, - "slayerLevel": 85 + "slayerLevel": 85, + "attackSpeed": 4 }, "7039": { "name": "Reanimated dragon", "hitpoints": 35, + "attackSpeed": 4, "dragon": true }, "7095": { @@ -28630,6 +31248,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -28643,6 +31262,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -28656,6 +31276,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -28668,6 +31289,7 @@ "name": "Glough", "hitpoints": 575, "combatLevel": 378, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 270, "defenceLevel": 248, @@ -28684,6 +31306,7 @@ "name": "Glough", "hitpoints": 575, "combatLevel": 378, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 270, "defenceLevel": 248, @@ -28700,6 +31323,7 @@ "name": "Glough", "hitpoints": 575, "combatLevel": 378, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 270, "defenceLevel": 248, @@ -28716,6 +31340,7 @@ "name": "Keef", "hitpoints": 180, "combatLevel": 178, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 120, "defenceLevel": 165, @@ -28731,6 +31356,7 @@ "name": "Keef", "hitpoints": 180, "combatLevel": 178, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 120, "defenceLevel": 165, @@ -28746,6 +31372,7 @@ "name": "Kob", "hitpoints": 200, "combatLevel": 185, + "attackSpeed": 5, "attackLevel": 180, "strengthLevel": 175, "defenceLevel": 80, @@ -28763,6 +31390,7 @@ "name": "Kob", "hitpoints": 200, "combatLevel": 185, + "attackSpeed": 5, "attackLevel": 180, "strengthLevel": 175, "defenceLevel": 80, @@ -28780,6 +31408,7 @@ "name": "Maniacal monkey", "hitpoints": 65, "combatLevel": 140, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 175, "defenceLevel": 10, @@ -28790,6 +31419,7 @@ "name": "Maniacal Monkey Archer", "hitpoints": 60, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 80, "defenceLevel": 80, @@ -28801,6 +31431,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -28819,6 +31450,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -28837,6 +31469,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -28855,6 +31488,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -28873,6 +31507,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -28891,6 +31526,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -28909,6 +31545,7 @@ "hitpoints": 210, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 95, "defenceLevel": 95, @@ -28927,6 +31564,7 @@ "hitpoints": 210, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 95, "defenceLevel": 95, @@ -28945,6 +31583,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -28963,6 +31602,7 @@ "hitpoints": 210, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 95, "defenceLevel": 95, @@ -28980,6 +31620,7 @@ "name": "Sand Crab", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28990,6 +31631,7 @@ "name": "Sandy rocks", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -29001,6 +31643,7 @@ "hitpoints": 49, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 36, "defenceLevel": 37, @@ -29011,6 +31654,7 @@ "name": "Ent", "hitpoints": 75, "combatLevel": 86, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 75, @@ -29028,6 +31672,7 @@ "name": "Forester", "hitpoints": 17, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 8, @@ -29042,6 +31687,7 @@ "hitpoints": 150, "combatLevel": 124, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 67, "defenceLevel": 135, @@ -29058,6 +31704,7 @@ "hitpoints": 170, "combatLevel": 184, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 155, "strengthLevel": 158, "defenceLevel": 162, @@ -29070,6 +31717,7 @@ "hitpoints": 160, "combatLevel": 178, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 148, "defenceLevel": 175, @@ -29082,6 +31730,7 @@ "hitpoints": 120, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 50, @@ -29094,6 +31743,7 @@ "hitpoints": 115, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 70, "defenceLevel": 80, @@ -29106,6 +31756,7 @@ "hitpoints": 130, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 50, @@ -29118,6 +31769,7 @@ "hitpoints": 87, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 71, @@ -29130,6 +31782,7 @@ "hitpoints": 98, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 85, @@ -29142,6 +31795,7 @@ "hitpoints": 130, "combatLevel": 110, "slayerLevel": 65, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 40, @@ -29153,6 +31807,7 @@ "hitpoints": 220, "combatLevel": 182, "slayerLevel": 90, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 160, "defenceLevel": 120, @@ -29169,6 +31824,7 @@ "hitpoints": 150, "combatLevel": 109, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 90, "strengthLevel": 80, "defenceLevel": 65, @@ -29184,6 +31840,7 @@ "hitpoints": 130, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 120, @@ -29201,6 +31858,7 @@ "hitpoints": 122, "combatLevel": 143, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 112, @@ -29218,6 +31876,7 @@ "hitpoints": 195, "combatLevel": 215, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 185, "strengthLevel": 185, "defenceLevel": 185, @@ -29235,6 +31894,7 @@ "hitpoints": 250, "combatLevel": 274, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 235, "strengthLevel": 235, "defenceLevel": 235, @@ -29252,6 +31912,7 @@ "hitpoints": 116, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -29263,6 +31924,7 @@ "hitpoints": 60, "combatLevel": 95, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 70, "defenceLevel": 100, @@ -29275,6 +31937,7 @@ "hitpoints": 115, "combatLevel": 140, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 136, "defenceLevel": 100, @@ -29287,6 +31950,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -29298,6 +31962,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -29311,6 +31976,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -29324,6 +31990,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -29337,6 +32004,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -29353,6 +32021,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -29369,6 +32038,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -29383,6 +32053,7 @@ "name": "King Sand Crab", "hitpoints": 200, "combatLevel": 107, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 100, @@ -29393,6 +32064,7 @@ "name": "Sandy Boulder", "hitpoints": 200, "combatLevel": 107, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 100, @@ -29403,6 +32075,7 @@ "name": "Possessed pickaxe", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -29419,6 +32092,7 @@ "hitpoints": 45, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 29, @@ -29435,6 +32109,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -29446,6 +32121,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -29457,6 +32133,7 @@ "hitpoints": 109, "combatLevel": 89, "slayerLevel": 15, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 85, "defenceLevel": 50, @@ -29473,6 +32150,7 @@ "hitpoints": 245, "combatLevel": 271, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 298, "strengthLevel": 198, "defenceLevel": 198, @@ -29491,6 +32169,7 @@ "hitpoints": 285, "combatLevel": 289, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 310, "strengthLevel": 210, "defenceLevel": 198, @@ -29509,6 +32188,7 @@ "hitpoints": 315, "combatLevel": 318, "slayerLevel": 77, + "attackSpeed": 4, "attackLevel": 330, "strengthLevel": 210, "defenceLevel": 258, @@ -29528,6 +32208,7 @@ "hitpoints": 170, "combatLevel": 123, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 115, "defenceLevel": 30, @@ -29539,6 +32220,7 @@ "hitpoints": 140, "combatLevel": 112, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 90, "defenceLevel": 70, @@ -29550,6 +32232,7 @@ "hitpoints": 205, "combatLevel": 200, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 197, "strengthLevel": 197, "defenceLevel": 85, @@ -29566,6 +32249,7 @@ "hitpoints": 190, "combatLevel": 169, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -29582,6 +32266,7 @@ "hitpoints": 450, "combatLevel": 321, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 240, "strengthLevel": 250, "defenceLevel": 200, @@ -29603,6 +32288,7 @@ "hitpoints": 85, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 71, @@ -29610,11 +32296,32 @@ "magicLevel": 1, "demon": true }, + "7288": { + "name": "Awakened Altar", + "hitpoints": 100, + "demon": true + }, + "7290": { + "name": "Awakened Altar", + "hitpoints": 100, + "demon": true + }, + "7292": { + "name": "Awakened Altar", + "hitpoints": 100, + "demon": true + }, + "7294": { + "name": "Awakened Altar", + "hitpoints": 100, + "demon": true + }, "7296": { "name": "Dark Ankou", "hitpoints": 60, "combatLevel": 95, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 70, "defenceLevel": 100, @@ -29625,6 +32332,7 @@ "name": "Ancient Wizard", "hitpoints": 80, "combatLevel": 98, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 30, "defenceLevel": 20, @@ -29635,6 +32343,7 @@ "name": "Ancient Wizard", "hitpoints": 80, "combatLevel": 98, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 30, "defenceLevel": 20, @@ -29646,6 +32355,7 @@ "name": "Ancient Wizard", "hitpoints": 80, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 150, "defenceLevel": 20, @@ -29658,6 +32368,7 @@ "name": "Brassican Mage", "hitpoints": 150, "combatLevel": 140, + "attackSpeed": 3, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 80, @@ -29668,6 +32379,7 @@ "name": "Double agent", "hitpoints": 160, "combatLevel": 141, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 105, "defenceLevel": 100, @@ -29684,6 +32396,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -29695,6 +32408,7 @@ "hitpoints": 55, "combatLevel": 45, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 42, "defenceLevel": 14, @@ -29708,6 +32422,7 @@ "hitpoints": 64, "combatLevel": 68, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -29719,11 +32434,31 @@ "rangeDef": 10, "magicDef": 5 }, + "7390": { + "name": "Screaming banshee", + "hitpoints": 61, + "combatLevel": 70, + "slayerLevel": 15, + "attackSpeed": 4, + "attackLevel": 65, + "strengthLevel": 61, + "defenceLevel": 56, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 13, + "slashDef": 13, + "crushDef": 13, + "rangeDef": 13, + "poisonImmune": true, + "venomImmune": true, + "undead": true + }, "7391": { "name": "Screaming twisted banshee", "hitpoints": 220, "combatLevel": 144, "slayerLevel": 15, + "attackSpeed": 4, "attackLevel": 103, "strengthLevel": 110, "defenceLevel": 80, @@ -29742,6 +32477,7 @@ "hitpoints": 77, "combatLevel": 86, "slayerLevel": 20, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 77, "defenceLevel": 77, @@ -29753,6 +32489,7 @@ "hitpoints": 95, "combatLevel": 89, "slayerLevel": 25, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 78, "defenceLevel": 78, @@ -29769,6 +32506,7 @@ "hitpoints": 126, "combatLevel": 97, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 98, "strengthLevel": 65, "defenceLevel": 52, @@ -29786,6 +32524,7 @@ "hitpoints": 170, "combatLevel": 135, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 88, "strengthLevel": 98, "defenceLevel": 130, @@ -29802,6 +32541,7 @@ "hitpoints": 175, "combatLevel": 162, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 135, @@ -29815,6 +32555,7 @@ "hitpoints": 380, "combatLevel": 202, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 145, "defenceLevel": 85, @@ -29827,6 +32568,7 @@ "hitpoints": 410, "combatLevel": 278, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 190, "defenceLevel": 130, @@ -29839,6 +32581,7 @@ "hitpoints": 190, "combatLevel": 206, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 170, "strengthLevel": 150, "defenceLevel": 220, @@ -29850,6 +32593,7 @@ "hitpoints": 220, "combatLevel": 241, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 180, "defenceLevel": 250, @@ -29872,6 +32616,7 @@ "hitpoints": 250, "combatLevel": 253, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 180, @@ -29889,6 +32634,7 @@ "hitpoints": 390, "combatLevel": 335, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 220, @@ -29906,6 +32652,7 @@ "hitpoints": 300, "combatLevel": 264, "slayerLevel": 65, + "attackSpeed": 4, "attackLevel": 260, "strengthLevel": 230, "defenceLevel": 120, @@ -29917,6 +32664,7 @@ "hitpoints": 420, "combatLevel": 295, "slayerLevel": 70, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 320, "defenceLevel": 250, @@ -29932,6 +32680,7 @@ "hitpoints": 240, "combatLevel": 280, "slayerLevel": 93, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 230, "defenceLevel": 390, @@ -29947,6 +32696,7 @@ "hitpoints": 270, "combatLevel": 349, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 230, "strengthLevel": 250, "defenceLevel": 190, @@ -29964,6 +32714,7 @@ "hitpoints": 270, "combatLevel": 349, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 230, "strengthLevel": 250, "defenceLevel": 190, @@ -29981,6 +32732,7 @@ "hitpoints": 550, "combatLevel": 374, "slayerLevel": 90, + "attackSpeed": 4, "attackLevel": 270, "strengthLevel": 290, "defenceLevel": 220, @@ -29998,6 +32750,7 @@ "hitpoints": 400, "combatLevel": 342, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 260, "defenceLevel": 240, @@ -30015,6 +32768,7 @@ "hitpoints": 320, "combatLevel": 300, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 310, "strengthLevel": 260, "defenceLevel": 140, @@ -30031,6 +32785,7 @@ "hitpoints": 120, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 90, "strengthLevel": 100, "defenceLevel": 60, @@ -30050,6 +32805,7 @@ "name": "Zamorak warrior", "hitpoints": 50, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 70, "defenceLevel": 90, @@ -30060,6 +32816,7 @@ "name": "Zamorak warrior", "hitpoints": 50, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 70, "defenceLevel": 90, @@ -30070,6 +32827,7 @@ "name": "Zamorak ranger", "hitpoints": 50, "combatLevel": 81, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -30080,6 +32838,7 @@ "name": "Zamorak ranger", "hitpoints": 50, "combatLevel": 82, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 80, "defenceLevel": 80, @@ -30090,6 +32849,7 @@ "name": "Zamorak mage", "hitpoints": 50, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 81, "defenceLevel": 82, @@ -30100,6 +32860,7 @@ "name": "Zamorak mage", "hitpoints": 50, "combatLevel": 82, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 80, "defenceLevel": 80, @@ -30110,6 +32871,7 @@ "name": "Cave lizard", "hitpoints": 20, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 36, "defenceLevel": 35, @@ -30124,6 +32886,7 @@ "name": "Zamorak crafter", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 12, @@ -30134,6 +32897,7 @@ "name": "Zamorak crafter", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 12, @@ -30145,6 +32909,7 @@ "hitpoints": 65, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 60, "defenceLevel": 61, @@ -30161,6 +32926,7 @@ "hitpoints": 50, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 47, @@ -30177,6 +32943,7 @@ "hitpoints": 71, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 69, "strengthLevel": 65, "defenceLevel": 62, @@ -30193,6 +32960,7 @@ "hitpoints": 68, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 63, "defenceLevel": 62, @@ -30208,6 +32976,7 @@ "name": "Derwen", "hitpoints": 320, "combatLevel": 235, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -30227,6 +32996,7 @@ "hitpoints": 320, "combatLevel": 235, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -30244,6 +33014,7 @@ "7527": { "name": "Vanguard", "hitpoints": 225, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 225, "defenceLevel": 315, @@ -30260,6 +33031,7 @@ "7528": { "name": "Vanguard", "hitpoints": 225, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 225, "defenceLevel": 315, @@ -30276,6 +33048,7 @@ "7529": { "name": "Vanguard", "hitpoints": 225, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 225, "defenceLevel": 315, @@ -30291,21 +33064,29 @@ }, "7530": { "name": "Vespula", + "hitpoints": 200, + "attackSpeed": 3, "rangeDef": 60, "magicDef": 70 }, "7531": { "name": "Vespula", + "hitpoints": 200, + "attackSpeed": 3, "rangeDef": 60, "magicDef": 70 }, "7532": { "name": "Vespula", + "hitpoints": 200, + "attackSpeed": 3, "rangeDef": 60, "magicDef": 70 }, "7533": { "name": "Abyssal portal", + "hitpoints": 250, + "attackSpeed": 2, "attackLevel": 1, "strengthLevel": 1, "rangeLevel": 1, @@ -30314,17 +33095,22 @@ }, "7538": { "name": "Vespine soldier", + "hitpoints": 100, + "attackSpeed": 4, "rangeLevel": 1, "magicDef": 30 }, "7539": { "name": "Vespine soldier", + "hitpoints": 100, + "attackSpeed": 4, "rangeLevel": 1, "magicDef": 30 }, "7540": { "name": "Tekton", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30339,6 +33125,7 @@ "7541": { "name": "Tekton", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30353,6 +33140,7 @@ "7542": { "name": "Tekton", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30367,6 +33155,7 @@ "7543": { "name": "Tekton (enraged)", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30381,6 +33170,7 @@ "7544": { "name": "Tekton (enraged)", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30395,6 +33185,7 @@ "7545": { "name": "Tekton", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30409,6 +33200,7 @@ "7548": { "name": "Scavenger beast", "hitpoints": 30, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 45, @@ -30418,6 +33210,7 @@ "7549": { "name": "Scavenger beast", "hitpoints": 45, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 180, "defenceLevel": 67, @@ -30428,6 +33221,7 @@ "name": "Great Olm (Right claw)", "hitpoints": 600, "combatLevel": 549, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30445,6 +33239,7 @@ "name": "Great Olm", "hitpoints": 800, "combatLevel": 1043, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 150, @@ -30462,6 +33257,7 @@ "name": "Great Olm (Left claw)", "hitpoints": 600, "combatLevel": 750, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30479,6 +33275,7 @@ "name": "Great Olm (Right claw)", "hitpoints": 600, "combatLevel": 549, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30496,6 +33293,7 @@ "name": "Great Olm", "hitpoints": 800, "combatLevel": 1043, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 150, @@ -30513,6 +33311,7 @@ "name": "Great Olm (Left claw)", "hitpoints": 600, "combatLevel": 750, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30528,6 +33327,8 @@ }, "7559": { "name": "Deathly ranger", + "hitpoints": 120, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "range": 120, @@ -30535,13 +33336,32 @@ }, "7560": { "name": "Deathly mage", + "hitpoints": 120, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "rangeLevel": 1, "magic": 120 }, + "7561": { + "name": "Muttadile", + "hitpoints": 250, + "attackSpeed": 4 + }, + "7562": { + "name": "Muttadile", + "hitpoints": 250, + "attackSpeed": 4 + }, + "7563": { + "name": "Muttadile", + "hitpoints": 250, + "attackSpeed": 4 + }, "7566": { "name": "Vasa Nistirio", + "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "range": 100, @@ -30553,6 +33373,8 @@ }, "7567": { "name": "Vasa Nistirio", + "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "range": 100, @@ -30564,6 +33386,8 @@ }, "7568": { "name": "Glowing crystal", + "hitpoints": 120, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "rangeLevel": 1, @@ -30572,7 +33396,9 @@ }, "7573": { "name": "Lizardman shaman", + "hitpoints": 190, "slayerLevel": 1, + "attackSpeed": 4, "range": 56, "stabDef": 102, "slashDef": 160, @@ -30584,7 +33410,9 @@ }, "7574": { "name": "Lizardman shaman", + "hitpoints": 190, "slayerLevel": 1, + "attackSpeed": 4, "range": 56, "stabDef": 102, "slashDef": 160, @@ -30597,6 +33425,7 @@ "7584": { "name": "Ice demon", "hitpoints": 140, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 160, @@ -30612,6 +33441,7 @@ "7585": { "name": "Ice demon", "hitpoints": 210, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 240, @@ -30626,7 +33456,9 @@ }, "7604": { "name": "Skeletal Mystic", + "hitpoints": 160, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magic": 40, "stabDef": 155, @@ -30640,7 +33472,9 @@ }, "7605": { "name": "Skeletal Mystic", + "hitpoints": 160, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magic": 40, "stabDef": 155, @@ -30654,7 +33488,9 @@ }, "7606": { "name": "Skeletal Mystic", + "hitpoints": 160, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magic": 40, "stabDef": 155, @@ -30671,6 +33507,7 @@ "hitpoints": 45, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -30681,6 +33518,7 @@ "name": "Khazard warlord", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -30691,6 +33529,7 @@ "name": "Khazard warlord", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -30701,6 +33540,7 @@ "name": "Chaotic death spawn", "hitpoints": 50, "combatLevel": 215, + "attackSpeed": 3, "attackLevel": 380, "strengthLevel": 1, "defenceLevel": 70, @@ -30713,6 +33553,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -30725,6 +33566,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -30736,30 +33578,35 @@ "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7659": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7660": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7661": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7662": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7664": { @@ -30767,6 +33614,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -30779,6 +33627,7 @@ "hitpoints": 200, "combatLevel": 221, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 180, "defenceLevel": 190, @@ -30790,6 +33639,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -30801,6 +33651,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -30812,6 +33663,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -30823,6 +33675,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -30834,6 +33687,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -30845,6 +33699,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -30856,6 +33711,7 @@ "hitpoints": 10, "combatLevel": 32, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 15, @@ -30867,6 +33723,7 @@ "hitpoints": 25, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 3, "defenceLevel": 55, "rangeLevel": 120, "magicLevel": 120, @@ -30882,6 +33739,7 @@ "hitpoints": 40, "combatLevel": 165, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 160, "strengthLevel": 160, "defenceLevel": 95, @@ -30905,6 +33763,7 @@ "hitpoints": 15, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 95, @@ -30918,6 +33777,7 @@ "hitpoints": 15, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 95, @@ -30932,6 +33792,7 @@ "hitpoints": 15, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 95, @@ -30950,6 +33811,7 @@ "hitpoints": 75, "combatLevel": 240, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 210, "strengthLevel": 290, "defenceLevel": 120, @@ -30970,6 +33832,7 @@ "hitpoints": 130, "combatLevel": 370, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 180, "defenceLevel": 60, @@ -30983,6 +33846,7 @@ "hitpoints": 220, "combatLevel": 490, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 370, "strengthLevel": 510, "defenceLevel": 260, @@ -30995,6 +33859,7 @@ "hitpoints": 350, "combatLevel": 900, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 750, "strengthLevel": 1020, "defenceLevel": 480, @@ -31012,6 +33877,7 @@ "hitpoints": 90, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 125, "defenceLevel": 100, @@ -31027,6 +33893,7 @@ "hitpoints": 130, "combatLevel": 370, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 180, "defenceLevel": 60, @@ -31040,6 +33907,7 @@ "hitpoints": 220, "combatLevel": 490, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 370, "strengthLevel": 510, "defenceLevel": 260, @@ -31052,6 +33920,7 @@ "hitpoints": 350, "combatLevel": 900, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 750, "strengthLevel": 1020, "defenceLevel": 480, @@ -31069,6 +33938,7 @@ "hitpoints": 90, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 125, "defenceLevel": 100, @@ -31084,6 +33954,7 @@ "hitpoints": 1200, "combatLevel": 1400, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 350, "strengthLevel": 600, "defenceLevel": 260, @@ -31102,6 +33973,7 @@ "hitpoints": 80, "combatLevel": 250, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -31113,6 +33985,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -31131,6 +34004,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -31149,6 +34023,7 @@ "hitpoints": 200, "combatLevel": 152, "slayerLevel": 66, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 120, "defenceLevel": 90, @@ -31166,6 +34041,7 @@ "hitpoints": 200, "combatLevel": 147, "slayerLevel": 66, + "attackSpeed": 6, "attackLevel": 120, "strengthLevel": 110, "defenceLevel": 90, @@ -31183,6 +34059,7 @@ "hitpoints": 200, "combatLevel": 139, "slayerLevel": 66, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 80, "defenceLevel": 90, @@ -31200,6 +34077,7 @@ "hitpoints": 300, "combatLevel": 210, "slayerLevel": 82, + "attackSpeed": 5, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 150, @@ -31217,6 +34095,7 @@ "hitpoints": 50, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 80, "defenceLevel": 40, @@ -31233,6 +34112,7 @@ "hitpoints": 150, "combatLevel": 109, "slayerLevel": 57, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -31250,16 +34130,7 @@ "name": "Ammonite Crab", "hitpoints": 100, "combatLevel": 25, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 1, - "rangeLevel": 1, - "magicLevel": 1 - }, - "7800": { - "name": "Fossil Rock", - "hitpoints": 100, - "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -31270,6 +34141,7 @@ "name": "Hoop Snake", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 10, "defenceLevel": 20, @@ -31280,6 +34152,7 @@ "name": "Tar Monster", "hitpoints": 200, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 80, "defenceLevel": 70, @@ -31291,6 +34164,7 @@ "hitpoints": 200, "combatLevel": 276, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 280, "strengthLevel": 160, "defenceLevel": 280, @@ -31308,13 +34182,15 @@ }, "7817": { "name": "Lava beast", - "hitpoints": 65 + "hitpoints": 65, + "attackSpeed": 4 }, "7851": { "name": "Dusk", "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31326,6 +34202,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -31340,6 +34217,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -31354,6 +34232,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31365,6 +34244,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31375,6 +34255,7 @@ "name": "Justiciar Zachariah", "hitpoints": 320, "combatLevel": 348, + "attackSpeed": 6, "attackLevel": 500, "strengthLevel": 250, "defenceLevel": 100, @@ -31394,6 +34275,7 @@ "name": "Derwen", "hitpoints": 320, "combatLevel": 235, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -31413,6 +34295,7 @@ "hitpoints": 320, "combatLevel": 235, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -31432,6 +34315,7 @@ "hitpoints": 250, "combatLevel": 247, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 215, "defenceLevel": 200, @@ -31449,6 +34333,7 @@ "hitpoints": 250, "combatLevel": 247, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 215, "defenceLevel": 200, @@ -31466,6 +34351,7 @@ "hitpoints": 250, "combatLevel": 247, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 215, "defenceLevel": 200, @@ -31483,6 +34369,7 @@ "hitpoints": 100, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 90, "defenceLevel": 100, @@ -31495,6 +34382,7 @@ "hitpoints": 110, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 85, "defenceLevel": 71, @@ -31507,6 +34395,7 @@ "hitpoints": 110, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 85, "defenceLevel": 71, @@ -31519,6 +34408,7 @@ "hitpoints": 110, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 85, "defenceLevel": 71, @@ -31531,6 +34421,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 75, "defenceLevel": 68, @@ -31548,6 +34439,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 75, "defenceLevel": 68, @@ -31565,6 +34457,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 75, "defenceLevel": 68, @@ -31582,6 +34475,7 @@ "hitpoints": 120, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 90, "defenceLevel": 81, @@ -31594,6 +34488,7 @@ "hitpoints": 120, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 90, "defenceLevel": 81, @@ -31606,6 +34501,7 @@ "hitpoints": 120, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 90, "defenceLevel": 81, @@ -31618,6 +34514,7 @@ "hitpoints": 200, "combatLevel": 188, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 165, "defenceLevel": 152, @@ -31630,6 +34527,7 @@ "hitpoints": 200, "combatLevel": 188, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 165, "defenceLevel": 152, @@ -31642,6 +34540,7 @@ "hitpoints": 200, "combatLevel": 188, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 165, "defenceLevel": 152, @@ -31654,6 +34553,7 @@ "hitpoints": 150, "combatLevel": 136, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 120, "defenceLevel": 102, @@ -31665,6 +34565,7 @@ "hitpoints": 100, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 40, @@ -31680,6 +34581,7 @@ "hitpoints": 100, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 40, @@ -31695,6 +34597,7 @@ "hitpoints": 100, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 40, @@ -31710,6 +34613,7 @@ "hitpoints": 10, "combatLevel": 7, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 4, @@ -31724,6 +34628,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31735,6 +34640,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31746,6 +34652,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -31760,6 +34667,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -31774,6 +34682,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31785,6 +34694,7 @@ "hitpoints": 450, "combatLevel": 328, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 300, "strengthLevel": 250, "defenceLevel": 150, @@ -31796,6 +34706,7 @@ "hitpoints": 450, "combatLevel": 328, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 300, "strengthLevel": 250, "defenceLevel": 150, @@ -31807,6 +34718,7 @@ "hitpoints": 450, "combatLevel": 328, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 300, "strengthLevel": 250, "defenceLevel": 150, @@ -31817,6 +34729,7 @@ "name": "Sand Snake (hard)", "hitpoints": 180, "combatLevel": 154, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 140, "defenceLevel": 20, @@ -31827,6 +34740,7 @@ "name": "Sand Snake", "hitpoints": 60, "combatLevel": 36, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 20, "defenceLevel": 20, @@ -31837,6 +34751,7 @@ "name": "Sand Snake", "hitpoints": 60, "combatLevel": 36, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 20, "defenceLevel": 20, @@ -31847,6 +34762,7 @@ "name": "Thief", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -31857,6 +34773,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -31867,6 +34784,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -31878,6 +34796,7 @@ "hitpoints": 14, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 13, "strengthLevel": 14, "defenceLevel": 14, @@ -31901,6 +34820,7 @@ "hitpoints": 48, "combatLevel": 52, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 40, "defenceLevel": 33, @@ -31918,6 +34838,7 @@ "hitpoints": 72, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 41, @@ -31939,6 +34860,7 @@ "hitpoints": 110, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 73, "defenceLevel": 49, @@ -31958,6 +34880,7 @@ "hitpoints": 80, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 76, "strengthLevel": 80, "defenceLevel": 80, @@ -31978,6 +34901,7 @@ "hitpoints": 80, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 83, "strengthLevel": 76, "defenceLevel": 80, @@ -32001,6 +34925,7 @@ "hitpoints": 105, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 100, "defenceLevel": 60, @@ -32021,6 +34946,7 @@ "hitpoints": 140, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 93, "strengthLevel": 110, "defenceLevel": 80, @@ -32041,6 +34967,7 @@ "hitpoints": 143, "combatLevel": 126, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 119, "defenceLevel": 80, @@ -32064,6 +34991,7 @@ "hitpoints": 155, "combatLevel": 135, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 106, "strengthLevel": 126, "defenceLevel": 87, @@ -32086,6 +35014,7 @@ "name": "Corsair Traitor (hard)", "hitpoints": 160, "combatLevel": 103, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -32096,6 +35025,7 @@ "name": "Corsair Traitor", "hitpoints": 55, "combatLevel": 35, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -32107,6 +35037,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -32123,6 +35054,7 @@ "name": "Ithoi the Navigator", "hitpoints": 55, "combatLevel": 35, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -32134,6 +35066,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 82, @@ -32150,6 +35083,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 82, @@ -32166,6 +35100,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 20, "defenceLevel": 82, @@ -32182,6 +35117,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 20, "defenceLevel": 82, @@ -32198,6 +35134,7 @@ "hitpoints": 150, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 162, "strengthLevel": 162, "defenceLevel": 38, @@ -32214,6 +35151,7 @@ "hitpoints": 50, "combatLevel": 46, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 38, @@ -32230,6 +35168,7 @@ "hitpoints": 50, "combatLevel": 46, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 38, @@ -32245,6 +35184,7 @@ "name": "Rune dragon", "hitpoints": 330, "combatLevel": 380, + "attackSpeed": 4, "attackLevel": 284, "strengthLevel": 284, "defenceLevel": 276, @@ -32264,6 +35204,7 @@ "hitpoints": 295, "combatLevel": 338, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 280, "strengthLevel": 280, "defenceLevel": 272, @@ -32281,6 +35222,7 @@ "hitpoints": 330, "combatLevel": 380, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 284, "strengthLevel": 284, "defenceLevel": 276, @@ -32299,6 +35241,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -32314,6 +35257,7 @@ "name": "Spawn", "hitpoints": 80, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -32333,6 +35277,7 @@ "name": "Robert the Strong", "hitpoints": 280, "combatLevel": 194, + "attackSpeed": 4, "defenceLevel": 140, "rangeLevel": 328, "magicLevel": 128, @@ -32350,6 +35295,7 @@ "hitpoints": 460, "combatLevel": 392, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 268, "defenceLevel": 164, @@ -32371,6 +35317,7 @@ "hitpoints": 750, "combatLevel": 732, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 308, "defenceLevel": 214, @@ -32392,6 +35339,7 @@ "hitpoints": 460, "combatLevel": 392, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 268, "defenceLevel": 164, @@ -32413,6 +35361,7 @@ "hitpoints": 750, "combatLevel": 732, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 308, "defenceLevel": 214, @@ -32433,6 +35382,7 @@ "name": "Zombified Spawn", "hitpoints": 8, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 4, @@ -32453,6 +35403,7 @@ "name": "Zombified Spawn", "hitpoints": 38, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 82, "defenceLevel": 6, @@ -32473,6 +35424,7 @@ "name": "Stone Guardian", "hitpoints": 62, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 150, "strengthLevel": 148, "defenceLevel": 138, @@ -32483,6 +35435,7 @@ "name": "Stone Guardian", "hitpoints": 62, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 138, @@ -32493,17 +35446,76 @@ "name": "Stone Guardian", "hitpoints": 62, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 138, "rangeLevel": 1, "magicLevel": 128 }, + "8067": { + "name": "Zombie", + "hitpoints": 54, + "combatLevel": 132, + "slayerLevel": 1, + "attackSpeed": 5, + "attackLevel": 160, + "strengthLevel": 180, + "defenceLevel": 62, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 25, + "slashDef": 20, + "crushDef": 25, + "rangeDef": 30, + "magicDef": 10, + "bonusAttack": 30, + "undead": true + }, + "8068": { + "name": "Zombie", + "hitpoints": 54, + "combatLevel": 132, + "slayerLevel": 1, + "attackSpeed": 5, + "attackLevel": 160, + "strengthLevel": 1, + "defenceLevel": 62, + "rangeLevel": 180, + "magicLevel": 1, + "range": 20, + "stabDef": 15, + "slashDef": 10, + "crushDef": 15, + "rangeDef": 20, + "magicDef": 30, + "undead": true + }, + "8069": { + "name": "Zombie", + "hitpoints": 54, + "combatLevel": 132, + "slayerLevel": 1, + "attackSpeed": 5, + "attackLevel": 160, + "strengthLevel": 1, + "defenceLevel": 62, + "rangeLevel": 1, + "magicLevel": 180, + "magic": 20, + "stabDef": 35, + "slashDef": 30, + "crushDef": 35, + "rangeDef": 10, + "magicDef": 20, + "undead": true + }, "8070": { "name": "Skeleton", "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 180, "defenceLevel": 62, @@ -32522,6 +35534,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 1, "defenceLevel": 62, @@ -32540,6 +35553,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 1, "defenceLevel": 62, @@ -32558,6 +35572,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -32570,28 +35585,12 @@ "magicDef": 30, "dragon": true }, - "8074": { - "name": "Blue dragon", - "hitpoints": 105, - "combatLevel": 111, - "slayerLevel": 1, - "attackLevel": 95, - "strengthLevel": 95, - "defenceLevel": 95, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 50, - "slashDef": 70, - "crushDef": 70, - "rangeDef": 50, - "magicDef": 60, - "dragon": true - }, "8075": { "name": "Red dragon", "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -32609,6 +35608,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -32621,28 +35621,12 @@ "magicDef": 30, "dragon": true }, - "8077": { - "name": "Blue dragon", - "hitpoints": 105, - "combatLevel": 111, - "slayerLevel": 1, - "attackLevel": 95, - "strengthLevel": 95, - "defenceLevel": 95, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 50, - "slashDef": 70, - "crushDef": 70, - "rangeDef": 50, - "magicDef": 60, - "dragon": true - }, "8078": { "name": "Red dragon", "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -32660,6 +35644,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -32677,6 +35662,7 @@ "hitpoints": 165, "combatLevel": 189, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 165, @@ -32694,6 +35680,7 @@ "hitpoints": 175, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 168, "defenceLevel": 168, @@ -32712,6 +35699,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -32729,6 +35717,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -32746,6 +35735,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -32763,6 +35753,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -32780,6 +35771,7 @@ "hitpoints": 210, "combatLevel": 246, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -32797,6 +35789,7 @@ "hitpoints": 285, "combatLevel": 289, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 310, "strengthLevel": 210, "defenceLevel": 198, @@ -32815,6 +35808,7 @@ "hitpoints": 254, "combatLevel": 304, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 268, "defenceLevel": 268, @@ -32833,6 +35827,7 @@ "hitpoints": 254, "combatLevel": 304, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 268, "defenceLevel": 268, @@ -32851,6 +35846,7 @@ "hitpoints": 295, "combatLevel": 338, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 280, "strengthLevel": 280, "defenceLevel": 272, @@ -32868,6 +35864,7 @@ "hitpoints": 330, "combatLevel": 380, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 284, "strengthLevel": 284, "defenceLevel": 276, @@ -32886,6 +35883,7 @@ "hitpoints": 315, "combatLevel": 318, "slayerLevel": 77, + "attackSpeed": 4, "attackLevel": 330, "strengthLevel": 210, "defenceLevel": 258, @@ -32905,6 +35903,7 @@ "hitpoints": 315, "combatLevel": 318, "slayerLevel": 77, + "attackSpeed": 4, "attackLevel": 330, "strengthLevel": 210, "defenceLevel": 258, @@ -32923,6 +35922,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -32946,6 +35946,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -32969,6 +35970,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -32992,6 +35994,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33015,6 +36018,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33039,6 +36043,7 @@ "hitpoints": 4, "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 47, "defenceLevel": 20, @@ -33060,6 +36065,7 @@ "hitpoints": 4, "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 47, "defenceLevel": 20, @@ -33080,6 +36086,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 36, + "attackSpeed": 7, "attackLevel": 27, "strengthLevel": 29, "defenceLevel": 21, @@ -33096,6 +36103,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -33112,6 +36120,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33135,6 +36144,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33158,6 +36168,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33181,6 +36192,7 @@ "name": "Growthling", "hitpoints": 10, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 38, "defenceLevel": 40, @@ -33194,6 +36206,7 @@ "hitpoints": 115, "combatLevel": 128, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 100, "defenceLevel": 100, @@ -33206,6 +36219,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -33218,6 +36232,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -33231,6 +36246,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33251,6 +36267,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33271,6 +36288,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33291,6 +36309,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33311,6 +36330,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33331,6 +36351,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33351,6 +36372,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33371,6 +36393,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33382,6 +36405,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33393,6 +36417,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33404,6 +36429,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33415,6 +36441,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33426,6 +36453,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33437,6 +36465,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33448,6 +36477,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33459,6 +36489,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33469,6 +36500,7 @@ "name": "Abomination", "hitpoints": 200, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -33484,6 +36516,7 @@ "name": "Abomination", "hitpoints": 200, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -33499,6 +36532,7 @@ "name": "Abomination", "hitpoints": 200, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -33514,6 +36548,7 @@ "name": "Swamp Crab", "hitpoints": 75, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -33528,6 +36563,7 @@ "name": "Swamp Crab", "hitpoints": 75, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -33542,6 +36578,7 @@ "name": "Swampy log", "hitpoints": 75, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -33557,6 +36594,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33568,6 +36606,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33579,6 +36618,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33590,6 +36630,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33601,6 +36642,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33612,6 +36654,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33623,6 +36666,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33634,38 +36678,18 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, "rangeLevel": 105, "magicLevel": 105 }, - "8338": { - "name": "Xarpus", - "hitpoints": 5080, - "combatLevel": 960, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 250, - "rangeLevel": 1, - "magicLevel": 220, - "rangeDef": 160 - }, - "8339": { - "name": "Xarpus", - "hitpoints": 5080, - "combatLevel": 960, - "attackLevel": 1, - "strengthLevel": 1, - "defenceLevel": 250, - "rangeLevel": 1, - "magicLevel": 220, - "rangeDef": 160 - }, "8340": { "name": "Xarpus", "hitpoints": 5080, "combatLevel": 960, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 250, @@ -33677,6 +36701,7 @@ "name": "Xarpus", "hitpoints": 5080, "combatLevel": 960, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 250, @@ -33688,6 +36713,7 @@ "name": "Nylocas Ischyros", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -33700,6 +36726,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -33712,6 +36739,7 @@ "name": "Nylocas Hagios", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -33724,6 +36752,7 @@ "name": "Nylocas Ischyros", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -33736,6 +36765,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -33748,6 +36778,7 @@ "name": "Nylocas Hagios", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -33760,6 +36791,7 @@ "name": "Nylocas Ischyros", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -33772,6 +36804,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -33784,6 +36817,7 @@ "name": "Nylocas Hagios", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -33796,6 +36830,7 @@ "name": "Nylocas Ischyros", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -33808,6 +36843,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -33820,6 +36856,7 @@ "name": "Nylocas Hagios", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -33832,6 +36869,7 @@ "name": "Nylocas Vasilias", "hitpoints": 2500, "combatLevel": 800, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 350, "defenceLevel": 50, @@ -33846,6 +36884,7 @@ "name": "Nylocas Vasilias", "hitpoints": 2500, "combatLevel": 800, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 350, "defenceLevel": 50, @@ -33860,6 +36899,7 @@ "name": "Nylocas Vasilias", "hitpoints": 2500, "combatLevel": 800, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 350, "defenceLevel": 50, @@ -33874,6 +36914,7 @@ "name": "Pestilent Bloat", "hitpoints": 2000, "combatLevel": 870, + "attackSpeed": 1, "attackLevel": 250, "strengthLevel": 340, "defenceLevel": 100, @@ -33894,6 +36935,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -33905,6 +36947,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -33916,6 +36959,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -33927,6 +36971,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -33938,6 +36983,7 @@ "name": "Nylocas Matomenos", "hitpoints": 200, "combatLevel": 115, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -33948,6 +36994,7 @@ "name": "Blood spawn", "hitpoints": 120, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "rangeLevel": 1 @@ -33956,6 +37003,7 @@ "name": "Verzik Vitur", "hitpoints": 2000, "combatLevel": 1040, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 20, @@ -33975,6 +37023,7 @@ "name": "Verzik Vitur", "hitpoints": 2000, "combatLevel": 1040, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 20, @@ -33994,6 +37043,7 @@ "name": "Verzik Vitur", "hitpoints": 2000, "combatLevel": 1040, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 20, @@ -34013,6 +37063,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1265, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 200, @@ -34032,6 +37083,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1265, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 200, @@ -34051,6 +37103,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1520, + "attackSpeed": 7, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 150, @@ -34072,6 +37125,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1520, + "attackSpeed": 7, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 150, @@ -34093,6 +37147,7 @@ "name": "Nylocas Ischyros", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34105,6 +37160,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34117,6 +37173,7 @@ "name": "Nylocas Hagios", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34129,6 +37186,7 @@ "name": "Nylocas Athanatos", "hitpoints": 180, "combatLevel": 350, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -34139,6 +37197,7 @@ "name": "Nylocas Matomenos", "hitpoints": 200, "combatLevel": 115, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34149,6 +37208,7 @@ "name": "Sotetseg", "hitpoints": 4000, "combatLevel": 995, + "attackSpeed": 5, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 200, @@ -34166,6 +37226,7 @@ "name": "Sotetseg", "hitpoints": 4000, "combatLevel": 995, + "attackSpeed": 5, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 200, @@ -34183,6 +37244,7 @@ "name": "Monk of Zamorak", "hitpoints": 20, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 22, @@ -34193,6 +37255,7 @@ "name": "Monk of Zamorak", "hitpoints": 10, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -34203,6 +37266,7 @@ "name": "Mother", "hitpoints": 235, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 170, @@ -34216,6 +37280,7 @@ "name": "Mother", "hitpoints": 235, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 170, @@ -34229,6 +37294,7 @@ "name": "Mother", "hitpoints": 235, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 170, @@ -34242,6 +37308,7 @@ "name": "Don't Know What", "hitpoints": 220, "combatLevel": 163, + "attackSpeed": 3, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 160, @@ -34250,16 +37317,72 @@ "magicDef": 200, "bonusRangeStrength": 40 }, + "8474": { + "name": "Black Guard", + "hitpoints": 40, + "combatLevel": 48, + "slayerLevel": 1, + "attackSpeed": 7, + "attackLevel": 40, + "strengthLevel": 45, + "defenceLevel": 45, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 40, + "slashDef": 40, + "crushDef": 40, + "rangeDef": 40, + "bonusAttack": 30, + "bonusStrength": 30 + }, + "8475": { + "name": "Black Guard", + "hitpoints": 40, + "combatLevel": 48, + "slayerLevel": 1, + "attackSpeed": 7, + "attackLevel": 40, + "strengthLevel": 45, + "defenceLevel": 45, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 40, + "slashDef": 40, + "crushDef": 40, + "rangeDef": 40, + "bonusAttack": 30, + "bonusStrength": 30 + }, + "8476": { + "name": "Black Guard", + "hitpoints": 40, + "combatLevel": 48, + "slayerLevel": 1, + "attackSpeed": 7, + "attackLevel": 40, + "strengthLevel": 45, + "defenceLevel": 45, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 40, + "slashDef": 40, + "crushDef": 40, + "rangeDef": 40, + "bonusAttack": 30, + "bonusStrength": 30 + }, "8496": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "8512": { "name": "Tormented Soul", "hitpoints": 20, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 16, "strengthLevel": 12, "defenceLevel": 10, @@ -34270,6 +37393,7 @@ "name": "Tormented Soul", "hitpoints": 20, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 16, "strengthLevel": 12, "defenceLevel": 10, @@ -34278,8 +37402,9 @@ }, "8514": { "name": "Trapped Soul", - "hitpoints": 22, + "hitpoints": 30, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 29, "defenceLevel": 20, @@ -34288,8 +37413,9 @@ }, "8528": { "name": "Trapped Soul", - "hitpoints": 22, + "hitpoints": 30, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 29, "defenceLevel": 20, @@ -34300,6 +37426,7 @@ "name": "Trapped Soul (hard)", "hitpoints": 100, "combatLevel": 101, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 20, @@ -34311,6 +37438,7 @@ "hitpoints": 60, "combatLevel": 62, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 53, "defenceLevel": 52, @@ -34328,6 +37456,7 @@ "hitpoints": 60, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -34345,6 +37474,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -34362,6 +37492,7 @@ "name": "Swamp frog", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 20, "defenceLevel": 15, @@ -34372,6 +37503,7 @@ "name": "Hespori", "hitpoints": 300, "combatLevel": 284, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 120, @@ -34394,6 +37526,7 @@ "hitpoints": 300, "combatLevel": 194, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -34410,6 +37543,7 @@ "hitpoints": 130, "combatLevel": 99, "slayerLevel": 62, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 60, "defenceLevel": 80, @@ -34429,6 +37563,7 @@ "hitpoints": 130, "combatLevel": 99, "slayerLevel": 62, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 60, "defenceLevel": 80, @@ -34448,6 +37583,7 @@ "hitpoints": 250, "combatLevel": 192, "slayerLevel": 84, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 118, "defenceLevel": 120, @@ -34469,6 +37605,7 @@ "hitpoints": 250, "combatLevel": 192, "slayerLevel": 84, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 118, "defenceLevel": 120, @@ -34490,6 +37627,7 @@ "hitpoints": 50, "combatLevel": 50, "slayerLevel": 44, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 45, "defenceLevel": 30, @@ -34505,6 +37643,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34526,6 +37665,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34547,6 +37687,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34568,6 +37709,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34589,6 +37731,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34610,6 +37753,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34631,6 +37775,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34652,6 +37797,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34667,5 +37813,99 @@ "bonusRangeStrength": 20, "bonusMagicDamage": 20, "dragon": true + }, + "8633": { + "name": "The Mimic", + "hitpoints": 230, + "combatLevel": 186, + "attackSpeed": 3, + "attackLevel": 185, + "strengthLevel": 120, + "defenceLevel": 120, + "rangeLevel": 1, + "magicLevel": 60, + "magic": 180, + "stabDef": 160, + "slashDef": 165, + "crushDef": 150, + "rangeDef": 145, + "magicDef": 30, + "bonusAttack": 135, + "bonusStrength": 48 + }, + "8635": { + "name": "Third Age Warrior", + "hitpoints": 40, + "combatLevel": 83, + "attackSpeed": 5, + "attackLevel": 90, + "strengthLevel": 75, + "defenceLevel": 80, + "rangeLevel": 1, + "magicLevel": 1, + "stabDef": 96, + "slashDef": 108, + "crushDef": 113, + "rangeDef": 97, + "bonusAttack": 105, + "bonusStrength": 75 + }, + "8636": { + "name": "Third Age Ranger", + "hitpoints": 40, + "combatLevel": 76, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 80, + "rangeLevel": 95, + "magicLevel": 1, + "range": 140, + "stabDef": 55, + "slashDef": 47, + "crushDef": 60, + "rangeDef": 55, + "magicDef": 60, + "bonusRangeStrength": 7 + }, + "8637": { + "name": "Third Age Mage", + "hitpoints": 40, + "combatLevel": 83, + "attackSpeed": 4, + "attackLevel": 1, + "strengthLevel": 1, + "defenceLevel": 80, + "rangeLevel": 1, + "magicLevel": 110, + "magic": 145, + "stabDef": 5, + "slashDef": 6, + "crushDef": 5, + "magicDef": 65, + "bonusMagicDamage": 24 + }, + "8678": { + "name": "Feral Vampyre", + "hitpoints": 50, + "combatLevel": 72, + "slayerLevel": 1, + "attackSpeed": 4, + "attackLevel": 65, + "strengthLevel": 70, + "defenceLevel": 65, + "rangeLevel": 1, + "magicLevel": 50 + }, + "8698": { + "name": "Monk of Zamorak", + "hitpoints": 16, + "combatLevel": 23, + "attackSpeed": 4, + "attackLevel": 15, + "strengthLevel": 13, + "defenceLevel": 18, + "rangeLevel": 1, + "magicLevel": 30 } } \ No newline at end of file diff --git a/RuneLitePlus/src/main/resources/runelite.png b/runelite-client/src/main/resources/runelite.png similarity index 100% rename from RuneLitePlus/src/main/resources/runelite.png rename to runelite-client/src/main/resources/runelite.png diff --git a/RuneLitePlus/src/main/resources/runelite_transparent.png b/runelite-client/src/main/resources/runelite_transparent.png similarity index 100% rename from RuneLitePlus/src/main/resources/runelite_transparent.png rename to runelite-client/src/main/resources/runelite_transparent.png diff --git a/RuneLitePlus/src/main/resources/runeliteplus.png b/runelite-client/src/main/resources/runeliteplus.png similarity index 100% rename from RuneLitePlus/src/main/resources/runeliteplus.png rename to runelite-client/src/main/resources/runeliteplus.png diff --git a/RuneLitePlus/src/main/resources/runeliteplus_transparent.png b/runelite-client/src/main/resources/runeliteplus_transparent.png similarity index 100% rename from RuneLitePlus/src/main/resources/runeliteplus_transparent.png rename to runelite-client/src/main/resources/runeliteplus_transparent.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/agility.png b/runelite-client/src/main/resources/skill_icons/agility.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/agility.png rename to runelite-client/src/main/resources/skill_icons/agility.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/attack.png b/runelite-client/src/main/resources/skill_icons/attack.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/attack.png rename to runelite-client/src/main/resources/skill_icons/attack.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/combat.png b/runelite-client/src/main/resources/skill_icons/combat.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/combat.png rename to runelite-client/src/main/resources/skill_icons/combat.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/construction.png b/runelite-client/src/main/resources/skill_icons/construction.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/construction.png rename to runelite-client/src/main/resources/skill_icons/construction.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/cooking.png b/runelite-client/src/main/resources/skill_icons/cooking.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/cooking.png rename to runelite-client/src/main/resources/skill_icons/cooking.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/crafting.png b/runelite-client/src/main/resources/skill_icons/crafting.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/crafting.png rename to runelite-client/src/main/resources/skill_icons/crafting.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/defence.png b/runelite-client/src/main/resources/skill_icons/defence.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/defence.png rename to runelite-client/src/main/resources/skill_icons/defence.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/farming.png b/runelite-client/src/main/resources/skill_icons/farming.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/farming.png rename to runelite-client/src/main/resources/skill_icons/farming.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/firemaking.png b/runelite-client/src/main/resources/skill_icons/firemaking.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/firemaking.png rename to runelite-client/src/main/resources/skill_icons/firemaking.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/fishing.png b/runelite-client/src/main/resources/skill_icons/fishing.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/fishing.png rename to runelite-client/src/main/resources/skill_icons/fishing.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/fletching.png b/runelite-client/src/main/resources/skill_icons/fletching.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/fletching.png rename to runelite-client/src/main/resources/skill_icons/fletching.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/herblore.png b/runelite-client/src/main/resources/skill_icons/herblore.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/herblore.png rename to runelite-client/src/main/resources/skill_icons/herblore.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/hitpoints.png b/runelite-client/src/main/resources/skill_icons/hitpoints.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/hitpoints.png rename to runelite-client/src/main/resources/skill_icons/hitpoints.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/hunter.png b/runelite-client/src/main/resources/skill_icons/hunter.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/hunter.png rename to runelite-client/src/main/resources/skill_icons/hunter.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/magic.png b/runelite-client/src/main/resources/skill_icons/magic.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/magic.png rename to runelite-client/src/main/resources/skill_icons/magic.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/mining.png b/runelite-client/src/main/resources/skill_icons/mining.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/mining.png rename to runelite-client/src/main/resources/skill_icons/mining.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/overall.png b/runelite-client/src/main/resources/skill_icons/overall.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/overall.png rename to runelite-client/src/main/resources/skill_icons/overall.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/prayer.png b/runelite-client/src/main/resources/skill_icons/prayer.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/prayer.png rename to runelite-client/src/main/resources/skill_icons/prayer.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/ranged.png b/runelite-client/src/main/resources/skill_icons/ranged.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/ranged.png rename to runelite-client/src/main/resources/skill_icons/ranged.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/runecraft.png b/runelite-client/src/main/resources/skill_icons/runecraft.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/runecraft.png rename to runelite-client/src/main/resources/skill_icons/runecraft.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/slayer.png b/runelite-client/src/main/resources/skill_icons/slayer.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/slayer.png rename to runelite-client/src/main/resources/skill_icons/slayer.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/smithing.png b/runelite-client/src/main/resources/skill_icons/smithing.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/smithing.png rename to runelite-client/src/main/resources/skill_icons/smithing.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/strength.png b/runelite-client/src/main/resources/skill_icons/strength.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/strength.png rename to runelite-client/src/main/resources/skill_icons/strength.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/thieving.png b/runelite-client/src/main/resources/skill_icons/thieving.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/thieving.png rename to runelite-client/src/main/resources/skill_icons/thieving.png diff --git a/RuneLitePlus/src/main/resources/skill_icons/woodcutting.png b/runelite-client/src/main/resources/skill_icons/woodcutting.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons/woodcutting.png rename to runelite-client/src/main/resources/skill_icons/woodcutting.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/agility.png b/runelite-client/src/main/resources/skill_icons_small/agility.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/agility.png rename to runelite-client/src/main/resources/skill_icons_small/agility.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/attack.png b/runelite-client/src/main/resources/skill_icons_small/attack.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/attack.png rename to runelite-client/src/main/resources/skill_icons_small/attack.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/bounty hunter - hunter.png b/runelite-client/src/main/resources/skill_icons_small/bounty hunter - hunter.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/bounty hunter - hunter.png rename to runelite-client/src/main/resources/skill_icons_small/bounty hunter - hunter.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/bounty hunter - rogue.png b/runelite-client/src/main/resources/skill_icons_small/bounty hunter - rogue.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/bounty hunter - rogue.png rename to runelite-client/src/main/resources/skill_icons_small/bounty hunter - rogue.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/clue scrolls (all).png b/runelite-client/src/main/resources/skill_icons_small/clue scrolls (all).png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/clue scrolls (all).png rename to runelite-client/src/main/resources/skill_icons_small/clue scrolls (all).png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/combat.png b/runelite-client/src/main/resources/skill_icons_small/combat.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/combat.png rename to runelite-client/src/main/resources/skill_icons_small/combat.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/construction.png b/runelite-client/src/main/resources/skill_icons_small/construction.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/construction.png rename to runelite-client/src/main/resources/skill_icons_small/construction.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/cooking.png b/runelite-client/src/main/resources/skill_icons_small/cooking.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/cooking.png rename to runelite-client/src/main/resources/skill_icons_small/cooking.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/crafting.png b/runelite-client/src/main/resources/skill_icons_small/crafting.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/crafting.png rename to runelite-client/src/main/resources/skill_icons_small/crafting.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/defence.png b/runelite-client/src/main/resources/skill_icons_small/defence.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/defence.png rename to runelite-client/src/main/resources/skill_icons_small/defence.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/farming.png b/runelite-client/src/main/resources/skill_icons_small/farming.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/farming.png rename to runelite-client/src/main/resources/skill_icons_small/farming.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/firemaking.png b/runelite-client/src/main/resources/skill_icons_small/firemaking.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/firemaking.png rename to runelite-client/src/main/resources/skill_icons_small/firemaking.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/fishing.png b/runelite-client/src/main/resources/skill_icons_small/fishing.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/fishing.png rename to runelite-client/src/main/resources/skill_icons_small/fishing.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/fletching.png b/runelite-client/src/main/resources/skill_icons_small/fletching.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/fletching.png rename to runelite-client/src/main/resources/skill_icons_small/fletching.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/herblore.png b/runelite-client/src/main/resources/skill_icons_small/herblore.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/herblore.png rename to runelite-client/src/main/resources/skill_icons_small/herblore.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/hitpoints.png b/runelite-client/src/main/resources/skill_icons_small/hitpoints.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/hitpoints.png rename to runelite-client/src/main/resources/skill_icons_small/hitpoints.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/hunter.png b/runelite-client/src/main/resources/skill_icons_small/hunter.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/hunter.png rename to runelite-client/src/main/resources/skill_icons_small/hunter.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/last man standing.png b/runelite-client/src/main/resources/skill_icons_small/last man standing.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/last man standing.png rename to runelite-client/src/main/resources/skill_icons_small/last man standing.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/magic.png b/runelite-client/src/main/resources/skill_icons_small/magic.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/magic.png rename to runelite-client/src/main/resources/skill_icons_small/magic.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/mining.png b/runelite-client/src/main/resources/skill_icons_small/mining.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/mining.png rename to runelite-client/src/main/resources/skill_icons_small/mining.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/overall.png b/runelite-client/src/main/resources/skill_icons_small/overall.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/overall.png rename to runelite-client/src/main/resources/skill_icons_small/overall.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/prayer.png b/runelite-client/src/main/resources/skill_icons_small/prayer.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/prayer.png rename to runelite-client/src/main/resources/skill_icons_small/prayer.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/ranged.png b/runelite-client/src/main/resources/skill_icons_small/ranged.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/ranged.png rename to runelite-client/src/main/resources/skill_icons_small/ranged.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/runecraft.png b/runelite-client/src/main/resources/skill_icons_small/runecraft.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/runecraft.png rename to runelite-client/src/main/resources/skill_icons_small/runecraft.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/slayer.png b/runelite-client/src/main/resources/skill_icons_small/slayer.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/slayer.png rename to runelite-client/src/main/resources/skill_icons_small/slayer.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/smithing.png b/runelite-client/src/main/resources/skill_icons_small/smithing.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/smithing.png rename to runelite-client/src/main/resources/skill_icons_small/smithing.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/strength.png b/runelite-client/src/main/resources/skill_icons_small/strength.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/strength.png rename to runelite-client/src/main/resources/skill_icons_small/strength.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/thieving.png b/runelite-client/src/main/resources/skill_icons_small/thieving.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/thieving.png rename to runelite-client/src/main/resources/skill_icons_small/thieving.png diff --git a/RuneLitePlus/src/main/resources/skill_icons_small/woodcutting.png b/runelite-client/src/main/resources/skill_icons_small/woodcutting.png similarity index 100% rename from RuneLitePlus/src/main/resources/skill_icons_small/woodcutting.png rename to runelite-client/src/main/resources/skill_icons_small/woodcutting.png diff --git a/RuneLitePlus/src/main/resources/slayer_xp.json b/runelite-client/src/main/resources/slayer_xp.json similarity index 100% rename from RuneLitePlus/src/main/resources/slayer_xp.json rename to runelite-client/src/main/resources/slayer_xp.json diff --git a/RuneLitePlus/src/main/resources/util/arrow_right.png b/runelite-client/src/main/resources/util/arrow_right.png similarity index 100% rename from RuneLitePlus/src/main/resources/util/arrow_right.png rename to runelite-client/src/main/resources/util/arrow_right.png diff --git a/RuneLitePlus/src/main/resources/util/clue_arrow.png b/runelite-client/src/main/resources/util/clue_arrow.png similarity index 100% rename from RuneLitePlus/src/main/resources/util/clue_arrow.png rename to runelite-client/src/main/resources/util/clue_arrow.png diff --git a/RuneLitePlus/src/main/resources/util/reset.png b/runelite-client/src/main/resources/util/reset.png similarity index 100% rename from RuneLitePlus/src/main/resources/util/reset.png rename to runelite-client/src/main/resources/util/reset.png diff --git a/RuneLitePlus/src/main/scripts/BankBuildTab.hash b/runelite-client/src/main/scripts/BankBuildTab.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/BankBuildTab.hash rename to runelite-client/src/main/scripts/BankBuildTab.hash diff --git a/RuneLitePlus/src/main/scripts/BankBuildTab.rs2asm b/runelite-client/src/main/scripts/BankBuildTab.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/BankBuildTab.rs2asm rename to runelite-client/src/main/scripts/BankBuildTab.rs2asm diff --git a/RuneLitePlus/src/main/scripts/BankLayoutTabSeparator.hash b/runelite-client/src/main/scripts/BankLayoutTabSeparator.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/BankLayoutTabSeparator.hash rename to runelite-client/src/main/scripts/BankLayoutTabSeparator.hash diff --git a/RuneLitePlus/src/main/scripts/BankLayoutTabSeparator.rs2asm b/runelite-client/src/main/scripts/BankLayoutTabSeparator.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/BankLayoutTabSeparator.rs2asm rename to runelite-client/src/main/scripts/BankLayoutTabSeparator.rs2asm diff --git a/RuneLitePlus/src/main/scripts/BankSearchFilter.hash b/runelite-client/src/main/scripts/BankSearchFilter.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/BankSearchFilter.hash rename to runelite-client/src/main/scripts/BankSearchFilter.hash diff --git a/RuneLitePlus/src/main/scripts/BankSearchFilter.rs2asm b/runelite-client/src/main/scripts/BankSearchFilter.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/BankSearchFilter.rs2asm rename to runelite-client/src/main/scripts/BankSearchFilter.rs2asm diff --git a/RuneLitePlus/src/main/scripts/BankSearchLayout.hash b/runelite-client/src/main/scripts/BankSearchLayout.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/BankSearchLayout.hash rename to runelite-client/src/main/scripts/BankSearchLayout.hash diff --git a/RuneLitePlus/src/main/scripts/BankSearchLayout.rs2asm b/runelite-client/src/main/scripts/BankSearchLayout.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/BankSearchLayout.rs2asm rename to runelite-client/src/main/scripts/BankSearchLayout.rs2asm diff --git a/RuneLitePlus/src/main/scripts/ChatBuilder.hash b/runelite-client/src/main/scripts/ChatBuilder.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatBuilder.hash rename to runelite-client/src/main/scripts/ChatBuilder.hash diff --git a/RuneLitePlus/src/main/scripts/ChatBuilder.rs2asm b/runelite-client/src/main/scripts/ChatBuilder.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatBuilder.rs2asm rename to runelite-client/src/main/scripts/ChatBuilder.rs2asm diff --git a/RuneLitePlus/src/main/scripts/ChatSplitBuilder.hash b/runelite-client/src/main/scripts/ChatSplitBuilder.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatSplitBuilder.hash rename to runelite-client/src/main/scripts/ChatSplitBuilder.hash diff --git a/RuneLitePlus/src/main/scripts/ChatSplitBuilder.rs2asm b/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatSplitBuilder.rs2asm rename to runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm diff --git a/RuneLitePlus/src/main/scripts/ChatboxInput.hash b/runelite-client/src/main/scripts/ChatboxInput.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatboxInput.hash rename to runelite-client/src/main/scripts/ChatboxInput.hash diff --git a/RuneLitePlus/src/main/scripts/ChatboxInput.rs2asm b/runelite-client/src/main/scripts/ChatboxInput.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatboxInput.rs2asm rename to runelite-client/src/main/scripts/ChatboxInput.rs2asm diff --git a/RuneLitePlus/src/main/scripts/ChatboxInputWidgetBuilder.hash b/runelite-client/src/main/scripts/ChatboxInputWidgetBuilder.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatboxInputWidgetBuilder.hash rename to runelite-client/src/main/scripts/ChatboxInputWidgetBuilder.hash diff --git a/RuneLitePlus/src/main/scripts/ChatboxInputWidgetBuilder.rs2asm b/runelite-client/src/main/scripts/ChatboxInputWidgetBuilder.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/ChatboxInputWidgetBuilder.rs2asm rename to runelite-client/src/main/scripts/ChatboxInputWidgetBuilder.rs2asm diff --git a/RuneLitePlus/src/main/scripts/CombatInterfaceSP.hash b/runelite-client/src/main/scripts/CombatInterfaceSP.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/CombatInterfaceSP.hash rename to runelite-client/src/main/scripts/CombatInterfaceSP.hash diff --git a/RuneLitePlus/src/main/scripts/CombatInterfaceSP.rs2asm b/runelite-client/src/main/scripts/CombatInterfaceSP.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/CombatInterfaceSP.rs2asm rename to runelite-client/src/main/scripts/CombatInterfaceSP.rs2asm diff --git a/RuneLitePlus/src/main/scripts/CommandScript.hash b/runelite-client/src/main/scripts/CommandScript.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/CommandScript.hash rename to runelite-client/src/main/scripts/CommandScript.hash diff --git a/RuneLitePlus/src/main/scripts/CommandScript.rs2asm b/runelite-client/src/main/scripts/CommandScript.rs2asm similarity index 97% rename from RuneLitePlus/src/main/scripts/CommandScript.rs2asm rename to runelite-client/src/main/scripts/CommandScript.rs2asm index 0916a66d4a..930256d55e 100644 --- a/RuneLitePlus/src/main/scripts/CommandScript.rs2asm +++ b/runelite-client/src/main/scripts/CommandScript.rs2asm @@ -322,8 +322,11 @@ LABEL241: iconst 0 ; sconst "blockChatInput" ; runelite_callback ; - if_icmpeq LABEL247 ; don't add to input varcstr + if_icmpeq SKIPSETVARC ; skip setting varc with input set_varc_string 335 + jump LABEL247 ; jump over SKIPSETVARC +SKIPSETVARC: + pop_string ; pop message LABEL247: invoke 223 return diff --git a/RuneLitePlus/src/main/scripts/CustomJoinClan.rs2asm b/runelite-client/src/main/scripts/CustomJoinClan.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/CustomJoinClan.rs2asm rename to runelite-client/src/main/scripts/CustomJoinClan.rs2asm diff --git a/RuneLitePlus/src/main/scripts/DeathKeepBuildScript.hash b/runelite-client/src/main/scripts/DeathkeepBuild.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/DeathKeepBuildScript.hash rename to runelite-client/src/main/scripts/DeathkeepBuild.hash diff --git a/RuneLitePlus/src/main/scripts/DeathKeepBuildScript.rs2asm b/runelite-client/src/main/scripts/DeathkeepBuild.rs2asm similarity index 64% rename from RuneLitePlus/src/main/scripts/DeathKeepBuildScript.rs2asm rename to runelite-client/src/main/scripts/DeathkeepBuild.rs2asm index 520f2c7e9e..75ade43db2 100644 --- a/RuneLitePlus/src/main/scripts/DeathKeepBuildScript.rs2asm +++ b/runelite-client/src/main/scripts/DeathkeepBuild.rs2asm @@ -1,11 +1,15 @@ .id 1601 .int_stack_count 4 .string_stack_count 2 -.int_var_count 13 +.int_var_count 14 .string_var_count 3 +; callback "itemsKeptOnDeath" +; Used by the ItemsKepthOnDeath plugin to edit the interface +; Put a rune pouch in your inventory and it shouldn't have a white outline +; in the Items kept on death screen sload 1 iconst 262167 - if_settext + if_settext iconst 0 istore 4 iconst 0 @@ -22,392 +26,400 @@ istore 9 iconst 0 istore 10 + iconst 0 + istore 11 iload 1 define_array 111 iconst 0 - istore 11 - iconst 0 istore 12 + iconst 0 + istore 13 iload 0 iconst 0 - if_icmpeq LABEL29 - jump LABEL517 -LABEL29: + if_icmpeq LABEL31 + jump LABEL525 +LABEL31: iconst 93 iconst 13190 - inv_total + inv_total iconst 0 - if_icmpgt LABEL40 + if_icmpgt LABEL42 iconst 93 iconst 13192 - inv_total + inv_total iconst 0 - if_icmpgt LABEL40 - jump LABEL42 -LABEL40: + if_icmpgt LABEL42 + jump LABEL44 +LABEL42: iconst 1 istore 9 -LABEL42: +LABEL44: iload 10 iload 1 - if_icmplt LABEL46 - jump LABEL82 -LABEL46: + if_icmplt LABEL48 + jump LABEL88 +LABEL48: iconst 584 - iload 10 - inv_getobj + iload 11 + inv_getobj istore 6 iload 6 iconst -1 - if_icmpne LABEL54 - jump LABEL79 -LABEL54: + if_icmpne LABEL56 + jump LABEL85 +LABEL56: iconst 584 - iload 10 - inv_getnum + iload 11 + inv_getnum istore 7 -LABEL58: +LABEL60: iload 10 iload 1 - if_icmplt LABEL62 - jump LABEL78 -LABEL62: + if_icmplt LABEL64 + jump LABEL80 +LABEL64: iload 7 iconst 0 - if_icmpgt LABEL66 - jump LABEL78 -LABEL66: + if_icmpgt LABEL68 + jump LABEL80 +LABEL68: iload 10 iload 6 - set_array_int + set_array_int iload 7 iconst 1 - sub + sub istore 7 iload 10 iconst 1 - add + add istore 10 - jump LABEL58 -LABEL78: - jump LABEL81 -LABEL79: + jump LABEL60 +LABEL80: + iload 11 + iconst 1 + add + istore 11 + jump LABEL87 +LABEL85: iload 1 istore 10 -LABEL81: - jump LABEL42 -LABEL82: +LABEL87: + jump LABEL44 +LABEL88: iload 4 iload 1 - if_icmplt LABEL86 - jump LABEL141 -LABEL86: + if_icmplt LABEL92 + jump LABEL147 +LABEL92: iconst 262162 iconst 5 iload 4 - cc_create + cc_create iconst 36 iconst 32 iconst 0 iconst 0 - cc_setsize + cc_setsize iconst 5 iload 4 iconst 40 - multiply - add + multiply + add iconst 25 iconst 0 iconst 0 - cc_setposition + cc_setposition iload 4 - get_array_int + get_array_int istore 6 iload 6 iconst -1 - if_icmpne LABEL111 - jump LABEL138 -LABEL111: + if_icmpne LABEL117 + jump LABEL144 +LABEL117: iload 6 iconst 1 - 1200 + cc_setobject sconst "" iload 6 - oc_name - join_string 2 - cc_setopbase + oc_name + join_string 2 + cc_setopbase iconst 1 sconst "Item:" - cc_setop + cc_setop iconst 1603 iconst 1 iconst 1 iload 6 - oc_name + oc_name sconst "1is" - cc_setonop + cc_setonop iconst 1118481 - cc_setgraphicshadow + cc_setgraphicshadow iconst 1 - cc_setoutline + cc_setoutline iload 4 iconst 1 - add + add istore 4 - jump LABEL140 -LABEL138: + jump LABEL146 +LABEL144: iload 1 istore 4 -LABEL140: - jump LABEL82 -LABEL141: +LABEL146: + jump LABEL88 +LABEL147: iconst 0 istore 4 -LABEL143: +LABEL149: iload 4 iconst 468 - inv_size - if_icmplt LABEL148 - jump LABEL342 -LABEL148: + inv_size + if_icmplt LABEL154 + jump LABEL350 +LABEL154: iconst 468 iload 4 - inv_getobj + inv_getobj istore 6 iload 6 iconst -1 - if_icmpne LABEL156 - jump LABEL337 -LABEL156: + if_icmpne LABEL162 + jump LABEL345 +LABEL162: iconst 262165 iconst 5 iload 5 - cc_create + cc_create iconst 36 iconst 32 iconst 0 iconst 0 - cc_setsize + cc_setsize iconst 5 iload 5 iconst 8 - mod + mod iconst 38 - multiply - add + multiply + add iconst 25 iconst 38 iload 5 iconst 8 - div - multiply - add + div + multiply + add iconst 0 iconst 0 - cc_setposition + cc_setposition iload 6 iconst 468 iload 4 - inv_getnum - 1200 + inv_getnum + cc_setobject sconst "" iload 6 - oc_name - join_string 2 - cc_setopbase + oc_name + join_string 2 + cc_setopbase iconst 1 sconst "Item:" - cc_setop + cc_setop iconst 1603 iconst 0 iconst 468 iload 4 - inv_getnum + inv_getnum iload 6 - oc_name + oc_name sconst "1is" - cc_setonop + cc_setonop iconst 1118481 - cc_setgraphicshadow + cc_setgraphicshadow iconst 111 iconst 49 iconst 879 iload 6 - enum + oc_uncert + enum iconst 1 - if_icmpeq LABEL214 - jump LABEL219 -LABEL214: + if_icmpeq LABEL221 + jump LABEL226 +LABEL221: iconst 2 - cc_setoutline + cc_setoutline iconst 1 istore 8 - jump LABEL221 -LABEL219: + jump LABEL228 +LABEL226: iconst 1 - cc_setoutline -LABEL221: + cc_setoutline +LABEL228: iload 5 iconst 1 - add + add istore 5 iload 6 - oc_stackable + oc_stackable iconst 1 - if_icmpeq LABEL230 - jump LABEL337 -LABEL230: + if_icmpeq LABEL237 + jump LABEL345 +LABEL237: iconst 0 istore 10 iconst 0 - istore 12 -LABEL234: + istore 13 +LABEL241: iload 10 iload 1 - if_icmplt LABEL238 - jump LABEL252 -LABEL238: + if_icmplt LABEL245 + jump LABEL259 +LABEL245: iload 10 - get_array_int + get_array_int iload 6 - if_icmpeq LABEL243 - jump LABEL247 -LABEL243: - iload 12 + if_icmpeq LABEL250 + jump LABEL254 +LABEL250: + iload 13 iconst 1 - add - istore 12 -LABEL247: + add + istore 13 +LABEL254: iload 10 iconst 1 - add + add istore 10 - jump LABEL234 -LABEL252: + jump LABEL241 +LABEL259: iconst 2147483647 iconst 94 iload 6 - inv_total - sub + inv_total + sub iconst 93 iload 6 - inv_total - sub + inv_total + sub + iload 13 + add + istore 12 + iconst 0 + iload 12 + sub + istore 12 iload 12 - add - istore 11 iconst 0 - iload 11 - sub - istore 11 - iload 11 - iconst 0 - if_icmpgt LABEL272 - jump LABEL337 -LABEL272: + if_icmpgt LABEL279 + jump LABEL345 +LABEL279: iconst 262165 iconst 5 iload 5 - cc_create + cc_create iconst 36 iconst 32 iconst 0 iconst 0 - cc_setsize + cc_setsize iconst 5 iload 5 iconst 8 - mod + mod iconst 38 - multiply - add + multiply + add iconst 25 iconst 38 iload 5 iconst 8 - div - multiply - add + div + multiply + add iconst 0 iconst 0 - cc_setposition + cc_setposition iload 6 - iload 11 - 1200 + iload 12 + cc_setobject sconst "" iload 6 - oc_name - join_string 2 - cc_setopbase + oc_name + join_string 2 + cc_setopbase iconst 1 sconst "Item:" - cc_setop + cc_setop iconst 1603 iconst 0 - iload 11 + iload 12 iload 6 - oc_name + oc_name sconst "1is" - cc_setonop + cc_setonop iconst 1118481 - cc_setgraphicshadow + cc_setgraphicshadow iconst 111 iconst 49 iconst 879 iload 6 - enum + oc_uncert + enum iconst 1 - if_icmpeq LABEL326 - jump LABEL331 -LABEL326: + if_icmpeq LABEL334 + jump LABEL339 +LABEL334: iconst 2 - cc_setoutline + cc_setoutline iconst 1 istore 8 - jump LABEL333 -LABEL331: + jump LABEL341 +LABEL339: iconst 1 - cc_setoutline -LABEL333: + cc_setoutline +LABEL341: iload 5 iconst 1 - add + add istore 5 -LABEL337: +LABEL345: iload 4 iconst 1 - add + add istore 4 - jump LABEL143 -LABEL342: + jump LABEL149 +LABEL350: sconst "The normal amount of items kept is " sconst "three" sconst "." sconst "
    " sconst "
    " - join_string 5 + join_string 5 sstore 2 iload 3 iconst 1 - if_icmpeq LABEL353 - jump LABEL363 -LABEL353: + if_icmpeq LABEL361 + jump LABEL371 +LABEL361: sload 2 sconst "You're an " sconst "" sconst "Ultimate Iron Man" sconst "" sconst ", so you will always keep zero items." - join_string 5 - append + join_string 5 + append sstore 2 - jump LABEL426 -LABEL363: + jump LABEL434 +LABEL371: iload 1 iconst 0 - if_icmpeq LABEL367 - jump LABEL379 -LABEL367: + if_icmpeq LABEL375 + jump LABEL387 +LABEL375: sload 2 sconst "You're marked with a " sconst "" @@ -416,16 +428,16 @@ LABEL367: sconst ". This reduces the items you keep from " sconst "three" sconst " to zero!" - join_string 7 - append + join_string 7 + append sstore 2 - jump LABEL426 -LABEL379: + jump LABEL434 +LABEL387: iload 1 iconst 1 - if_icmpeq LABEL383 - jump LABEL402 -LABEL383: + if_icmpeq LABEL391 + jump LABEL410 +LABEL391: sload 2 sconst "You're marked with a " sconst "" @@ -441,57 +453,57 @@ LABEL383: sconst "Protect Items" sconst "" sconst " prayer active, which saves you one extra item!" - join_string 14 - append + join_string 14 + append sstore 2 - jump LABEL426 -LABEL402: + jump LABEL434 +LABEL410: iload 1 iconst 3 - if_icmpeq LABEL406 - jump LABEL411 -LABEL406: + if_icmpeq LABEL414 + jump LABEL419 +LABEL414: sload 2 sconst "You have no factors affecting the items you keep." - append + append sstore 2 - jump LABEL426 -LABEL411: + jump LABEL434 +LABEL419: iload 1 iconst 3 iconst 1 - add - if_icmpeq LABEL417 - jump LABEL426 -LABEL417: + add + if_icmpeq LABEL425 + jump LABEL434 +LABEL425: sload 2 sconst "You have the " sconst "" sconst "Protect Items" sconst "" sconst " prayer active, which saves you one extra item!" - join_string 5 - append + join_string 5 + append sstore 2 -LABEL426: +LABEL434: iload 8 iconst 1 - if_icmpeq LABEL433 - iload 9 - iconst 1 - if_icmpeq LABEL433 - jump LABEL484 -LABEL433: - iload 8 - iconst 1 - if_icmpeq LABEL437 - jump LABEL458 -LABEL437: + if_icmpeq LABEL441 iload 9 iconst 1 if_icmpeq LABEL441 - jump LABEL458 + jump LABEL492 LABEL441: + iload 8 + iconst 1 + if_icmpeq LABEL445 + jump LABEL466 +LABEL445: + iload 9 + iconst 1 + if_icmpeq LABEL449 + jump LABEL466 +LABEL449: sload 2 sconst "
    " sconst "
    " @@ -505,16 +517,16 @@ LABEL441: sconst "Bonds" sconst "" sconst " are always protected." - join_string 12 - append + join_string 12 + append sstore 2 - jump LABEL484 -LABEL458: + jump LABEL492 +LABEL466: iload 8 iconst 1 - if_icmpeq LABEL462 - jump LABEL474 -LABEL462: + if_icmpeq LABEL470 + jump LABEL482 +LABEL470: sload 2 sconst "
    " sconst "
    " @@ -523,11 +535,11 @@ LABEL462: sconst "white outline" sconst "" sconst " will always be lost." - join_string 7 - append + join_string 7 + append sstore 2 - jump LABEL484 -LABEL474: + jump LABEL492 +LABEL482: sload 2 sconst "
    " sconst "
    " @@ -535,13 +547,13 @@ LABEL474: sconst "Bonds" sconst "" sconst " are always protected, so are not shown here." - join_string 6 - append + join_string 6 + append sstore 2 -LABEL484: +LABEL492: sload 2 iconst 262173 - if_settext + if_settext sconst "" sconst "Max items kept on death :" sconst "
    " @@ -549,51 +561,51 @@ LABEL484: sconst "" sconst "~ " iload 1 - tostring + tostring sconst " ~" - join_string 8 + join_string 8 iconst 262174 - if_settext + if_settext iload 2 iconst 0 - if_icmpgt LABEL503 - jump LABEL510 -LABEL503: + if_icmpgt LABEL511 + jump LABEL518 +LABEL511: sconst "Items you will keep on death:" iconst 262161 - if_settext + if_settext sconst "Items you will lose on death:" iconst 262164 - if_settext - jump LABEL516 -LABEL510: + if_settext + jump LABEL524 +LABEL518: sconst "Items you will keep on death if not skulled:" iconst 262161 - if_settext + if_settext sconst "Items you will lose on death if not skulled:" iconst 262164 - if_settext -LABEL516: - jump LABEL557 -LABEL517: + if_settext +LABEL524: + jump LABEL565 +LABEL525: iconst 1 iconst 262165 - if_sethide + if_sethide iconst 1 iconst 262162 - if_sethide + if_sethide iconst 0 iconst 262175 - if_sethide + if_sethide sload 0 iconst 262176 - if_settext + if_settext sconst "The normal amount of items kept is " sconst "three" sconst "." sconst "
    " sconst "
    " - join_string 5 + join_string 5 sstore 2 sload 2 sconst "You're in a " @@ -601,22 +613,22 @@ LABEL517: sconst "safe area" sconst "" sconst ". See information to the left for a more detailed description." - join_string 5 - append + join_string 5 + append sstore 2 sload 2 iconst 262173 - if_settext + if_settext sconst "" sconst "Max items kept on death :" sconst "
    " sconst "
    " sconst "" sconst "All items!" - join_string 6 + join_string 6 iconst 262174 - if_settext -LABEL557: - sconst "deathKeepBuild" ; push event name + if_settext +LABEL565: + sconst "itemsKeptOnDeath" ; push event name runelite_callback ; invoke callback - return + return diff --git a/RuneLitePlus/src/main/scripts/DestroyOnOpKey.hash b/runelite-client/src/main/scripts/DestroyOnOpKey.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/DestroyOnOpKey.hash rename to runelite-client/src/main/scripts/DestroyOnOpKey.hash diff --git a/RuneLitePlus/src/main/scripts/DestroyOnOpKey.rs2asm b/runelite-client/src/main/scripts/DestroyOnOpKey.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/DestroyOnOpKey.rs2asm rename to runelite-client/src/main/scripts/DestroyOnOpKey.rs2asm diff --git a/RuneLitePlus/src/main/scripts/FakeXPDrops.hash b/runelite-client/src/main/scripts/FakeXPDrops.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/FakeXPDrops.hash rename to runelite-client/src/main/scripts/FakeXPDrops.hash diff --git a/RuneLitePlus/src/main/scripts/FakeXPDrops.rs2asm b/runelite-client/src/main/scripts/FakeXPDrops.rs2asm similarity index 99% rename from RuneLitePlus/src/main/scripts/FakeXPDrops.rs2asm rename to runelite-client/src/main/scripts/FakeXPDrops.rs2asm index 212034768a..0a61b8b13a 100644 --- a/RuneLitePlus/src/main/scripts/FakeXPDrops.rs2asm +++ b/runelite-client/src/main/scripts/FakeXPDrops.rs2asm @@ -7,6 +7,8 @@ iload 1 sconst "fakeXpDrop" runelite_callback ; + pop_int + pop_int iconst 105 iconst 83 iconst 681 diff --git a/RuneLitePlus/src/main/scripts/GEOffersSetupInit.hash b/runelite-client/src/main/scripts/GEOffersSetupInit.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/GEOffersSetupInit.hash rename to runelite-client/src/main/scripts/GEOffersSetupInit.hash diff --git a/RuneLitePlus/src/main/scripts/GEOffersSetupInit.rs2asm b/runelite-client/src/main/scripts/GEOffersSetupInit.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/GEOffersSetupInit.rs2asm rename to runelite-client/src/main/scripts/GEOffersSetupInit.rs2asm diff --git a/RuneLitePlus/src/main/scripts/MagicSpellBookRedraw.hash b/runelite-client/src/main/scripts/MagicSpellBookRedraw.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/MagicSpellBookRedraw.hash rename to runelite-client/src/main/scripts/MagicSpellBookRedraw.hash diff --git a/RuneLitePlus/src/main/scripts/MagicSpellBookRedraw.rs2asm b/runelite-client/src/main/scripts/MagicSpellBookRedraw.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/MagicSpellBookRedraw.rs2asm rename to runelite-client/src/main/scripts/MagicSpellBookRedraw.rs2asm diff --git a/RuneLitePlus/src/main/scripts/OpenBankSearchInput.hash b/runelite-client/src/main/scripts/OpenBankSearchInput.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/OpenBankSearchInput.hash rename to runelite-client/src/main/scripts/OpenBankSearchInput.hash diff --git a/RuneLitePlus/src/main/scripts/OpenBankSearchInput.rs2asm b/runelite-client/src/main/scripts/OpenBankSearchInput.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/OpenBankSearchInput.rs2asm rename to runelite-client/src/main/scripts/OpenBankSearchInput.rs2asm diff --git a/RuneLitePlus/src/main/scripts/OptionsPanelRebuilder.hash b/runelite-client/src/main/scripts/OptionsPanelRebuilder.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/OptionsPanelRebuilder.hash rename to runelite-client/src/main/scripts/OptionsPanelRebuilder.hash diff --git a/RuneLitePlus/src/main/scripts/OptionsPanelRebuilder.rs2asm b/runelite-client/src/main/scripts/OptionsPanelRebuilder.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/OptionsPanelRebuilder.rs2asm rename to runelite-client/src/main/scripts/OptionsPanelRebuilder.rs2asm diff --git a/RuneLitePlus/src/main/scripts/OptionsPanelZoomMouseListener.hash b/runelite-client/src/main/scripts/OptionsPanelZoomMouseListener.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/OptionsPanelZoomMouseListener.hash rename to runelite-client/src/main/scripts/OptionsPanelZoomMouseListener.hash diff --git a/RuneLitePlus/src/main/scripts/OptionsPanelZoomMouseListener.rs2asm b/runelite-client/src/main/scripts/OptionsPanelZoomMouseListener.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/OptionsPanelZoomMouseListener.rs2asm rename to runelite-client/src/main/scripts/OptionsPanelZoomMouseListener.rs2asm diff --git a/RuneLitePlus/src/main/scripts/OptionsPanelZoomUpdater.hash b/runelite-client/src/main/scripts/OptionsPanelZoomUpdater.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/OptionsPanelZoomUpdater.hash rename to runelite-client/src/main/scripts/OptionsPanelZoomUpdater.hash diff --git a/RuneLitePlus/src/main/scripts/OptionsPanelZoomUpdater.rs2asm b/runelite-client/src/main/scripts/OptionsPanelZoomUpdater.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/OptionsPanelZoomUpdater.rs2asm rename to runelite-client/src/main/scripts/OptionsPanelZoomUpdater.rs2asm diff --git a/RuneLitePlus/src/main/scripts/PrivateMessage.hash b/runelite-client/src/main/scripts/PrivateMessage.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/PrivateMessage.hash rename to runelite-client/src/main/scripts/PrivateMessage.hash diff --git a/RuneLitePlus/src/main/scripts/PrivateMessage.rs2asm b/runelite-client/src/main/scripts/PrivateMessage.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/PrivateMessage.rs2asm rename to runelite-client/src/main/scripts/PrivateMessage.rs2asm diff --git a/RuneLitePlus/src/main/scripts/PvpWidgetBuilder.hash b/runelite-client/src/main/scripts/PvpWidgetBuilder.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/PvpWidgetBuilder.hash rename to runelite-client/src/main/scripts/PvpWidgetBuilder.hash diff --git a/RuneLitePlus/src/main/scripts/PvpWidgetBuilder.rs2asm b/runelite-client/src/main/scripts/PvpWidgetBuilder.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/PvpWidgetBuilder.rs2asm rename to runelite-client/src/main/scripts/PvpWidgetBuilder.rs2asm diff --git a/RuneLitePlus/src/main/scripts/QuestListShowProgress.hash b/runelite-client/src/main/scripts/QuestListShowProgress.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/QuestListShowProgress.hash rename to runelite-client/src/main/scripts/QuestListShowProgress.hash diff --git a/RuneLitePlus/src/main/scripts/QuestListShowProgress.rs2asm b/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/QuestListShowProgress.rs2asm rename to runelite-client/src/main/scripts/QuestListShowProgress.rs2asm diff --git a/RuneLitePlus/src/main/scripts/ResetChatboxInput.hash b/runelite-client/src/main/scripts/ResetChatboxInput.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/ResetChatboxInput.hash rename to runelite-client/src/main/scripts/ResetChatboxInput.hash diff --git a/RuneLitePlus/src/main/scripts/ResetChatboxInput.rs2asm b/runelite-client/src/main/scripts/ResetChatboxInput.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/ResetChatboxInput.rs2asm rename to runelite-client/src/main/scripts/ResetChatboxInput.rs2asm diff --git a/RuneLitePlus/src/main/scripts/ScrollWheelZoomHandler.hash b/runelite-client/src/main/scripts/ScrollWheelZoomHandler.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/ScrollWheelZoomHandler.hash rename to runelite-client/src/main/scripts/ScrollWheelZoomHandler.hash diff --git a/RuneLitePlus/src/main/scripts/ScrollWheelZoomHandler.rs2asm b/runelite-client/src/main/scripts/ScrollWheelZoomHandler.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/ScrollWheelZoomHandler.rs2asm rename to runelite-client/src/main/scripts/ScrollWheelZoomHandler.rs2asm diff --git a/RuneLitePlus/src/main/scripts/SendPrivateMessage.rs2asm b/runelite-client/src/main/scripts/SendPrivateMessage.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/SendPrivateMessage.rs2asm rename to runelite-client/src/main/scripts/SendPrivateMessage.rs2asm diff --git a/RuneLitePlus/src/main/scripts/SkillTabBuilder.hash b/runelite-client/src/main/scripts/SkillTabBuilder.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/SkillTabBuilder.hash rename to runelite-client/src/main/scripts/SkillTabBuilder.hash diff --git a/RuneLitePlus/src/main/scripts/SkillTabBuilder.rs2asm b/runelite-client/src/main/scripts/SkillTabBuilder.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/SkillTabBuilder.rs2asm rename to runelite-client/src/main/scripts/SkillTabBuilder.rs2asm diff --git a/RuneLitePlus/src/main/scripts/SkillTabTotalLevel.hash b/runelite-client/src/main/scripts/SkillTabTotalLevel.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/SkillTabTotalLevel.hash rename to runelite-client/src/main/scripts/SkillTabTotalLevel.hash diff --git a/RuneLitePlus/src/main/scripts/SkillTabTotalLevel.rs2asm b/runelite-client/src/main/scripts/SkillTabTotalLevel.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/SkillTabTotalLevel.rs2asm rename to runelite-client/src/main/scripts/SkillTabTotalLevel.rs2asm diff --git a/RuneLitePlus/src/main/scripts/SpecbarRedraw.hash b/runelite-client/src/main/scripts/SpecbarRedraw.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/SpecbarRedraw.hash rename to runelite-client/src/main/scripts/SpecbarRedraw.hash diff --git a/RuneLitePlus/src/main/scripts/SpecbarRedraw.rs2asm b/runelite-client/src/main/scripts/SpecbarRedraw.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/SpecbarRedraw.rs2asm rename to runelite-client/src/main/scripts/SpecbarRedraw.rs2asm diff --git a/RuneLitePlus/src/main/scripts/TriggerBankLayout.hash b/runelite-client/src/main/scripts/TriggerBankLayout.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/TriggerBankLayout.hash rename to runelite-client/src/main/scripts/TriggerBankLayout.hash diff --git a/RuneLitePlus/src/main/scripts/TriggerBankLayout.rs2asm b/runelite-client/src/main/scripts/TriggerBankLayout.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/TriggerBankLayout.rs2asm rename to runelite-client/src/main/scripts/TriggerBankLayout.rs2asm diff --git a/runelite-client/src/main/scripts/UpdateBankPin.hash b/runelite-client/src/main/scripts/UpdateBankPin.hash new file mode 100644 index 0000000000..92d8396619 --- /dev/null +++ b/runelite-client/src/main/scripts/UpdateBankPin.hash @@ -0,0 +1 @@ +2A73E4C408881BB0EBDDE9BB05910C55F0313FA90BA907B722859E0183A713E7 \ No newline at end of file diff --git a/runelite-client/src/main/scripts/UpdateBankPin.rs2asm b/runelite-client/src/main/scripts/UpdateBankPin.rs2asm new file mode 100644 index 0000000000..0bb6001cfd --- /dev/null +++ b/runelite-client/src/main/scripts/UpdateBankPin.rs2asm @@ -0,0 +1,492 @@ +.id 653 +.int_stack_count 19 +.string_stack_count 0 +.int_var_count 22 +.string_var_count 0 + iload 0 + sconst "bankpin" + runelite_callback + iconst 3 + if_icmpeq LABEL4 + jump LABEL20 +LABEL4: + sconst "Finally, the FOURTH digit." + iload 18 + if_settext + sconst "*" + iload 14 + if_settext + sconst "*" + iload 15 + if_settext + sconst "*" + iload 16 + if_settext + sconst "?" + iload 17 + if_settext + jump LABEL128 +LABEL20: + iload 0 + iconst 2 + if_icmpeq LABEL24 + jump LABEL40 +LABEL24: + sconst "Time for the THIRD digit." + iload 18 + if_settext + sconst "*" + iload 14 + if_settext + sconst "*" + iload 15 + if_settext + sconst "?" + iload 16 + if_settext + sconst "?" + iload 17 + if_settext + jump LABEL128 +LABEL40: + iload 0 + iconst 1 + if_icmpeq LABEL44 + jump LABEL60 +LABEL44: + sconst "Now click the SECOND digit." + iload 18 + if_settext + sconst "*" + iload 14 + if_settext + sconst "?" + iload 15 + if_settext + sconst "?" + iload 16 + if_settext + sconst "?" + iload 17 + if_settext + jump LABEL128 +LABEL60: + iload 0 + iconst 0 + if_icmpeq LABEL64 + jump LABEL80 +LABEL64: + sconst "First click the FIRST digit." + iload 18 + if_settext + sconst "?" + iload 14 + if_settext + sconst "?" + iload 15 + if_settext + sconst "?" + iload 16 + if_settext + sconst "?" + iload 17 + if_settext + jump LABEL128 +LABEL80: + sconst "Submitting..." + iload 18 + if_settext + sconst "*" + iload 14 + if_settext + sconst "*" + iload 15 + if_settext + sconst "*" + iload 16 + if_settext + sconst "*" + iload 17 + if_settext + iload 4 + cc_deleteall + iload 5 + cc_deleteall + iload 6 + cc_deleteall + iload 7 + cc_deleteall + iload 8 + cc_deleteall + iload 9 + cc_deleteall + iload 10 + cc_deleteall + iload 11 + cc_deleteall + iload 12 + cc_deleteall + iload 13 + cc_deleteall + iconst -1 + sconst "" + iload 2 + if_setonop + iload 2 + if_clearops + iconst -1 + sconst "" + iload 3 + if_setonop + iload 3 + if_clearops + return +LABEL128: + iconst 10 + define_array 73 + iconst 0 + iload 4 + set_array_int + iconst 1 + iload 5 + set_array_int + iconst 2 + iload 6 + set_array_int + iconst 3 + iload 7 + set_array_int + iconst 4 + iload 8 + set_array_int + iconst 5 + iload 9 + set_array_int + iconst 6 + iload 10 + set_array_int + iconst 7 + iload 11 + set_array_int + iconst 8 + iload 12 + set_array_int + iconst 9 + iload 13 + set_array_int + iconst 0 + istore 19 + iconst -1 + istore 20 + iconst 20 + istore 21 +LABEL166: + iload 21 + iconst 0 + if_icmpgt LABEL170 + jump LABEL188 +LABEL170: + iload 21 + iconst 1 + sub + istore 21 + iconst 9 + random + istore 19 + iconst 9 + get_array_int + istore 20 + iconst 9 + iload 19 + get_array_int + set_array_int + iload 19 + iload 20 + set_array_int + jump LABEL166 +LABEL188: + iconst 0 + get_array_int + iconst 0 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 1 + get_array_int + iconst 1 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 2 + get_array_int + iconst 2 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 3 + get_array_int + iconst 3 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 4 + get_array_int + iconst 4 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 5 + get_array_int + iconst 5 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 6 + get_array_int + iconst 6 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 7 + get_array_int + iconst 7 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 8 + get_array_int + iconst 8 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 9 + get_array_int + iconst 9 + iload 0 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + invoke 679 + iconst 1 + iload 2 + if_gettext + iload 2 + if_setop + iconst 686 + iconst 12345 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + sconst "iIIIIIIIIIIIIIIIII" + iload 2 + if_setonop + iconst 1 + iload 3 + if_gettext + iload 3 + if_setop + iconst 686 + iconst 54321 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + sconst "iIIIIIIIIIIIIIIIII" + iload 3 + if_setonop + return diff --git a/RuneLitePlus/src/main/scripts/XpDropChanged.hash b/runelite-client/src/main/scripts/XpDropChanged.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/XpDropChanged.hash rename to runelite-client/src/main/scripts/XpDropChanged.hash diff --git a/RuneLitePlus/src/main/scripts/XpDropChanged.rs2asm b/runelite-client/src/main/scripts/XpDropChanged.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/XpDropChanged.rs2asm rename to runelite-client/src/main/scripts/XpDropChanged.rs2asm diff --git a/RuneLitePlus/src/main/scripts/ZoomHandler.hash b/runelite-client/src/main/scripts/ZoomHandler.hash similarity index 100% rename from RuneLitePlus/src/main/scripts/ZoomHandler.hash rename to runelite-client/src/main/scripts/ZoomHandler.hash diff --git a/RuneLitePlus/src/main/scripts/ZoomHandler.rs2asm b/runelite-client/src/main/scripts/ZoomHandler.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/ZoomHandler.rs2asm rename to runelite-client/src/main/scripts/ZoomHandler.rs2asm diff --git a/RuneLitePlus/src/main/scripts/null.rs2asm b/runelite-client/src/main/scripts/null.rs2asm similarity index 100% rename from RuneLitePlus/src/main/scripts/null.rs2asm rename to runelite-client/src/main/scripts/null.rs2asm diff --git a/runelite-client/src/test/java/net/runelite/client/RuneLiteModuleTest.java b/runelite-client/src/test/java/net/runelite/client/RuneLiteModuleTest.java new file mode 100644 index 0000000000..b62ea720e9 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/RuneLiteModuleTest.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client; + +import com.google.inject.Guice; +import net.runelite.client.rs.ClientUpdateCheckMode; +import org.junit.Test; + +public class RuneLiteModuleTest +{ + @Test + public void testConfigure() + { + Guice.createInjector(new RuneLiteModule(ClientUpdateCheckMode.AUTO, true)); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/config/ConfigManagerTest.java b/runelite-client/src/test/java/net/runelite/client/config/ConfigManagerTest.java new file mode 100644 index 0000000000..63afbbd2a6 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/config/ConfigManagerTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.config; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.io.IOException; +import java.time.Instant; +import java.util.UUID; +import java.util.concurrent.ScheduledExecutorService; +import javax.inject.Inject; +import net.runelite.client.account.AccountSession; +import net.runelite.client.eventbus.EventBus; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ConfigManagerTest +{ + @Mock + @Bind + EventBus eventBus; + + @Mock + @Bind + ScheduledExecutorService executor; + + @Mock + @Bind + RuneLiteConfig runeliteConfig; + + @Inject + ConfigManager manager; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testGetConfig() throws IOException + { + AccountSession accountSession = new AccountSession(UUID.randomUUID(), Instant.now()); + accountSession.setUsername("test"); + + manager.setConfiguration("test", "key", "moo"); + + TestConfig conf = manager.getConfig(TestConfig.class); + Assert.assertEquals("moo", conf.key()); + } + + @Test + public void testGetConfigDefault() throws IOException + { + AccountSession accountSession = new AccountSession(UUID.randomUUID(), Instant.now()); + accountSession.setUsername("test"); + + TestConfig conf = manager.getConfig(TestConfig.class); + Assert.assertEquals("default", conf.key()); + } + + @Test + public void testSetConfig() throws IOException + { + AccountSession accountSession = new AccountSession(UUID.randomUUID(), Instant.now()); + accountSession.setUsername("test"); + + TestConfig conf = manager.getConfig(TestConfig.class); + conf.key("new value"); + + Assert.assertEquals("new value", conf.key()); + } + + @Test + public void testGetConfigDescriptor() throws IOException + { + AccountSession accountSession = new AccountSession(UUID.randomUUID(), Instant.now()); + accountSession.setUsername("test"); + + TestConfig conf = manager.getConfig(TestConfig.class); + ConfigDescriptor descriptor = manager.getConfigDescriptor(conf); + Assert.assertEquals(1, descriptor.getItems().size()); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/config/TestConfig.java b/runelite-client/src/test/java/net/runelite/client/config/TestConfig.java new file mode 100644 index 0000000000..9bc5f29b37 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/config/TestConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.config; + +@ConfigGroup("test") +public interface TestConfig +{ + @ConfigItem( + keyName = "key", + name = "Key Name", + description = "value" + ) + default String key() + { + return "default"; + } + + @ConfigItem( + keyName = "key", + name = "Key Name", + description = "value" + ) + void key(String key); +} diff --git a/runelite-client/src/test/java/net/runelite/client/game/ItemVariationMappingTest.java b/runelite-client/src/test/java/net/runelite/client/game/ItemVariationMappingTest.java new file mode 100644 index 0000000000..ba67d6b9c2 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/game/ItemVariationMappingTest.java @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2018, Ron Young + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.game; + +import java.util.LinkedHashMap; +import java.util.Map; +import static net.runelite.api.ItemID.*; +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ItemVariationMappingTest +{ + private static final Map ITEMS_MAP = new LinkedHashMap() + {{ + put(_12_ANCHOVY_PIZZA, ANCHOVY_PIZZA); + put(_12_MEAT_PIZZA, MEAT_PIZZA); + put(_12_PINEAPPLE_PIZZA, PINEAPPLE_PIZZA); + put(_12_PLAIN_PIZZA, PLAIN_PIZZA); + put(ADAMANT_PLATELEGS_T, ADAMANT_PLATELEGS); + put(ADAMANT_PLATESKIRT_T, ADAMANT_PLATESKIRT); + put(AGILITY_CAPET, AGILITY_CAPE); + put(AGILITY_MIX1, AGILITY_MIX2); + put(AGILITY_MIX2, AGILITY_MIX2); + put(AHRIMS_ROBETOP_100, AHRIMS_ROBETOP); + put(AHRIMS_ROBETOP_25, AHRIMS_ROBETOP); + put(AHRIMS_ROBETOP_50, AHRIMS_ROBETOP); + put(AHRIMS_ROBETOP_75, AHRIMS_ROBETOP); + put(AHRIMS_STAFF_0, AHRIMS_STAFF); + put(AMULET_OF_GLORY5, AMULET_OF_GLORY); + put(AMULET_OF_GLORY6, AMULET_OF_GLORY); + put(AMULET_OF_MAGIC_T, AMULET_OF_MAGIC); + put(ANCIENT_PAGE_1, ANCIENT_PAGE); + put(ANCIENT_PAGE_2, ANCIENT_PAGE); + put(ANTIDOTE2, ANTIDOTE_UNF); + put(ANTIDOTE3, ANTIDOTE_UNF); + put(ANTIDOTE4, ANTIDOTE_UNF); + put(ANTIDOTE1_5958, ANTIDOTE_UNF); + put(ANTIDOTE2_5956, ANTIDOTE_UNF); + put(APPLES2, APPLES1); + put(APPLES3, APPLES1); + put(APPLES4, APPLES1); + put(APPLES5, APPLES1); + put(ARCHERS_RING_I, ARCHERS_RING); + put(ASGARNIAN_ALEM4, ASGARNIAN_ALE); + put(ATTACK_CAPET, ATTACK_CAPE); + put(ATTACK_MIX1, ATTACK_MIX2); + put(ATTACK_MIX2, ATTACK_MIX2); + put(ATTACK_POTION1, ATTACK_POTION3); + put(BANANAS2, BANANAS1); + put(BANANAS3, BANANAS1); + put(BANANAS4, BANANAS1); + put(BANANAS5, BANANAS1); + put(BANDOS_PAGE_1, BANDOS_PAGE_1); + put(BLACK_KITESHIELD_T, BLACK_KITESHIELD); + put(BLACK_MASK_1, BLACK_MASK_10); + put(BLACK_MASK_2, BLACK_MASK_10); + put(BLACK_MASK_3, BLACK_MASK_10); + put(BLACK_MASK_4, BLACK_MASK_10); + put(BLUE_SKIRT_T, BLUE_SKIRT); + put(BLUE_WIZARD_HAT_T, BLUE_WIZARD_HAT); + put(BLUE_WIZARD_ROBE_T, BLUE_WIZARD_ROBE); + put(BOOK_PAGE_1, BOOK_PAGE_1); + put(BOOK_PAGE_2, BOOK_PAGE_1); + put(BROODOO_SHIELD_9, BROODOO_SHIELD_10); + put(BROWN_SPICE_1, BROWN_SPICE_4); + put(BROWN_SPICE_2, BROWN_SPICE_4); + put(BROWN_SPICE_3, BROWN_SPICE_4); + put(BROWN_SPICE_4, BROWN_SPICE_4); + put(CASKET_ELITE, CASKET); + put(CASKET_HARD, CASKET); + put(CASKET_MEDIUM, CASKET); + put(CASTLE_SKETCH_1, CASTLE_SKETCH_1); + put(CASTLE_SKETCH_2, CASTLE_SKETCH_1); + put(CHEFS_DELIGHTM2, CHEFS_DELIGHT); + put(CHEFS_DELIGHTM3, CHEFS_DELIGHT); + put(CHEFS_DELIGHTM4, CHEFS_DELIGHT); + put(CIDER1, CIDER); + put(CIDER2, CIDER); + put(CLUE_NEST_ELITE, CLUE_NEST_EASY); + put(CLUE_NEST_HARD, CLUE_NEST_EASY); + put(CLUE_NEST_MEDIUM, CLUE_NEST_EASY); + put(CLUE_SCROLL_EASY, CLUE_SCROLL); + put(CLUE_SCROLL_ELITE, CLUE_SCROLL); + put(COMMORB_V2, COMMORB_V2); + put(COMPOST_POTION1, COMPOST_POTION4); + put(COMPOST_POTION2, COMPOST_POTION4); + put(COMPOST_POTION3, COMPOST_POTION4); + put(COMPOST_POTION4, COMPOST_POTION4); + put(CRYSTAL_BOW_510_I, NEW_CRYSTAL_BOW); + put(CRYSTAL_BOW_510, NEW_CRYSTAL_BOW); + put(CRYSTAL_BOW_610_I, NEW_CRYSTAL_BOW); + put(CRYSTAL_BOW_610, NEW_CRYSTAL_BOW); + put(CRYSTAL_BOW_710_I, NEW_CRYSTAL_BOW); + put(CRYSTAL_HALBERD_510_I, NEW_CRYSTAL_HALBERD_FULL_I); + put(CRYSTAL_HALBERD_510, NEW_CRYSTAL_HALBERD_FULL_I); + put(CRYSTAL_HALBERD_610_I, NEW_CRYSTAL_HALBERD_FULL_I); + put(CRYSTAL_HALBERD_610, NEW_CRYSTAL_HALBERD_FULL_I); + put(CRYSTAL_HALBERD_710_I, NEW_CRYSTAL_HALBERD_FULL_I); + put(CRYSTAL_SHIELD_510_I, NEW_CRYSTAL_SHIELD); + put(CRYSTAL_SHIELD_510, NEW_CRYSTAL_SHIELD); + put(CRYSTAL_SHIELD_610_I, NEW_CRYSTAL_SHIELD); + put(CRYSTAL_SHIELD_610, NEW_CRYSTAL_SHIELD); + put(CRYSTAL_SHIELD_710_I, NEW_CRYSTAL_SHIELD); + put(DEFENCE_POTION2, DEFENCE_POTION3); + put(DEFENCE_POTION3, DEFENCE_POTION3); + put(DEFENCE_POTION4, DEFENCE_POTION3); + put(DESERT_AMULET_1, DESERT_AMULET); + put(DESERT_AMULET_2, DESERT_AMULET); + put(DHAROKS_PLATEBODY_50, DHAROKS_PLATEBODY); + put(DHAROKS_PLATEBODY_75, DHAROKS_PLATEBODY); + put(DHAROKS_PLATELEGS_0, DHAROKS_PLATELEGS); + put(DHAROKS_PLATELEGS_100, DHAROKS_PLATELEGS); + put(DHAROKS_PLATELEGS_25, DHAROKS_PLATELEGS); + put(DRAGON_BITTERM3, DRAGON_BITTER); + put(DRAGON_BITTERM4, DRAGON_BITTER); + put(DRAGON_DEFENDER_T, DRAGON_DEFENDER); + put(DRAGONSTONE_BOLTS, DRAGONSTONE_BOLTS_E); + put(DRAGONSTONE_DRAGON_BOLTS, DRAGONSTONE_DRAGON_BOLTS_E); + put(ENCHANTED_LYRE2, ENCHANTED_LYRE); + put(ENCHANTED_LYRE3, ENCHANTED_LYRE); + put(ENCHANTED_LYRE4, ENCHANTED_LYRE); + put(ENCHANTED_LYRE5, ENCHANTED_LYRE); + put(ENERGY_MIX1, ENERGY_MIX2); + put(EXTENDED_SUPER_ANTIFIRE_MIX1, EXTENDED_SUPER_ANTIFIRE_MIX2); + put(EXTENDED_SUPER_ANTIFIRE_MIX2, EXTENDED_SUPER_ANTIFIRE_MIX2); + put(EXTENDED_SUPER_ANTIFIRE1, EXTENDED_SUPER_ANTIFIRE4); + put(EXTENDED_SUPER_ANTIFIRE2, EXTENDED_SUPER_ANTIFIRE4); + put(EXTENDED_SUPER_ANTIFIRE3, EXTENDED_SUPER_ANTIFIRE4); + put(FRAGMENT_1, FRAGMENT_1); + put(FRAGMENT_2, FRAGMENT_1); + put(FRAGMENT_3, FRAGMENT_1); + put(FREMENNIK_SEA_BOOTS_1, FREMENNIK_SEA_BOOTS); + put(FREMENNIK_SEA_BOOTS_2, FREMENNIK_SEA_BOOTS); + put(GAMES_NECKLACE3, GAMES_NECKLACE8); + put(GAMES_NECKLACE4, GAMES_NECKLACE8); + put(GAMES_NECKLACE5, GAMES_NECKLACE8); + put(GAMES_NECKLACE6, GAMES_NECKLACE8); + put(GAMES_NECKLACE7, GAMES_NECKLACE8); + put(GREENMANS_ALE4, GREENMANS_ALE); + put(GREENMANS_ALEM1, GREENMANS_ALE); + put(GREENMANS_ALEM2, GREENMANS_ALE); + put(GREENMANS_ALEM3, GREENMANS_ALE); + put(GREENMANS_ALEM4, GREENMANS_ALE); + put(GUTHANS_PLATEBODY_75, GUTHANS_PLATEBODY); + put(GUTHANS_WARSPEAR_0, GUTHANS_WARSPEAR); + put(GUTHANS_WARSPEAR_100, GUTHANS_WARSPEAR); + put(GUTHANS_WARSPEAR_25, GUTHANS_WARSPEAR); + put(GUTHANS_WARSPEAR_50, GUTHANS_WARSPEAR); + put(HALF_A_GARDEN_PIE, PART_GARDEN_PIE); + put(HALF_A_MEAT_PIE, MEAT_PIE); + put(MUSHROOM_PIE, HALF_A_MUSHROOM_PIE); + put(HALF_A_REDBERRY_PIE, REDBERRY_PIE); + put(HALF_A_ROCK, ROCK); + put(HUNTING_MIX1, HUNTING_MIX2); + put(HUNTING_MIX2, HUNTING_MIX2); + put(IMPINABOX1, IMPINABOX2); + put(IMPINABOX2, IMPINABOX2); + put(IRON_FULL_HELM_T, IRON_FULL_HELM); + put(KARILS_COIF_100, KARILS_COIF); + put(KARILS_COIF_25, KARILS_COIF); + put(KARILS_COIF_50, KARILS_COIF); + put(KARILS_COIF_75, KARILS_COIF); + put(KARILS_CROSSBOW_0, KARILS_CROSSBOW); + put(KEY_MEDIUM, KEY); + put(KODAI_POTION_1, KODAI_POTION_1); + put(KODAI_POTION_2, KODAI_POTION_1); + put(KODAI_POTION_3, KODAI_POTION_1); + put(KODAI_POTION_4, KODAI_POTION_1); + put(MAGIC_POTION1, MAGIC_POTION4); + put(MAGIC_POTION2, MAGIC_POTION4); + put(MAGIC_POTION3, MAGIC_POTION4); + put(MAGIC_POTION4, MAGIC_POTION4); + put(MAGIC_SHORTBOW_I, MAGIC_SHORTBOW_U); + put(MITHRIL_FULL_HELM_T, MITHRIL_FULL_HELM); + put(MITHRIL_KITESHIELD_T, MITHRIL_KITESHIELD); + put(MITHRIL_PLATEBODY_T, MITHRIL_PLATEBODY); + put(MITHRIL_PLATELEGS_T, MITHRIL_PLATELEGS); + put(MITHRIL_PLATESKIRT_T, MITHRIL_PLATESKIRT); + put(NECKLACE_OF_PASSAGE1, NECKLACE_OF_PASSAGE5); + put(NECKLACE_OF_PASSAGE2, NECKLACE_OF_PASSAGE5); + put(NECKLACE_OF_PASSAGE3, NECKLACE_OF_PASSAGE5); + put(NECKLACE_OF_PASSAGE4, NECKLACE_OF_PASSAGE5); + put(NECKLACE_OF_PASSAGE5, NECKLACE_OF_PASSAGE5); + put(OLIVE_OIL4, OLIVE_OIL4); + put(ONIONS1, ONIONS1); + put(ONIONS2, ONIONS1); + put(ONIONS3, ONIONS1); + put(ONIONS4, ONIONS1); + put(ORANGES3, ORANGES1); + put(ORANGES4, ORANGES1); + put(ORANGES5, ORANGES1); + put(OVERLOAD_1, OVERLOAD_4); + put(OVERLOAD_2, OVERLOAD_4); + put(PHARAOHS_SCEPTRE_3, PHARAOHS_SCEPTRE_3); + put(PHARAOHS_SCEPTRE_4, PHARAOHS_SCEPTRE_3); + put(PHARAOHS_SCEPTRE_5, PHARAOHS_SCEPTRE_3); + put(PHARAOHS_SCEPTRE_6, PHARAOHS_SCEPTRE_3); + put(PHARAOHS_SCEPTRE_7, PHARAOHS_SCEPTRE_3); + put(PRAEL_BAT_1, PRAEL_BAT_1); + put(PRAYER_CAPET, PRAYER_CAPE); + put(PRAYER_ENHANCE_1_20965, PRAYER_ENHANCE_1); + put(PRAYER_ENHANCE_2_20966, PRAYER_ENHANCE_1); + put(PRAYER_ENHANCE_3_20967, PRAYER_ENHANCE_1); + put(RANGING_MIX1, RANGING_MIX2); + put(RANGING_MIX2, RANGING_MIX2); + put(RANGING_POTION1, RANGING_POTION3); + put(RANGING_POTION2, RANGING_POTION3); + put(RANGING_POTION3, RANGING_POTION3); + put(RED_DHIDE_BODY_T, RED_DHIDE_BODY); + put(RED_DHIDE_CHAPS_T, RED_DHIDE_CHAPS); + put(RED_SLAYER_HELMET_I, SLAYER_HELMET); + put(RED_SPICE_1, RED_SPICE_4); + put(RED_SPICE_2, RED_SPICE_4); + put(RESTORE_MIX1, RESTORE_MIX2); + put(RESTORE_MIX2, RESTORE_MIX2); + put(RESTORE_POTION1, RESTORE_POTION3); + put(RESTORE_POTION2, RESTORE_POTION3); + put(RESTORE_POTION3, RESTORE_POTION3); + put(RING_OF_DUELING5, RING_OF_DUELING8); + put(RING_OF_DUELING6, RING_OF_DUELING8); + put(RING_OF_DUELING7, RING_OF_DUELING8); + put(RING_OF_DUELING8, RING_OF_DUELING8); + put(RING_OF_RETURNING1, RING_OF_RETURNING5); + put(ROD_OF_IVANDIS_4, ROD_OF_IVANDIS_10); + put(ROD_OF_IVANDIS_5, ROD_OF_IVANDIS_10); + put(ROD_OF_IVANDIS_6, ROD_OF_IVANDIS_10); + put(ROD_OF_IVANDIS_7, ROD_OF_IVANDIS_10); + put(ROD_OF_IVANDIS_8, ROD_OF_IVANDIS_10); + put(SACRED_OIL3, SACRED_OIL4); + put(SACRED_OIL4, SACRED_OIL4); + put(SALVE_AMULET_E, SALVE_AMULET); + put(SALVE_AMULETI, SALVE_AMULET); + put(SANDSTONE_1KG, SANDSTONE_1KG); + put(SARADOMIN_PAGE_4, SARADOMIN_PAGE_1); + put(SEERS_RING_I, SEERS_RING); + put(SHAYZIEN_BOOTS_1, SHAYZIEN_BOOTS_1); + put(SHAYZIEN_BOOTS_2, SHAYZIEN_BOOTS_1); + put(SHAYZIEN_BOOTS_3, SHAYZIEN_BOOTS_1); + put(SHAYZIEN_HELM_4, SHAYZIEN_HELM_1); + put(SHAYZIEN_HELM_5, SHAYZIEN_HELM_1); + put(SHAYZIEN_PLATEBODY_1, SHAYZIEN_PLATEBODY_1); + put(SHAYZIEN_PLATEBODY_2, SHAYZIEN_PLATEBODY_1); + put(SHAYZIEN_PLATEBODY_3, SHAYZIEN_PLATEBODY_1); + put(SHAYZIEN_SUPPLY_GREAVES_4, SHAYZIEN_SUPPLY_GREAVES_1); + put(SHAYZIEN_SUPPLY_GREAVES_5, SHAYZIEN_SUPPLY_GREAVES_1); + put(SHAYZIEN_SUPPLY_HELM_1, SHAYZIEN_SUPPLY_HELM_1); + put(SHAYZIEN_SUPPLY_HELM_2, SHAYZIEN_SUPPLY_HELM_1); + put(SHAYZIEN_SUPPLY_HELM_3, SHAYZIEN_SUPPLY_HELM_1); + put(SHEEP_BONES_4, SHEEP_BONES_1); + put(SINHAZA_SHROUD_TIER_1, SINHAZA_SHROUD_TIER_1); + put(SINHAZA_SHROUD_TIER_2, SINHAZA_SHROUD_TIER_1); + put(SINHAZA_SHROUD_TIER_3, SINHAZA_SHROUD_TIER_1); + put(SINHAZA_SHROUD_TIER_4, SINHAZA_SHROUD_TIER_1); + put(SLAYER_RING_6, SLAYER_RING_8); + put(SLAYER_RING_7, SLAYER_RING_8); + put(SLAYER_RING_8, SLAYER_RING_8); + put(SLAYER_RING_ETERNAL, SLAYER_RING_8); + put(SLAYERS_RESPITE1, SLAYERS_RESPITE); + put(STAMINA_POTION4, STAMINA_POTION4); + put(STASH_UNITS_EASY, STASH_UNITS_EASY); + put(STASH_UNITS_ELITE, STASH_UNITS_EASY); + put(STASH_UNITS_HARD, STASH_UNITS_EASY); + put(STASH_UNITS_MASTER, STASH_UNITS_EASY); + put(STRENGTH_POTION1, STRENGTH_POTION4); + put(STRENGTH_POTION2, STRENGTH_POTION4); + put(STRENGTH_POTION3, STRENGTH_POTION4); + put(STRENGTH_POTION4, STRENGTH_POTION4); + put(STUDDED_BODY_T, STUDDED_BODY); + put(SUPER_DEF_MIX1, SUPER_DEF_MIX2); + put(SUPER_DEF_MIX2, SUPER_DEF_MIX2); + put(SUPER_DEFENCE1, SUPER_DEFENCE3); + put(SUPER_DEFENCE2, SUPER_DEFENCE3); + put(SUPER_DEFENCE3, SUPER_DEFENCE3); + put(SUPER_RESTORE_MIX1, SUPER_RESTORE_MIX2); + put(SUPER_RESTORE_MIX2, SUPER_RESTORE_MIX2); + put(SUPER_RESTORE1, SUPER_RESTORE4); + put(SUPER_RESTORE2, SUPER_RESTORE4); + put(SUPER_RESTORE3, SUPER_RESTORE4); + put(TEAK_SHELVES_2, TEAK_SHELVES_1); + put(TELEPORT_CRYSTAL_1, TELEPORT_CRYSTAL_4); + put(TELEPORT_CRYSTAL_2, TELEPORT_CRYSTAL_4); + put(TELEPORT_CRYSTAL_3, TELEPORT_CRYSTAL_4); + put(TELEPORT_CRYSTAL_4, TELEPORT_CRYSTAL_4); + put(TOPAZ_BOLTS, TOPAZ_BOLTS_E); + put(TOPAZ_DRAGON_BOLTS, TOPAZ_DRAGON_BOLTS_E); + put(TORAGS_HAMMERS_0, TORAGS_HAMMERS); + put(TORAGS_HAMMERS_100, TORAGS_HAMMERS); + put(TORAGS_HAMMERS_25, TORAGS_HAMMERS); + put(TORAGS_PLATELEGS_50, TORAGS_PLATELEGS); + put(TORAGS_PLATELEGS_75, TORAGS_PLATELEGS); + put(TREASONOUS_RING_I, TREASONOUS_RING); + put(TRIDENT_OF_THE_SEAS_E, TRIDENT_OF_THE_SEAS_FULL); + put(TRIDENT_OF_THE_SWAMP_E, TRIDENT_OF_THE_SWAMP); + put(VERACS_BRASSARD_50, VERACS_BRASSARD); + put(VERACS_BRASSARD_75, VERACS_BRASSARD); + put(VERACS_FLAIL_0, VERACS_FLAIL); + put(VERACS_FLAIL_100, VERACS_FLAIL); + put(VERACS_FLAIL_25, VERACS_FLAIL); + put(VOID_SEAL1, VOID_SEAL8); + put(VOID_SEAL2, VOID_SEAL8); + put(VOID_SEAL3, VOID_SEAL8); + put(VOID_SEAL4, VOID_SEAL8); + put(VOID_SEAL5, VOID_SEAL8); + put(WATERSKIN3, WATERSKIN4); + put(WATERSKIN4, WATERSKIN4); + put(WESTERN_BANNER_1, WESTERN_BANNER); + put(WESTERN_BANNER_2, WESTERN_BANNER); + put(WESTERN_BANNER_3, WESTERN_BANNER); + put(YELLOW_SPICE_2, YELLOW_SPICE_4); + put(YELLOW_SPICE_3, YELLOW_SPICE_4); + put(YELLOW_SPICE_4, YELLOW_SPICE_4); + put(ZAMORAK_BREW1, ZAMORAK_BREW3); + put(ZAMORAK_BREW2, ZAMORAK_BREW3); + }}; + + @Test + public void testMappedNames() + { + ITEMS_MAP.forEach((key, value) -> + { + assertEquals(value, (Integer) ItemVariationMapping.map(key)); + }); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java new file mode 100644 index 0000000000..c0b81a9665 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins; + +import com.google.common.reflect.ClassPath; +import com.google.common.reflect.ClassPath.ClassInfo; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; +import com.google.inject.grapher.graphviz.GraphvizGrapher; +import com.google.inject.grapher.graphviz.GraphvizModule; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import com.google.inject.util.Modules; +import java.applet.Applet; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import net.runelite.api.Client; +import net.runelite.client.RuneLite; +import net.runelite.client.RuneLiteModule; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.eventbus.EventBus; +import net.runelite.client.rs.ClientUpdateCheckMode; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class PluginManagerTest +{ + private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins"; + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + @Mock + @Bind + public Applet applet; + + @Mock + @Bind + public Client client; + + private Set pluginClasses; + private Set configClasses; + + @Before + public void before() throws IOException + { + Injector injector = Guice.createInjector(Modules + .override(new RuneLiteModule(ClientUpdateCheckMode.AUTO, true)) + .with(BoundFieldModule.of(this))); + + RuneLite.setInjector(injector); + + // Find plugins and configs we expect to have + pluginClasses = new HashSet<>(); + configClasses = new HashSet<>(); + Set classes = ClassPath.from(getClass().getClassLoader()).getTopLevelClassesRecursive(PLUGIN_PACKAGE); + for (ClassInfo classInfo : classes) + { + Class clazz = classInfo.load(); + PluginDescriptor pluginDescriptor = clazz.getAnnotation(PluginDescriptor.class); + if (pluginDescriptor != null) + { + pluginClasses.add(clazz); + continue; + } + + if (Config.class.isAssignableFrom(clazz)) + { + configClasses.add(clazz); + } + } + + } + + @Test + public void testLoadPlugins() throws Exception + { + PluginManager pluginManager = new PluginManager(false, null, null, null, null, null); + pluginManager.setOutdated(true); + pluginManager.loadCorePlugins(); + Collection plugins = pluginManager.getPlugins(); + long expected = pluginClasses.stream() + .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) + .filter(Objects::nonNull) + .filter(PluginDescriptor::loadWhenOutdated) + .count(); + assertEquals(expected, plugins.size()); + + pluginManager = new PluginManager(false, null, null, null, null, null); + pluginManager.loadCorePlugins(); + plugins = pluginManager.getPlugins(); + + // Check that the plugins register with the eventbus without errors + EventBus eventBus = new EventBus(); + plugins.forEach(eventBus::register); + + expected = pluginClasses.stream() + .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) + .filter(Objects::nonNull) + .filter(pd -> !pd.developerPlugin()) + .count(); + assertEquals(expected, plugins.size()); + } + + @Test + public void dumpGraph() throws Exception + { + List modules = new ArrayList<>(); + modules.add(new GraphvizModule()); + modules.add(new RuneLiteModule(ClientUpdateCheckMode.AUTO, true)); + + PluginManager pluginManager = new PluginManager(true, null, null, null, null, null); + pluginManager.loadCorePlugins(); + for (Plugin p : pluginManager.getPlugins()) + { + modules.add(p); + } + + File file = folder.newFile(); + try (PrintWriter out = new PrintWriter(file, "UTF-8")) + { + Injector injector = Guice.createInjector(modules); + GraphvizGrapher grapher = injector.getInstance(GraphvizGrapher.class); + grapher.setOut(out); + grapher.setRankdir("TB"); + grapher.graph(injector); + } + } + + @Test + public void ensureNoDuplicateConfigKeyNames() + { + for (final Class clazz : configClasses) + { + final Set configKeyNames = new HashSet<>(); + + for (final Method method : clazz.getMethods()) + { + if (!method.isDefault()) + { + continue; + } + + final ConfigItem annotation = method.getAnnotation(ConfigItem.class); + + if (annotation == null) + { + continue; + } + + final String configKeyName = annotation.keyName(); + + if (configKeyNames.contains(configKeyName)) + { + throw new IllegalArgumentException("keyName " + configKeyName + " is duplicated in " + clazz); + } + + configKeyNames.add(configKeyName); + } + } + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/attackstyles/AttackStylesPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/attackstyles/AttackStylesPluginTest.java new file mode 100644 index 0000000000..2060d0d536 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/attackstyles/AttackStylesPluginTest.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.attackstyles; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.Set; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.ui.overlay.OverlayManager; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class AttackStylesPluginTest +{ + @Mock + @Bind + Client client; + + @Mock + @Bind + OverlayManager overlayManager; + + @Mock + @Bind + AttackStylesConfig attackConfig; + + @Inject + AttackStylesPlugin attackPlugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + /* + * Verify that red text is displayed when attacking with a style that gains experience + * in one of the unwanted skills. + */ + @Test + public void testWarning() + { + ConfigChanged warnForAttackEvent = new ConfigChanged(); + warnForAttackEvent.setGroup("attackIndicator"); + warnForAttackEvent.setKey("warnForAttack"); + warnForAttackEvent.setNewValue("true"); + attackPlugin.onConfigChanged(warnForAttackEvent); + + // Verify there is a warned skill + Set warnedSkills = attackPlugin.getWarnedSkills(); + assertTrue(warnedSkills.contains(Skill.ATTACK)); + + // Set mock client to attack in style that gives attack xp + when(client.getVar(VarPlayer.ATTACK_STYLE)).thenReturn(AttackStyle.ACCURATE.ordinal()); + + // verify that earning xp in a warned skill will display red text on the widget + attackPlugin.onVarbitChanged(new VarbitChanged()); + assertTrue(attackPlugin.isWarnedSkillSelected()); + + // Switch to attack style that doesn't give attack xp + when(client.getVar(VarPlayer.ATTACK_STYLE)).thenReturn(AttackStyle.AGGRESSIVE.ordinal()); + + // Verify the widget will now display white text + attackPlugin.onVarbitChanged(new VarbitChanged()); + warnedSkills = attackPlugin.getWarnedSkills(); + assertTrue(warnedSkills.contains(Skill.ATTACK)); + assertFalse(attackPlugin.isWarnedSkillSelected()); + } + + /* + * Verify that attack style widgets are hidden when filtered with the AttackStylesPlugin. + */ + @Test + public void testHiddenWidget() + { + ConfigChanged warnForAttackEvent = new ConfigChanged(); + warnForAttackEvent.setGroup("attackIndicator"); + warnForAttackEvent.setKey("warnForAttack"); + warnForAttackEvent.setNewValue("true"); + attackPlugin.onConfigChanged(warnForAttackEvent); + + // Set up mock widgets for atk and str attack styles + Widget atkWidget = mock(Widget.class); + Widget strWidget = mock(Widget.class); + when(client.getWidget(WidgetInfo.COMBAT_STYLE_ONE)).thenReturn(atkWidget); + when(client.getWidget(WidgetInfo.COMBAT_STYLE_TWO)).thenReturn(strWidget); + // Set widgets to return their hidden value in widgetsToHide when isHidden() is called + when(atkWidget.isHidden()).thenAnswer(x -> isAtkHidden()); + when(strWidget.isHidden()).thenAnswer(x -> isStrHidden()); + + // equip type_4 weapon type on player + when(client.getVar(Varbits.EQUIPPED_WEAPON_TYPE)).thenReturn(WeaponType.TYPE_4.ordinal()); + attackPlugin.onVarbitChanged(new VarbitChanged()); + + // Verify there is a warned skill + Set warnedSkills = attackPlugin.getWarnedSkills(); + assertTrue(warnedSkills.contains(Skill.ATTACK)); + + // Enable hiding widgets + ConfigChanged hideWidgetEvent = new ConfigChanged(); + hideWidgetEvent.setGroup("attackIndicator"); + hideWidgetEvent.setKey("removeWarnedStyles"); + hideWidgetEvent.setNewValue("true"); + attackPlugin.onConfigChanged(hideWidgetEvent); + when(attackConfig.removeWarnedStyles()).thenReturn(true); + + // verify that the accurate attack style widget is hidden + assertTrue(atkWidget.isHidden()); + + // add another warned skill + ConfigChanged warnForStrengthEvent = new ConfigChanged(); + warnForStrengthEvent.setGroup("attackIndicator"); + warnForStrengthEvent.setKey("warnForStrength"); + warnForStrengthEvent.setNewValue("true"); + attackPlugin.onConfigChanged(warnForStrengthEvent); + + // verify that the aggressive attack style widget is now hidden + assertTrue(strWidget.isHidden()); + + // disable hiding attack style widgets + hideWidgetEvent.setGroup("attackIndicator"); + hideWidgetEvent.setKey("removeWarnedStyles"); + hideWidgetEvent.setNewValue("false"); + attackPlugin.onConfigChanged(hideWidgetEvent); + when(attackConfig.removeWarnedStyles()).thenReturn(false); + + // verify that the aggressive and accurate attack style widgets are no longer hidden + assertFalse(attackPlugin.getHiddenWidgets().get(WeaponType.TYPE_4, + WidgetInfo.COMBAT_STYLE_ONE)); + assertFalse(attackPlugin.getHiddenWidgets().get(WeaponType.TYPE_4, + WidgetInfo.COMBAT_STYLE_THREE)); + } + + private boolean isAtkHidden() + { + if (attackPlugin.getHiddenWidgets().size() == 0) + { + return false; + } + return attackPlugin.getHiddenWidgets().get(WeaponType.TYPE_4, WidgetInfo.COMBAT_STYLE_ONE); + } + + private boolean isStrHidden() + { + if (attackPlugin.getHiddenWidgets().size() == 0) + { + return false; + } + return attackPlugin.getHiddenWidgets().get(WeaponType.TYPE_4, WidgetInfo.COMBAT_STYLE_TWO); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/bank/BankCalculationTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/bank/BankCalculationTest.java new file mode 100644 index 0000000000..af690525c3 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/bank/BankCalculationTest.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.bank; + +import com.google.common.collect.ImmutableList; +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemDefinition; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.client.game.ItemManager; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class BankCalculationTest +{ + @Mock + @Bind + private Client client; + + @Mock + @Bind + private ItemManager itemManager; + + @Mock + @Bind + private BankConfig bankConfig; + + @Inject + private BankCalculation bankCalculation; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testCalculate() + { + when(bankConfig.showHA()) + .thenReturn(true); + + Item coins = mock(Item.class); + when(coins.getId()) + .thenReturn(ItemID.COINS_995); + when(coins.getQuantity()) + .thenReturn(Integer.MAX_VALUE); + + Item whip = mock(Item.class); + when(whip.getId()) + .thenReturn(ItemID.ABYSSAL_WHIP); + when(whip.getQuantity()) + .thenReturn(1_000_000_000); + + Item[] items = ImmutableList.of( + coins, + whip + ).toArray(new Item[0]); + + ItemContainer bankContainer = mock(ItemContainer.class); + when(bankContainer.getItems()) + .thenReturn(items); + + when(client.getItemContainer(InventoryID.BANK)) + .thenReturn(bankContainer); + + ItemDefinition whipComp = mock(ItemDefinition.class); + when(whipComp.getId()) + .thenReturn(ItemID.ABYSSAL_WHIP); + when(whipComp.getPrice()) + .thenReturn(7); // 7 * .6 = 4, 4 * 1m overflows + when(itemManager.getItemDefinition(ItemID.ABYSSAL_WHIP)) + .thenReturn(whipComp); + + bankCalculation.calculate(); + + long value = bankCalculation.getHaPrice(); + assertTrue(value == Integer.MAX_VALUE); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java new file mode 100644 index 0000000000..4f35f7b174 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.cerberus; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.Arrays; +import java.util.List; +import javax.inject.Inject; +import net.runelite.api.NPC; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.GameTick; +import net.runelite.client.ui.overlay.OverlayManager; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class CerberusPluginTest +{ + @Mock + @Bind + OverlayManager overlayManager; + + @Inject + CerberusPlugin cerberusPlugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testOnGameTick() + { + List ghosts = cerberusPlugin.getGhosts(); + ghosts.addAll(Arrays.asList( + mockNpc(new LocalPoint(0, 0)), + mockNpc(new LocalPoint(1, 0)), + mockNpc(new LocalPoint(0, 5)), + mockNpc(new LocalPoint(2, 0)), + mockNpc(new LocalPoint(2, 5)), + mockNpc(new LocalPoint(1, 5)) + )); + cerberusPlugin.onGameTick(new GameTick()); + + // Expected sort is by lowest y first, then by lowest x + assertEquals(ghosts.get(0).getLocalLocation(), new LocalPoint(0, 0)); + assertEquals(ghosts.get(1).getLocalLocation(), new LocalPoint(1, 0)); + assertEquals(ghosts.get(2).getLocalLocation(), new LocalPoint(2, 0)); + + assertEquals(ghosts.get(3).getLocalLocation(), new LocalPoint(0, 5)); + assertEquals(ghosts.get(4).getLocalLocation(), new LocalPoint(1, 5)); + assertEquals(ghosts.get(5).getLocalLocation(), new LocalPoint(2, 5)); + } + + private static NPC mockNpc(LocalPoint localPoint) + { + NPC npc = mock(NPC.class); + when(npc.getLocalLocation()).thenReturn(localPoint); + return npc; + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java new file mode 100644 index 0000000000..de4e89299c --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.chatcommands; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.concurrent.ScheduledExecutorService; +import javax.inject.Inject; +import static net.runelite.api.ChatMessageType.GAMEMESSAGE; +import static net.runelite.api.ChatMessageType.TRADE; +import net.runelite.api.Client; +import net.runelite.api.events.ChatMessage; +import net.runelite.client.config.ChatColorConfig; +import net.runelite.client.config.ConfigManager; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.eq; +import org.mockito.Mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ChatCommandsPluginTest +{ + @Mock + @Bind + Client client; + + @Mock + @Bind + ConfigManager configManager; + + @Mock + @Bind + ScheduledExecutorService scheduledExecutorService; + + @Mock + @Bind + ChatColorConfig chatColorConfig; + + @Mock + @Bind + ChatCommandsConfig chatCommandsConfig; + + @Inject + ChatCommandsPlugin chatCommandsPlugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testCorporealBeastKill() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", "Your Corporeal Beast kill count is: 4.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "corporeal beast", 4); + } + + @Test + public void testTheatreOfBlood() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", "Your completed Theatre of Blood count is: 73.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "theatre of blood", 73); + } + + @Test + public void testWintertodt() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", "Your subdued Wintertodt count is: 4.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "wintertodt", 4); + } + + @Test + public void testKreearra() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", "Your Kree'arra kill count is: 4.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "kree'arra", 4); + } + + @Test + public void testBarrows() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", "Your Barrows chest count is: 277.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "barrows chests", 277); + } + + @Test + public void testHerbiboar() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", "Your herbiboar harvest count is: 4091.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "herbiboar", 4091); + } + + @Test + public void testPersonalBest() + { + final String FIGHT_DURATION = "Fight duration: 2:06. Personal best: 1:19."; + + when(client.getUsername()).thenReturn("Adam"); + + // This sets lastBoss + ChatMessage chatMessage = new ChatMessage(null, GAMEMESSAGE, "", "Your Kree'arra kill count is: 4.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessage); + + chatMessage = new ChatMessage(null, GAMEMESSAGE, "", FIGHT_DURATION, null, 0); + chatCommandsPlugin.onChatMessage(chatMessage); + + verify(configManager).setConfiguration(eq("personalbest.adam"), eq("kree'arra"), eq(79)); + } + + @Test + public void testPersonalBestNoTrailingPeriod() + { + final String FIGHT_DURATION = "Fight duration: 0:59. Personal best: 0:55"; + + when(client.getUsername()).thenReturn("Adam"); + + // This sets lastBoss + ChatMessage chatMessage = new ChatMessage(null, GAMEMESSAGE, "", "Your Zulrah kill count is: 4.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessage); + + chatMessage = new ChatMessage(null, GAMEMESSAGE, "", FIGHT_DURATION, null, 0); + chatCommandsPlugin.onChatMessage(chatMessage); + + verify(configManager).setConfiguration(eq("personalbest.adam"), eq("zulrah"), eq(55)); + } + + @Test + public void testNewPersonalBest() + { + final String NEW_PB = "Fight duration: 3:01 (new personal best)."; + + when(client.getUsername()).thenReturn("Adam"); + + // This sets lastBoss + ChatMessage chatMessage = new ChatMessage(null, GAMEMESSAGE, "", "Your Kree'arra kill count is: 4.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessage); + + chatMessage = new ChatMessage(null, GAMEMESSAGE, "", NEW_PB, null, 0); + chatCommandsPlugin.onChatMessage(chatMessage); + + verify(configManager).setConfiguration(eq("personalbest.adam"), eq("kree'arra"), eq(181)); + } + + @Test + public void testDuelArenaWin() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, TRADE, "", "You won! You have now won 27 duels.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "duel arena wins", 27); + verify(configManager).setConfiguration("killcount.adam", "duel arena win streak", 1); + } + + @Test + public void testDuelArenaWin2() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, TRADE, "", "You were defeated! You have won 22 duels.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "duel arena wins", 22); + } + + @Test + public void testDuelArenaLose() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, TRADE, "", "You have now lost 999 duels.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "duel arena losses", 999); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java new file mode 100644 index 0000000000..a12a8b257b --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2019, Adam + * Copyright (c) 2019, osrs-music-map + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.chatfilter; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.Player; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ChatFilterPluginTest +{ + @Mock + @Bind + private Client client; + + @Mock + @Bind + private ChatFilterConfig chatFilterConfig; + + @Mock + @Bind + private Player localPlayer; + + @Inject + private ChatFilterPlugin chatFilterPlugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + + when(chatFilterConfig.filterType()).thenReturn(ChatFilterType.CENSOR_WORDS); + when(chatFilterConfig.filteredWords()).thenReturn(""); + when(chatFilterConfig.filteredRegex()).thenReturn(""); + when(client.getLocalPlayer()).thenReturn(localPlayer); + } + + @Test + public void testCensorWords() + { + when(chatFilterConfig.filteredWords()).thenReturn("hat"); + + chatFilterPlugin.updateFilteredPatterns(); + assertEquals("w***s up", chatFilterPlugin.censorMessage("whats up")); + } + + @Test + public void testCensorRegex() + { + when(chatFilterConfig.filterType()).thenReturn(ChatFilterType.REMOVE_MESSAGE); + when(chatFilterConfig.filteredRegex()).thenReturn("5[0-9]x2\n("); + + chatFilterPlugin.updateFilteredPatterns(); + assertNull(chatFilterPlugin.censorMessage("55X2 Dicing | Trusted Ranks | Huge Pay Outs!")); + } + + @Test + public void testBrokenRegex() + { + when(chatFilterConfig.filteredRegex()).thenReturn("Test\n)\n73"); + + chatFilterPlugin.updateFilteredPatterns(); + assertEquals("** isn't funny", chatFilterPlugin.censorMessage("73 isn't funny")); + } + + @Test + public void testCaseSensitivity() + { + when(chatFilterConfig.filterType()).thenReturn(ChatFilterType.CENSOR_MESSAGE); + when(chatFilterConfig.filteredWords()).thenReturn("ReGeX!!!"); + + chatFilterPlugin.updateFilteredPatterns(); + assertEquals("Hey, everyone, I just tried to say something very silly!", + chatFilterPlugin.censorMessage("I love regex!!!!!!!!")); + } + + @Test + public void testNonPrintableCharacters() + { + when(chatFilterConfig.filterType()).thenReturn(ChatFilterType.REMOVE_MESSAGE); + when(chatFilterConfig.filteredWords()).thenReturn("test"); + + chatFilterPlugin.updateFilteredPatterns(); + assertNull(chatFilterPlugin.censorMessage("te\u008Cst")); + } + + @Test + public void testMessageFromFriendIsFiltered() + { + when(client.isFriended("Iron Mammal", false)).thenReturn(true); + when(chatFilterConfig.filterFriends()).thenReturn(true); + assertTrue(chatFilterPlugin.shouldFilterPlayerMessage("Iron Mammal")); + } + + @Test + public void testMessageFromFriendIsNotFiltered() + { + when(client.isFriended("Iron Mammal", false)).thenReturn(true); + when(chatFilterConfig.filterFriends()).thenReturn(false); + assertFalse(chatFilterPlugin.shouldFilterPlayerMessage("Iron Mammal")); + } + + @Test + public void testMessageFromClanIsFiltered() + { + when(client.isClanMember("B0aty")).thenReturn(true); + when(chatFilterConfig.filterClan()).thenReturn(true); + assertTrue(chatFilterPlugin.shouldFilterPlayerMessage("B0aty")); + } + + @Test + public void testMessageFromClanIsNotFiltered() + { + when(client.isClanMember("B0aty")).thenReturn(true); + when(chatFilterConfig.filterClan()).thenReturn(false); + assertFalse(chatFilterPlugin.shouldFilterPlayerMessage("B0aty")); + } + + @Test + public void testMessageFromSelfIsNotFiltered() + { + when(localPlayer.getName()).thenReturn("Swampletics"); + assertFalse(chatFilterPlugin.shouldFilterPlayerMessage("Swampletics")); + } + + @Test + public void testMessageFromNonFriendNonClanIsFiltered() + { + when(client.isFriended("Woox", false)).thenReturn(false); + when(client.isClanMember("Woox")).thenReturn(false); + assertTrue(chatFilterPlugin.shouldFilterPlayerMessage("Woox")); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPluginTest.java new file mode 100644 index 0000000000..c30c8a4e9e --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPluginTest.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.chatnotifications; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.Iterator; +import java.util.List; +import javax.inject.Inject; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.MessageNode; +import net.runelite.api.events.ChatMessage; +import net.runelite.client.Notifier; +import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.util.Text; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ChatNotificationsPluginTest +{ + @Mock + @Bind + private Client client; + + @Mock + @Bind + private ChatNotificationsConfig config; + + @Mock + @Bind + private ChatMessageManager chatMessageManager; + + @Mock + @Bind + private Notifier notifier; + + @Inject + private ChatNotificationsPlugin chatNotificationsPlugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void onChatMessage() + { + when(config.highlightWordsString()).thenReturn("Deathbeam, Deathbeam OSRS , test"); + + MessageNode messageNode = mock(MessageNode.class); + when(messageNode.getValue()).thenReturn("Deathbeam, Deathbeam OSRS"); + + ChatMessage chatMessage = new ChatMessage(); + chatMessage.setType(ChatMessageType.PUBLICCHAT); + chatMessage.setMessageNode(messageNode); + + chatNotificationsPlugin.startUp(); // load highlight config + chatNotificationsPlugin.onChatMessage(chatMessage); + + verify(messageNode).setValue("Deathbeam, Deathbeam OSRS"); + } + + @Test + public void highlightListTest() + { + when(config.highlightWordsString()).thenReturn("this,is, a , test, "); + final List higlights = Text.fromCSV(config.highlightWordsString()); + assertEquals(4, higlights.size()); + + final Iterator iterator = higlights.iterator(); + assertEquals("this", iterator.next()); + assertEquals("is", iterator.next()); + assertEquals("a", iterator.next()); + assertEquals("test", iterator.next()); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClueTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClueTest.java new file mode 100644 index 0000000000..6896928b29 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClueTest.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.cluescrolls.clues; + +import net.runelite.api.coords.WorldPoint; +import org.junit.Test; + +public class CoordinateClueTest +{ + @Test + public void testDuplicateCoordinates() + { + // If this doesn't throw then the clues map doesn't have duplicate keys + new CoordinateClue("test", new WorldPoint(0, 0, 0)); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java new file mode 100644 index 0000000000..e372ef763f --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2018, Brett Middle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.combatlevel; + +import net.runelite.api.Experience; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class CombatLevelPluginTest +{ + @Test + public void testNewPlayer() + { + int attackLevel = 1; + int strengthLevel = 1; + int defenceLevel = 1; + int hitpointsLevel = 10; + int magicLevel = 1; + int rangeLevel = 1; + int prayerLevel = 1; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(3, combatLevel); + + // test attack/strength + assertEquals(2, meleeNeed); + + // test defence/hitpoints + assertEquals(3, hpDefNeed); + + // test ranged + assertEquals(2, rangeNeed); + + // test magic + assertEquals(2, magicNeed); + + // test prayer + assertEquals(5, prayerNeed); + } + + @Test + public void testAll10() + { + int attackLevel = 10; + int strengthLevel = 10; + int defenceLevel = 10; + int hitpointsLevel = 10; + int magicLevel = 10; + int rangeLevel = 10; + int prayerLevel = 10; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(12, combatLevel); + + // test attack/strength + assertEquals(1, meleeNeed); + + // test defence/hitpoints + assertEquals(1, hpDefNeed); + + // test ranged + assertEquals(4, rangeNeed); + + // test magic + assertEquals(4, magicNeed); + + // test prayer + assertEquals(2, prayerNeed); + } + + @Test + public void testPlayerBmid() + { + // snapshot of current stats 2018-10-2 + int attackLevel = 65; + int strengthLevel = 70; + int defenceLevel = 60; + int hitpointsLevel = 71; + int magicLevel = 73; + int rangeLevel = 75; + int prayerLevel = 56; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(83, combatLevel); + + // test attack/strength + assertEquals(2, meleeNeed); + + // test defence/hitpoints + assertEquals(2, hpDefNeed); + + // test ranged + assertEquals(17, rangeNeed); + + // test magic + assertEquals(19, magicNeed); + + // test prayer + assertEquals(4, prayerNeed); + } + + @Test + public void testPlayerRunelite() + { + // snapshot of current stats 2018-10-2 + int attackLevel = 43; + int strengthLevel = 36; + int defenceLevel = 1; + int hitpointsLevel = 42; + int magicLevel = 64; + int rangeLevel = 51; + int prayerLevel = 15; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(43, combatLevel); + + // test attack/strength + assertEquals(18, meleeNeed); + + // test defence/hitpoints + assertEquals(2, hpDefNeed); + + // test ranged + assertEquals(14, rangeNeed); + + // test magic + assertEquals(1, magicNeed); + + // test prayer + assertEquals(3, prayerNeed); + } + + @Test + public void testPlayerZezima() + { + // snapshot of current stats 2018-10-3 + // Zezima cannot earn a combat level from ranged/magic anymore, so it won't show as the result is too high + int attackLevel = 74; + int strengthLevel = 74; + int defenceLevel = 72; + int hitpointsLevel = 72; + int magicLevel = 60; + int rangeLevel = 44; + int prayerLevel = 52; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(90, combatLevel); + + // test attack/strength + assertEquals(2, meleeNeed); + + // test defence/hitpoints + assertEquals(2, hpDefNeed); + + // test prayer + assertEquals(4, prayerNeed); + } + + @Test + public void testPrayerLevelsNeeded() + { + int attackLevel = 99; + int strengthLevel = 99; + int defenceLevel = 99; + int hitpointsLevel = 99; + int magicLevel = 99; + int rangeLevel = 99; + int prayerLevel = 89; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(124, combatLevel); + + // test prayer + assertEquals(1, prayerNeed); + } + + @Test + public void testEvenPrayerLevelsNeededWhenNearNextCombatLevel() + { + int attackLevel = 74; + int strengthLevel = 75; + int defenceLevel = 72; + int hitpointsLevel = 72; + int magicLevel = 60; + int rangeLevel = 44; + int prayerLevel = 52; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(90, combatLevel); + + // test prayer + assertEquals(2, prayerNeed); + } + + @Test + public void testOddPrayerLevelsNeededWhenNearNextCombatLevel() + { + int attackLevel = 74; + int strengthLevel = 75; + int defenceLevel = 72; + int hitpointsLevel = 72; + int magicLevel = 60; + int rangeLevel = 44; + int prayerLevel = 53; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(90, combatLevel); + + // test prayer + assertEquals(1, prayerNeed); + } + + @Test + public void testNextMagicLevelBarelyReachesNextCombatLevel() + { + int attackLevel = 40; + int strengthLevel = 44; + int defenceLevel = 46; + int hitpointsLevel = 39; + int magicLevel = 57; + int rangeLevel = 40; + int prayerLevel = 29; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(52, combatLevel); + + // test attack/strength + assertEquals(3, meleeNeed); + + // test defence/hitpoints + assertEquals(3, hpDefNeed); + + // test ranged + assertEquals(18, rangeNeed); + + // test magic + assertEquals(1, magicNeed); + + // test prayer + assertEquals(5, prayerNeed); + } + + @Test + public void testRangeMagicLevelsNeeded() + { + int attackLevel = 60; + int strengthLevel = 69; + int defenceLevel = 1; + int hitpointsLevel = 78; + int magicLevel = 85; + int rangeLevel = 85; + int prayerLevel = 52; + + int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, + magicLevel, rangeLevel, prayerLevel); + + // test combat level + assertEquals(68, combatLevel); + + // test attack/strength + assertEquals(3, meleeNeed); + + // test defence/hitpoints + assertEquals(4, hpDefNeed); + + // test ranged + assertEquals(3, rangeNeed); + + // test magic + assertEquals(3, magicNeed); + + // test prayer + assertEquals(8, prayerNeed); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/cooking/CookingPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/cooking/CookingPluginTest.java new file mode 100644 index 0000000000..6b8334e99d --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/cooking/CookingPluginTest.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.cooking; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import javax.inject.Inject; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GraphicID; +import net.runelite.api.Player; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.SpotAnimationChanged; +import net.runelite.client.game.ItemManager; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.any; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class CookingPluginTest +{ + private static final String[] COOKING_MESSAGES = { + "You successfully cook a shark.", + "You successfully cook an anglerfish.", + "You manage to cook a tuna.", + "You cook the karambwan. It looks delicious.", + "You roast a lobster.", + "You cook a bass.", + "You successfully bake a tasty garden pie." + }; + + @Inject + CookingPlugin cookingPlugin; + + @Mock + @Bind + Client client; + + @Mock + @Bind + InfoBoxManager infoBoxManager; + + @Mock + @Bind + ItemManager itemManager; + + @Mock + @Bind + CookingConfig config; + + @Mock + @Bind + CookingOverlay cookingOverlay; + + @Mock + @Bind + OverlayManager overlayManager; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testOnChatMessage() + { + for (String message : COOKING_MESSAGES) + { + ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.SPAM, "", message, "", 0); + cookingPlugin.onChatMessage(chatMessage); + } + + CookingSession cookingSession = cookingPlugin.getSession(); + assertNotNull(cookingSession); + assertEquals(COOKING_MESSAGES.length, cookingSession.getCookAmount()); + } + + @Test + public void testOnSpotAnimationChanged() + { + Player player = mock(Player.class); + when(player.getSpotAnimation()).thenReturn(GraphicID.WINE_MAKE); + + when(config.fermentTimer()).thenReturn(true); + when(client.getLocalPlayer()).thenReturn(player); + + SpotAnimationChanged graphicChanged = new SpotAnimationChanged(); + graphicChanged.setActor(player); + cookingPlugin.onSpotAnimationChanged(graphicChanged); + + verify(infoBoxManager).addInfoBox(any(FermentTimer.class)); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java new file mode 100644 index 0000000000..3427246946 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.emojis; + +import com.google.inject.Guice; +import com.google.inject.Inject; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.IndexedSprite; +import net.runelite.api.MessageNode; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.client.chat.ChatMessageManager; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class EmojiPluginTest +{ + @Mock + @Bind + private Client client; + + @Mock + @Bind + private ChatMessageManager chatMessageManager; + + @Inject + private EmojiPlugin emojiPlugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testOnChatMessage() + { + when(client.getGameState()).thenReturn(GameState.LOGGED_IN); + when(client.getModIcons()).thenReturn(new IndexedSprite[0]); + when(client.createIndexedSprite()).thenReturn(mock(IndexedSprite.class)); + + // Trip emoji loading + GameStateChanged gameStateChanged = new GameStateChanged(); + gameStateChanged.setGameState(GameState.LOGGED_IN); + emojiPlugin.onGameStateChanged(gameStateChanged); + + MessageNode messageNode = mock(MessageNode.class); + // With chat recolor, message may be wrapped in col tags + when(messageNode.getValue()).thenReturn(":) :) :)"); + + ChatMessage chatMessage = new ChatMessage(); + chatMessage.setType(ChatMessageType.PUBLICCHAT); + chatMessage.setMessageNode(messageNode); + + emojiPlugin.onChatMessage(chatMessage); + + verify(messageNode).setRuneLiteFormatMessage(" "); + } + + @Test + public void testGtLt() + { + when(client.getGameState()).thenReturn(GameState.LOGGED_IN); + when(client.getModIcons()).thenReturn(new IndexedSprite[0]); + when(client.createIndexedSprite()).thenReturn(mock(IndexedSprite.class)); + + // Trip emoji loading + GameStateChanged gameStateChanged = new GameStateChanged(); + gameStateChanged.setGameState(GameState.LOGGED_IN); + emojiPlugin.onGameStateChanged(gameStateChanged); + + MessageNode messageNode = mock(MessageNode.class); + when(messageNode.getValue()).thenReturn(":D"); + + ChatMessage chatMessage = new ChatMessage(); + chatMessage.setType(ChatMessageType.PUBLICCHAT); + chatMessage.setMessageNode(messageNode); + + emojiPlugin.onChatMessage(chatMessage); + + verify(messageNode).setRuneLiteFormatMessage(""); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java new file mode 100644 index 0000000000..8ba0b4253a --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.examine; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.concurrent.ScheduledExecutorService; +import javax.inject.Inject; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import net.runelite.api.MenuAction; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.widgets.Widget; +import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.game.ItemManager; +import net.runelite.http.api.examine.ExamineClient; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ExaminePluginTest +{ + @Inject + ExaminePlugin examinePlugin; + + @Mock + @Bind + ExamineClient examineClient; + + @Mock + @Bind + Client client; + + @Mock + @Bind + ChatMessageManager chatMessageManager; + + @Mock + @Bind + ItemManager itemManager; + + @Mock + @Bind + ScheduledExecutorService scheduledExecutorService; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testItem() + { + when(client.getWidget(anyInt(), anyInt())).thenReturn(mock(Widget.class)); + + MenuOptionClicked menuOptionClicked = new MenuOptionClicked(new MenuEntry( + "Examine", + "Something", + ItemID.ABYSSAL_WHIP, + MenuAction.EXAMINE_ITEM.getId(), + 123, + 456, + false + )); + examinePlugin.onMenuOptionClicked(menuOptionClicked); + + ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.ITEM_EXAMINE, "", "A weapon from the abyss.", "", 0); + examinePlugin.onChatMessage(chatMessage); + + // This passes due to not mocking the ItemDefinition for the whip + verify(examineClient).submitItem(anyInt(), anyString()); + } + + @Test + public void testLargeStacks() + { + when(client.getWidget(anyInt(), anyInt())).thenReturn(mock(Widget.class)); + + MenuOptionClicked menuOptionClicked = new MenuOptionClicked(new MenuEntry( + "Examine", + "Something", + ItemID.ABYSSAL_WHIP, + MenuAction.EXAMINE_ITEM.getId(), + 123, + 456, + false + )); + + + examinePlugin.onMenuOptionClicked(menuOptionClicked); + + ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.ITEM_EXAMINE, "", "100000 x Abyssal whip", "", 0); + examinePlugin.onChatMessage(chatMessage); + + verify(examineClient, never()).submitItem(anyInt(), anyString()); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/gpu/ShaderTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/gpu/ShaderTest.java new file mode 100644 index 0000000000..bc42b37239 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/gpu/ShaderTest.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.gpu; + +import com.jogamp.nativewindow.AbstractGraphicsConfiguration; +import com.jogamp.nativewindow.NativeWindowFactory; +import com.jogamp.nativewindow.awt.AWTGraphicsConfiguration; +import com.jogamp.nativewindow.awt.JAWTWindow; +import com.jogamp.opengl.GL4; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLContext; +import com.jogamp.opengl.GLDrawable; +import com.jogamp.opengl.GLDrawableFactory; +import com.jogamp.opengl.GLProfile; +import java.awt.Canvas; +import java.util.function.Function; +import javax.swing.JFrame; +import static net.runelite.client.plugins.gpu.GLUtil.inputStreamToString; +import net.runelite.client.plugins.gpu.template.Template; +import static org.junit.Assert.fail; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +public class ShaderTest +{ + private static final String VERTEX_SHADER = "" + + "void main() {" + + " gl_Position = vec4(1.0, 1.0, 1.0, 1.0);" + + "}"; + private GL4 gl; + + @Before + public void before() + { + Canvas canvas = new Canvas(); + JFrame frame = new JFrame(); + frame.setSize(100, 100); + frame.add(canvas); + frame.setVisible(true); + + GLProfile glProfile = GLProfile.getMaxFixedFunc(true); + + GLCapabilities glCaps = new GLCapabilities(glProfile); + AbstractGraphicsConfiguration config = AWTGraphicsConfiguration.create(canvas.getGraphicsConfiguration(), + glCaps, glCaps); + + JAWTWindow jawtWindow = (JAWTWindow) NativeWindowFactory.getNativeWindow(canvas, config); + + GLDrawableFactory glDrawableFactory = GLDrawableFactory.getFactory(glProfile); + + GLDrawable glDrawable = glDrawableFactory.createGLDrawable(jawtWindow); + glDrawable.setRealized(true); + + + GLContext glContext = glDrawable.createContext(null); + int res = glContext.makeCurrent(); + if (res == GLContext.CONTEXT_NOT_CURRENT) + { + fail("error making context current"); + } + + gl = glContext.getGL().getGL4(); + } + + @Test + @Ignore + public void testUnordered() throws ShaderException + { + int glComputeProgram = gl.glCreateProgram(); + int glComputeShader = gl.glCreateShader(gl.GL_COMPUTE_SHADER); + try + { + Function func = (s) -> inputStreamToString(getClass().getResourceAsStream(s)); + Template template = new Template(func); + String source = template.process(func.apply("comp_unordered.glsl")); + + int line = 0; + for (String str : source.split("\\n")) + { + System.out.println(++line + " " + str); + } + + GLUtil.loadComputeShader(gl, glComputeProgram, glComputeShader, source); + } + finally + { + gl.glDeleteShader(glComputeShader); + gl.glDeleteProgram(glComputeProgram); + } + } + + @Test + @Ignore + public void testSmall() throws ShaderException + { + int glComputeProgram = gl.glCreateProgram(); + int glComputeShader = gl.glCreateShader(gl.GL_COMPUTE_SHADER); + try + { + Function func = (s) -> inputStreamToString(getClass().getResourceAsStream(s)); + Template template = new Template(func); + String source = template.process(func.apply("comp_small.glsl")); + + int line = 0; + for (String str : source.split("\\n")) + { + System.out.println(++line + " " + str); + } + + GLUtil.loadComputeShader(gl, glComputeProgram, glComputeShader, source); + } + finally + { + gl.glDeleteShader(glComputeShader); + gl.glDeleteProgram(glComputeProgram); + } + } + + @Test + @Ignore + public void testComp() throws ShaderException + { + int glComputeProgram = gl.glCreateProgram(); + int glComputeShader = gl.glCreateShader(gl.GL_COMPUTE_SHADER); + try + { + Function func = (s) -> inputStreamToString(getClass().getResourceAsStream(s)); + Template template = new Template(func); + String source = template.process(func.apply("comp.glsl")); + + int line = 0; + for (String str : source.split("\\n")) + { + System.out.println(++line + " " + str); + } + + GLUtil.loadComputeShader(gl, glComputeProgram, glComputeShader, source); + } + finally + { + gl.glDeleteShader(glComputeShader); + gl.glDeleteProgram(glComputeProgram); + } + } + + @Test + @Ignore + public void testGeom() throws ShaderException + { + int glComputeProgram = gl.glCreateProgram(); + int glVertexShader = gl.glCreateShader(gl.GL_VERTEX_SHADER); + int glGeometryShader = gl.glCreateShader(gl.GL_GEOMETRY_SHADER); + int glFragmentShader = gl.glCreateShader(gl.GL_FRAGMENT_SHADER); + try + { + Function func = (s) -> inputStreamToString(getClass().getResourceAsStream(s)); + Template template = new Template(func); + String source = template.process(func.apply("geom.glsl")); + + int line = 0; + for (String str : source.split("\\n")) + { + System.out.println(++line + " " + str); + } + + GLUtil.loadShaders(gl, glComputeProgram, glVertexShader, glGeometryShader, glFragmentShader, VERTEX_SHADER, source, ""); + } + finally + { + gl.glDeleteShader(glVertexShader); + gl.glDeleteShader(glGeometryShader); + gl.glDeleteShader(glFragmentShader); + gl.glDeleteProgram(glComputeProgram); + } + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/gpu/template/TemplateTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/gpu/template/TemplateTest.java new file mode 100644 index 0000000000..0c35e65d52 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/gpu/template/TemplateTest.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.gpu.template; + +import java.util.function.Function; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class TemplateTest +{ + private static final String FILE1 = "" + + "test1\n" + + "#include file2\n" + + "test3\n"; + + private static final String FILE2 = "" + + "test4\n" + + "test5\n"; + + private static final String RESULT = "" + + "test1\n" + + "test4\n" + + "test5\n" + + "test3\n"; + + @Test + public void testProcess() + { + Function func = (String resource) -> + { + switch (resource) + { + case "file2": + return FILE2; + default: + throw new RuntimeException("unknown resource"); + } + }; + String out = new Template(func).process(FILE1); + assertEquals(RESULT, out); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java new file mode 100644 index 0000000000..172c36d129 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.plugins.grandexchange; + +import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GrandExchangeOfferState; +import net.runelite.api.ItemDefinition; +import net.runelite.client.game.AsyncBufferedImage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class GrandExchangeOfferSlotTest +{ + @Mock + private GrandExchangeOffer offer; + + @Test + public void testUpdateOffer() + { + when(offer.getState()).thenReturn(GrandExchangeOfferState.CANCELLED_BUY); + + GrandExchangeOfferSlot offerSlot = new GrandExchangeOfferSlot(); + offerSlot.updateOffer(mock(ItemDefinition.class), mock(AsyncBufferedImage.class), offer); + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/WildcardMatchLoaderTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/WildcardMatchLoaderTest.java new file mode 100644 index 0000000000..b65dc30076 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/WildcardMatchLoaderTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.grounditems; + +import java.util.Arrays; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class WildcardMatchLoaderTest +{ + @Test + public void testLoad() + { + WildcardMatchLoader loader = new WildcardMatchLoader(Arrays.asList("rune*", "Abyssal whip")); + assertTrue(loader.load("rune pouch")); + assertTrue(loader.load("Rune pouch")); + assertFalse(loader.load("Adamant dagger")); + assertTrue(loader.load("Runeite Ore")); + assertTrue(loader.load("Abyssal whip")); + assertFalse(loader.load("Abyssal dagger")); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java new file mode 100644 index 0000000000..058877dd85 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.hiscore; + +import org.junit.Test; + +public class HiscorePanelTest +{ + @Test + public void testConstructor() + { + new HiscorePanel(new HiscoreConfig() + { + }); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java new file mode 100644 index 0000000000..51dc7842e0 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.idlenotifier; + +import com.google.inject.Guice; +import com.google.inject.Inject; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.EnumSet; +import net.runelite.api.AnimationID; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Hitsplat; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Player; +import net.runelite.api.VarPlayer; +import net.runelite.api.WorldType; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.InteractingChanged; +import net.runelite.client.Notifier; +import net.runelite.client.game.SoundManager; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Matchers; +import static org.mockito.Matchers.any; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class IdleNotifierPluginTest +{ + private static final String PLAYER_NAME = "Deathbeam"; + + @Mock + @Bind + private Client client; + + @Mock + @Bind + private IdleNotifierConfig config; + + @Mock + @Bind + private SoundManager soundManager; + + @Mock + @Bind + private Notifier notifier; + + @Inject + private IdleNotifierPlugin plugin; + + @Mock + private NPC monster; + + @Mock + private NPC randomEvent; + + @Mock + private Player player; + + @Before + public void setUp() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + + // Mock monster + final String[] monsterActions = new String[] { "Attack", "Examine" }; + final NPCDefinition monsterComp = mock(NPCDefinition.class); + when(monsterComp.getActions()).thenReturn(monsterActions); + when(monster.getDefinition()).thenReturn(monsterComp); + + // Mock random event + final String[] randomEventActions = new String[] { "Talk-to", "Dismiss", "Examine" }; + final NPCDefinition randomEventComp = mock(NPCDefinition.class); + when(randomEventComp.getActions()).thenReturn(randomEventActions); + when(randomEvent.getDefinition()).thenReturn(randomEventComp); + + // Mock player + when(player.getName()).thenReturn(PLAYER_NAME); + when(player.getAnimation()).thenReturn(AnimationID.IDLE); + when(client.getLocalPlayer()).thenReturn(player); + + // Mock config + when(config.logoutIdle()).thenReturn(true); + when(config.animationIdle()).thenReturn(true); + when(config.interactionIdle()).thenReturn(true); + when(config.getIdleNotificationDelay()).thenReturn(0); + when(config.getHitpointsThreshold()).thenReturn(42); + when(config.getPrayerThreshold()).thenReturn(42); + + // Mock client + when(client.getGameState()).thenReturn(GameState.LOGGED_IN); + when(client.getKeyboardIdleTicks()).thenReturn(42); + when(client.getMouseLastPressedMillis()).thenReturn(System.currentTimeMillis() - 100_000L); + when(client.getWorldType()).thenReturn(EnumSet.of(WorldType.DEADMAN)); + } + + @Test + public void checkAnimationIdle() + { + when(player.getAnimation()).thenReturn(AnimationID.WOODCUTTING_BRONZE); + AnimationChanged animationChanged = new AnimationChanged(); + animationChanged.setActor(player); + plugin.onAnimationChanged(animationChanged); + plugin.onGameTick(new GameTick()); + when(player.getAnimation()).thenReturn(AnimationID.IDLE); + plugin.onAnimationChanged(animationChanged); + plugin.onGameTick(new GameTick()); + verify(notifier).notify("[" + PLAYER_NAME + "] is now idle!"); + } + + @Test + public void checkAnimationReset() + { + when(player.getAnimation()).thenReturn(AnimationID.WOODCUTTING_BRONZE); + AnimationChanged animationChanged = new AnimationChanged(); + animationChanged.setActor(player); + plugin.onAnimationChanged(animationChanged); + plugin.onGameTick(new GameTick()); + when(player.getAnimation()).thenReturn(AnimationID.LOOKING_INTO); + plugin.onAnimationChanged(animationChanged); + plugin.onGameTick(new GameTick()); + when(player.getAnimation()).thenReturn(AnimationID.IDLE); + plugin.onAnimationChanged(animationChanged); + plugin.onGameTick(new GameTick()); + verify(notifier, times(0)).notify(any()); + } + + @Test + public void checkAnimationLogout() + { + when(player.getAnimation()).thenReturn(AnimationID.WOODCUTTING_BRONZE); + AnimationChanged animationChanged = new AnimationChanged(); + animationChanged.setActor(player); + plugin.onAnimationChanged(animationChanged); + plugin.onGameTick(new GameTick()); + + // Logout + when(client.getGameState()).thenReturn(GameState.LOGIN_SCREEN); + GameStateChanged gameStateChanged = new GameStateChanged(); + gameStateChanged.setGameState(GameState.LOGIN_SCREEN); + plugin.onGameStateChanged(gameStateChanged); + + // Log back in + when(client.getGameState()).thenReturn(GameState.LOGGED_IN); + gameStateChanged.setGameState(GameState.LOGGED_IN); + plugin.onGameStateChanged(gameStateChanged); + + // Tick + when(player.getAnimation()).thenReturn(AnimationID.IDLE); + plugin.onAnimationChanged(animationChanged); + plugin.onGameTick(new GameTick()); + verify(notifier, times(0)).notify(any()); + } + + @Test + public void checkCombatIdle() + { + when(player.getInteracting()).thenReturn(monster); + plugin.onInteractingChanged(new InteractingChanged(player, monster)); + plugin.onGameTick(new GameTick()); + when(player.getInteracting()).thenReturn(null); + plugin.onInteractingChanged(new InteractingChanged(player, null)); + plugin.onGameTick(new GameTick()); + verify(notifier).notify("[" + PLAYER_NAME + "] is now out of combat!"); + } + + @Test + public void checkCombatReset() + { + when(player.getInteracting()).thenReturn(monster); + plugin.onInteractingChanged(new InteractingChanged(player, monster)); + plugin.onGameTick(new GameTick()); + when(player.getInteracting()).thenReturn(randomEvent); + plugin.onInteractingChanged(new InteractingChanged(player, randomEvent)); + plugin.onGameTick(new GameTick()); + when(player.getInteracting()).thenReturn(null); + plugin.onInteractingChanged(new InteractingChanged(player, null)); + plugin.onGameTick(new GameTick()); + verify(notifier, times(0)).notify(any()); + } + + @Test + public void checkCombatLogout() + { + plugin.onInteractingChanged(new InteractingChanged(player, monster)); + when(player.getInteracting()).thenReturn(monster); + plugin.onGameTick(new GameTick()); + + // Logout + when(client.getGameState()).thenReturn(GameState.LOGIN_SCREEN); + GameStateChanged gameStateChanged = new GameStateChanged(); + gameStateChanged.setGameState(GameState.LOGIN_SCREEN); + plugin.onGameStateChanged(gameStateChanged); + + // Log back in + when(client.getGameState()).thenReturn(GameState.LOGGED_IN); + gameStateChanged.setGameState(GameState.LOGGED_IN); + plugin.onGameStateChanged(gameStateChanged); + + // Tick + when(player.getInteracting()).thenReturn(null); + plugin.onInteractingChanged(new InteractingChanged(player, null)); + plugin.onGameTick(new GameTick()); + verify(notifier, times(0)).notify(any()); + } + + @Test + public void checkCombatLogoutIdle() + { + // Player is idle + when(client.getMouseIdleTicks()).thenReturn(80_000); + + // But player is being damaged (is in combat) + final HitsplatApplied hitsplatApplied = new HitsplatApplied(); + hitsplatApplied.setActor(player); + hitsplatApplied.setHitsplat(new Hitsplat(Hitsplat.HitsplatType.DAMAGE, 0, 0)); + plugin.onHitsplatApplied(hitsplatApplied); + plugin.onGameTick(new GameTick()); + verify(notifier, times(0)).notify(any()); + } + + @Test + public void doubleNotifyOnMouseReset() + { + // Player is idle, but in combat so the idle packet is getting set repeatedly + // make sure we are not notifying + + when(client.getKeyboardIdleTicks()).thenReturn(80_000); + when(client.getMouseIdleTicks()).thenReturn(14_500); + + plugin.onGameTick(new GameTick()); + plugin.onGameTick(new GameTick()); + verify(notifier, times(1)).notify(any()); + } + + @Test + public void testSpecRegen() + { + when(config.getSpecEnergyThreshold()).thenReturn(50); + + when(client.getVar(Matchers.eq(VarPlayer.SPECIAL_ATTACK_PERCENT))).thenReturn(400); // 40% + plugin.onGameTick(new GameTick()); // once to set lastSpecEnergy to 400 + verify(notifier, never()).notify(any()); + + when(client.getVar(Matchers.eq(VarPlayer.SPECIAL_ATTACK_PERCENT))).thenReturn(500); // 50% + plugin.onGameTick(new GameTick()); + verify(notifier).notify(Matchers.eq("[" + PLAYER_NAME + "] has restored spec energy!")); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java new file mode 100644 index 0000000000..805c7822b8 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemcharges; + +import com.google.inject.Guice; +import com.google.inject.Inject; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.concurrent.ScheduledExecutorService; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.events.ChatMessage; +import net.runelite.client.Notifier; +import net.runelite.client.config.RuneLiteConfig; +import net.runelite.client.ui.overlay.OverlayManager; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.eq; +import org.mockito.Mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ItemChargePluginTest +{ + private static final String CHECK = "Your dodgy necklace has 10 charges left."; + private static final String PROTECT = "Your dodgy necklace protects you. It has 9 charges left."; + private static final String PROTECT_1 = "Your dodgy necklace protects you. It has 1 charge left."; + private static final String BREAK = "Your dodgy necklace protects you. It then crumbles to dust."; + + @Mock + @Bind + private Client client; + + @Mock + @Bind + private ScheduledExecutorService scheduledExecutorService; + + @Mock + @Bind + private RuneLiteConfig runeLiteConfig; + + @Mock + @Bind + private OverlayManager overlayManager; + + @Mock + @Bind + private Notifier notifier; + + @Mock + @Bind + private ItemChargeConfig config; + + @Inject + private ItemChargePlugin itemChargePlugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testOnChatMessage() + { + ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", CHECK, "", 0); + itemChargePlugin.onChatMessage(chatMessage); + verify(config).dodgyNecklace(eq(10)); + reset(config); + + chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", PROTECT, "", 0); + itemChargePlugin.onChatMessage(chatMessage); + verify(config).dodgyNecklace(eq(9)); + reset(config); + + chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", PROTECT_1, "", 0); + itemChargePlugin.onChatMessage(chatMessage); + verify(config).dodgyNecklace(eq(1)); + reset(config); + + chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", BREAK, "", 0); + itemChargePlugin.onChatMessage(chatMessage); + verify(config).dodgyNecklace(eq(10)); + reset(config); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatChangesTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatChangesTest.java new file mode 100644 index 0000000000..6a134ff101 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatChangesTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016-2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemstats; + +import org.junit.Test; + +public class ItemStatChangesTest +{ + @Test + public void testInit() + { + new ItemStatChanges(); + } + +} diff --git a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculatorTest.java similarity index 50% rename from RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java rename to runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculatorTest.java index 6b8b45e4e9..8c28256b89 100644 --- a/RuneLitePlus/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/MaxHitCalculatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Lucas + * Copyright (c) 2019, Bartvollebregt * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,77 +22,48 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.alchemicalhydra; +package net.runelite.client.plugins.maxhit.calculators; -import javax.inject.Singleton; -import lombok.Getter; -import lombok.Setter; -import api.NPC; -import api.Prayer; -import api.ProjectileID; +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import net.runelite.api.Client; +import net.runelite.client.plugins.maxhit.calculators.testconfig.MagicMaxHitConfig; +import net.runelite.client.plugins.maxhit.calculators.testconfig.MaxHitConfig; +import net.runelite.client.plugins.maxhit.calculators.testconfig.MeleeMaxHitConfig; +import net.runelite.client.plugins.maxhit.calculators.testconfig.RangeMaxHitConfig; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; -@Singleton -class Hydra +@RunWith(MockitoJUnitRunner.class) +public class MaxHitCalculatorTest { - enum AttackStyle + @Mock + @Bind + protected Client client; + + @Before + public void setUp() { - MAGIC(ProjectileID.HYDRA_MAGIC, Prayer.PROTECT_FROM_MAGIC), - RANGED(ProjectileID.HYDRA_RANGED, Prayer.PROTECT_FROM_MISSILES); + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } - @Getter - private int projId; + @Test + public void calculate() + { + testMaxHitConfig(MeleeMaxHitConfig.values()); + testMaxHitConfig(RangeMaxHitConfig.values()); + testMaxHitConfig(MagicMaxHitConfig.values()); + } - @Getter - private Prayer prayer; - - AttackStyle(int projId, Prayer prayer) + private void testMaxHitConfig(MaxHitConfig[] maxHitConfigs) + { + for (MaxHitConfig maxHitConfig : maxHitConfigs) { - this.projId = projId; - this.prayer = prayer; + maxHitConfig.test(client); } } - - @Getter - @Setter - private NPC npc; - - @Getter - @Setter - private HydraPhase phase; - - @Getter - @Setter - private int attackCount; - - @Getter - @Setter - private int nextSwitch; - - @Getter - @Setter - private int nextSpecial; - - @Getter - @Setter - private AttackStyle nextAttack; - - @Getter - @Setter - private AttackStyle lastAttack; - - @Getter - @Setter - private boolean weakened; - - Hydra(NPC npc) - { - this.npc = npc; - this.phase = HydraPhase.ONE; - this.nextAttack = AttackStyle.MAGIC; - this.lastAttack = AttackStyle.MAGIC; // important, else we wouldn't switch if the first attack is ranged - this.nextSpecial = 3; - this.nextSwitch = phase.getAttacksPerSwitch(); - this.attackCount = 0; - this.weakened = false; - } } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MagicMaxHitConfig.java b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MagicMaxHitConfig.java new file mode 100644 index 0000000000..452aa484fc --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MagicMaxHitConfig.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2019, Bartvollebregt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.maxhit.calculators.testconfig; + +import net.runelite.api.*; +import net.runelite.client.plugins.maxhit.calculators.MagicMaxHitCalculator; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public enum MagicMaxHitConfig implements MaxHitConfig +{ + + TRIDENT_SLAYER(new int[] {75, 83, 99}, 0, new Item[] + { + mockItem(ItemID.SLAYER_HELMET_I), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.OCCULT_NECKLACE), + mockItem(ItemID.TRIDENT_OF_THE_SEAS), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.BROODOO_SHIELD), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, new int[] {25, 27, 34}), + + TRIDENT_OF_SEAS(new int[] {75, 83, 99}, 0, new Item[] + { + mockItem(ItemID.MYSTIC_HAT), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.AMULET_OF_GLORY), + mockItem(ItemID.TRIDENT_OF_THE_SEAS), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.BROODOO_SHIELD), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, new int[] {20, 22, 28}), + + TRIDENT_OF_SWAMP(new int[] {75, 83, 99}, 0, new Item[] + { + mockItem(ItemID.MYSTIC_HAT), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.AMULET_OF_GLORY), + mockItem(ItemID.TRIDENT_OF_THE_SWAMP), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.BROODOO_SHIELD), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, new int[] {23, 25, 31}), + + MAGIC_DART(new int[] {75, 83, 99}, 18, new Item[] + { + mockItem(ItemID.MYSTIC_HAT), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.AMULET_OF_GLORY), + mockItem(ItemID.SLAYERS_STAFF), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.BROODOO_SHIELD), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, new int[] {17, 18, 19}), + + + FIRE_BOLT(75, 8, new Item[] + { + mockItem(ItemID.SLAYER_HELMET_I), + mockItem(ItemID.IMBUED_SARADOMIN_CAPE), + mockItem(ItemID.OCCULT_NECKLACE), + mockItem(ItemID.STAFF_OF_THE_DEAD), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.TOME_OF_FIRE), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.CHAOS_GAUNTLETS), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, 31), + + + WIND_BLAST(75, 9, new Item[] + { + mockItem(ItemID.MYSTIC_HAT), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.AMULET_OF_GLORY), + mockItem(ItemID.STAFF_OF_AIR), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.BROODOO_SHIELD), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, 13), + + + EARTH_WAVE(75, 15, new Item[] + { + mockItem(ItemID.MYSTIC_HAT), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.OCCULT_NECKLACE), + mockItem(ItemID.STAFF_OF_EARTH), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.TOME_OF_FIRE), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, 20), + + FLAMES_OF_ZAMORAK(75, 20, new Item[] + { + mockItem(ItemID.MYSTIC_HAT), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.AMULET_OF_GLORY), + mockItem(ItemID.STAFF_OF_THE_DEAD), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.BROODOO_SHIELD), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, 23), + + SARADOMIN_STRIKE(75, 52, new Item[] + { + mockItem(ItemID.MYSTIC_HAT), + mockItem(ItemID.SARADOMIN_CAPE), + mockItem(ItemID.AMULET_OF_GLORY), + mockItem(ItemID.STAFF_OF_LIGHT), + mockItem(ItemID.MYSTIC_ROBE_TOP), + mockItem(ItemID.BROODOO_SHIELD), + null, + mockItem(ItemID.MYSTIC_ROBE_BOTTOM), + null, + mockItem(ItemID.MYSTIC_GLOVES), + mockItem(ItemID.WIZARD_BOOTS), + mockItem(ItemID.RING_OF_WEALTH) + }, 23), + + + ; + + + private final int[] magicLevels; + private final int spellId; + private final Item[] equipedItems; + private final int[] expectedMaxHits; + + MagicMaxHitConfig(int magicLevel, int spellId, Item[] equipedItems, int expectedMaxHit) + { + this.magicLevels = new int[] {magicLevel}; + this.spellId = spellId; + this.equipedItems = equipedItems; + this.expectedMaxHits = new int[] {expectedMaxHit}; + } + + MagicMaxHitConfig(int[] magicLevels, int spellId, Item[] equipedItems, int[] expectedMaxHits) + { + this.magicLevels = magicLevels; + this.spellId = spellId; + this.equipedItems = equipedItems; + this.expectedMaxHits = expectedMaxHits; + } + + + private static Item mockItem(int itemId) + { + Item item = mock(Item.class); + when(item.getId()).thenReturn(itemId); + return item; + } + + public void test(Client client) + { + int[] magicLevels = this.magicLevels; + for (int i = 0, magicLevelsLength = magicLevels.length; i < magicLevelsLength; i++) + { + int magicLevel = magicLevels[i]; + int expectedMaxHit = this.expectedMaxHits[i]; + + // Mock equipment container + ItemContainer equipmentContainer = mock(ItemContainer.class); + when(equipmentContainer.getItems()) + .thenReturn(this.equipedItems); + when(client.getItemContainer(InventoryID.EQUIPMENT)).thenReturn(equipmentContainer); + + // Mock Varbits + when(client.getBoostedSkillLevel(Skill.MAGIC)).thenReturn(magicLevel); + when(client.getVar(Varbits.AUTO_CAST_SPELL)).thenReturn(this.spellId); + + // Test + MagicMaxHitCalculator maxHitCalculator = new MagicMaxHitCalculator(client, this.equipedItems); + assertEquals(this.toString(), expectedMaxHit, maxHitCalculator.getMaxHit(), 0); + + } + + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MaxHitConfig.java b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MaxHitConfig.java new file mode 100644 index 0000000000..309abe1727 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MaxHitConfig.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019, Bartvollebregt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.maxhit.calculators.testconfig; + +import net.runelite.api.Client; + +public interface MaxHitConfig +{ + void test(Client client); +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MeleeMaxHitConfig.java b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MeleeMaxHitConfig.java new file mode 100644 index 0000000000..dd03f9487e --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/MeleeMaxHitConfig.java @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2019, Bartvollebregt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.maxhit.calculators.testconfig; + +import net.runelite.api.*; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.plugins.maxhit.attackstyle.WeaponType; +import net.runelite.client.plugins.maxhit.calculators.MeleeMaxHitCalculator; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public enum MeleeMaxHitConfig implements MaxHitConfig +{ + + DRAGON_SCIMITAR(new int[] {75, 83, 99}, 66, WeaponType.TYPE_9, 1, new Item[] + { + mockItem(ItemID.IRON_FULL_HELM), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.DRAGON_SCIMITAR), + mockItem(ItemID.IRON_PLATEBODY), + mockItem(ItemID.IRON_KITESHIELD), + null, + mockItem(ItemID.IRON_PLATELEGS), + null, + mockItem(ItemID.LEATHER_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING) + }, new int[] {17, 19, 22}), + + DRAGON_SCIMITAR_DEFENDER(new int[] {75, 83, 99}, 76, WeaponType.TYPE_9, 1, new Item[] + { + mockItem(ItemID.IRON_FULL_HELM), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.DRAGON_SCIMITAR), + mockItem(ItemID.IRON_PLATEBODY), + mockItem(ItemID.DRAGON_DEFENDER), + null, + mockItem(ItemID.IRON_PLATELEGS), + null, + mockItem(ItemID.LEATHER_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING) + }, new int[] {19, 21, 24}), + + DRAGON_SCIMITAR_COMPLETE(new int[] {75, 83, 99}, 108, WeaponType.TYPE_9, 1, new Item[] + { + mockItem(ItemID.SLAYER_HELMET), + mockItem(ItemID.FIRE_CAPE), + mockItem(ItemID.AMULET_OF_FURY), + mockItem(ItemID.DRAGON_SCIMITAR), + mockItem(ItemID.FIGHTER_TORSO), + mockItem(ItemID.DRAGON_DEFENDER), + null, + mockItem(ItemID.IRON_PLATELEGS), + null, + mockItem(ItemID.BARROWS_GLOVES), + mockItem(ItemID.DRAGON_BOOTS), + mockItem(ItemID.BERSERKER_RING) + }, new int[] {26, 29, 35}), + + OBSIDIAN_SET(new int[] {75, 83, 99}, 61, WeaponType.TYPE_17, 2, new Item[] + { + mockItem(ItemID.OBSIDIAN_HELMET), + mockItem(ItemID.OBSIDIAN_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.TOKTZXILAK), + mockItem(ItemID.OBSIDIAN_PLATEBODY), + mockItem(ItemID.TOKTZKETXIL), + null, + mockItem(ItemID.OBSIDIAN_PLATELEGS), + null, + mockItem(ItemID.LEATHER_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING) + }, new int[] {18, 19, 23}), + + DHAROK_SET(new int[] {75, 75, 75, 83, 83, 83, 99, 99, 99}, 105, WeaponType.TYPE_1, 1, + new int[][] {{99, 99}, {1, 99}, {32, 75}, {99, 99}, {1, 99}, {32, 75}, {99, 99}, {1, 99}, {32, 75}}, + new Item[] + { + mockItem(ItemID.DHAROKS_HELM_100), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.DHAROKS_GREATAXE_100), + mockItem(ItemID.DHAROKS_PLATEBODY_100), + null, + null, + mockItem(ItemID.DHAROKS_PLATELEGS_100), + null, + mockItem(ItemID.LEATHER_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING) + }, new int[] {23, 45, 30, 25, 49, 33, 29, 57, 38}), + + VOID_SET(new int[] {75, 83, 99}, 66, WeaponType.TYPE_9, 1, new Item[] + { + mockItem(ItemID.VOID_MELEE_HELM), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.DRAGON_SCIMITAR), + mockItem(ItemID.VOID_KNIGHT_TOP), + mockItem(ItemID.IRON_KITESHIELD), + null, + mockItem(ItemID.VOID_KNIGHT_ROBE), + null, + mockItem(ItemID.VOID_KNIGHT_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING) + }, new int[] {19, 21, 25}), + ; + + + private final int[] strengthLevels; + private final WeaponType weaponType; + private final int attackStyleId; + private final Item[] equipedItems; + private final int[] expectedMaxHits; + private final int[][] hitpoints; + private final int meleeEquipmentStrength; + + MeleeMaxHitConfig(int[] strengthLevels, int meleeEquipmentStrength, WeaponType weaponType, int attackStyleId, int[][] hitpoints, Item[] equipedItems, int[] expectedMaxHits) + { + this.strengthLevels = strengthLevels; + this.meleeEquipmentStrength = meleeEquipmentStrength; + this.weaponType = weaponType; + this.attackStyleId = attackStyleId; + this.hitpoints = hitpoints; + this.equipedItems = equipedItems; + this.expectedMaxHits = expectedMaxHits; + } + + MeleeMaxHitConfig(int[] strengthLevels, int meleeEquipmentStrength, WeaponType weaponType, int attackStyleId, Item[] equipedItems, int[] expectedMaxHits) + { + this.strengthLevels = strengthLevels; + this.hitpoints = new int[strengthLevels.length][2]; + this.meleeEquipmentStrength = meleeEquipmentStrength; + this.weaponType = weaponType; + this.attackStyleId = attackStyleId; + this.equipedItems = equipedItems; + this.expectedMaxHits = expectedMaxHits; + } + + + private static Item mockItem(int itemId) + { + Item item = mock(Item.class); + when(item.getId()).thenReturn(itemId); + return item; + } + + public void test(Client client) + { + int[] strengthLevels = this.strengthLevels; + for (int i = 0, strengthLevelsLength = strengthLevels.length; i < strengthLevelsLength; i++) + { + int strengthLevel = strengthLevels[i]; + int[] hitpoints = this.hitpoints[i]; + int expectedMaxHit = this.expectedMaxHits[i]; + + // Mock equipment container + ItemContainer equipmentContainer = mock(ItemContainer.class); + when(equipmentContainer.getItems()) + .thenReturn(this.equipedItems); + when(client.getItemContainer(InventoryID.EQUIPMENT)).thenReturn(equipmentContainer); + + // Mock equipment strength + Widget equipmentWidget = mock(Widget.class); + when(client.getWidget(WidgetInfo.EQUIPMENT_MELEE_STRENGTH)).thenReturn(equipmentWidget); + when(equipmentWidget.getText()).thenReturn("Melee strength: " + this.meleeEquipmentStrength); + + // Mock Varbits + when(client.getVar(Varbits.EQUIPPED_WEAPON_TYPE)).thenReturn(this.weaponType.ordinal()); + when(client.getVar(VarPlayer.ATTACK_STYLE)).thenReturn(this.attackStyleId); + + // Mock strength + when(client.getBoostedSkillLevel(Skill.STRENGTH)).thenReturn(strengthLevel); + + // Mock hitpoints + when(client.getBoostedSkillLevel(Skill.HITPOINTS)).thenReturn(hitpoints[0]); + when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(hitpoints[1]); + + // Test + MeleeMaxHitCalculator maxHitCalculator = new MeleeMaxHitCalculator(client, this.equipedItems); + assertEquals(this.toString(), expectedMaxHit, maxHitCalculator.getMaxHit(), 0); + + } + + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/RangeMaxHitConfig.java b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/RangeMaxHitConfig.java new file mode 100644 index 0000000000..31ac795bb5 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/maxhit/calculators/testconfig/RangeMaxHitConfig.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2019, Bartvollebregt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.maxhit.calculators.testconfig; + +import net.runelite.api.*; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.plugins.maxhit.attackstyle.WeaponType; +import net.runelite.client.plugins.maxhit.calculators.RangeMaxHitCalculator; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public enum RangeMaxHitConfig implements MaxHitConfig +{ + + MAGIC_SHORTBOW(new int[] {75, 83, 99}, 49, WeaponType.TYPE_3, 1, new Item[] + { + mockItem(ItemID.IRON_FULL_HELM), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.MAGIC_SHORTBOW), + mockItem(ItemID.IRON_PLATEBODY), + null, + null, + mockItem(ItemID.IRON_PLATELEGS), + null, + mockItem(ItemID.LEATHER_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING), + mockItem(ItemID.RUNE_ARROW) + }, new int[] {15, 16, 19}), + + RUNE_CROSSBOW(new int[] {75, 83, 99}, 115, WeaponType.TYPE_5, 0, new Item[] + { + mockItem(ItemID.IRON_FULL_HELM), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.RUNE_CROSSBOW), + mockItem(ItemID.IRON_PLATEBODY), + null, + null, + mockItem(ItemID.IRON_PLATELEGS), + null, + mockItem(ItemID.LEATHER_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING), + mockItem(ItemID.RUNITE_BOLTS) + }, new int[] {24, 26, 31}), + + BLOwPIPE(new int[] {75, 83, 99}, 50, WeaponType.TYPE_19, 1, new Item[] + { + mockItem(ItemID.IRON_FULL_HELM), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.TOXIC_BLOWPIPE), + mockItem(ItemID.IRON_PLATEBODY), + null, + null, + mockItem(ItemID.IRON_PLATELEGS), + null, + mockItem(ItemID.LEATHER_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING) + }, new int[] {15, 16, 19}), + + VOID_SET(new int[] {75, 83, 99}, 115, WeaponType.TYPE_5, 1, new Item[] + { + mockItem(ItemID.VOID_RANGER_HELM), + mockItem(ItemID.BLACK_CAPE), + mockItem(ItemID.GOLD_NECKLACE), + mockItem(ItemID.RUNE_CROSSBOW), + mockItem(ItemID.VOID_KNIGHT_TOP), + mockItem(ItemID.IRON_KITESHIELD), + null, + mockItem(ItemID.VOID_KNIGHT_ROBE), + null, + mockItem(ItemID.VOID_KNIGHT_GLOVES), + mockItem(ItemID.LEATHER_BOOTS), + mockItem(ItemID.GOLD_RING) + }, new int[] {26, 28, 33}), + + ; + + private final int[] rangeLevels; + private final WeaponType weaponType; + private final int attackStyleId; + private final Item[] equipedItems; + private final int[] expectedMaxHits; + private final int ammoEquipmentStrength; + + RangeMaxHitConfig(int[] rangeLevels, int ammoEquipmentStrength, WeaponType weaponType, int attackStyleId, Item[] equipedItems, int[] expectedMaxHits) + { + this.rangeLevels = rangeLevels; + this.ammoEquipmentStrength = ammoEquipmentStrength; + this.weaponType = weaponType; + this.attackStyleId = attackStyleId; + this.equipedItems = equipedItems; + this.expectedMaxHits = expectedMaxHits; + } + + + private static Item mockItem(int itemId) + { + Item item = mock(Item.class); + when(item.getId()).thenReturn(itemId); + return item; + } + + public void test(Client client) + { + int[] rangeLevels = this.rangeLevels; + for (int i = 0, rangeLevelsLength = rangeLevels.length; i < rangeLevelsLength; i++) + { + int rangeLevel = rangeLevels[i]; + int expectedMaxHit = this.expectedMaxHits[i]; + + // Mock equipment container + ItemContainer equipmentContainer = mock(ItemContainer.class); + when(equipmentContainer.getItems()) + .thenReturn(this.equipedItems); + when(client.getItemContainer(InventoryID.EQUIPMENT)).thenReturn(equipmentContainer); + + // Mock equipment strength + Widget equipmentWidget = mock(Widget.class); + when(client.getWidget(WidgetInfo.EQUIPMENT_RANGED_STRENGTH)).thenReturn(equipmentWidget); + when(equipmentWidget.getText()).thenReturn("Ranged strength: " + this.ammoEquipmentStrength); + + // Mock Varbits + when(client.getVar(Varbits.EQUIPPED_WEAPON_TYPE)).thenReturn(this.weaponType.ordinal()); + when(client.getVar(VarPlayer.ATTACK_STYLE)).thenReturn(this.attackStyleId); + + // Mock strength + when(client.getBoostedSkillLevel(Skill.RANGED)).thenReturn(rangeLevel); + + // Test + RangeMaxHitCalculator maxHitCalculator = new RangeMaxHitCalculator(client, this.equipedItems); + assertEquals(this.toString(), expectedMaxHit, maxHitCalculator.getMaxHit(), 0); + + } + + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java new file mode 100644 index 0000000000..7f4c3bcbb0 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.motherlode; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.concurrent.ScheduledExecutorService; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.client.Notifier; +import net.runelite.client.config.ChatColorConfig; +import net.runelite.client.config.RuneLiteConfig; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class MotherlodePluginTest +{ + @Inject + private MotherlodePlugin motherlodePlugin; + + @Mock + @Bind + private Client client; + + @Mock + @Bind + MotherlodeSession motherlodeSession; + + @Mock + @Bind + private MotherlodeConfig motherlodeConfig; + + @Mock + @Bind + private MotherlodeGemOverlay motherlodeGemOverlay; + + @Mock + @Bind + private MotherlodeOreOverlay motherlodeOreOverlay; + + @Mock + @Bind + private MotherlodeRocksOverlay motherlodeRocksOverlay; + + @Mock + @Bind + private MotherlodeSackOverlay motherlodeSackOverlay; + + @Mock + @Bind + private ScheduledExecutorService scheduledExecutorService; + + @Mock + @Bind + private ChatColorConfig chatColorConfig; + + @Mock + @Bind + private RuneLiteConfig runeliteConfig; + + @Mock + @Bind + private Notifier notifier; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + + when(client.getGameState()).thenReturn(GameState.LOGGED_IN); + when(client.getMapRegions()).thenReturn(new int[]{14679}); + } + + @Test + public void testOreCounter() + { + // set inMlm + GameStateChanged gameStateChanged = new GameStateChanged(); + gameStateChanged.setGameState(GameState.LOGGED_IN); + motherlodePlugin.onGameStateChanged(gameStateChanged); + + // Initial sack count + when(client.getVar(Varbits.SACK_NUMBER)).thenReturn(42); + motherlodePlugin.onVarbitChanged(new VarbitChanged()); + + // Create before inventory + ItemContainer inventory = mock(ItemContainer.class); + Item[] items = new Item[]{ + mockItem(ItemID.RUNITE_ORE, 1), + mockItem(ItemID.GOLDEN_NUGGET, 4), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + + }; + when(inventory.getItems()) + .thenReturn(items); + when(client.getItemContainer(InventoryID.INVENTORY)).thenReturn(inventory); + + // Withdraw 20 + when(client.getVar(Varbits.SACK_NUMBER)).thenReturn(22); + motherlodePlugin.onVarbitChanged(new VarbitChanged()); + + inventory = mock(ItemContainer.class); + // +1 rune, +4 nugget, +2 coal, +1 addy + items = new Item[]{ + mockItem(ItemID.RUNITE_ORE, 1), + mockItem(ItemID.RUNITE_ORE, 1), + mockItem(ItemID.GOLDEN_NUGGET, 8), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.COAL, 1), + mockItem(ItemID.ADAMANTITE_ORE, 1), + + }; + when(inventory.getItems()) + .thenReturn(items); + when(client.getItemContainer(InventoryID.INVENTORY)).thenReturn(inventory); + + // Trigger comparison + motherlodePlugin.onItemContainerChanged(new ItemContainerChanged(inventory)); + + verify(motherlodeSession).updateOreFound(ItemID.RUNITE_ORE, 1); + verify(motherlodeSession).updateOreFound(ItemID.GOLDEN_NUGGET, 4); + verify(motherlodeSession).updateOreFound(ItemID.COAL, 2); + verify(motherlodeSession).updateOreFound(ItemID.ADAMANTITE_ORE, 1); + verifyNoMoreInteractions(motherlodeSession); + } + + private static Item mockItem(int itemId, int quantity) + { + Item item = mock(Item.class); + when(item.getId()).thenReturn(itemId); + when(item.getQuantity()).thenReturn(quantity); + return item; + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java new file mode 100644 index 0000000000..87f69cceb3 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.npchighlight; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import javax.inject.Inject; +import net.runelite.api.Client; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class NpcIndicatorsPluginTest +{ + @Mock + @Bind + private Client client; + + @Mock + @Bind + private ScheduledExecutorService executorService; + + @Mock + @Bind + private NpcIndicatorsConfig npcIndicatorsConfig; + + @Inject + private NpcIndicatorsPlugin npcIndicatorsPlugin; + + @Before + public void setUp() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void getHighlights() + { + when(npcIndicatorsConfig.getNpcToHighlight()).thenReturn("goblin, , zulrah , *wyvern, ,"); + final List highlightedNpcs = npcIndicatorsPlugin.getHighlights(); + assertEquals("Length of parsed NPCs is incorrect", 3, highlightedNpcs.size()); + + final Iterator iterator = highlightedNpcs.iterator(); + assertEquals("goblin", iterator.next()); + assertEquals("zulrah", iterator.next()); + assertEquals("*wyvern", iterator.next()); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverTest.java new file mode 100644 index 0000000000..6a09ff0f71 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverTest.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018, Lotto + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.puzzlesolver; + +import net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver; +import net.runelite.client.plugins.puzzlesolver.solver.PuzzleState; +import net.runelite.client.plugins.puzzlesolver.solver.heuristics.ManhattanDistance; +import net.runelite.client.plugins.puzzlesolver.solver.pathfinding.IDAStar; +import net.runelite.client.plugins.puzzlesolver.solver.pathfinding.IDAStarMM; +import org.junit.Test; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class PuzzleSolverTest +{ + private static final PuzzleState[] START_STATES = + { + new PuzzleState(new int[]{0, 11, 1, 3, 4, 5, 12, 2, 7, 9, 6, 20, 18, 16, 8, 15, 22, 10, 14, 13, 21, -1, 17, 23, 19}), + new PuzzleState(new int[]{0, 2, 7, 3, 4, 10, 5, 12, 1, 9, 6, 17, 8, 14, 19, -1, 16, 21, 11, 13, 15, 20, 22, 18, 23}), + new PuzzleState(new int[]{0, 1, 11, 3, 4, 12, 2, 7, 13, 9, 5, 21, 15, 17, 14, -1, 10, 6, 8, 19, 16, 20, 22, 18, 23}), + new PuzzleState(new int[]{0, 1, 2, 3, 4, 10, 5, 6, 9, 14, 15, -1, 7, 13, 17, 21, 11, 20, 23, 8, 16, 22, 12, 19, 18}), + new PuzzleState(new int[]{0, 1, 2, 3, 4, 5, 6, 8, 22, 18, 10, -1, 7, 17, 9, 20, 11, 12, 21, 14, 16, 15, 23, 13, 19}), + new PuzzleState(new int[]{0, 1, 2, 3, 4, 5, 6, 8, 12, 9, 16, 11, 17, 7, 14, 10, 20, -1, 22, 13, 15, 18, 21, 23, 19}), + new PuzzleState(new int[]{1, 6, 16, 8, 4, 0, 7, 11, 2, 9, 5, 21, 18, 3, 14, 10, 20, -1, 13, 22, 15, 23, 12, 17, 19}), + new PuzzleState(new int[]{0, 1, 2, 4, 8, 6, 16, 11, 7, 3, 5, -1, 12, 14, 9, 15, 10, 17, 13, 18, 20, 21, 22, 23, 19}), + new PuzzleState(new int[]{0, 2, 9, 14, 6, 5, 7, 11, 3, 4, 15, 10, 1, 12, 18, 16, 17, -1, 8, 13, 20, 21, 22, 23, 19}), + new PuzzleState(new int[]{0, 1, 2, 3, 4, 11, 5, 12, 7, 8, 10, 6, 15, 13, 9, 16, 21, -1, 17, 14, 20, 22, 23, 18, 19}), + new PuzzleState(new int[]{5, 0, 1, 2, 4, 10, 6, 3, 8, 9, 12, 13, 7, 14, 19, 15, 11, 16, 17, -1, 20, 21, 22, 18, 23}), + new PuzzleState(new int[]{0, 6, 1, 3, 4, 5, 8, -1, 2, 9, 16, 11, 12, 7, 14, 10, 15, 17, 13, 19, 20, 21, 22, 18, 23}), + new PuzzleState(new int[]{0, 6, 1, 2, 4, 11, 15, 8, 3, 14, 5, 7, 9, 12, 18, 16, 10, 17, 23, 13, 20, 21, 22, -1, 19}), + new PuzzleState(new int[]{0, 1, 7, 2, 4, 5, 3, 12, 8, 9, 15, 6, 18, -1, 13, 11, 10, 22, 17, 23, 16, 21, 20, 19, 14}), + new PuzzleState(new int[]{0, 1, 2, 7, 3, 5, 11, 6, 14, 4, 10, -1, 16, 12, 9, 15, 17, 18, 8, 19, 20, 21, 13, 22, 23}), + new PuzzleState(new int[]{2, 10, 5, 3, 4, -1, 0, 1, 8, 9, 15, 11, 7, 13, 23, 17, 6, 20, 14, 19, 16, 12, 18, 21, 22}), + new PuzzleState(new int[]{0, 1, 2, 8, 9, 5, 6, 7, 3, 4, 10, -1, 14, 23, 18, 21, 11, 16, 12, 19, 15, 20, 17, 13, 22}), + new PuzzleState(new int[]{0, 6, 1, 3, 4, 11, 2, 13, 9, 12, 5, 16, 7, 18, 8, 20, 15, -1, 14, 19, 21, 10, 22, 23, 17}), + new PuzzleState(new int[]{12, 1, 2, 3, 4, 0, 7, 6, 8, 9, 5, 10, 22, 13, 19, 15, 11, 21, 14, 17, 20, 16, 18, -1, 23}), + new PuzzleState(new int[]{0, 2, 11, 3, 4, 5, 1, 6, 8, 9, 15, 10, 13, 14, 19, 7, 12, -1, 17, 18, 20, 21, 16, 22, 23}), + new PuzzleState(new int[]{5, 0, 4, 2, 9, 10, 7, 3, 19, 8, 6, 1, 18, -1, 14, 15, 11, 16, 12, 13, 20, 21, 17, 22, 23}), + new PuzzleState(new int[]{0, 3, 2, 7, 4, 6, 10, 1, 8, 9, 15, 5, 12, 18, 13, -1, 20, 11, 22, 14, 16, 21, 23, 17, 19}), + new PuzzleState(new int[]{1, 2, 4, -1, 9, 0, 5, 7, 3, 14, 10, 6, 8, 13, 19, 15, 11, 18, 12, 22, 20, 16, 21, 23, 17}), + new PuzzleState(new int[]{0, 1, 2, 4, 9, 5, 11, -1, 7, 14, 10, 17, 6, 13, 8, 15, 16, 20, 3, 18, 22, 21, 12, 23, 19}), + new PuzzleState(new int[]{0, 1, 8, 2, 4, 5, 11, 17, 3, 9, 6, 16, 7, 12, 18, 15, 21, -1, 14, 13, 20, 22, 10, 23, 19}), + new PuzzleState(new int[]{5, 0, 2, 3, 4, 1, 8, 6, 7, 9, 11, 12, 16, 13, 14, -1, 22, 20, 17, 19, 21, 10, 15, 18, 23}), + new PuzzleState(new int[]{0, -1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 16, 11, 13, 14, 10, 15, 19, 22, 23, 20, 21, 17, 12, 18}), + new PuzzleState(new int[]{0, 2, 7, -1, 4, 6, 1, 9, 3, 14, 5, 12, 8, 13, 19, 15, 16, 10, 22, 23, 20, 11, 18, 21, 17}), + new PuzzleState(new int[]{7, 5, 13, 1, 12, 0, 2, 4, 3, 9, 10, 6, 8, 17, 14, 15, 11, 16, 18, -1, 20, 21, 22, 23, 19}), + new PuzzleState(new int[]{5, 0, 3, 8, 4, 10, 6, -1, 7, 9, 11, 1, 12, 2, 19, 15, 16, 17, 14, 13, 20, 21, 22, 18, 23}), + new PuzzleState(new int[]{5, 2, 3, 7, 4, 0, 6, 14, 9, 19, 1, 11, 22, 17, 12, 10, 15, -1, 13, 8, 20, 16, 21, 18, 23}), + new PuzzleState(new int[]{0, 1, 3, 4, 9, 5, 6, 2, 7, 14, 10, 13, 17, -1, 8, 15, 11, 16, 12, 18, 20, 21, 22, 23, 19}), + new PuzzleState(new int[]{0, 3, 11, 7, 4, 5, 2, 6, 12, 8, 10, 1, 17, -1, 9, 15, 16, 23, 13, 14, 20, 21, 18, 22, 19}), + new PuzzleState(new int[]{1, 5, 8, 2, 4, -1, 0, 7, 3, 9, 11, 22, 15, 12, 14, 6, 10, 18, 16, 19, 20, 21, 17, 13, 23}), + new PuzzleState(new int[]{7, 12, 11, 4, 9, -1, 0, 8, 10, 2, 6, 1, 16, 3, 14, 5, 15, 17, 13, 19, 20, 21, 22, 18, 23}), + new PuzzleState(new int[]{11, 3, 2, 12, 4, 6, 0, 7, 13, 8, 1, 5, 17, 16, 9, -1, 10, 15, 18, 14, 20, 21, 22, 23, 19}), + new PuzzleState(new int[]{0, 6, 1, 3, 4, 5, 11, 2, 10, 9, 15, 12, 8, 14, 19, 16, 21, -1, 7, 13, 20, 22, 17, 18, 23}), + new PuzzleState(new int[]{0, 1, 2, 3, 4, 6, 10, 7, 8, 9, 5, 16, 11, 14, 17, 20, 13, 18, 12, 22, 21, 15, 23, -1, 19}), + new PuzzleState(new int[]{0, 1, 2, 4, 8, 5, 6, 7, 3, -1, 10, 16, 18, 17, 9, 15, 12, 11, 14, 13, 20, 21, 22, 23, 19}), + new PuzzleState(new int[]{0, 11, 6, 1, 4, 5, 21, 8, 2, 9, 10, 3, 16, -1, 14, 15, 12, 17, 13, 19, 20, 22, 7, 18, 23}), + new PuzzleState(new int[]{0, 6, 1, 2, 4, 11, 10, 3, 13, 9, 5, 7, 8, -1, 23, 15, 16, 22, 18, 14, 20, 21, 12, 17, 19}), + new PuzzleState(new int[]{0, 6, 1, 2, 3, 10, 11, 12, 5, 18, 15, 7, 4, -1, 14, 21, 17, 13, 8, 9, 16, 20, 22, 23, 19}), + new PuzzleState(new int[]{0, 1, 3, 11, 4, 6, 10, 14, 2, 8, 5, -1, 12, 7, 9, 15, 16, 18, 13, 19, 20, 21, 22, 17, 23}), + new PuzzleState(new int[]{1, 5, 2, 3, 4, -1, 0, 7, 14, 8, 11, 6, 13, 9, 23, 10, 12, 15, 19, 17, 20, 21, 16, 22, 18}), + }; + + private static final PuzzleState[] START_STATES_MM = + { + new PuzzleState(new int[]{0, 5, 1, 3, 4, 15, 2, 8, 10, 9, 22, 16, 11, 6, 14, 7, 21, 23, 12, 18, 20, -1, 17, 13, 19}), + new PuzzleState(new int[]{0, 12, 8, 13, 4, 3, 16, 2, 1, 9, 21, 5, 6, 10, 14, 7, 17, 20, 18, -1, 15, 11, 22, 23, 19}), + new PuzzleState(new int[]{1, 3, 7, 9, 8, 13, 17, 2, 4, 6, 15, 5, 22, 12, 14, 11, 0, 10, 21, -1, 20, 18, 16, 23, 19}), + new PuzzleState(new int[]{5, 2, 16, 14, 4, 3, 0, 8, 9, 11, 15, 6, 17, 19, 7, 1, 10, -1, 23, 18, 20, 12, 21, 13, 22}), + new PuzzleState(new int[]{0, 6, 1, 4, 13, 10, 2, 16, 7, 3, 20, -1, 8, 14, 9, 21, 5, 18, 11, 19, 17, 15, 12, 22, 23}), + new PuzzleState(new int[]{5, 0, 1, 4, 8, 10, 6, 7, 12, 3, 17, 16, 21, 2, 9, 18, 20, 13, 14, 19, 11, -1, 23, 15, 22}), + new PuzzleState(new int[]{1, 9, 2, 13, 17, 5, 7, 8, 3, 22, 6, -1, 16, 12, 4, 15, 18, 0, 23, 14, 10, 21, 11, 20, 19}), + new PuzzleState(new int[]{1, 2, 11, 13, 4, 21, 7, 3, 6, 9, 0, 8, 10, 19, 14, 20, 12, 16, 23, -1, 5, 17, 15, 22, 18}), + new PuzzleState(new int[]{2, 0, 1, 4, 13, 6, 7, 3, 8, 9, 22, 15, 10, 14, 18, 5, 12, -1, 17, 21, 20, 11, 23, 16, 19}), + new PuzzleState(new int[]{0, 1, 2, 8, 3, 6, 12, 22, 9, 7, 11, 21, 13, 4, 14, 5, 10, -1, 18, 19, 20, 15, 16, 23, 17}), + new PuzzleState(new int[]{1, 2, 3, 4, 8, 0, 6, 15, 14, 18, 16, 17, 20, -1, 9, 10, 12, 22, 11, 13, 21, 7, 5, 19, 23}), + new PuzzleState(new int[]{0, 5, 2, 4, 9, 7, 15, 20, 12, 13, 6, -1, 22, 1, 8, 10, 11, 23, 14, 3, 21, 16, 17, 19, 18}), + new PuzzleState(new int[]{0, 1, 9, 6, 13, 5, 18, -1, 4, 2, 15, 12, 3, 17, 7, 16, 10, 8, 23, 14, 20, 21, 19, 11, 22}), + new PuzzleState(new int[]{11, 5, 12, 3, 4, 15, 8, 0, 7, 1, 6, -1, 19, 2, 9, 16, 10, 13, 17, 23, 20, 21, 22, 14, 18}), + new PuzzleState(new int[]{10, 0, 1, 3, 4, 18, 5, 6, 12, 9, 7, 11, 8, -1, 22, 15, 23, 14, 19, 13, 20, 2, 17, 16, 21}), + new PuzzleState(new int[]{19, -1, 6, 2, 4, 0, 21, 10, 3, 9, 1, 15, 17, 8, 14, 11, 13, 22, 7, 18, 16, 12, 5, 23, 20}), + new PuzzleState(new int[]{11, 6, 3, 4, 9, 1, 10, 16, 2, 7, 5, 0, 13, -1, 12, 21, 8, 18, 17, 14, 15, 20, 22, 23, 19}), + new PuzzleState(new int[]{0, 1, 5, 3, 4, -1, 6, 2, 15, 10, 7, 8, 23, 16, 13, 22, 11, 9, 12, 14, 20, 21, 18, 17, 19}), + new PuzzleState(new int[]{10, 0, 1, -1, 2, 6, 5, 4, 13, 9, 16, 17, 12, 8, 19, 20, 15, 7, 21, 11, 22, 18, 14, 23, 3}), + new PuzzleState(new int[]{1, 0, 5, 3, 9, 20, 15, 7, 2, 14, 6, 4, 12, -1, 8, 13, 18, 10, 23, 11, 21, 16, 17, 19, 22}), + new PuzzleState(new int[]{0, 7, 6, 3, 4, 15, 1, 2, 8, 18, 11, 5, 13, -1, 22, 17, 16, 23, 14, 9, 20, 10, 12, 19, 21}), + new PuzzleState(new int[]{5, 7, 0, 2, 9, 10, 1, 11, 3, 4, 16, 22, 8, 14, 17, 15, 20, 12, 13, 6, 21, 23, 19, -1, 18}), + new PuzzleState(new int[]{3, 0, 1, 5, 4, 11, 6, 2, 16, 9, 15, 10, 7, 12, 13, 21, 19, -1, 22, 8, 20, 17, 14, 18, 23}), + new PuzzleState(new int[]{6, 0, 3, 2, 4, 5, 1, 8, 13, 12, 15, 14, 10, 7, 9, -1, 22, 11, 19, 23, 16, 20, 17, 21, 18}), + new PuzzleState(new int[]{11, 5, 6, 8, 9, 0, 21, 16, 4, 3, 17, 18, 2, 7, 1, 15, 10, -1, 22, 14, 20, 19, 13, 12, 23}), + new PuzzleState(new int[]{2, 18, 3, 11, 4, -1, 5, 6, 12, 1, 10, 20, 0, 7, 9, 21, 15, 14, 23, 19, 16, 22, 13, 8, 17}), + new PuzzleState(new int[]{0, 6, 8, 3, 1, 5, 2, 12, 9, 13, 16, 14, 19, 7, 18, 10, 11, -1, 4, 15, 20, 17, 23, 21, 22}), + new PuzzleState(new int[]{1, 16, 10, 4, 3, 0, 15, 2, 9, -1, 8, 5, 23, 12, 6, 21, 18, 14, 13, 11, 20, 22, 7, 19, 17}), + new PuzzleState(new int[]{1, 7, 6, 3, 4, 0, 2, 14, 5, 22, 18, 21, 16, 9, 13, 10, 20, -1, 8, 17, 15, 23, 11, 19, 12}), + new PuzzleState(new int[]{5, 0, 1, 7, 9, 11, 8, 4, 2, 14, 15, 17, 18, -1, 3, 20, 10, 12, 22, 19, 16, 6, 13, 21, 23}), + new PuzzleState(new int[]{5, 0, 6, 14, 7, 13, 15, 1, 3, 10, 20, 9, 17, 4, 2, 11, 12, 8, 19, -1, 21, 16, 22, 18, 23}), + new PuzzleState(new int[]{12, 7, 8, 4, 9, 6, 11, 15, 2, 1, 5, -1, 13, 16, 3, 17, 0, 10, 18, 14, 20, 22, 21, 19, 23}), + new PuzzleState(new int[]{15, 1, 2, 3, 14, -1, 20, 9, 4, 19, 0, 6, 7, 16, 13, 10, 5, 12, 17, 18, 22, 11, 21, 23, 8}), + new PuzzleState(new int[]{0, 1, 17, -1, 14, 6, 4, 2, 3, 16, 10, 18, 13, 19, 9, 7, 5, 8, 21, 22, 11, 20, 15, 12, 23}), + new PuzzleState(new int[]{5, 11, 9, 0, 3, 8, 14, -1, 6, 4, 1, 13, 7, 2, 19, 10, 21, 18, 23, 17, 15, 20, 12, 16, 22}), + new PuzzleState(new int[]{2, 0, 14, -1, 4, 18, 1, 10, 12, 13, 5, 9, 11, 22, 7, 15, 8, 17, 19, 3, 20, 21, 6, 16, 23}), + new PuzzleState(new int[]{0, 1, 13, 9, 2, 6, 8, 22, 3, 4, 12, 16, 10, 7, 19, -1, 5, 11, 14, 17, 15, 20, 21, 18, 23}), + new PuzzleState(new int[]{0, 13, 17, 8, 3, 5, 1, 12, 14, 4, 10, -1, 6, 7, 9, 15, 23, 2, 16, 19, 20, 11, 21, 22, 18}), + new PuzzleState(new int[]{5, 10, 7, 2, 9, 15, 0, -1, 1, 3, 18, 4, 17, 12, 14, 21, 11, 6, 8, 23, 20, 16, 22, 19, 13}), + new PuzzleState(new int[]{0, 3, 1, 2, 4, 10, 5, 7, 8, 9, 11, 6, 21, 13, 12, 20, 17, -1, 14, 19, 22, 18, 15, 16, 23}), + new PuzzleState(new int[]{0, 2, 7, 11, 13, 3, 14, 1, 4, 9, 5, -1, 12, 8, 18, 20, 10, 15, 22, 23, 17, 16, 6, 21, 19}), + new PuzzleState(new int[]{0, 16, 3, 22, 7, 11, 6, -1, 9, 4, 2, 1, 13, 12, 18, 5, 10, 8, 19, 14, 15, 20, 17, 23, 21}), + new PuzzleState(new int[]{0, 13, 5, 12, 3, 2, 10, 4, 6, 8, 1, 21, 19, 14, 9, 17, 23, 22, 16, 11, 15, 7, 20, -1, 18}), + new PuzzleState(new int[]{14, 5, 6, 12, 4, 10, 20, 1, 0, 23, 2, 16, 13, 19, 3, 15, 22, -1, 9, 8, 11, 7, 18, 17, 21}), + new PuzzleState(new int[]{0, 1, 2, 4, 7, 5, 11, -1, 18, 8, 16, 10, 12, 13, 3, 17, 6, 21, 23, 9, 15, 20, 22, 14, 19}), + new PuzzleState(new int[]{1, 6, 7, 3, 4, 5, 17, 0, 22, 12, 10, 15, 8, -1, 14, 11, 13, 16, 18, 19, 20, 2, 21, 9, 23}), + }; + + private static final int[] FINISHED_STATE = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1}; + + @Test + public void testSolverMM() + { + for (PuzzleState state : START_STATES_MM) + { + PuzzleSolver solver = new PuzzleSolver(new IDAStarMM(new ManhattanDistance()), state); + solver.run(); + + assertTrue(solver.hasSolution()); + assertFalse(solver.hasFailed()); + assertTrue(solver.getStep(solver.getStepCount() - 1).hasPieces(FINISHED_STATE)); + } + } + + @Test + public void testSolver() + { + for (PuzzleState state : START_STATES) + { + PuzzleSolver solver = new PuzzleSolver(new IDAStar(new ManhattanDistance()), state); + solver.run(); + + assertTrue(solver.hasSolution()); + assertFalse(solver.hasFailed()); + assertTrue(solver.getStep(solver.getStepCount() - 1).hasPieces(FINISHED_STATE)); + } + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolverTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolverTest.java new file mode 100644 index 0000000000..7b6fefc4f1 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/puzzlesolver/lightbox/LightboxSolverTest.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.puzzlesolver.lightbox; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class LightboxSolverTest +{ + private static final int[] INITIAL = new int[]{ + 1, 0, 1, 0, 0, + 0, 1, 0, 1, 0, + 0, 1, 1, 1, 0, + 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1 + }; + + private static final int[] A = new int[]{ + 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, + 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, + 0, 0, 0, 0, 1 + }; + + private static final int[] B = new int[]{ + 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, + 0, 0, 0, 1, 0, + 1, 1, 0, 1, 0, + 0, 0, 0, 1, 1, + }; + + private static final int[] C = new int[]{ + 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, + 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, + }; + + private static final int[] D = new int[]{ + 1, 1, 0, 0, 0, + 1, 0, 1, 0, 1, + 1, 1, 0, 1, 1, + 0, 1, 1, 0, 0, + 1, 0, 0, 1, 1, + }; + + private static final int[] E = new int[]{ + 1, 0, 0, 1, 0, + 1, 1, 1, 0, 1, + 1, 1, 0, 1, 0, + 0, 0, 1, 0, 0, + 1, 0, 0, 1, 1, + }; + + private static final int[] F = new int[]{ + 1, 0, 0, 1, 0, + 1, 0, 0, 0, 1, + 1, 0, 1, 1, 0, + 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, + }; + + private static final int[] G = new int[]{ + 1, 0, 0, 1, 1, + 1, 1, 1, 0, 0, + 0, 1, 1, 1, 0, + 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, + }; + + private static final int[] H = new int[]{ + 1, 0, 1, 1, 1, + 1, 1, 1, 0, 0, + 0, 1, 1, 1, 0, + 1, 1, 0, 0, 1, + 1, 0, 0, 1, 0 + }; + + private static LightboxState fromArray(int[] array) + { + LightboxState s = new LightboxState(); + + assert array.length == 25; + for (int i = 0; i < array.length; ++i) + { + s.setState(i / 5, i % 5, array[i] != 0); + } + + return s; + } + + @Test + public void test() + { + LightboxSolver solver = new LightboxSolver(); + + solver.setInitial(fromArray(INITIAL)); + solver.setSwitchChange(Combination.A, fromArray(A)); + solver.setSwitchChange(Combination.B, fromArray(B)); + solver.setSwitchChange(Combination.C, fromArray(C)); + solver.setSwitchChange(Combination.D, fromArray(D)); + solver.setSwitchChange(Combination.E, fromArray(E)); + solver.setSwitchChange(Combination.F, fromArray(F)); + solver.setSwitchChange(Combination.G, fromArray(G)); + solver.setSwitchChange(Combination.H, fromArray(H)); + + LightboxSolution solution = solver.solve(); + + LightboxSolution expected = new LightboxSolution(); + expected.flip(Combination.A); + expected.flip(Combination.B); + expected.flip(Combination.D); + expected.flip(Combination.E); + expected.flip(Combination.F); + expected.flip(Combination.G); + + assertEquals(expected, solution); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPluginTest.java new file mode 100644 index 0000000000..9a4a4953e9 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPluginTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.reorderprayers; + +import net.runelite.api.Prayer; +import static net.runelite.api.Prayer.*; +import static org.junit.Assert.*; +import org.junit.Test; + +public class ReorderPrayersPluginTest +{ + private static final Prayer[] PRAYER_ORDER = new Prayer[]{ + THICK_SKIN, + BURST_OF_STRENGTH, + CLARITY_OF_THOUGHT, + SHARP_EYE, + MYSTIC_WILL, + ROCK_SKIN, + SUPERHUMAN_STRENGTH, + IMPROVED_REFLEXES, + RAPID_RESTORE, + RAPID_HEAL, + PROTECT_ITEM, + HAWK_EYE, + MYSTIC_LORE, + STEEL_SKIN, + ULTIMATE_STRENGTH, + INCREDIBLE_REFLEXES, + PROTECT_FROM_MAGIC, + PROTECT_FROM_MISSILES, + PROTECT_FROM_MELEE, + EAGLE_EYE, + MYSTIC_MIGHT, + RETRIBUTION, + REDEMPTION, + SMITE, + CHIVALRY, + PIETY, + PRESERVE, + RIGOUR, + AUGURY + }; + + @Test + public void testPrayerOrder() + { + // the reorder prayers plugin depends on the Prayer enum order + assertArrayEquals(Prayer.values(), PRAYER_ORDER); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java new file mode 100644 index 0000000000..9aff61c346 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.screenshot; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Consumer; +import javax.inject.Inject; +import static net.runelite.api.ChatMessageType.GAMEMESSAGE; +import net.runelite.api.Client; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetID.DIALOG_SPRITE_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.LEVEL_UP_GROUP_ID; +import static net.runelite.api.widgets.WidgetInfo.DIALOG_SPRITE_TEXT; +import static net.runelite.api.widgets.WidgetInfo.LEVEL_UP_LEVEL; +import static net.runelite.api.widgets.WidgetInfo.PACK; +import net.runelite.client.Notifier; +import net.runelite.client.config.RuneLiteConfig; +import net.runelite.client.ui.ClientUI; +import net.runelite.client.ui.DrawManager; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Matchers; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ScreenshotPluginTest +{ + private static final String CLUE_SCROLL = "You have completed 28 medium Treasure Trails"; + private static final String BARROWS_CHEST = "Your Barrows chest count is 310"; + private static final String CHAMBERS_OF_XERIC_CHEST = "Your completed Chambers of Xeric count is: 489."; + private static final String THEATRE_OF_BLOOD_CHEST = "Your completed Theatre of Blood count is: 73."; + private static final String VALUABLE_DROP = "Valuable drop: 6 x Bronze arrow (42 coins)"; + private static final String UNTRADEABLE_DROP = "Untradeable drop: Rusty sword"; + + @Mock + @Bind + private Client client; + + @Inject + private ScreenshotPlugin screenshotPlugin; + + @Mock + @Bind + private ScreenshotConfig screenshotConfig; + + @Mock + @Bind + Notifier notifier; + + @Mock + @Bind + ClientUI clientUi; + + @Mock + @Bind + DrawManager drawManager; + + @Mock + @Bind + RuneLiteConfig config; + + @Mock + @Bind + ScheduledExecutorService service; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + when(screenshotConfig.screenshotRewards()).thenReturn(true); + when(screenshotConfig.screenshotLevels()).thenReturn(true); + when(screenshotConfig.screenshotValuableDrop()).thenReturn(true); + when(screenshotConfig.screenshotUntradeableDrop()).thenReturn(true); + } + + @Test + public void testClueScroll() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Seth", CLUE_SCROLL, null, 0); + screenshotPlugin.onChatMessage(chatMessageEvent); + + assertEquals("medium", screenshotPlugin.getClueType()); + assertEquals(28, screenshotPlugin.getClueNumber()); + } + + @Test + public void testBarrowsChest() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Seth", BARROWS_CHEST, null, 0); + screenshotPlugin.onChatMessage(chatMessageEvent); + + assertEquals(310, screenshotPlugin.getBarrowsNumber()); + } + + @Test + public void testChambersOfXericChest() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Seth", CHAMBERS_OF_XERIC_CHEST, null, 0); + screenshotPlugin.onChatMessage(chatMessageEvent); + + assertEquals(489, screenshotPlugin.getChambersOfXericNumber()); + } + + @Test + public void testTheatreOfBloodChest() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Magic fTail", THEATRE_OF_BLOOD_CHEST, null, 0); + screenshotPlugin.onChatMessage(chatMessageEvent); + + assertEquals(73, screenshotPlugin.gettheatreOfBloodNumber()); + } + + @Test + public void testValuableDrop() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", VALUABLE_DROP, null, 0); + screenshotPlugin.onChatMessage(chatMessageEvent); + + verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + } + + @Test + public void testUntradeableDrop() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", UNTRADEABLE_DROP, null, 0); + screenshotPlugin.onChatMessage(chatMessageEvent); + + verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + } + + @Test + public void testHitpointsLevel99() + { + Widget widget = mock(Widget.class); + when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); + + Widget levelChild = mock(Widget.class); + when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); + + when(levelChild.getText()).thenReturn("Your Hitpoints are now 99."); + + assertEquals("Hitpoints(99)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); + + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(LEVEL_UP_GROUP_ID); + screenshotPlugin.onWidgetLoaded(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); + + verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + } + + @Test + public void testFiremakingLevel9() + { + Widget widget = mock(Widget.class); + when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); + + Widget levelChild = mock(Widget.class); + when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); + + when(levelChild.getText()).thenReturn("Your Firemaking level is now 9."); + + assertEquals("Firemaking(9)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); + + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(LEVEL_UP_GROUP_ID); + screenshotPlugin.onWidgetLoaded(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); + + verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + } + + @Test + public void testAttackLevel70() + { + Widget widget = mock(Widget.class); + when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); + + Widget levelChild = mock(Widget.class); + when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); + + when(levelChild.getText()).thenReturn("Your Attack level is now 70."); + + assertEquals("Attack(70)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); + + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(LEVEL_UP_GROUP_ID); + screenshotPlugin.onWidgetLoaded(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); + + verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + } + + @Test + public void testHunterLevel2() + { + Widget widget = mock(Widget.class); + when(widget.getId()).thenReturn(PACK(DIALOG_SPRITE_GROUP_ID, 0)); + + Widget levelChild = mock(Widget.class); + when(client.getWidget(Matchers.eq(DIALOG_SPRITE_TEXT))).thenReturn(levelChild); + + when(levelChild.getText()).thenReturn("Congratulations, you've just advanced a Hunter level.

    Your Hunter level is now 2."); + + assertEquals("Hunter(2)", screenshotPlugin.parseLevelUpWidget(DIALOG_SPRITE_TEXT)); + + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(DIALOG_SPRITE_GROUP_ID); + screenshotPlugin.onWidgetLoaded(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); + + verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/skybox/SkyboxTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/skybox/SkyboxTest.java new file mode 100644 index 0000000000..6787759ead --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/skybox/SkyboxTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2019 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.skybox; + +import com.google.common.base.Strings; +import com.google.common.io.CharSource; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; + +@Slf4j +public class SkyboxTest +{ + @Test + public void testLoadSimple() throws IOException + { + Skybox skybox = new Skybox(CharSource.wrap("bounds 0 0 100 100 #00F // R 0 0 100 100\r\nr 99 99").openStream(), "simple"); + Assert.assertEquals(0, skybox.getColorForPoint(0, 0, 0, 0, 0, 1, null)); + int x = (99 * 64) + 32; + int y = (99 * 64) + 32; + Assert.assertEquals(0x0000FF, skybox.getColorForPoint(x, y, x, y, 0, 1, null)); + } + + @Test + public void testLoadActual() throws IOException + { + long start = System.nanoTime(); + Skybox skybox = new Skybox(SkyboxPlugin.class.getResourceAsStream("skybox.txt"), "skybox.txt"); + log.info("Parse took {}ms", (System.nanoTime() - start) / 1_000_000); + + String skyboxFile = System.getProperty("skyboxExport"); + if (!Strings.isNullOrEmpty(skyboxFile)) + { + start = System.nanoTime(); + BufferedImage img = skybox.render(1f, 0, 0, null); + long time = System.nanoTime() - start; + log.info("Map render took {}ms", time / 1_000_000); + log.info("Single render takes ~{}ns/frame", time / (img.getWidth() * img.getHeight())); + ImageIO.write(img, "png", new File(skyboxFile)); + } + + Assert.assertNotEquals(skybox.getColorForPoint(3232, 3232, 3232, 3232, 0, .9, null), 0); // Lumbridge will never be black + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java new file mode 100644 index 0000000000..099a76d19b --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.slayer; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.io.IOException; +import java.util.concurrent.ScheduledExecutorService; +import javax.inject.Inject; +import net.runelite.api.ChatMessageType; +import static net.runelite.api.ChatMessageType.GAMEMESSAGE; +import net.runelite.api.Client; +import net.runelite.api.MessageNode; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.Notifier; +import net.runelite.client.chat.ChatCommandManager; +import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.game.ItemManager; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.http.api.chat.ChatClient; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class SlayerPluginTest +{ + private static final String TASK_NEW = "Your new task is to kill 231 Suqahs."; + private static final String TASK_NEW_KONAR = "You are to bring balance to 147 Wyrms in the Karuulm Slayer Dungeon."; + private static final String TASK_NEW_KONAR_2 = "You are to bring balance to 142 Hellhounds in Witchhaven Dungeon."; + private static final String TASK_NEW_KONAR_3 = "You are to bring balance to 135 Trolls south of Mount Quidamortem."; + private static final String TASK_NEW_FIRST = "We'll start you off hunting goblins, you'll need to kill 17 of them."; + private static final String TASK_NEW_NPC_CONTACT = "Excellent, you're doing great. Your new task is to kill
    211 Suqahs."; + private static final String TASK_NEW_FROM_PARTNER = "You have received a new Slayer assignment from breaklulz: Dust Devils (377)"; + private static final String TASK_CHECKSLAYERGEM = "You're assigned to kill Suqahs; only 211 more to go."; + private static final String TASK_CHECKSLAYERGEM_WILDERNESS = "You're assigned to kill Suqahs in the Wilderness; only 211 more to go."; + private static final String TASK_CHECKSLAYERGEM_KONAR = "You're assigned to kill Blue dragons in the Ogre Enclave; only 122 more to go."; + + private static final String TASK_BOSS_NEW = "Excellent. You're now assigned to kill Vet'ion 3 times.
    Your reward point tally is 914."; + private static final String TASK_BOSS_NEW_THE = "Excellent. You're now assigned to kill the Chaos
    Elemental 3 times. Your reward point tally is 914."; + + private static final String TASK_EXISTING = "You're still hunting suqahs; you have 222 to go. Come
    back when you've finished your task."; + + private static final String REWARD_POINTS = "Reward points: 17,566"; + + private static final String TASK_ONE = "You've completed one task; return to a Slayer master."; + private static final String TASK_COMPLETE_NO_POINTS = "You've completed 3 tasks; return to a Slayer master."; + private static final String TASK_POINTS = "You've completed 9 tasks and received 0 points, giving you a total of 18,000; return to a Slayer master."; + private static final String TASK_LARGE_STREAK = "You've completed 2,465 tasks and received 15 points, giving you a total of 17,566,000; return to a Slayer master."; + + private static final String TASK_COMPLETE = "You need something new to hunt."; + private static final String TASK_CANCELED = "Your task has been cancelled."; + + private static final String SUPERIOR_MESSAGE = "A superior foe has appeared..."; + + @Mock + @Bind + Client client; + + @Mock + @Bind + SlayerConfig slayerConfig; + + @Mock + @Bind + OverlayManager overlayManager; + + @Mock + @Bind + SlayerOverlay overlay; + + @Mock + @Bind + InfoBoxManager infoBoxManager; + + @Mock + @Bind + ItemManager itemManager; + + @Mock + @Bind + Notifier notifier; + + @Mock + @Bind + ChatMessageManager chatMessageManager; + + @Mock + @Bind + ChatCommandManager chatCommandManager; + + @Mock + @Bind + ScheduledExecutorService executor; + + @Mock + @Bind + ChatClient chatClient; + + @Inject + SlayerPlugin slayerPlugin; + + @Mock + @Bind + SlayerTaskPanel panel; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testNewTask() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(231, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testNewKonarTask() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW_KONAR); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Wyrms", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(147, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Karuulm Slayer Dungeon", slayerPlugin.getCurrentTask().getTaskLocation()); + } + + @Test + public void testNewKonarTask2() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW_KONAR_2); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Hellhounds", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(142, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Witchhaven Dungeon", slayerPlugin.getCurrentTask().getTaskLocation()); + } + + @Test + public void testNewKonarTask3() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW_KONAR_3); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Trolls", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(135, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Mount Quidamortem", slayerPlugin.getCurrentTask().getTaskLocation()); + } + + @Test + public void testFirstTask() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW_FIRST); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("goblins", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(17, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testNewNpcContactTask() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW_NPC_CONTACT); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(211, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testBossTask() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_BOSS_NEW); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Vet'ion", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(3, slayerPlugin.getCurrentTask().getAmount()); + assertEquals(914, slayerPlugin.getPoints()); + } + + @Test + public void testBossTaskThe() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_BOSS_NEW_THE); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Chaos Elemental", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(3, slayerPlugin.getCurrentTask().getAmount()); + assertEquals(914, slayerPlugin.getPoints()); + } + + @Test + public void testPartnerTask() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", TASK_NEW_FROM_PARTNER, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + + assertEquals("Dust Devils", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(377, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testCheckSlayerGem() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", TASK_CHECKSLAYERGEM, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(211, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testCheckSlayerGemWildernessTask() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", TASK_CHECKSLAYERGEM_WILDERNESS, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(211, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Wilderness", slayerPlugin.getCurrentTask().getTaskLocation()); + } + + @Test + public void testCheckSlayerGemKonarTask() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", TASK_CHECKSLAYERGEM_KONAR, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + + assertEquals("Blue dragons", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(122, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Ogre Enclave", slayerPlugin.getCurrentTask().getTaskLocation()); + } + + @Test + public void testExistingTask() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_EXISTING); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(222, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testOneTask() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Perterter", TASK_ONE, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + + assertEquals(1, slayerPlugin.getStreak()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testNoPoints() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Perterter", TASK_COMPLETE_NO_POINTS, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + + assertEquals(3, slayerPlugin.getStreak()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testPoints() + { + when(client.getVar(Varbits.SLAYER_REWARD_POINTS)).thenReturn(18_000); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Perterter", TASK_POINTS, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + VarbitChanged varbitChanged = new VarbitChanged(); + slayerPlugin.onVarbitChanged(varbitChanged); + + assertEquals(9, slayerPlugin.getStreak()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + assertEquals(18_000, slayerPlugin.getPoints()); + } + + @Test + public void testLargeStreak() + { + when(client.getVar(Varbits.SLAYER_REWARD_POINTS)).thenReturn(17_566_000); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Perterter", TASK_LARGE_STREAK, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + VarbitChanged varbitChanged = new VarbitChanged(); + slayerPlugin.onVarbitChanged(varbitChanged); + + assertEquals(2465, slayerPlugin.getStreak()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + assertEquals(17_566_000, slayerPlugin.getPoints()); + } + + @Test + public void testComplete() + { + slayerPlugin.getCurrentTask().setTaskName("cows"); + slayerPlugin.getCurrentTask().setAmount(42); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Perterter", TASK_COMPLETE, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testCancelled() + { + slayerPlugin.getCurrentTask().setTaskName("cows"); + slayerPlugin.getCurrentTask().setAmount(42); + + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Perterter", TASK_CANCELED, null, 0); + slayerPlugin.onChatMessage(chatMessageEvent); + + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testSuperiorNotification() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "Superior", SUPERIOR_MESSAGE, null, 0); + + when(slayerConfig.showSuperiorNotification()).thenReturn(true); + slayerPlugin.onChatMessage(chatMessageEvent); + verify(notifier).notify(SUPERIOR_MESSAGE); + + when(slayerConfig.showSuperiorNotification()).thenReturn(false); + slayerPlugin.onChatMessage(chatMessageEvent); + verifyNoMoreInteractions(notifier); + } + + @Test + public void testTaskLookup() throws IOException + { + net.runelite.http.api.chat.Task task = new net.runelite.http.api.chat.Task(); + task.setTask("task"); + task.setLocation("loc"); + task.setAmount(42); + task.setInitialAmount(42); + + when(slayerConfig.taskCommand()).thenReturn(true); + when(chatClient.getTask(anyString())).thenReturn(task); + + ChatMessage setMessage = new ChatMessage(); + setMessage.setType(ChatMessageType.PUBLICCHAT); + setMessage.setName("Adam"); + setMessage.setMessageNode(mock(MessageNode.class)); + + slayerPlugin.taskLookup(setMessage, "!task"); + + verify(chatMessageManager).update(any(MessageNode.class)); + } + + @Test + public void testTaskLookupInvalid() throws IOException + { + net.runelite.http.api.chat.Task task = new net.runelite.http.api.chat.Task(); + task.setTask("task<"); + task.setLocation("loc"); + task.setAmount(42); + task.setInitialAmount(42); + + when(slayerConfig.taskCommand()).thenReturn(true); + when(chatClient.getTask(anyString())).thenReturn(task); + + ChatMessage chatMessage = new ChatMessage(); + chatMessage.setType(ChatMessageType.PUBLICCHAT); + chatMessage.setName("Adam"); + chatMessage.setMessageNode(mock(MessageNode.class)); + + slayerPlugin.taskLookup(chatMessage, "!task"); + + verify(chatMessageManager, never()).update(any(MessageNode.class)); + } + + @Test + public void testSuperiorsLowercase() + { + for (String name : SlayerPlugin.SUPERIOR_SLAYER_MONSTERS) + { + assertEquals(name, name.toLowerCase()); + } + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/smelting/SmeltingPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/smelting/SmeltingPluginTest.java new file mode 100644 index 0000000000..1c8573f26c --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/smelting/SmeltingPluginTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2019, Stephen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.smelting; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import javax.inject.Inject; +import net.runelite.api.ChatMessageType; +import net.runelite.api.events.ChatMessage; +import net.runelite.client.ui.overlay.OverlayManager; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class SmeltingPluginTest +{ + private static final String SMELT_CANNONBALL = "You remove the cannonballs from the mould"; + private static final String SMELT_BAR = "You retrieve a bar of steel."; + + @Inject + SmeltingPlugin smeltingPlugin; + + @Mock + @Bind + SmeltingConfig config; + + @Mock + @Bind + SmeltingOverlay smeltingOverlay; + + @Mock + @Bind + OverlayManager overlayManager; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testCannonballs() + { + ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.SPAM, "", SMELT_CANNONBALL, "", 0); + smeltingPlugin.onChatMessage(chatMessage); + + SmeltingSession smeltingSession = smeltingPlugin.getSession(); + assertNotNull(smeltingSession); + assertEquals(4, smeltingSession.getCannonBallsSmelted()); + } + + @Test + public void testBars() + { + ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.SPAM, "", SMELT_BAR, "", 0); + smeltingPlugin.onChatMessage(chatMessage); + + SmeltingSession smeltingSession = smeltingPlugin.getSession(); + assertNotNull(smeltingSession); + assertEquals(1, smeltingSession.getBarsSmelted()); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timestamp/TimestampPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timestamp/TimestampPluginTest.java new file mode 100644 index 0000000000..e9033043cf --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timestamp/TimestampPluginTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2019, Trevor + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.timestamp; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.util.TimeZone; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.events.ConfigChanged; +import static org.junit.Assert.assertTrue; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class TimestampPluginTest +{ + @Mock + @Bind + Client client; + + @Mock + @Bind + TimestampConfig config; + + @Inject + TimestampPlugin plugin; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + @Test + public void testGenerateTimestamp() + { + when(config.timestampFormat()).thenReturn("[yyyy:MM:dd:HH:hh:mm:ss]"); + + ConfigChanged configChanged = new ConfigChanged(); + configChanged.setGroup("timestamp"); + configChanged.setKey("format"); + configChanged.setNewValue("true"); + plugin.onConfigChanged(configChanged); + + int testInput = 1554667116; + String testOutput = "[2019:04:07:15:03:58:36]"; + TimeZone timeZone = TimeZone.getTimeZone("America/New_York"); + plugin.getFormatter().setTimeZone(timeZone); + assertTrue(plugin.generateTimestamp(testInput, timeZone.toZoneId()).equals(testOutput)); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/clocks/ClockPanelTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/clocks/ClockPanelTest.java new file mode 100644 index 0000000000..09849de72b --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/clocks/ClockPanelTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018, Jamy C + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.timetracking.clocks; + +import java.time.format.DateTimeParseException; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class ClockPanelTest +{ + @Test + public void properColonSeparatedTimeStringShouldReturnCorrectSeconds() + { + assertEquals(5, ClockPanel.stringToSeconds("5")); + assertEquals(50, ClockPanel.stringToSeconds("50")); + assertEquals(120, ClockPanel.stringToSeconds("2:00")); + assertEquals(120, ClockPanel.stringToSeconds("0:120")); + assertEquals(120, ClockPanel.stringToSeconds("0:0:120")); + assertEquals(1200, ClockPanel.stringToSeconds("20:00")); + + assertEquals(50, ClockPanel.stringToSeconds("00:00:50")); + assertEquals(121, ClockPanel.stringToSeconds("00:02:01")); + assertEquals(3660, ClockPanel.stringToSeconds("01:01:00")); + assertEquals(9000, ClockPanel.stringToSeconds("2:30:00")); + assertEquals(9033, ClockPanel.stringToSeconds("02:30:33")); + assertEquals(82800, ClockPanel.stringToSeconds("23:00:00")); + assertEquals(400271, ClockPanel.stringToSeconds("111:11:11")); + } + + @Test + public void properIntuitiveTimeStringShouldReturnCorrectSeconds() + { + assertEquals(5, ClockPanel.stringToSeconds("5s")); + assertEquals(50, ClockPanel.stringToSeconds("50s")); + assertEquals(120, ClockPanel.stringToSeconds("2m")); + assertEquals(120, ClockPanel.stringToSeconds("120s")); + assertEquals(1200, ClockPanel.stringToSeconds("20m")); + + assertEquals(121, ClockPanel.stringToSeconds("2m1s")); + assertEquals(121, ClockPanel.stringToSeconds("2m 1s")); + assertEquals(3660, ClockPanel.stringToSeconds("1h 1m")); + assertEquals(3660, ClockPanel.stringToSeconds("61m")); + assertEquals(3660, ClockPanel.stringToSeconds("3660s")); + assertEquals(9000, ClockPanel.stringToSeconds("2h 30m")); + assertEquals(9033, ClockPanel.stringToSeconds("2h 30m 33s")); + assertEquals(82800, ClockPanel.stringToSeconds("23h")); + assertEquals(400271, ClockPanel.stringToSeconds("111h 11m 11s")); + } + + @Test + public void incorrectTimeStringShouldThrowException() + { + Class numberEx = NumberFormatException.class; + Class dateTimeEx = DateTimeParseException.class; + + tryFail("a", numberEx); + tryFail("abc", numberEx); + tryFail("aa:bb:cc", numberEx); + tryFail("01:12=", numberEx); + + tryFail("s", dateTimeEx); + tryFail("1s 1m", dateTimeEx); + tryFail("20m:10s", dateTimeEx); + tryFail("20hh10m10s", dateTimeEx); + } + + private void tryFail(String input, Class expectedException) + { + try + { + ClockPanel.stringToSeconds(input); + fail("Should have thrown " + expectedException.getSimpleName()); + } + catch (Exception exception) + { + assertEquals(expectedException, exception.getClass()); + } + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/FarmingWorldTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/FarmingWorldTest.java new file mode 100644 index 0000000000..78bf100c05 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/FarmingWorldTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.timetracking.farming; + +import org.junit.Test; + +public class FarmingWorldTest +{ + @Test + public void testInit() + { + new FarmingWorld(); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/PatchImplementationTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/PatchImplementationTest.java new file mode 100644 index 0000000000..6ed2f81f60 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/PatchImplementationTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.timetracking.farming; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ErrorCollector; +import static org.hamcrest.Matchers.*; + +public class PatchImplementationTest +{ + @Rule + public ErrorCollector collector = new ErrorCollector(); + + @Test + public void testRange() + { + for (PatchImplementation impl : PatchImplementation.values()) + { + Map harvestStages = new HashMap<>(); + for (int i = 0; i < 256; i++) + { + PatchState s = impl.forVarbitValue(i); + if (s != null) + { + String pfx = impl.name() + "[" + i + "]"; + collector.checkThat(pfx + ": cropState", s.getCropState(), notNullValue()); + collector.checkThat(pfx + ": produce", s.getProduce(), notNullValue()); + collector.checkThat(pfx + ": negative stage", s.getStage(), greaterThanOrEqualTo(0)); + int stages = s.getProduce().getStages(); + if (s.getCropState() == CropState.HARVESTABLE) + { + stages = s.getProduce().getHarvestStages(); + } + collector.checkThat(pfx + ": out of bounds stage", s.getStage(), lessThan(stages)); + if (s.getCropState() == CropState.DEAD || s.getCropState() == CropState.DISEASED) + { + collector.checkThat(pfx + ": dead seed", s.getStage(), greaterThan(0)); + } + if (s.getCropState() == CropState.GROWING && s.getProduce() != Produce.WEEDS && s.getStage() < stages) + { + harvestStages.computeIfAbsent(s.getProduce(), k -> new boolean[s.getProduce().getStages()])[s.getStage()] = true; + } + } + } + + for (Map.Entry produce : harvestStages.entrySet()) + { + boolean[] states = produce.getValue(); + // Alot of time the final stage is not hit, because some plants do not have a "Check-health" stage + for (int i = 0; i < states.length - 1; i++) + { + collector.checkThat(produce.getKey().getName() + " stage " + i + " never found by varbit", states[i], is(true)); + } + } + } + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/twitch/irc/MessageTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/twitch/irc/MessageTest.java new file mode 100644 index 0000000000..7ef1b4d839 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/twitch/irc/MessageTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.twitch.irc; + +import java.util.Map; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class MessageTest +{ + @Test + public void testParse() + { + Message message = Message.parse("@badges=subscriber/0;color=;display-name=kappa_kid_;emotes=;id=6539b42a-e945-4a83-a5b7-018149ca9fa7;mod=0;room-id=27107346;subscriber=1;tmi-sent-ts=1535926830652;turbo=0;user-id=33390095;user-type= :kappa_kid_!kappa_kid_@kappa_kid_.tmi.twitch.tv PRIVMSG #b0aty :how do u add charges to that zeah book?"); + Map messageTags = message.getTags(); + assertEquals("subscriber/0", messageTags.get("badges")); + assertEquals("kappa_kid_!kappa_kid_@kappa_kid_.tmi.twitch.tv", message.getSource()); + assertEquals("PRIVMSG", message.getCommand()); + assertEquals("#b0aty", message.getArguments()[0]); + assertEquals("how do u add charges to that zeah book?", message.getArguments()[1]); + + message = Message.parse("@badges=moderator/1,subscriber/12,bits/10000;color=#008000;display-name=Am_Sephiroth;emotes=;id=7d516b7c-de7a-4c8b-ad23-d8880b55d46b;login=am_sephiroth;mod=1;msg-id=subgift;msg-param-months=8;msg-param-recipient-display-name=IntRS;msg-param-recipient-id=189672346;msg-param-recipient-user-name=intrs;msg-param-sender-count=215;msg-param-sub-plan-name=Sick\\sNerd\\sSubscription\\s;msg-param-sub-plan=1000;room-id=49408183;subscriber=1;system-msg=Am_Sephiroth\\sgifted\\sa\\sTier\\s1\\ssub\\sto\\sIntRS!\\sThey\\shave\\sgiven\\s215\\sGift\\sSubs\\sin\\sthe\\schannel!;tmi-sent-ts=1535980032939;turbo=0;user-id=69539403;user-type=mod :tmi.twitch.tv USERNOTICE #sick_nerd"); + messageTags = message.getTags(); + assertEquals("Am_Sephiroth gifted a Tier 1 sub to IntRS! They have given 215 Gift Subs in the channel!", messageTags.get("system-msg")); + } +} \ No newline at end of file diff --git a/api/src/main/java/api/HealthBarOverride.java b/runelite-client/src/test/java/net/runelite/client/plugins/worldmap/TeleportLocationDataTest.java similarity index 75% rename from api/src/main/java/api/HealthBarOverride.java rename to runelite-client/src/test/java/net/runelite/client/plugins/worldmap/TeleportLocationDataTest.java index 8df07ca4d9..2c52d0ae4f 100644 --- a/api/src/main/java/api/HealthBarOverride.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/worldmap/TeleportLocationDataTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Lotto + * Copyright (c) 2018, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,15 +23,21 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package api; +package net.runelite.client.plugins.worldmap; -import lombok.Data; +import static org.junit.Assert.assertNotNull; +import org.junit.Test; -@Data -public class HealthBarOverride +public class TeleportLocationDataTest { - public final Sprite frontSprite; - public final Sprite backSprite; - public final Sprite frontSpriteLarge; - public final Sprite backSpriteLarge; -} + @Test + public void testResources() + { + for (TeleportLocationData data : TeleportLocationData.values()) + { + String path = data.getIconPath(); + assertNotNull(path); + assertNotNull(path, getClass().getResourceAsStream(path)); + } + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java b/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java new file mode 100644 index 0000000000..719998d407 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client.rs; + +import java.io.IOException; +import okhttp3.OkHttpClient; +import org.junit.Test; + +/** + * + * @author Adam + */ +public class ClientConfigLoaderTest +{ + @Test + public void test() throws IOException + { + final ClientConfigLoader loader = new ClientConfigLoader(new OkHttpClient()); + final RSConfig config = loader.fetch(); + + for (String key : config.getClassLoaderProperties().keySet()) + { + System.out.println(key + ": " + config.getClassLoaderProperties().get(key)); + } + + System.out.println("Applet properties:"); + + for (String key : config.getAppletProperties().keySet()) + { + System.out.println(key + ": " + config.getAppletProperties().get(key)); + } + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/ui/FontManagerTest.java b/runelite-client/src/test/java/net/runelite/client/ui/FontManagerTest.java new file mode 100644 index 0000000000..fd42ea6dbf --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/FontManagerTest.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017, Tyler + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui; + +import static org.junit.Assert.assertNotNull; +import org.junit.Test; + +public class FontManagerTest +{ + @Test + public void getRunescapeFont() + { + assertNotNull(FontManager.getRunescapeFont()); + } + + @Test + public void getRunescapeSmallFont() + { + assertNotNull(FontManager.getRunescapeSmallFont()); + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayManagerTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayManagerTest.java new file mode 100644 index 0000000000..af1accea5b --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayManagerTest.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class OverlayManagerTest +{ + class TestOverlay extends Overlay + { + TestOverlay(OverlayPosition position, OverlayPriority priority) + { + setPosition(position); + setPriority(priority); + } + + @Override + public Dimension render(Graphics2D graphics) + { + throw new UnsupportedOperationException("Not supported yet."); + } + } + + private static class OverlayA extends Overlay + { + @Override + public Dimension render(Graphics2D graphics) + { + return null; + } + } + + private static class OverlayB extends Overlay + { + @Override + public Dimension render(Graphics2D graphics) + { + return null; + } + } + + @Test + public void testEquality() + { + Overlay a1 = new OverlayA(); + Overlay a2 = new OverlayA(); + Overlay b = new OverlayB(); + // The same instance of the same overlay should be equal + assertTrue(a1.equals(a1)); + // A different instance of the same overlay should not be equal by default + assertFalse(a1.equals(a2)); + // A different instance of a different overlay should not be equal + assertFalse(a1.equals(b)); + } + + @Test + public void testSort() + { + // High priorities overlays render first + Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); + Overlay tll = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.LOW); + List overlays = Arrays.asList(tlh, tll); + overlays.sort(OverlayManager.OVERLAY_COMPARATOR); + assertEquals(tlh, overlays.get(0)); + assertEquals(tll, overlays.get(1)); + } + + @Test + public void testSortDynamic() + { + // Dynamic overlays render before static overlays + Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); + Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, OverlayPriority.HIGH); + List overlays = Arrays.asList(tlh, dyn); + overlays.sort(OverlayManager.OVERLAY_COMPARATOR); + assertEquals(dyn, overlays.get(0)); + assertEquals(tlh, overlays.get(1)); + } + + @Test + public void testTooltips() + { + // Tooltip overlay renders after everything + Overlay t = new TestOverlay(OverlayPosition.TOOLTIP, OverlayPriority.HIGH); + Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, OverlayPriority.HIGH); + Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); + List overlays = Arrays.asList(t, dyn, tlh); + overlays.sort(OverlayManager.OVERLAY_COMPARATOR); + assertEquals(dyn, overlays.get(0)); + assertEquals(tlh, overlays.get(1)); + assertEquals(t, overlays.get(2)); + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java new file mode 100644 index 0000000000..45c859a4a7 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay.components; + +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import org.mockito.Mock; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class TextComponentTest +{ + @Mock + private Graphics2D graphics; + + @Before + public void before() + { + when(graphics.getFontMetrics()).thenReturn(mock(FontMetrics.class)); + } + + @Test + public void testRender() + { + TextComponent textComponent = new TextComponent(); + textComponent.setText("test"); + textComponent.setColor(Color.RED); + textComponent.render(graphics); + verify(graphics, times(2)).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.RED); + } + + @Test + public void testRender2() + { + TextComponent textComponent = new TextComponent(); + textComponent.setText("test"); + textComponent.render(graphics); + verify(graphics, times(2)).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.BLUE); + } + + @Test + public void testRender3() + { + TextComponent textComponent = new TextComponent(); + textComponent.setText("test test"); + textComponent.render(graphics); + verify(graphics, atLeastOnce()).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).drawString(eq(" test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.BLUE); + verify(graphics, atLeastOnce()).setColor(Color.GREEN); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java new file mode 100644 index 0000000000..1c7e95d37a --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay.components.table; + +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import org.mockito.Mock; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class TableComponentTest +{ + @Mock + private Graphics2D graphics; + + @Before + public void before() + { + when(graphics.getFontMetrics()).thenReturn(mock(FontMetrics.class)); + } + + @Test + public void testRender() + { + TableComponent tableComponent = new TableComponent(); + tableComponent.addRow("test"); + tableComponent.setDefaultAlignment(TableAlignment.CENTER); + tableComponent.setDefaultColor(Color.RED); + tableComponent.render(graphics); + verify(graphics, times(2)).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.RED); + } + + @Test + public void testColors() + { + TableComponent tableComponent = new TableComponent(); + tableComponent.addRow("test", "test", "test", "test", "test"); + tableComponent.setColumns("", "", ""); + List elements = tableComponent.getColumns(); + elements.get(0).setColor(Color.RED); + elements.get(1).setColor(Color.GREEN); + elements.get(2).setColor(Color.BLUE); + tableComponent.render(graphics); + verify(graphics, atLeastOnce()).setColor(Color.RED); + verify(graphics, atLeastOnce()).setColor(Color.GREEN); + verify(graphics, atLeastOnce()).setColor(Color.BLUE); + verify(graphics, atLeastOnce()).setColor(Color.YELLOW); + verify(graphics, atLeastOnce()).setColor(Color.WHITE); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/ColorUtilTest.java b/runelite-client/src/test/java/net/runelite/client/util/ColorUtilTest.java new file mode 100644 index 0000000000..0399a3634b --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/ColorUtilTest.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import java.awt.Color; +import java.util.HashMap; +import java.util.Map; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class ColorUtilTest +{ + private static final Map COLOR_HEXSTRING_MAP = new HashMap() + {{ + put(Color.BLACK, "000000"); + put(new Color(0x1), "000001"); + put(new Color(0x100000), "100000"); + put(Color.RED, "ff0000"); + put(Color.GREEN, "00ff00"); + put(Color.BLUE, "0000ff"); + put(new Color(0xA1B2C3), "a1b2c3"); + put(Color.WHITE, "ffffff"); + }}; + + @Test + public void colorTag() + { + COLOR_HEXSTRING_MAP.forEach((color, hex) -> + { + assertEquals("", ColorUtil.colorTag(color)); + }); + } + + @Test + public void prependColorTag() + { + COLOR_HEXSTRING_MAP.forEach((color, hex) -> + { + assertEquals("test", ColorUtil.prependColorTag("test", color)); + assertEquals("", ColorUtil.prependColorTag("", color)); + }); + + assertEquals("94/99", ColorUtil.prependColorTag("94" + ColorUtil.prependColorTag("/99", Color.WHITE), Color.RED)); + } + + @Test + public void wrapWithColorTag() + { + COLOR_HEXSTRING_MAP.forEach((color, hex) -> + { + assertEquals("test", ColorUtil.wrapWithColorTag("test", color)); + assertEquals("", ColorUtil.wrapWithColorTag("", color)); + }); + } + + @Test + public void toHexColor() + { + COLOR_HEXSTRING_MAP.forEach((color, hex) -> + { + assertEquals("#" + hex, ColorUtil.toHexColor(color)); + }); + } + + @Test + public void colorLerp() + { + assertEquals(Color.WHITE, ColorUtil.colorLerp(Color.WHITE, Color.WHITE, 0.9)); + assertEquals(new Color(128, 128, 128), ColorUtil.colorLerp(Color.BLACK, Color.WHITE, 0.5)); + assertEquals(Color.BLACK, ColorUtil.colorLerp(Color.BLACK, Color.CYAN, 0)); + assertEquals(Color.CYAN, ColorUtil.colorLerp(Color.BLACK, Color.CYAN, 1)); + } + + @Test + public void colorToHexCode() + { + COLOR_HEXSTRING_MAP.forEach((color, hex) -> + { + assertEquals(hex, ColorUtil.colorToHexCode(color)); + }); + } + + @Test + public void isFullyTransparent() + { + for (Color color : COLOR_HEXSTRING_MAP.keySet()) + { + assertFalse(ColorUtil.isFullyTransparent(color)); + } + assertTrue(ColorUtil.isFullyTransparent(new Color(0, 0, 0, 0))); + assertFalse(ColorUtil.isFullyTransparent(new Color(0, 0, 0, 1))); + } + + @Test + public void isNotFullyTransparent() + { + for (Color color : COLOR_HEXSTRING_MAP.keySet()) + { + assertTrue(ColorUtil.isNotFullyTransparent(color)); + } + assertFalse(ColorUtil.isNotFullyTransparent(new Color(0, 0, 0, 0))); + assertTrue(ColorUtil.isNotFullyTransparent(new Color(0, 0, 0, 1))); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java new file mode 100644 index 0000000000..829e90368b --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java @@ -0,0 +1,439 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import java.awt.Color; +import static java.awt.Color.BLACK; +import static java.awt.Color.BLUE; +import static java.awt.Color.GRAY; +import static java.awt.Color.GREEN; +import static java.awt.Color.RED; +import static java.awt.Color.WHITE; +import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferInt; +import java.util.Arrays; +import java.util.function.Predicate; +import javax.annotation.Nonnull; +import org.apache.commons.lang3.ArrayUtils; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class ImageUtilTest +{ + private static final Color BLACK_HALF_TRANSPARENT = new Color(0, 0, 0, 128); + private static final Color BLACK_TRANSPARENT = new Color(0, true); + private static final int CORNER_SIZE = 2; + private static final int CENTERED_SIZE = 3; + + private static final BufferedImage BLACK_PIXEL_TOP_LEFT; + private static final BufferedImage BLACK_PIXEL_TOP_RIGHT; + private static final BufferedImage BLACK_PIXEL_BOTTOM_LEFT; + private static final BufferedImage BLACK_PIXEL_BOTTOM_RIGHT; + + static + { + BLACK_PIXEL_TOP_LEFT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_TOP_LEFT.setRGB(0, 0, BLACK.getRGB()); + + BLACK_PIXEL_TOP_RIGHT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_TOP_RIGHT.setRGB(1, 0, BLACK.getRGB()); + + BLACK_PIXEL_BOTTOM_LEFT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_BOTTOM_LEFT.setRGB(0, 1, BLACK.getRGB()); + + BLACK_PIXEL_BOTTOM_RIGHT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_BOTTOM_RIGHT.setRGB(1, 1, BLACK.getRGB()); + } + + @Test + public void bufferedImageFromImage() + { + final BufferedImage buffered = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + assertEquals(buffered, ImageUtil.bufferedImageFromImage(buffered)); + } + + @Test + public void grayscaleOffset() + { + // grayscaleOffset(BufferedImage image, int offset) + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), -255))); + assertTrue(bufferedImagesEqual(oneByOne(new Color(50, 50, 50)), ImageUtil.grayscaleOffset(oneByOne(BLACK), 50))); + assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(BLACK), 128))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(GRAY), -255))); + assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(BLACK), 255))); + assertTrue(bufferedImagesEqual(oneByOne(new Color(200, 200, 200)), ImageUtil.grayscaleOffset(oneByOne(WHITE), -55))); + assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 55))); + + // grayscaleOffset(BufferedImage image, float percentage) + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 0f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 1f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 2f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(GRAY), 0f))); + assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(GRAY), 1f))); + assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(GRAY), 2f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(WHITE), 0f))); + assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(WHITE), 0.503f))); // grayscaleOffset does Math.floor + assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 1f))); + assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 2f))); + } + + @Test + public void alphaOffset() + { + // alphaOffset(BufferedImage image, int offset) + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), -255))); + assertTrue(bufferedImagesEqual(oneByOne(new Color(0, 0, 0, 50)), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 50))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_HALF_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 128))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), -255))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 255))); + assertTrue(bufferedImagesEqual(oneByOne(new Color(0, 0, 0, 200)), ImageUtil.alphaOffset(oneByOne(BLACK), -55))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK), 255))); + + // alphaOffset(BufferedImage image, float offset) + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 0f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 1f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 2f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), 0f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_HALF_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), 1f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), 2f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK), 0f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_HALF_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK), 0.503f))); // opacityOffset does Math.floor + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK), 1f))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK), 2f))); + } + + @Test + public void grayscaleImage() + { + final BufferedImage[] grayscaleColors = new BufferedImage[] { + oneByOne(WHITE), + oneByOne(GRAY), + oneByOne(BLACK), + oneByOne(BLACK_HALF_TRANSPARENT), + oneByOne(BLACK_TRANSPARENT), + }; + final BufferedImage[] nonGrayscaleColors = new BufferedImage[] { + oneByOne(RED), + oneByOne(GREEN), + oneByOne(BLUE), + }; + + for (BufferedImage image : grayscaleColors) + { + assertTrue(isGrayscale(image)); + } + for (BufferedImage image : nonGrayscaleColors) + { + assertFalse(isGrayscale(image)); + } + for (BufferedImage image : ArrayUtils.addAll(grayscaleColors, nonGrayscaleColors)) + { + assertTrue(isGrayscale(ImageUtil.grayscaleImage(image))); + } + } + + @Test + public void resizeImage() + { + // TODO: test image contents after changing size + + final BufferedImage larger = ImageUtil.resizeImage(oneByOne(BLACK), 46, 46); + final BufferedImage smaller = ImageUtil.resizeImage(centeredPixel(WHITE), 1, 1); + final BufferedImage stretched = ImageUtil.resizeImage(solidColor(30, 30, RED), 12, 34); + + assertEquals(46, larger.getWidth()); + assertEquals(46, larger.getHeight()); + assertEquals(1, smaller.getWidth()); + assertEquals(1, smaller.getHeight()); + assertEquals(12, stretched.getWidth()); + assertEquals(34, stretched.getHeight()); + + final BufferedImage[] assertSameAfterResize = new BufferedImage[] { + oneByOne(WHITE), + oneByOne(GRAY), + oneByOne(BLACK), + oneByOne(RED), + oneByOne(GREEN), + oneByOne(BLUE), + oneByOne(BLACK_HALF_TRANSPARENT), + oneByOne(BLACK_TRANSPARENT), + centeredPixel(WHITE), + centeredPixel(GRAY), + centeredPixel(BLACK), + BLACK_PIXEL_TOP_LEFT, + BLACK_PIXEL_TOP_RIGHT, + BLACK_PIXEL_BOTTOM_LEFT, + BLACK_PIXEL_BOTTOM_RIGHT, + }; + for (BufferedImage image : assertSameAfterResize) + { + assertTrue(bufferedImagesEqual(image, ImageUtil.resizeImage(image, image.getWidth(), image.getHeight()))); + } + } + + @Test + public void resizeCanvas() + { + assertTrue(bufferedImagesEqual(centeredPixel(BLACK), ImageUtil.resizeCanvas(oneByOne(BLACK), 3, 3))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.resizeCanvas(oneByOne(BLACK), 1, 1))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.resizeCanvas(centeredPixel(BLACK), 1, 1))); + + BufferedImage expected = new BufferedImage(2, 1, BufferedImage.TYPE_INT_ARGB); + expected.setRGB(1, 0, BLACK.getRGB()); + assertTrue(bufferedImagesEqual(expected, ImageUtil.resizeCanvas(oneByOne(BLACK), 2, 1))); + + expected = new BufferedImage(1, 2, BufferedImage.TYPE_INT_ARGB); + expected.setRGB(0, 1, BLACK.getRGB()); + assertTrue(bufferedImagesEqual(expected, ImageUtil.resizeCanvas(oneByOne(BLACK), 1, 2))); + } + + @Test + public void rotateImage() + { + // TODO: Test more than 90° rotations + + // Evenly-sized images (2x2) + assertTrue(bufferedImagesEqual(BLACK_PIXEL_TOP_RIGHT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI / 2))); + assertTrue(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_RIGHT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI))); + assertTrue(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_LEFT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI * 3 / 2))); + assertTrue(bufferedImagesEqual(BLACK_PIXEL_TOP_LEFT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI * 2))); + + // Unevenly-sized images (2x1); when rotated 90° become (2x2) images + final BufferedImage twoByOneLeft = new BufferedImage(2, 1, BufferedImage.TYPE_INT_ARGB); + twoByOneLeft.setRGB(0, 0, BLACK.getRGB()); + final BufferedImage twoByTwoRight = new BufferedImage(2, 1, BufferedImage.TYPE_INT_ARGB); + twoByTwoRight.setRGB(1, 0, BLACK.getRGB()); + final BufferedImage oneByTwoTop = new BufferedImage(2, 2, BufferedImage.TYPE_INT_ARGB); + oneByTwoTop.setRGB(1, 0, new Color(0, 0, 0, 127).getRGB()); + final BufferedImage oneByTwoBottom = new BufferedImage(2, 2, BufferedImage.TYPE_INT_ARGB); + oneByTwoBottom.setRGB(0, 0, new Color(0, 0, 0, 127).getRGB()); + oneByTwoBottom.setRGB(0, 1, BLACK.getRGB()); + + assertTrue(bufferedImagesEqual(oneByTwoTop, ImageUtil.rotateImage(twoByOneLeft, Math.PI / 2))); + assertTrue(bufferedImagesEqual(twoByTwoRight, ImageUtil.rotateImage(twoByOneLeft, Math.PI))); + assertTrue(bufferedImagesEqual(oneByTwoBottom, ImageUtil.rotateImage(twoByOneLeft, Math.PI * 3 / 2))); + assertTrue(bufferedImagesEqual(twoByOneLeft, ImageUtil.rotateImage(twoByOneLeft, Math.PI * 2))); + } + + @Test + public void flipImage() + { + assertTrue(bufferedImagesEqual(BLACK_PIXEL_TOP_LEFT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, false, false))); + assertTrue(bufferedImagesEqual(BLACK_PIXEL_TOP_RIGHT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, true, false))); + assertTrue(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_LEFT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, false, true))); + assertTrue(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_RIGHT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, true, true))); + } + + @Test + public void fillImage() + { + // fillImage(BufferedImage image, Color color) + assertTrue(bufferedImagesEqual(centeredPixel(GRAY), ImageUtil.fillImage(centeredPixel(BLACK), GRAY))); + assertTrue(bufferedImagesEqual(solidColor(3, 3, GREEN), ImageUtil.fillImage(solidColor(3, 3, BLACK), GREEN))); + assertTrue(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.fillImage(oneByOne(BLACK_TRANSPARENT), WHITE))); + + // fillImage(BufferedImage image, Color color, Predicate fillCondition) + BufferedImage expected = solidColor(CORNER_SIZE, CORNER_SIZE, WHITE); + expected.setRGB(0, 0, new Color(0, true).getRGB()); + assertTrue(bufferedImagesEqual(expected, ImageUtil.fillImage(BLACK_PIXEL_TOP_LEFT, WHITE, ColorUtil::isFullyTransparent))); + } + + @Test + public void outlineImage() + { + // outlineImage(BufferedImage image, Color color) + BufferedImage expected = new BufferedImage(CENTERED_SIZE, CENTERED_SIZE, BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < expected.getWidth(); x++) + { + for (int y = 0; y < expected.getHeight(); y++) + { + if (x != 1 && y != 1) + { + continue; + } + expected.setRGB(x, y, BLACK.getRGB()); + } + } + assertTrue(bufferedImagesEqual(expected, ImageUtil.outlineImage(centeredPixel(BLACK), BLACK))); + expected.setRGB(1, 1, WHITE.getRGB()); + assertTrue(bufferedImagesEqual(expected, ImageUtil.outlineImage(centeredPixel(WHITE), BLACK))); + expected = solidColor(CORNER_SIZE, CORNER_SIZE, WHITE); + expected.setRGB(0, 0, BLACK.getRGB()); + expected.setRGB(1, 1, new Color(0, true).getRGB()); + assertTrue(bufferedImagesEqual(expected, ImageUtil.outlineImage(BLACK_PIXEL_TOP_LEFT, WHITE))); + + // outlineImage(BufferedImage image, Color color, Predicate fillCondition) + BufferedImage test = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + test.setRGB(0, 0, BLACK.getRGB()); + test.setRGB(1, 0, GRAY.getRGB()); + expected = test; + expected.setRGB(0, 1, BLUE.getRGB()); + assertTrue(bufferedImagesEqual(expected, ImageUtil.outlineImage(test, BLUE, (color -> color.equals(BLACK))))); + + // outlineImage(BufferedImage image, Color color, Boolean outlineCorners) + expected = solidColor(CORNER_SIZE, CORNER_SIZE, WHITE); + expected.setRGB(0, 0, BLACK.getRGB()); + assertTrue(bufferedImagesEqual(expected, ImageUtil.outlineImage(BLACK_PIXEL_TOP_LEFT, WHITE, true))); + assertTrue(bufferedImagesEqual(solidColor(3, 3, BLACK), ImageUtil.outlineImage(centeredPixel(BLACK), BLACK, true))); + + // outlineImage(BufferedImage image, Color color, Predicate fillCondition, Boolean outlineCorners) + test = new BufferedImage(5, 5, BufferedImage.TYPE_INT_ARGB); + test.setRGB(2, 2, BLACK.getRGB()); + test.setRGB(1, 2, new Color(50, 50, 50).getRGB()); + test.setRGB(3, 2, new Color(100, 100, 100).getRGB()); + test.setRGB(2, 3, new Color(150, 150, 150).getRGB()); + expected = test; + expected.setRGB(2, 1, RED.getRGB()); + expected.setRGB(3, 1, RED.getRGB()); + expected.setRGB(4, 1, RED.getRGB()); + expected.setRGB(4, 2, RED.getRGB()); + expected.setRGB(1, 3, RED.getRGB()); + expected.setRGB(3, 3, RED.getRGB()); + expected.setRGB(4, 3, RED.getRGB()); + expected.setRGB(1, 4, RED.getRGB()); + expected.setRGB(2, 4, RED.getRGB()); + expected.setRGB(3, 4, RED.getRGB()); + Predicate testPredicate = (color -> ColorUtil.isNotFullyTransparent(color) && color.getRed() > 75 && color.getGreen() > 75 && color.getBlue() > 75); + assertTrue(bufferedImagesEqual(expected, ImageUtil.outlineImage(test, RED, testPredicate, true))); + } + + /** + * Compares whether two {@link BufferedImage}s are equal in data. + * + * @param expected The first {@link BufferedImage} to be compared. + * @param actual The second {@link BufferedImage} to be compared. + * @return A boolean indicating whether the given {@link BufferedImage}s are of the same image data. + */ + private boolean bufferedImagesEqual(final @Nonnull BufferedImage expected, final @Nonnull BufferedImage actual) + { + if (expected.getWidth() != actual.getWidth()) + { + return false; + } + + if (!expected.getColorModel().equals(actual.getColorModel())) + { + return false; + } + + final DataBuffer aBuffer = expected.getRaster().getDataBuffer(); + final DataBuffer bBuffer = actual.getRaster().getDataBuffer(); + final DataBufferInt aBufferInt = (DataBufferInt) aBuffer; + final DataBufferInt bBufferInt = (DataBufferInt) bBuffer; + + if (aBufferInt.getNumBanks() != bBufferInt.getNumBanks()) + { + return false; + } + + for (int i = 0; i < aBufferInt.getNumBanks(); i++) + { + final int[] aDataBank = aBufferInt.getData(i); + final int[] bDataBank = bBufferInt.getData(i); + if (!Arrays.equals(aDataBank, bDataBank)) + { + return false; + } + } + + return true; + } + + /** + * Returns whether a {@link BufferedImage} contains only grayscale pixel data. + * + * @param image The image to be checked. + * @return A boolean indicating whether all of the given image's pixels are grayscale. + */ + private boolean isGrayscale(final @Nonnull BufferedImage image) + { + for (int x = 0; x < image.getWidth(); x++) + { + for (int y = 0; y < image.getHeight(); y++) + { + final int color = image.getRGB(x, y); + final int red = (color & 0xff0000) >> 16; + final int green = (color & 0xff00) >> 8; + final int blue = color & 0xff; + if (red != green + || green != blue) + { + return false; + } + } + } + return true; + } + + /** + * Creates a {@link BufferedImage} of a 1-by-1px image of the given color. + * + * @param color The color to use for the image's single pixel. + * @return A {@link BufferedImage} containing a single pixel of the given color. + */ + private BufferedImage oneByOne(final @Nonnull Color color) + { + return solidColor(1, 1, color); + } + + /** + * Creates a {@link BufferedImage} of a single pixel of the given color centered in a 3-by-3px + * image. + * + * @param color The color to use for the centered pixel. + * @return A {@link BufferedImage} with completely transparent pixels and one pixel of the + * given color in the center. + */ + private BufferedImage centeredPixel(final @Nonnull Color color) + { + final BufferedImage out = new BufferedImage(CENTERED_SIZE, CENTERED_SIZE, BufferedImage.TYPE_INT_ARGB); + out.setRGB(1, 1, color.getRGB()); + return out; + } + + /** + * Creates a {@link BufferedImage} of a solid color of given width and height. + * + * @param width The desired width of the color image. + * @param height The desired height of the color image. + * @param color The desired color of the image. + * @return A {@link BufferedImage} of given dimensions filled with the given color. + */ + private BufferedImage solidColor(final int width, final int height, final @Nonnull Color color) + { + final BufferedImage out = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < width; x++) + { + for (int y = 0; y < height; y++) + { + out.setRGB(x, y, color.getRGB()); + } + } + return out; + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/ItemUtilTest.java b/runelite-client/src/test/java/net/runelite/client/util/ItemUtilTest.java new file mode 100644 index 0000000000..f69238896d --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/ItemUtilTest.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2018, TheStonedTurtle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import com.google.common.collect.ImmutableSet; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import net.runelite.api.Item; +import net.runelite.api.ItemID; +import net.runelite.http.api.loottracker.GameItem; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ItemUtilTest +{ + private static final Set SOME_IDS = ImmutableSet.of(ItemID.MITHRIL_BAR, ItemID.DRAGON_BONES); + private static final Set WRONG_IDS = ImmutableSet.of(ItemID.SCYTHE_OF_VITUR, ItemID.TWISTED_BOW); + private static final Set MIX_IDS = ImmutableSet.of( + ItemID.MITHRIL_BAR, ItemID.DRAGON_BONES, + ItemID.SCYTHE_OF_VITUR, ItemID.TWISTED_BOW + ); + + private static final Map SOME_MAP = new HashMap<>(); + private static final Map ALL_MAP = new HashMap<>(); + + private static final Item[] items = new Item[6]; + + static + { + SOME_MAP.put(ItemID.MITHRIL_BAR, new GameItem(ItemID.MITHRIL_BAR, 6)); + SOME_MAP.put(ItemID.DRAGON_BONES, new GameItem(ItemID.DRAGON_BONES, 2)); + + ALL_MAP.putAll(SOME_MAP); + ALL_MAP.put(ItemID.COINS_995, new GameItem(ItemID.COINS_995, 1000)); + ALL_MAP.put(ItemID.CHEWED_BONES, new GameItem(ItemID.CHEWED_BONES, 1)); + + items[0] = createItem(ItemID.MITHRIL_BAR, 3); + items[1] = createItem(ItemID.DRAGON_BONES, 1); + items[2] = createItem(ItemID.COINS_995, 1000); + + items[3] = createItem(ItemID.MITHRIL_BAR, 3); + items[4] = createItem(ItemID.DRAGON_BONES, 1); + items[5] = createItem(ItemID.CHEWED_BONES, 1); + } + + private static Item createItem(int id, int qty) + { + Item i = mock(Item.class); + when(i.getId()) + .thenReturn(id); + when(i.getQuantity()) + .thenReturn(qty); + + return i; + } + + @Test + public void toGameItemMap() + { + Map itemMap = ItemUtil.toGameItemMap(items, SOME_IDS); + assertEquals(SOME_MAP, itemMap); + assertNotEquals(ALL_MAP, itemMap); + + Map itemMap2 = ItemUtil.toGameItemMap(items); + assertNotEquals(SOME_MAP, itemMap2); + assertEquals(ALL_MAP, itemMap2); + } + + @Test + public void containsAllItemIds() + { + assertTrue(ItemUtil.containsAllItemIds(items, SOME_IDS)); + assertFalse(ItemUtil.containsAllItemIds(items, WRONG_IDS)); + assertFalse(ItemUtil.containsAllItemIds(items, MIX_IDS)); + } + + @Test + public void containsAnyItemId() + { + assertTrue(ItemUtil.containsAnyItemId(items, SOME_IDS)); + assertFalse(ItemUtil.containsAnyItemId(items, WRONG_IDS)); + assertTrue(ItemUtil.containsAnyItemId(items, MIX_IDS)); + } + + @Test + public void containsItemId() + { + assertTrue(ItemUtil.containsItemId(items, ItemID.COINS_995)); + assertFalse(ItemUtil.containsItemId(items, ItemID.TWISTED_BOW)); + } + + @Test + public void containsAllGameItems() + { + assertTrue(ItemUtil.containsAllGameItems(items, SOME_MAP.values())); + assertTrue(ItemUtil.containsAllGameItems(items, ALL_MAP.values())); + + Collection wrongItems = new ArrayList<>(SOME_MAP.values()); + wrongItems.add(new GameItem(ItemID.TWISTED_BOW, 1)); + assertFalse(ItemUtil.containsAllGameItems(items, wrongItems)); + + assertFalse(ItemUtil.containsAllGameItems(items, new GameItem(ItemID.MITHRIL_BAR, 7))); + assertTrue(ItemUtil.containsAllGameItems(items, new GameItem(ItemID.MITHRIL_BAR, 6))); + assertTrue(ItemUtil.containsAllGameItems(items, new GameItem(ItemID.MITHRIL_BAR, 5))); + assertFalse(ItemUtil.containsAllGameItems(items, new GameItem(ItemID.MITHRIL_BAR, 5), new GameItem(ItemID.TWISTED_BOW, 1))); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/StackFormatterTest.java b/runelite-client/src/test/java/net/runelite/client/util/StackFormatterTest.java new file mode 100644 index 0000000000..1e297a8513 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/StackFormatterTest.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2018, arlyon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import java.text.ParseException; +import java.util.Locale; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import org.junit.Before; +import org.junit.Test; + +public class StackFormatterTest +{ + @Before + public void setUp() + { + Locale.setDefault(Locale.ENGLISH); + } + + @Test + public void quantityToRSDecimalStackSize() + { + assertEquals("0", StackFormatter.quantityToRSDecimalStack(0)); + assertEquals("8500", StackFormatter.quantityToRSDecimalStack(8_500)); + assertEquals("10K", StackFormatter.quantityToRSDecimalStack(10_000)); + assertEquals("21.7K", StackFormatter.quantityToRSDecimalStack(21_700)); + assertEquals("100K", StackFormatter.quantityToRSDecimalStack(100_000)); + assertEquals("100.3K", StackFormatter.quantityToRSDecimalStack(100_300)); + assertEquals("1M", StackFormatter.quantityToRSDecimalStack(1_000_000)); + assertEquals("8.4M", StackFormatter.quantityToRSDecimalStack(8_450_000)); + assertEquals("10M", StackFormatter.quantityToRSDecimalStack(10_000_000)); + assertEquals("12.8M", StackFormatter.quantityToRSDecimalStack(12_800_000)); + assertEquals("100M", StackFormatter.quantityToRSDecimalStack(100_000_000)); + assertEquals("250.1M", StackFormatter.quantityToRSDecimalStack(250_100_000)); + assertEquals("1B", StackFormatter.quantityToRSDecimalStack(1_000_000_000)); + assertEquals("1.5B", StackFormatter.quantityToRSDecimalStack(1500_000_000)); + assertEquals("2.1B", StackFormatter.quantityToRSDecimalStack(Integer.MAX_VALUE)); + } + + @Test + public void quantityToRSStackSize() + { + assertEquals("0", StackFormatter.quantityToRSStackSize(0)); + assertEquals("99999", StackFormatter.quantityToRSStackSize(99_999)); + assertEquals("100K", StackFormatter.quantityToRSStackSize(100_000)); + assertEquals("10M", StackFormatter.quantityToRSStackSize(10_000_000)); + assertEquals("2147M", StackFormatter.quantityToRSStackSize(Integer.MAX_VALUE)); + + assertEquals("0", StackFormatter.quantityToRSStackSize(-0)); + assertEquals("-400", StackFormatter.quantityToRSStackSize(-400)); + assertEquals("-400K", StackFormatter.quantityToRSStackSize(-400_000)); + assertEquals("-40M", StackFormatter.quantityToRSStackSize(-40_000_000)); + assertEquals("-2147M", StackFormatter.quantityToRSStackSize(Integer.MIN_VALUE)); + } + + @Test + public void quantityToStackSize() + { + assertEquals("0", StackFormatter.quantityToStackSize(0)); + assertEquals("999", StackFormatter.quantityToStackSize(999)); + assertEquals("1,000", StackFormatter.quantityToStackSize(1000)); + assertEquals("9,450", StackFormatter.quantityToStackSize(9450)); + assertEquals("14.5K", StackFormatter.quantityToStackSize(14_500)); + assertEquals("99.9K", StackFormatter.quantityToStackSize(99_920)); + assertEquals("100K", StackFormatter.quantityToStackSize(100_000)); + assertEquals("10M", StackFormatter.quantityToStackSize(10_000_000)); + assertEquals("2.14B", StackFormatter.quantityToStackSize(Integer.MAX_VALUE)); + assertEquals("100B", StackFormatter.quantityToStackSize(100_000_000_000L)); + + assertEquals("0", StackFormatter.quantityToStackSize(-0)); + assertEquals("-400", StackFormatter.quantityToStackSize(-400)); + assertEquals("-400K", StackFormatter.quantityToStackSize(-400_000)); + assertEquals("-40M", StackFormatter.quantityToStackSize(-40_000_000)); + assertEquals("-2.14B", StackFormatter.quantityToStackSize(Integer.MIN_VALUE)); + assertEquals("-400B", StackFormatter.quantityToStackSize(-400_000_000_000L)); + } + + @Test + public void quantityToPreciseStackSize() + { + assertEquals("0", StackFormatter.quantityToRSDecimalStack(0)); + assertEquals("8500", StackFormatter.quantityToRSDecimalStack(8_500, true)); + assertEquals("10K", StackFormatter.quantityToRSDecimalStack(10_000, true)); + assertEquals("21.7K", StackFormatter.quantityToRSDecimalStack(21_710, true)); + assertEquals("100K", StackFormatter.quantityToRSDecimalStack(100_000, true)); + assertEquals("100.3K", StackFormatter.quantityToRSDecimalStack(100_310, true)); + assertEquals("1M", StackFormatter.quantityToRSDecimalStack(1_000_000, true)); + assertEquals("8.45M", StackFormatter.quantityToRSDecimalStack(8_450_000, true)); + assertEquals("8.451M", StackFormatter.quantityToRSDecimalStack(8_451_000, true)); + assertEquals("10M", StackFormatter.quantityToRSDecimalStack(10_000_000, true)); + assertEquals("12.8M", StackFormatter.quantityToRSDecimalStack(12_800_000, true)); + assertEquals("12.85M", StackFormatter.quantityToRSDecimalStack(12_850_000, true)); + assertEquals("12.851M", StackFormatter.quantityToRSDecimalStack(12_851_000, true)); + assertEquals("100M", StackFormatter.quantityToRSDecimalStack(100_000_000, true)); + assertEquals("250.1M", StackFormatter.quantityToRSDecimalStack(250_100_000, true)); + assertEquals("250.151M", StackFormatter.quantityToRSDecimalStack(250_151_000, true)); + assertEquals("1B", StackFormatter.quantityToRSDecimalStack(1_000_000_000, true)); + assertEquals("1.5B", StackFormatter.quantityToRSDecimalStack(1500_000_000, true)); + assertEquals("1.55B", StackFormatter.quantityToRSDecimalStack(1550_000_000, true)); + assertEquals("2.147B", StackFormatter.quantityToRSDecimalStack(Integer.MAX_VALUE, true)); + } + + @Test + public void stackSizeToQuantity() throws ParseException + { + assertEquals(0, StackFormatter.stackSizeToQuantity("0")); + assertEquals(907, StackFormatter.stackSizeToQuantity("907")); + assertEquals(1200, StackFormatter.stackSizeToQuantity("1200")); + assertEquals(10_500, StackFormatter.stackSizeToQuantity("10,500")); + assertEquals(10_500, StackFormatter.stackSizeToQuantity("10.5K")); + assertEquals(33_560_000, StackFormatter.stackSizeToQuantity("33.56M")); + assertEquals(2_000_000_000, StackFormatter.stackSizeToQuantity("2B")); + + assertEquals(0, StackFormatter.stackSizeToQuantity("-0")); + assertEquals(-400, StackFormatter.stackSizeToQuantity("-400")); + assertEquals(-400_000, StackFormatter.stackSizeToQuantity("-400k")); + assertEquals(-40_543_000, StackFormatter.stackSizeToQuantity("-40.543M")); + + try + { + StackFormatter.stackSizeToQuantity("0L"); + fail("Should have thrown an exception for invalid suffix."); + } + catch (ParseException ignore) + { + } + + try + { + StackFormatter.stackSizeToQuantity("badstack"); + fail("Should have thrown an exception for improperly formatted stack."); + } + catch (ParseException ignore) + { + } + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/TextTest.java b/runelite-client/src/test/java/net/runelite/client/util/TextTest.java new file mode 100644 index 0000000000..af5815b0a3 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/TextTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class TextTest +{ + @Test + public void removeTags() + { + assertEquals("Test", Text.removeTags("Test")); + assertEquals("Test", Text.removeTags("Test")); + assertEquals("Zezima (level-126)", Text.removeTags("Zezima (level-126)")); + assertEquals("", Text.removeTags("")); + assertEquals("Not so much.", Text.removeTags("Not so much.")); + assertEquals("Use Item -> Man", Text.removeTags("Use Item -> Man")); + assertEquals("a < b", Text.removeTags("a < b")); + assertEquals("Remove no tags", Text.removeTags("Remove no tags")); + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/WildcardMatcherTest.java b/runelite-client/src/test/java/net/runelite/client/util/WildcardMatcherTest.java new file mode 100644 index 0000000000..53b48a0755 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/WildcardMatcherTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import static junit.framework.TestCase.assertTrue; +import static net.runelite.client.util.WildcardMatcher.matches; +import static org.junit.Assert.assertFalse; +import org.junit.Test; + +public class WildcardMatcherTest +{ + @Test + public void testMatches() + { + assertTrue(matches("rune*", "rune pouch")); + assertTrue(matches("rune*", "Rune pouch")); + assertFalse(matches("Abyssal whip", "Adamant dagger")); + assertTrue(matches("rune*", "Runeite Ore")); + assertTrue(matches("Abyssal whip", "Abyssal whip")); + } +} \ No newline at end of file diff --git a/mixins/pom.xml b/runelite-mixins/pom.xml similarity index 83% rename from mixins/pom.xml rename to runelite-mixins/pom.xml index 0f590f044d..f299e82ec5 100644 --- a/mixins/pom.xml +++ b/runelite-mixins/pom.xml @@ -27,30 +27,29 @@ 4.0.0 - com.runeswag - runeswag-parent - 1.0-SNAPSHOT + net.runelite + runelite-parent + 1.5.28-SNAPSHOT mixins - RuneSwag Mixins + RuneLite Mixins org.slf4j slf4j-api - 1.7.25 provided - com.runeswag - api + net.runelite.rs + runescape-api ${project.version} + provided com.google.guava guava - 27.1-jre provided @@ -59,6 +58,15 @@ 1 provided + + + junit + junit + + + org.mockito + mockito-all + @@ -70,8 +78,8 @@ - 1.7 - 1.7 + 1.6 + 1.6
    diff --git a/mixins/src/main/java/net/runelite/api/mixins/Copy.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/Copy.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/Copy.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/Copy.java diff --git a/mixins/src/main/java/net/runelite/api/mixins/FieldHook.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/FieldHook.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java diff --git a/mixins/src/main/java/net/runelite/api/mixins/Inject.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/Inject.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/Inject.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/Inject.java diff --git a/mixins/src/main/java/net/runelite/api/mixins/MethodHook.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/MethodHook.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/MethodHook.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/MethodHook.java diff --git a/mixins/src/main/java/net/runelite/api/mixins/Mixin.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/Mixin.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/Mixin.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/Mixin.java diff --git a/mixins/src/main/java/net/runelite/api/mixins/Mixins.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/Mixins.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/Mixins.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/Mixins.java diff --git a/mixins/src/main/java/net/runelite/api/mixins/Replace.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/Replace.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/Replace.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/Replace.java diff --git a/mixins/src/main/java/net/runelite/api/mixins/Shadow.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/Shadow.java similarity index 100% rename from mixins/src/main/java/net/runelite/api/mixins/Shadow.java rename to runelite-mixins/src/main/java/net/runelite/api/mixins/Shadow.java diff --git a/mixins/src/main/java/net/runelite/mixins/CameraMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/CameraMixin.java similarity index 98% rename from mixins/src/main/java/net/runelite/mixins/CameraMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/CameraMixin.java index 0d49195fa5..4c231426b6 100644 --- a/mixins/src/main/java/net/runelite/mixins/CameraMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/CameraMixin.java @@ -28,7 +28,7 @@ import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; +import net.runelite.rs.api.RSClient; @Mixin(RSClient.class) public abstract class CameraMixin implements RSClient diff --git a/mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java similarity index 96% rename from mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java index c1161f2953..3bf15193e1 100644 --- a/mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java @@ -1,12 +1,12 @@ package net.runelite.mixins; -import api.Model; -import api.Perspective; +import net.runelite.api.Model; +import net.runelite.api.Perspective; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSModel; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSModel; /** * Class to check clickboxes of models. Mostly refactored code from the client. @@ -35,7 +35,7 @@ public abstract class ClickboxMixin implements RSClient boolean hasFlag = hash != 0L && (int) (hash >>> 16 & 1L) != 1; boolean viewportContainsMouse = client.getViewportContainsMouse(); - if (!hasFlag || !viewportContainsMouse || client.getOculusOrbState() != 0) + if (!hasFlag || !viewportContainsMouse) { return; } @@ -52,7 +52,7 @@ public abstract class ClickboxMixin implements RSClient } // only need a boundingbox check? - if (model.isSingleTile()) + if (model.isClickable()) { addHashAtMouse(hash); return; @@ -147,7 +147,7 @@ public abstract class ClickboxMixin implements RSClient continue; } - final int radius = model.isSingleTile() ? 20 : 5; + final int radius = model.isClickable() ? 20 : 5; int var18 = radius + viewportMouseY; boolean var34; diff --git a/mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java similarity index 94% rename from mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java index ab6585a031..f9e9a175f2 100644 --- a/mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java @@ -26,7 +26,7 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSClient; +import net.runelite.rs.api.RSClient; @Mixin(RSClient.class) public abstract class EntityHiderBridgeMixin implements RSClient @@ -64,6 +64,10 @@ public abstract class EntityHiderBridgeMixin implements RSClient @Inject public static boolean hideProjectiles; + @Inject + public static String hideNPCsNames; + + @Inject @Override public void setIsHidingEntities(boolean state) @@ -127,6 +131,13 @@ public abstract class EntityHiderBridgeMixin implements RSClient hideNPCs2D = state; } + @Inject + @Override + public void setNPCsNames(String NPCs) + { + hideNPCsNames = NPCs; + } + @Inject @Override public void setAttackersHidden(boolean state) diff --git a/mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java similarity index 89% rename from mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java index 0f564189a0..8f84b9d917 100644 --- a/mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java @@ -29,13 +29,13 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSActor; -import rs.api.RSClient; -import rs.api.RSEntity; -import rs.api.RSNPC; -import rs.api.RSPlayer; -import rs.api.RSProjectile; -import rs.api.RSScene; +import net.runelite.rs.api.RSActor; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSEntity; +import net.runelite.rs.api.RSNPC; +import net.runelite.rs.api.RSPlayer; +import net.runelite.rs.api.RSProjectile; +import net.runelite.rs.api.RSScene; @Mixin(RSScene.class) public abstract class EntityHiderMixin implements RSScene @@ -67,6 +67,9 @@ public abstract class EntityHiderMixin implements RSScene @Shadow("hideNPCs") private static boolean hideNPCs; + @Shadow("hideNPCsNames") + private static String hideNPCsNames; + @Shadow("hideNPCs2D") private static boolean hideNPCs2D; @@ -151,6 +154,7 @@ public abstract class EntityHiderMixin implements RSScene else if (renderable instanceof RSNPC) { RSNPC npc = (RSNPC) renderable; + String[] names = hideNPCsNames.split(","); if (!hideAttackers) { @@ -160,6 +164,20 @@ public abstract class EntityHiderMixin implements RSScene } } + for (String name : names) + { + if (name != null && !name.equals("")) + { + if (npc.getName() != null) + { + if (npc.getName().startsWith(name)) + { + return false; + } + } + } + } + return drawingUI ? !hideNPCs2D : !hideNPCs; } else if (renderable instanceof RSProjectile) diff --git a/mixins/src/main/java/net/runelite/mixins/MenuMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/MenuMixin.java similarity index 76% rename from mixins/src/main/java/net/runelite/mixins/MenuMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/MenuMixin.java index 7e3a55eb72..8857f785ca 100644 --- a/mixins/src/main/java/net/runelite/mixins/MenuMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/MenuMixin.java @@ -26,8 +26,8 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSClient; -import rs.api.RSFont; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSFont; @Mixin(RSClient.class) public abstract class MenuMixin implements RSClient @@ -109,4 +109,47 @@ public abstract class MenuMixin implements RSClient } } } + + @Inject + @Override + public void sortMenuEntries() + { + int count = getMenuOptionCount() - 1; + int[] menuOpcodes = getMenuTypes(); + String[] menuTargetNames = getMenuTargets(); + String[] menuActions = getMenuOptions(); + int[] menuArguments0 = getMenuIdentifiers(); + int[] menuArguments1 = getMenuActionParams0(); + int[] menuArguments2 = getMenuActionParams1(); + boolean[] menuShiftClick = getMenuForceLeftClick(); + + int tmp; + for (int i = 0; i < count; ++i) + { + if (menuOpcodes[i] < 1000 && menuOpcodes[i + 1] > 1000) + { + String var3 = menuTargetNames[i]; + menuTargetNames[i] = menuTargetNames[i + 1]; + menuTargetNames[i + 1] = var3; + String var4 = menuActions[i]; + menuActions[i] = menuActions[i + 1]; + menuActions[i + 1] = var4; + tmp = menuOpcodes[i]; + menuOpcodes[i] = menuOpcodes[i + 1]; + menuOpcodes[i + 1] = tmp; + tmp = menuArguments1[i]; + menuArguments1[i] = menuArguments1[i + 1]; + menuArguments1[i + 1] = tmp; + tmp = menuArguments2[i]; + menuArguments2[i] = menuArguments2[i + 1]; + menuArguments2[i + 1] = tmp; + tmp = menuArguments0[i]; + menuArguments0[i] = menuArguments0[i + 1]; + menuArguments0[i + 1] = tmp; + boolean var6 = menuShiftClick[i]; + menuShiftClick[i] = menuShiftClick[i + 1]; + menuShiftClick[i + 1] = var6; + } + } + } } diff --git a/mixins/src/main/java/net/runelite/mixins/MinimapMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/MinimapMixin.java similarity index 94% rename from mixins/src/main/java/net/runelite/mixins/MinimapMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/MinimapMixin.java index f927a99993..6433a0f5c9 100644 --- a/mixins/src/main/java/net/runelite/mixins/MinimapMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/MinimapMixin.java @@ -24,12 +24,12 @@ */ package net.runelite.mixins; -import static api.Perspective.SCENE_SIZE; +import static net.runelite.api.Perspective.SCENE_SIZE; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSClient; -import rs.api.RSScene; -import rs.api.RSSprite; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSScene; +import net.runelite.rs.api.RSSprite; @Mixin(RSClient.class) public abstract class MinimapMixin implements RSClient diff --git a/mixins/src/main/java/net/runelite/mixins/ProcessClientErrorMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ProcessClientErrorMixin.java similarity index 96% rename from mixins/src/main/java/net/runelite/mixins/ProcessClientErrorMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/ProcessClientErrorMixin.java index 1c2d8504bb..daa7bcdf23 100644 --- a/mixins/src/main/java/net/runelite/mixins/ProcessClientErrorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ProcessClientErrorMixin.java @@ -27,8 +27,8 @@ package net.runelite.mixins; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSRunException; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSRunException; @Mixin(RSClient.class) public abstract class ProcessClientErrorMixin implements RSClient diff --git a/mixins/src/main/java/net/runelite/mixins/RSAbstractIndexCacheMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSAbstractIndexCacheMixin.java similarity index 94% rename from mixins/src/main/java/net/runelite/mixins/RSAbstractIndexCacheMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSAbstractIndexCacheMixin.java index 6f57d367fa..444be65691 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSAbstractIndexCacheMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSAbstractIndexCacheMixin.java @@ -1,6 +1,6 @@ package net.runelite.mixins; -import api.overlay.OverlayIndex; +import net.runelite.api.overlay.OverlayIndex; import com.google.common.hash.HashCode; import com.google.common.hash.Hashing; import com.google.common.io.BaseEncoding; @@ -15,9 +15,9 @@ import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; import org.slf4j.Logger; -import rs.api.RSAbstractIndexCache; -import rs.api.RSClient; -import rs.api.RSIndexCache; +import net.runelite.rs.api.RSAbstractIndexCache; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSIndexCache; @Mixin(RSAbstractIndexCache.class) public abstract class RSAbstractIndexCacheMixin implements RSAbstractIndexCache diff --git a/mixins/src/main/java/net/runelite/mixins/RSActorMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java similarity index 87% rename from mixins/src/main/java/net/runelite/mixins/RSActorMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java index 97367cc2a2..f25c98e263 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSActorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java @@ -24,23 +24,23 @@ */ package net.runelite.mixins; -import api.Actor; -import api.Hitsplat; -import api.NPC; -import api.NPCDefinition; -import api.Perspective; -import api.Player; -import api.Point; -import api.Sprite; -import api.coords.LocalPoint; -import api.coords.WorldArea; -import api.coords.WorldPoint; -import api.events.AnimationChanged; -import api.events.HitsplatApplied; -import api.events.LocalPlayerDeath; -import api.events.SpotAnimationChanged; -import api.events.InteractingChanged; -import api.events.OverheadTextChanged; +import net.runelite.api.Actor; +import net.runelite.api.Hitsplat; +import net.runelite.api.NPC; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Sprite; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; +import net.runelite.api.events.HitsplatApplied; +import net.runelite.api.events.LocalPlayerDeath; +import net.runelite.api.events.SpotAnimationChanged; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.OverheadTextChanged; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.image.BufferedImage; @@ -49,14 +49,14 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSActor; -import rs.api.RSClient; -import rs.api.RSHealthBar; -import rs.api.RSHealthBarDefinition; -import rs.api.RSHealthBarUpdate; -import rs.api.RSIterableNodeDeque; -import rs.api.RSNPC; -import rs.api.RSNode; +import net.runelite.rs.api.RSActor; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSHealthBar; +import net.runelite.rs.api.RSHealthBarDefinition; +import net.runelite.rs.api.RSHealthBarUpdate; +import net.runelite.rs.api.RSIterableNodeDeque; +import net.runelite.rs.api.RSNPC; +import net.runelite.rs.api.RSNode; @Mixin(RSActor.class) public abstract class RSActorMixin implements RSActor @@ -119,8 +119,6 @@ public abstract class RSActorMixin implements RSActor if (healthBars != null) { RSNode current = healthBars.getCurrent(); - if (current == null) - return 0; RSNode next = current.getNext(); if (next instanceof RSHealthBar) { diff --git a/mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java similarity index 86% rename from mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java index 2a7ef9ba3d..698e5e4733 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java @@ -1,14 +1,14 @@ package net.runelite.mixins; -import api.Model; -import api.Perspective; -import api.Renderable; +import net.runelite.api.Model; +import net.runelite.api.Perspective; +import net.runelite.api.Renderable; import java.awt.geom.Area; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSBoundaryObject; -import rs.api.RSClient; +import net.runelite.rs.api.RSBoundaryObject; +import net.runelite.rs.api.RSClient; @Mixin(RSBoundaryObject.class) public abstract class RSBoundaryObjectMixin implements RSBoundaryObject @@ -34,7 +34,7 @@ public abstract class RSBoundaryObjectMixin implements RSBoundaryObject } @Inject - private Model getModelA() + public Model getModelA() { Renderable renderable = getRenderable1(); if (renderable == null) @@ -53,7 +53,7 @@ public abstract class RSBoundaryObjectMixin implements RSBoundaryObject } @Inject - private Model getModelB() + public Model getModelB() { Renderable renderable = getRenderable2(); if (renderable == null) diff --git a/mixins/src/main/java/net/runelite/mixins/RSCanvasMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSCanvasMixin.java similarity index 95% rename from mixins/src/main/java/net/runelite/mixins/RSCanvasMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSCanvasMixin.java index cfd6192771..d2bf489488 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSCanvasMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSCanvasMixin.java @@ -5,8 +5,8 @@ import java.awt.event.FocusListener; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSCanvas; -import rs.api.RSClient; +import net.runelite.rs.api.RSCanvas; +import net.runelite.rs.api.RSClient; @Mixin(RSCanvas.class) public abstract class RSCanvasMixin extends Canvas implements RSCanvas diff --git a/mixins/src/main/java/net/runelite/mixins/RSChatChannelMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSChatChannelMixin.java similarity index 95% rename from mixins/src/main/java/net/runelite/mixins/RSChatChannelMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSChatChannelMixin.java index a4d402b34a..85fb1de9a8 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSChatChannelMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSChatChannelMixin.java @@ -25,11 +25,11 @@ */ package net.runelite.mixins; -import api.MessageNode; +import net.runelite.api.MessageNode; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSChatChannel; -import rs.api.RSDualNode; +import net.runelite.rs.api.RSChatChannel; +import net.runelite.rs.api.RSDualNode; @Mixin(RSChatChannel.class) public abstract class RSChatChannelMixin implements RSChatChannel diff --git a/mixins/src/main/java/net/runelite/mixins/RSClanChatMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClanChatMixin.java similarity index 74% rename from mixins/src/main/java/net/runelite/mixins/RSClanChatMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSClanChatMixin.java index 74c7dbd067..beacf0eec4 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSClanChatMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClanChatMixin.java @@ -1,15 +1,15 @@ package net.runelite.mixins; -import api.events.ClanMemberJoined; -import api.events.ClanMemberLeft; +import net.runelite.api.events.ClanMemberJoined; +import net.runelite.api.events.ClanMemberLeft; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClanChat; -import rs.api.RSClanMate; -import rs.api.RSClient; -import rs.api.RSUser; -import rs.api.RSUsername; +import net.runelite.rs.api.RSClanChat; +import net.runelite.rs.api.RSClanMate; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSUser; +import net.runelite.rs.api.RSUsername; @Mixin(RSClanChat.class) public abstract class RSClanChatMixin implements RSClanChat diff --git a/mixins/src/main/java/net/runelite/mixins/RSClanMateMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClanMateMixin.java similarity index 83% rename from mixins/src/main/java/net/runelite/mixins/RSClanMateMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSClanMateMixin.java index 396bc86c53..ee272cb3db 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSClanMateMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClanMateMixin.java @@ -1,9 +1,9 @@ package net.runelite.mixins; -import api.ClanMemberRank; +import net.runelite.api.ClanMemberRank; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSClanMate; +import net.runelite.rs.api.RSClanMate; @Mixin(RSClanMate.class) public abstract class RSClanMateMixin implements RSClanMate diff --git a/mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java similarity index 87% rename from mixins/src/main/java/net/runelite/mixins/RSClientMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 0b287f5f64..069c9a99d4 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -24,76 +24,75 @@ */ package net.runelite.mixins; -import api.ChatMessageType; -import api.ClanMember; -import api.EnumDefinition; -import api.Friend; -import api.GameState; -import api.GrandExchangeOffer; -import api.GraphicsObject; -import api.HashTable; -import api.HealthBarOverride; -import api.HintArrowType; -import api.Ignore; -import api.IndexDataBase; -import api.IndexedSprite; -import api.InventoryID; -import api.MenuAction; -import static api.MenuAction.PLAYER_EIGTH_OPTION; -import static api.MenuAction.PLAYER_FIFTH_OPTION; -import static api.MenuAction.PLAYER_FIRST_OPTION; -import static api.MenuAction.PLAYER_FOURTH_OPTION; -import static api.MenuAction.PLAYER_SECOND_OPTION; -import static api.MenuAction.PLAYER_SEVENTH_OPTION; -import static api.MenuAction.PLAYER_SIXTH_OPTION; -import static api.MenuAction.PLAYER_THIRD_OPTION; -import api.MenuEntry; -import api.MessageNode; -import api.NPC; -import api.Node; -import api.PacketBuffer; -import static api.Perspective.LOCAL_TILE_SIZE; -import api.Player; -import api.Point; -import api.Prayer; -import api.Projectile; -import api.Skill; -import api.Sprite; -import api.Tile; -import api.VarPlayer; -import api.Varbits; -import api.WidgetNode; -import api.WorldType; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.BoostedLevelChanged; -import api.events.CanvasSizeChanged; -import api.events.ChatMessage; -import api.events.ClanChanged; -import api.events.ClientTick; -import api.events.DraggingWidgetChanged; -import api.events.ExperienceChanged; -import api.events.GameStateChanged; -import api.events.GrandExchangeOfferChanged; -import api.events.MenuEntryAdded; -import api.events.MenuOpened; -import api.events.MenuOptionClicked; -import api.events.MenuShouldLeftClick; -import api.events.NpcSpawned; -import api.events.PlayerDespawned; -import api.events.PlayerMenuOptionsChanged; -import api.events.PlayerSpawned; -import api.events.ResizeableChanged; -import api.events.UsernameChanged; -import api.events.VarbitChanged; -import api.events.WidgetLoaded; -import api.hooks.Callbacks; -import api.hooks.DrawCallbacks; -import api.vars.AccountType; -import api.widgets.Widget; -import api.widgets.WidgetInfo; -import api.widgets.WidgetItem; -import api.widgets.WidgetType; +import net.runelite.api.ChatMessageType; +import net.runelite.api.ClanMember; +import net.runelite.api.EnumDefinition; +import net.runelite.api.Friend; +import net.runelite.api.GameState; +import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GraphicsObject; +import net.runelite.api.HashTable; +import net.runelite.api.HintArrowType; +import net.runelite.api.Ignore; +import net.runelite.api.IndexDataBase; +import net.runelite.api.IndexedSprite; +import net.runelite.api.InventoryID; +import net.runelite.api.MenuAction; +import static net.runelite.api.MenuAction.PLAYER_EIGTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIFTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIRST_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FOURTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SECOND_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SEVENTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SIXTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_THIRD_OPTION; +import net.runelite.api.MenuEntry; +import net.runelite.api.MessageNode; +import net.runelite.api.NPC; +import net.runelite.api.Node; +import net.runelite.api.PacketBuffer; +import static net.runelite.api.Perspective.LOCAL_TILE_SIZE; +import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.Prayer; +import net.runelite.api.Projectile; +import net.runelite.api.Skill; +import net.runelite.api.Sprite; +import net.runelite.api.Tile; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.WidgetNode; +import net.runelite.api.WorldType; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.BoostedLevelChanged; +import net.runelite.api.events.CanvasSizeChanged; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ClanChanged; +import net.runelite.api.events.ClientTick; +import net.runelite.api.events.DraggingWidgetChanged; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GrandExchangeOfferChanged; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOpened; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.MenuShouldLeftClick; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.PlayerDespawned; +import net.runelite.api.events.PlayerMenuOptionsChanged; +import net.runelite.api.events.PlayerSpawned; +import net.runelite.api.events.ResizeableChanged; +import net.runelite.api.events.UsernameChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.hooks.Callbacks; +import net.runelite.api.hooks.DrawCallbacks; +import net.runelite.api.vars.AccountType; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.api.widgets.WidgetType; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.ArrayList; @@ -112,24 +111,24 @@ import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; import org.slf4j.Logger; -import rs.api.RSAbstractIndexCache; -import rs.api.RSChatChannel; -import rs.api.RSClanChat; -import rs.api.RSClient; -import rs.api.RSEnumDefinition; -import rs.api.RSFriendSystem; -import rs.api.RSFriendsList; -import rs.api.RSGroundItem; -import rs.api.RSIgnoreList; -import rs.api.RSIndexedSprite; -import rs.api.RSItemContainer; -import rs.api.RSNPC; -import rs.api.RSNodeDeque; -import rs.api.RSNodeHashTable; -import rs.api.RSPlayer; -import rs.api.RSSprite; -import rs.api.RSUsername; -import rs.api.RSWidget; +import net.runelite.rs.api.RSAbstractIndexCache; +import net.runelite.rs.api.RSChatChannel; +import net.runelite.rs.api.RSClanChat; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSEnumDefinition; +import net.runelite.rs.api.RSFriendSystem; +import net.runelite.rs.api.RSFriendsList; +import net.runelite.rs.api.RSGroundItem; +import net.runelite.rs.api.RSIgnoreList; +import net.runelite.rs.api.RSIndexedSprite; +import net.runelite.rs.api.RSItemContainer; +import net.runelite.rs.api.RSNPC; +import net.runelite.rs.api.RSNodeDeque; +import net.runelite.rs.api.RSNodeHashTable; +import net.runelite.rs.api.RSPlayer; +import net.runelite.rs.api.RSSprite; +import net.runelite.rs.api.RSUsername; +import net.runelite.rs.api.RSWidget; @Mixin(RSClient.class) public abstract class RSClientMixin implements RSClient @@ -190,9 +189,6 @@ public abstract class RSClientMixin implements RSClient .maximumSize(64) .build(); - @Inject - private static HealthBarOverride healthBarOverride; - @Inject private static boolean printMenuActions; @@ -203,6 +199,16 @@ public abstract class RSClientMixin implements RSClient printMenuActions = yes; } + @Inject + private static boolean hideFriendAttackOptions; + + @Inject + @Override + public void setHideFriendAttackOptions(boolean yes) + { + hideFriendAttackOptions = yes; + } + @Inject public RSClientMixin() { @@ -304,14 +310,6 @@ public abstract class RSClientMixin implements RSClient return AccountType.NORMAL; } - @Inject - @Override - public void setMouseCanvasHoverPosition(final Point position) - { - setMouseCanvasHoverPositionX(position.getX()); - setMouseCanvasHoverPositionY(position.getY()); - } - @Inject @Override public Tile getSelectedSceneTile() @@ -649,12 +647,15 @@ public abstract class RSClientMixin implements RSClient if (newCount == oldCount + 1) { MenuEntryAdded event = new MenuEntryAdded( - client.getMenuOptions()[newCount - 1], - client.getMenuTargets()[newCount - 1], - client.getMenuTypes()[newCount - 1], - client.getMenuIdentifiers()[newCount - 1], - client.getMenuActionParams0()[newCount - 1], - client.getMenuActionParams1()[newCount - 1] + new MenuEntry( + client.getMenuOptions()[oldCount], + client.getMenuTargets()[oldCount], + client.getMenuTypes()[oldCount], + client.getMenuIdentifiers()[oldCount], + client.getMenuActionParams0()[oldCount], + client.getMenuActionParams1()[oldCount], + client.getMenuForceLeftClick()[oldCount] + ) ); client.getCallbacks().post(event); @@ -862,7 +863,7 @@ public abstract class RSClientMixin implements RSClient return clanMemberManager != null && clanMemberManager.isMember(createName(name, getLoginType())); } - @FieldHook("clickedWidget") + @FieldHook("isDraggingWidget") @Inject public static void draggingWidgetChanged(int idx) { @@ -1244,13 +1245,18 @@ public abstract class RSClientMixin implements RSClient menuAction -= 2000; } - final MenuOptionClicked menuOptionClicked = new MenuOptionClicked(); - menuOptionClicked.setActionParam(actionParam); - menuOptionClicked.setMenuOption(menuOption); - menuOptionClicked.setMenuTarget(menuTarget); - menuOptionClicked.setMenuAction(MenuAction.of(menuAction)); - menuOptionClicked.setId(id); - menuOptionClicked.setWidgetId(widgetId); + final MenuOptionClicked menuOptionClicked = new MenuOptionClicked( + new MenuEntry( + menuOption, + menuTarget, + id, + menuAction, + actionParam, + widgetId, + false + ) + ); + client.getCallbacks().post(menuOptionClicked); if (menuOptionClicked.isConsumed()) @@ -1268,13 +1274,6 @@ public abstract class RSClientMixin implements RSClient client.getCallbacks().post(new UsernameChanged()); } - @Inject - @Override - public void setHealthBarOverride(HealthBarOverride override) - { - healthBarOverride = override; - } - @Override @Inject public int getTickCount() @@ -1565,4 +1564,18 @@ public abstract class RSClientMixin implements RSClient enumCache.put(id, rsEnumDefinition); return rsEnumDefinition; } + + @Inject + @Override + public void resetHealthBarCaches() + { + getHealthBarCache().reset(); + getHealthBarSpriteCache().reset(); + } + + @Inject + static boolean shouldHideAttackOptionFor(RSPlayer p) + { + return hideFriendAttackOptions && p.isFriended() || p.isClanMember(); + } } \ No newline at end of file diff --git a/mixins/src/main/java/net/runelite/mixins/RSDynamicObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSDynamicObjectMixin.java similarity index 83% rename from mixins/src/main/java/net/runelite/mixins/RSDynamicObjectMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSDynamicObjectMixin.java index c5644195ad..5760e13157 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSDynamicObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSDynamicObjectMixin.java @@ -27,12 +27,14 @@ package net.runelite.mixins; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSDynamicObject; -import rs.api.RSModel; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSDynamicObject; +import net.runelite.rs.api.RSEntity; +import net.runelite.rs.api.RSModel; @Mixin(RSDynamicObject.class) public abstract class RSDynamicObjectMixin implements RSDynamicObject @@ -40,6 +42,9 @@ public abstract class RSDynamicObjectMixin implements RSDynamicObject @Shadow("client") private static RSClient client; + @Inject + public int animationID; + @Copy("getModel") public abstract RSModel rs$getModel(); @@ -78,4 +83,18 @@ public abstract class RSDynamicObjectMixin implements RSDynamicObject setAnimFrame(Integer.MIN_VALUE | objectFrameCycle << 16 | getAnimFrame()); } } + + @MethodHook(value = "", end = true) + @Inject + public void rl$init(int id, int type, int orientation, int plane, int x, int y, int animationID, boolean var8, RSEntity var9) + { + this.animationID = animationID; + } + + @Inject + @Override + public int getAnimationID() + { + return animationID; + } } diff --git a/mixins/src/main/java/net/runelite/mixins/RSEnumDefinitionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSEnumDefinitionMixin.java similarity index 95% rename from mixins/src/main/java/net/runelite/mixins/RSEnumDefinitionMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSEnumDefinitionMixin.java index 31bd1906a8..05424a8b4e 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSEnumDefinitionMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSEnumDefinitionMixin.java @@ -2,7 +2,7 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSEnumDefinition; +import net.runelite.rs.api.RSEnumDefinition; @Mixin(RSEnumDefinition.class) public abstract class RSEnumDefinitionMixin implements RSEnumDefinition diff --git a/mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java similarity index 80% rename from mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java index 6e914b2e75..e1260cb83c 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java @@ -1,14 +1,14 @@ package net.runelite.mixins; -import api.Model; -import api.Perspective; -import api.Renderable; +import net.runelite.api.Model; +import net.runelite.api.Perspective; +import net.runelite.api.Renderable; import java.awt.geom.Area; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSFloorDecoration; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSFloorDecoration; @Mixin(RSFloorDecoration.class) public abstract class RSFloorDecorationMixin implements RSFloorDecoration @@ -34,7 +34,8 @@ public abstract class RSFloorDecorationMixin implements RSFloorDecoration } @Inject - private Model getModel() + @Override + public Model getModel() { Renderable renderable = getRenderable(); if (renderable == null) diff --git a/mixins/src/main/java/net/runelite/mixins/RSFriendMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendMixin.java similarity index 95% rename from mixins/src/main/java/net/runelite/mixins/RSFriendMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSFriendMixin.java index ce8d69ce80..13dd332804 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSFriendMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendMixin.java @@ -26,8 +26,8 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSFriend; -import rs.api.RSUsername; +import net.runelite.rs.api.RSFriend; +import net.runelite.rs.api.RSUsername; @Mixin(RSFriend.class) public abstract class RSFriendMixin implements RSFriend diff --git a/mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java similarity index 81% rename from mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java index e7e30b1430..7497e7c2a5 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java @@ -1,12 +1,12 @@ package net.runelite.mixins; -import api.events.RemovedFriend; +import net.runelite.api.events.RemovedFriend; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSFriendSystem; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSFriendSystem; @Mixin(RSFriendSystem.class) public abstract class RSFriendSystemMixin implements RSFriendSystem diff --git a/mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java similarity index 89% rename from mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java index c59c3687af..da84118774 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java @@ -24,19 +24,19 @@ */ package net.runelite.mixins; -import api.Perspective; -import api.Point; -import api.coords.Angle; -import api.coords.LocalPoint; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.Angle; +import net.runelite.api.coords.LocalPoint; import java.awt.Polygon; import java.awt.geom.Area; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSEntity; -import rs.api.RSGameObject; -import rs.api.RSModel; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSEntity; +import net.runelite.rs.api.RSGameObject; +import net.runelite.rs.api.RSModel; @Mixin(RSGameObject.class) public abstract class RSGameObjectMixin implements RSGameObject @@ -59,7 +59,8 @@ public abstract class RSGameObjectMixin implements RSGameObject } @Inject - private RSModel getModel() + @Override + public RSModel getModel() { RSEntity renderable = getRenderable(); if (renderable == null) diff --git a/mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java similarity index 94% rename from mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java index 111be4a353..e45d2612e7 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java @@ -24,16 +24,16 @@ */ package net.runelite.mixins; -import api.events.FocusChanged; -import api.hooks.DrawCallbacks; +import net.runelite.api.events.FocusChanged; +import net.runelite.api.hooks.DrawCallbacks; import java.awt.event.FocusEvent; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSGameShell; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSGameShell; @Mixin(RSGameShell.class) public abstract class RSGameShellMixin implements RSGameShell diff --git a/mixins/src/main/java/net/runelite/mixins/RSGrandExchangeOfferMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGrandExchangeOfferMixin.java similarity index 84% rename from mixins/src/main/java/net/runelite/mixins/RSGrandExchangeOfferMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSGrandExchangeOfferMixin.java index 043c1ad2ce..17509a4aa1 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSGrandExchangeOfferMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGrandExchangeOfferMixin.java @@ -25,17 +25,17 @@ package net.runelite.mixins; -import api.GrandExchangeOfferState; -import static api.GrandExchangeOfferState.BOUGHT; -import static api.GrandExchangeOfferState.BUYING; -import static api.GrandExchangeOfferState.CANCELLED_BUY; -import static api.GrandExchangeOfferState.CANCELLED_SELL; -import static api.GrandExchangeOfferState.EMPTY; -import static api.GrandExchangeOfferState.SELLING; -import static api.GrandExchangeOfferState.SOLD; +import net.runelite.api.GrandExchangeOfferState; +import static net.runelite.api.GrandExchangeOfferState.BOUGHT; +import static net.runelite.api.GrandExchangeOfferState.BUYING; +import static net.runelite.api.GrandExchangeOfferState.CANCELLED_BUY; +import static net.runelite.api.GrandExchangeOfferState.CANCELLED_SELL; +import static net.runelite.api.GrandExchangeOfferState.EMPTY; +import static net.runelite.api.GrandExchangeOfferState.SELLING; +import static net.runelite.api.GrandExchangeOfferState.SOLD; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSGrandExchangeOffer; +import net.runelite.rs.api.RSGrandExchangeOffer; @Mixin(RSGrandExchangeOffer.class) public abstract class RSGrandExchangeOfferMixin implements RSGrandExchangeOffer diff --git a/mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java similarity index 75% rename from mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java index 2b6ab90ef7..c7757732ba 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java @@ -1,12 +1,12 @@ package net.runelite.mixins; -import api.coords.LocalPoint; -import api.events.GraphicsObjectCreated; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.GraphicsObjectCreated; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSGraphicsObject; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSGraphicsObject; @Mixin(RSGraphicsObject.class) public abstract class RSGraphicsObjectMixin implements RSGraphicsObject diff --git a/mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java similarity index 91% rename from mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java index 3dd4652b73..23d0ce6586 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java @@ -1,13 +1,13 @@ package net.runelite.mixins; -import api.Tile; -import api.events.ItemQuantityChanged; +import net.runelite.api.Tile; +import net.runelite.api.events.ItemQuantityChanged; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSGroundItem; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSGroundItem; @Mixin(RSGroundItem.class) public abstract class RSGroundItemMixin implements RSGroundItem diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java new file mode 100644 index 0000000000..a12da101db --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java @@ -0,0 +1,96 @@ +package net.runelite.mixins; + +import java.awt.geom.Area; +import net.runelite.api.Model; +import net.runelite.api.Renderable; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSGroundItemPile; + +@Mixin(RSGroundItemPile.class) +public abstract class RSGroundItemPileMixin implements RSGroundItemPile +{ + @Inject + private int itemLayerPlane; + + @Inject + @Override + public int getPlane() + { + return itemLayerPlane; + } + + @Inject + @Override + public void setPlane(int plane) + { + this.itemLayerPlane = plane; + } + + @Inject + @Override + public Area getClickbox() + { + throw new UnsupportedOperationException(); + } + + @Inject + @Override + public Model getModelBottom() + { + Renderable renderable = getBottom(); + if (renderable == null) + { + return null; + } + + if (renderable instanceof Model) + { + return (Model) renderable; + } + else + { + return renderable.getModel(); + } + } + + @Inject + @Override + public Model getModelMiddle() + { + Renderable renderable = getMiddle(); + if (renderable == null) + { + return null; + } + + if (renderable instanceof Model) + { + return (Model) renderable; + } + else + { + return renderable.getModel(); + } + } + + @Inject + @Override + public Model getModelTop() + { + Renderable renderable = getTop(); + if (renderable == null) + { + return null; + } + + if (renderable instanceof Model) + { + return (Model) renderable; + } + else + { + return renderable.getModel(); + } + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSHealthBarDefinitionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSHealthBarDefinitionMixin.java new file mode 100644 index 0000000000..f6f31abdf6 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSHealthBarDefinitionMixin.java @@ -0,0 +1,26 @@ +package net.runelite.mixins; + +import net.runelite.api.events.PostHealthBar; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.MethodHook; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSBuffer; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSHealthBarDefinition; + +@Mixin(RSHealthBarDefinition.class) +public abstract class RSHealthBarDefinitionMixin implements RSHealthBarDefinition +{ + @Shadow("client") + private static RSClient client; + + @MethodHook(value = "read", end = true) + @Inject + public void onRead(RSBuffer buffer) + { + PostHealthBar postHealthBar = new PostHealthBar(); + postHealthBar.setHealthBar(this); + client.getCallbacks().post(postHealthBar); + } +} diff --git a/mixins/src/main/java/net/runelite/mixins/RSIgnoredMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSIgnoredMixin.java similarity index 84% rename from mixins/src/main/java/net/runelite/mixins/RSIgnoredMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSIgnoredMixin.java index 25442069d6..cd736628f6 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSIgnoredMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSIgnoredMixin.java @@ -2,8 +2,8 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSIgnored; -import rs.api.RSUsername; +import net.runelite.rs.api.RSIgnored; +import net.runelite.rs.api.RSUsername; @Mixin(RSIgnored.class) public abstract class RSIgnoredMixin implements RSIgnored diff --git a/mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java similarity index 92% rename from mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java index 5b75b00acd..74c1bf29a3 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java @@ -24,15 +24,15 @@ */ package net.runelite.mixins; -import api.Item; -import api.events.ItemContainerChanged; +import net.runelite.api.Item; +import net.runelite.api.events.ItemContainerChanged; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSGroundItem; -import rs.api.RSItemContainer; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSGroundItem; +import net.runelite.rs.api.RSItemContainer; @Mixin(RSItemContainer.class) public abstract class RSItemContainerMixin implements RSItemContainer diff --git a/mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java similarity index 91% rename from mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java index c5f1c8bfe5..68105f05bc 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java @@ -1,14 +1,14 @@ package net.runelite.mixins; -import api.events.PostItemDefinition; +import net.runelite.api.events.PostItemDefinition; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSItemDefinition; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSItemDefinition; @Mixin(RSItemDefinition.class) public abstract class RSItemDefinitionMixin implements RSItemDefinition diff --git a/mixins/src/main/java/net/runelite/mixins/RSKeyHandlerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSKeyHandlerMixin.java similarity index 92% rename from mixins/src/main/java/net/runelite/mixins/RSKeyHandlerMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSKeyHandlerMixin.java index 64d510e703..a7879dee08 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSKeyHandlerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSKeyHandlerMixin.java @@ -1,6 +1,6 @@ package net.runelite.mixins; -import api.events.FocusChanged; +import net.runelite.api.events.FocusChanged; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import net.runelite.api.mixins.Copy; @@ -9,8 +9,8 @@ import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSKeyHandler; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSKeyHandler; @Mixin(RSKeyHandler.class) public abstract class RSKeyHandlerMixin implements RSKeyHandler diff --git a/mixins/src/main/java/net/runelite/mixins/RSMessageMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSMessageMixin.java similarity index 80% rename from mixins/src/main/java/net/runelite/mixins/RSMessageMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSMessageMixin.java index 93b4f5a492..d514f859eb 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSMessageMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSMessageMixin.java @@ -1,12 +1,13 @@ package net.runelite.mixins; -import api.ChatMessageType; +import net.runelite.api.ChatMessageType; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSMessage; +import net.runelite.rs.api.RSClanChat; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSMessage; @Mixin(RSMessage.class) public abstract class RSMessageMixin implements RSMessage @@ -70,4 +71,13 @@ public abstract class RSMessageMixin implements RSMessage runeLiteFormatMessage = null; rl$timestamp = (int) (System.currentTimeMillis() / 1000L); } + + @Inject + @Override + public boolean isFromClanMate() + { + RSClanChat cc = client.getClanMemberManager(); + + return cc != null && cc.isMember(this.getSenderUsername()); + } } diff --git a/mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java similarity index 97% rename from mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java index 699fc82395..4799573d1b 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java @@ -24,15 +24,15 @@ */ package net.runelite.mixins; -import api.Model; +import net.runelite.api.Model; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSModel; -import rs.api.RSModelData; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSModelData; @Mixin(RSModelData.class) public abstract class RSModelDataMixin implements RSModelData diff --git a/mixins/src/main/java/net/runelite/mixins/RSModelMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java similarity index 94% rename from mixins/src/main/java/net/runelite/mixins/RSModelMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java index 9db32cb69a..69d6776aec 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSModelMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java @@ -24,26 +24,26 @@ */ package net.runelite.mixins; -import api.Model; -import api.Perspective; -import api.Point; -import api.model.Jarvis; -import api.model.Triangle; -import api.model.Vertex; import java.awt.Polygon; import java.util.ArrayList; import java.util.List; +import net.runelite.api.Model; +import net.runelite.api.Perspective; +import net.runelite.api.Point; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSAnimation; -import rs.api.RSClient; -import rs.api.RSFrames; -import rs.api.RSModel; -import rs.api.RSSkeleton; +import net.runelite.api.model.Jarvis; +import net.runelite.api.model.Triangle; +import net.runelite.api.model.Vertex; +import net.runelite.rs.api.RSAnimation; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSFrames; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSSkeleton; @Mixin(RSModel.class) public abstract class RSModelMixin implements RSModel @@ -66,12 +66,6 @@ public abstract class RSModelMixin implements RSModel @Inject private float[][] rl$faceTextureVCoordinates; - @Inject - public void rl$init(Model[] models, int length) - { - rl$init((RSModel[]) models, length); - } - @MethodHook(value = "", end = true) @Inject public void rl$init(RSModel[] models, int length) @@ -193,8 +187,7 @@ public abstract class RSModelMixin implements RSModel } @Inject - public void interpolateFrames(RSFrames frames, int frameId, RSFrames nextFrames, int nextFrameId, int interval, - int intervalCount) + public void interpolateFrames(RSFrames frames, int frameId, RSFrames nextFrames, int nextFrameId, int interval, int intervalCount) { if (getVertexGroups() != null) { @@ -232,7 +225,7 @@ public abstract class RSModelMixin implements RSModel { int type = frame.getTransformTypes()[i]; this.animate(skin.getTypes()[type], skin.getList()[type], frame.getTranslatorX()[i], - frame.getTranslatorY()[i], frame.getTranslatorZ()[i]); + frame.getTranslatorY()[i], frame.getTranslatorZ()[i]); } } else @@ -243,13 +236,13 @@ public abstract class RSModelMixin implements RSModel { boolean frameValid = false; if (transformIndex < frame.getTransformCount() - && frame.getTransformTypes()[transformIndex] == i) + && frame.getTransformTypes()[transformIndex] == i) { frameValid = true; } boolean nextFrameValid = false; if (nextTransformIndex < nextFrame.getTransformCount() - && nextFrame.getTransformTypes()[nextTransformIndex] == i) + && nextFrame.getTransformTypes()[nextTransformIndex] == i) { nextFrameValid = true; } diff --git a/mixins/src/main/java/net/runelite/mixins/RSMouseHandlerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSMouseHandlerMixin.java similarity index 97% rename from mixins/src/main/java/net/runelite/mixins/RSMouseHandlerMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSMouseHandlerMixin.java index 6bb95cebb9..5a1ba9d01a 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSMouseHandlerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSMouseHandlerMixin.java @@ -6,8 +6,8 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSMouseHandler; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSMouseHandler; @Mixin(RSMouseHandler.class) public abstract class RSMouseHandlerMixin implements RSMouseHandler diff --git a/mixins/src/main/java/net/runelite/mixins/RSMouseWheelHandlerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSMouseWheelHandlerMixin.java similarity index 96% rename from mixins/src/main/java/net/runelite/mixins/RSMouseWheelHandlerMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSMouseWheelHandlerMixin.java index 43c3876c63..61df42056f 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSMouseWheelHandlerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSMouseWheelHandlerMixin.java @@ -29,8 +29,8 @@ import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSMouseWheelHandler; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSMouseWheelHandler; @Mixin(RSMouseWheelHandler.class) public abstract class RSMouseWheelHandlerMixin implements RSMouseWheelHandler diff --git a/mixins/src/main/java/net/runelite/mixins/RSNPCDefinitionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCDefinitionMixin.java similarity index 70% rename from mixins/src/main/java/net/runelite/mixins/RSNPCDefinitionMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSNPCDefinitionMixin.java index ebf856ed78..07d16f949a 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSNPCDefinitionMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCDefinitionMixin.java @@ -1,17 +1,17 @@ package net.runelite.mixins; -import api.HeadIcon; -import static api.HeadIcon.MAGIC; -import static api.HeadIcon.MELEE; -import static api.HeadIcon.RANGED; -import static api.HeadIcon.RANGE_MAGE; -import api.events.NpcActionChanged; +import net.runelite.api.HeadIcon; +import static net.runelite.api.HeadIcon.MAGIC; +import static net.runelite.api.HeadIcon.MELEE; +import static net.runelite.api.HeadIcon.RANGED; +import static net.runelite.api.HeadIcon.RANGE_MAGE; +import net.runelite.api.events.NpcActionChanged; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSNPCDefinition; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSNPCDefinition; @Mixin(RSNPCDefinition.class) public abstract class RSNPCDefinitionMixin implements RSNPCDefinition diff --git a/mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java similarity index 93% rename from mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java index 0cf67502c3..ea0f74f93c 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java @@ -24,11 +24,11 @@ */ package net.runelite.mixins; -import api.AnimationID; -import api.NPCDefinition; -import api.Perspective; -import api.coords.LocalPoint; -import api.events.NpcDespawned; +import net.runelite.api.AnimationID; +import net.runelite.api.NPCDefinition; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.NpcDespawned; import java.awt.Polygon; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.FieldHook; @@ -36,10 +36,10 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSModel; -import rs.api.RSNPC; -import rs.api.RSNPCDefinition; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSNPC; +import net.runelite.rs.api.RSNPCDefinition; @Mixin(RSNPC.class) public abstract class RSNPCMixin implements RSNPC diff --git a/mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java similarity index 91% rename from mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java index 7744631317..dd67fb5a1f 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java @@ -1,12 +1,12 @@ package net.runelite.mixins; -import api.Node; +import net.runelite.api.Node; import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSNodeHashTable; +import net.runelite.rs.api.RSNodeHashTable; @Mixin(RSNodeHashTable.class) public abstract class RSNodeHashTableMixin implements RSNodeHashTable diff --git a/mixins/src/main/java/net/runelite/mixins/RSNodeMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeMixin.java similarity index 98% rename from mixins/src/main/java/net/runelite/mixins/RSNodeMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSNodeMixin.java index 1a1bb3402c..274ccba45a 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSNodeMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeMixin.java @@ -27,7 +27,7 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; -import rs.api.RSNode; +import net.runelite.rs.api.RSNode; @Mixin(RSNode.class) public abstract class RSNodeMixin implements RSNode diff --git a/mixins/src/main/java/net/runelite/mixins/RSPlayerAppearanceMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerAppearanceMixin.java similarity index 87% rename from mixins/src/main/java/net/runelite/mixins/RSPlayerAppearanceMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerAppearanceMixin.java index 516f528b41..76c5849f81 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSPlayerAppearanceMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerAppearanceMixin.java @@ -1,9 +1,9 @@ package net.runelite.mixins; -import api.kit.KitType; +import net.runelite.api.kit.KitType; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSPlayerAppearance; +import net.runelite.rs.api.RSPlayerAppearance; @Mixin(RSPlayerAppearance.class) public abstract class RSPlayerAppearanceMixin implements RSPlayerAppearance diff --git a/mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java similarity index 79% rename from mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java index 586ac2d6b0..e3e7920472 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -24,27 +24,28 @@ */ package net.runelite.mixins; -import api.HeadIcon; -import static api.HeadIcon.MAGIC; -import static api.HeadIcon.MELEE; -import static api.HeadIcon.RANGED; -import static api.HeadIcon.REDEMPTION; -import static api.HeadIcon.RETRIBUTION; -import static api.HeadIcon.SMITE; -import api.Model; -import api.Perspective; -import api.Point; -import api.SkullIcon; -import static api.SkullIcon.DEAD_MAN_FIVE; -import static api.SkullIcon.DEAD_MAN_FOUR; -import static api.SkullIcon.DEAD_MAN_ONE; -import static api.SkullIcon.DEAD_MAN_THREE; -import static api.SkullIcon.DEAD_MAN_TWO; -import static api.SkullIcon.SKULL; -import static api.SkullIcon.SKULL_FIGHT_PIT; -import api.coords.LocalPoint; -import api.model.Triangle; -import api.model.Vertex; +import net.runelite.api.HeadIcon; +import static net.runelite.api.HeadIcon.MAGIC; +import static net.runelite.api.HeadIcon.MELEE; +import static net.runelite.api.HeadIcon.RANGED; +import static net.runelite.api.HeadIcon.REDEMPTION; +import static net.runelite.api.HeadIcon.RETRIBUTION; +import static net.runelite.api.HeadIcon.SMITE; +import net.runelite.api.Model; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.SkullIcon; +import static net.runelite.api.SkullIcon.DEAD_MAN_FIVE; +import static net.runelite.api.SkullIcon.DEAD_MAN_FOUR; +import static net.runelite.api.SkullIcon.DEAD_MAN_ONE; +import static net.runelite.api.SkullIcon.DEAD_MAN_THREE; +import static net.runelite.api.SkullIcon.DEAD_MAN_TWO; +import static net.runelite.api.SkullIcon.SKULL; +import static net.runelite.api.SkullIcon.SKULL_FIGHT_PIT; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.mixins.MethodHook; +import net.runelite.api.model.Triangle; +import net.runelite.api.model.Vertex; import java.awt.Polygon; import java.util.ArrayList; import java.util.List; @@ -53,10 +54,10 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSModel; -import rs.api.RSPlayer; -import rs.api.RSUsername; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSPlayer; +import net.runelite.rs.api.RSUsername; @Mixin(RSPlayer.class) public abstract class RSPlayerMixin implements RSPlayer @@ -64,6 +65,9 @@ public abstract class RSPlayerMixin implements RSPlayer @Shadow("client") private static RSClient client; + @Inject + private boolean friended; + @Inject @Override public String getName() @@ -255,4 +259,17 @@ public abstract class RSPlayerMixin implements RSPlayer setSpotAnimationFrame(spotAnimFrame); } } + + @Inject + public boolean isFriended() + { + return isFriend() || friended; + } + + @Inject + @MethodHook(value = "checkIsFriend", end = true) + void updateFriended() + { + friended = client.getFriendManager().isFriended(getRsName(), false); + } } diff --git a/mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java similarity index 86% rename from mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java index cb10b1745f..1c10eeb835 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java @@ -24,17 +24,18 @@ */ package net.runelite.mixins; -import api.Actor; -import api.coords.LocalPoint; -import api.events.ProjectileMoved; +import net.runelite.api.Actor; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.ProjectileMoved; +import net.runelite.api.events.ProjectileSpawned; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSNPC; -import rs.api.RSPlayer; -import rs.api.RSProjectile; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSNPC; +import net.runelite.rs.api.RSPlayer; +import net.runelite.rs.api.RSProjectile; @Mixin(RSProjectile.class) public abstract class RSProjectileMixin implements RSProjectile @@ -42,6 +43,14 @@ public abstract class RSProjectileMixin implements RSProjectile @Shadow("client") private static RSClient client; + @Inject + RSProjectileMixin() + { + final ProjectileSpawned projectileSpawned = new ProjectileSpawned(); + projectileSpawned.setProjectile(this); + client.getCallbacks().post(projectileSpawned); + } + @Inject @Override public int getRemainingCycles() diff --git a/mixins/src/main/java/net/runelite/mixins/RSRasterProviderMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterProviderMixin.java similarity index 96% rename from mixins/src/main/java/net/runelite/mixins/RSRasterProviderMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSRasterProviderMixin.java index e2b5bd9512..77d850e5f9 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSRasterProviderMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterProviderMixin.java @@ -16,8 +16,8 @@ import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSRasterProvider; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSRasterProvider; @Mixin(RSRasterProvider.class) public abstract class RSRasterProviderMixin implements RSRasterProvider diff --git a/mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java similarity index 99% rename from mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java index ef07c0225f..8b8c3534e6 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java @@ -5,7 +5,7 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; +import net.runelite.rs.api.RSClient; @Mixin(RSClient.class) public abstract class RSRasterizer2DMixin implements RSClient diff --git a/mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java similarity index 92% rename from mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java index afdc4aea81..9e883dd8b4 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -24,26 +24,25 @@ */ package net.runelite.mixins; -import api.Perspective; -import api.Renderable; -import api.SceneTileModel; -import api.SceneTilePaint; -import api.Tile; -import api.coords.LocalPoint; -import api.hooks.DrawCallbacks; +import net.runelite.api.Perspective; +import net.runelite.api.Renderable; +import net.runelite.api.SceneTileModel; +import net.runelite.api.SceneTilePaint; +import net.runelite.api.Tile; +import net.runelite.api.hooks.DrawCallbacks; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSBoundaryObject; -import rs.api.RSClient; -import rs.api.RSFloorDecoration; -import rs.api.RSGroundItemPile; -import rs.api.RSScene; -import rs.api.RSTile; -import rs.api.RSTileModel; -import rs.api.RSWallDecoration; +import net.runelite.rs.api.RSBoundaryObject; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSFloorDecoration; +import net.runelite.rs.api.RSGroundItemPile; +import net.runelite.rs.api.RSScene; +import net.runelite.rs.api.RSTile; +import net.runelite.rs.api.RSTileModel; +import net.runelite.rs.api.RSWallDecoration; @Mixin(RSScene.class) public abstract class RSSceneMixin implements RSScene @@ -84,6 +83,16 @@ public abstract class RSSceneMixin implements RSScene } final boolean isGpu = client.isGpu(); + final boolean checkClick = client.isCheckClick(); + if (!client.isMenuOpen()) + { + // Force check click to update the selected tile + client.setCheckClick(true); + final int mouseX = client.getMouseX(); + final int mouseY = client.getMouseY(); + client.setMouseCanvasHoverPositionX(mouseX - client.getViewportXOffset()); + client.setMouseCanvasHoverPositionY(mouseY - client.getViewportYOffset()); + } if (!isGpu) { @@ -287,11 +296,11 @@ public abstract class RSSceneMixin implements RSScene if (client.getTileUpdateCount() == 0) { - if (!isGpu && client.getOculusOrbState() != 0) - { - client.setEntitiesAtMouseCount(0); - } client.setCheckClick(false); + if (!checkClick) + { + client.setViewportWalking(false); + } client.getCallbacks().drawScene(); return; } @@ -358,11 +367,11 @@ public abstract class RSSceneMixin implements RSScene if (client.getTileUpdateCount() == 0) { - if (!isGpu && client.getOculusOrbState() != 0) - { - client.setEntitiesAtMouseCount(0); - } client.setCheckClick(false); + if (!checkClick) + { + client.setViewportWalking(false); + } client.getCallbacks().drawScene(); return; } @@ -371,11 +380,13 @@ public abstract class RSSceneMixin implements RSScene } } - if (!isGpu && client.getOculusOrbState() != 0) - { - client.setEntitiesAtMouseCount(0); - } client.setCheckClick(false); + if (!checkClick) + { + // If checkClick was false, then the selected tile wouldn't have existed next tick, + // so clear viewport walking in order to prevent it triggering a walk + client.setViewportWalking(false); + } client.getCallbacks().drawScene(); } @@ -702,26 +713,7 @@ public abstract class RSSceneMixin implements RSScene @Inject static void setTargetTile(int targetX, int targetY) { - final LocalPoint current = client.getLocalPlayer().getLocalLocation(); - - // Limit walk distance - https://math.stackexchange.com/a/85582 - final int a = current.getSceneX(); - final int b = current.getSceneY(); - final int c = targetX; - final int d = targetY; - - final int r = MAX_TARGET_DISTANCE; - final int t = (int) Math.hypot(a - c, b - d) - r; - int x = targetX; - int y = targetY; - - if (t > 0) - { - x = (r * c + t * a) / (r + t); - y = (r * d + t * b) / (r + t); - } - - client.setSelectedSceneTileX(x); - client.setSelectedSceneTileY(y); + client.setSelectedSceneTileX(targetX); + client.setSelectedSceneTileY(targetY); } } diff --git a/mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java similarity index 97% rename from mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java index e0b718c2fb..2433ed1d2b 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java @@ -4,10 +4,10 @@ import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSFrames; -import rs.api.RSModel; -import rs.api.RSSequenceDefinition; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSFrames; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSSequenceDefinition; @Mixin(RSSequenceDefinition.class) public abstract class RSSequenceDefinitionMixin implements RSSequenceDefinition diff --git a/mixins/src/main/java/net/runelite/mixins/RSSpriteMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSpriteMixin.java similarity index 98% rename from mixins/src/main/java/net/runelite/mixins/RSSpriteMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSSpriteMixin.java index 8997ea8da3..80dd042f07 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSSpriteMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSpriteMixin.java @@ -4,7 +4,7 @@ import java.awt.Color; import java.awt.image.BufferedImage; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSSprite; +import net.runelite.rs.api.RSSprite; @Mixin(RSSprite.class) public abstract class RSSpriteMixin implements RSSprite diff --git a/mixins/src/main/java/net/runelite/mixins/RSTextureMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTextureMixin.java similarity index 97% rename from mixins/src/main/java/net/runelite/mixins/RSTextureMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTextureMixin.java index 4158dc1bcc..b273fec9a6 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSTextureMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTextureMixin.java @@ -29,8 +29,8 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSTexture; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSTexture; @Mixin(RSTexture.class) public abstract class RSTextureMixin implements RSTexture diff --git a/mixins/src/main/java/net/runelite/mixins/RSTextureProviderMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTextureProviderMixin.java similarity index 94% rename from mixins/src/main/java/net/runelite/mixins/RSTextureProviderMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTextureProviderMixin.java index 4455408eb9..6d6646248b 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSTextureProviderMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTextureProviderMixin.java @@ -24,13 +24,13 @@ */ package net.runelite.mixins; -import api.IndexDataBase; +import net.runelite.api.IndexDataBase; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSTextureProvider; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSTextureProvider; @Mixin(RSTextureProvider.class) public abstract class RSTextureProviderMixin implements RSTextureProvider diff --git a/mixins/src/main/java/net/runelite/mixins/RSTileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java similarity index 74% rename from mixins/src/main/java/net/runelite/mixins/RSTileMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java index c80da43ae3..ed17140360 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSTileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java @@ -24,48 +24,51 @@ */ package net.runelite.mixins; -import api.Actor; -import api.CollisionData; -import api.CollisionDataFlag; -import api.Constants; -import api.DecorativeObject; -import api.GameObject; -import api.GroundObject; -import api.Item; -import api.ItemLayer; -import api.Node; -import api.Point; -import api.Tile; -import api.WallObject; -import api.coords.LocalPoint; -import api.coords.WorldPoint; -import api.events.DecorativeObjectChanged; -import api.events.DecorativeObjectDespawned; -import api.events.DecorativeObjectSpawned; -import api.events.GameObjectChanged; -import api.events.GameObjectDespawned; -import api.events.GameObjectSpawned; -import api.events.GroundObjectChanged; -import api.events.GroundObjectDespawned; -import api.events.GroundObjectSpawned; -import api.events.ItemDespawned; -import api.events.ItemSpawned; -import api.events.WallObjectChanged; -import api.events.WallObjectDespawned; -import api.events.WallObjectSpawned; +import net.runelite.api.CollisionData; +import net.runelite.api.CollisionDataFlag; +import net.runelite.api.Constants; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GroundObject; +import net.runelite.api.Item; +import net.runelite.api.ItemLayer; +import net.runelite.api.Node; +import net.runelite.api.Point; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.DecorativeObjectChanged; +import net.runelite.api.events.DecorativeObjectDespawned; +import net.runelite.api.events.DecorativeObjectSpawned; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.ItemDespawned; +import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.WallObjectChanged; +import net.runelite.api.events.WallObjectDespawned; +import net.runelite.api.events.WallObjectSpawned; import java.util.ArrayList; import java.util.List; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSGameObject; -import rs.api.RSGroundItem; -import rs.api.RSGroundItemPile; -import rs.api.RSNode; -import rs.api.RSNodeDeque; -import rs.api.RSTile; +import net.runelite.rs.api.RSActor; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSEntity; +import net.runelite.rs.api.RSGameObject; +import net.runelite.rs.api.RSGraphicsObject; +import net.runelite.rs.api.RSGroundItem; +import net.runelite.rs.api.RSGroundItemPile; +import net.runelite.rs.api.RSNode; +import net.runelite.rs.api.RSNodeDeque; +import net.runelite.rs.api.RSProjectile; +import net.runelite.rs.api.RSTile; +import org.slf4j.Logger; @Mixin(RSTile.class) public abstract class RSTileMixin implements RSTile @@ -74,7 +77,7 @@ public abstract class RSTileMixin implements RSTile private static RSClient client; @Inject - private static GameObject lastGameObject; + private static RSGameObject lastGameObject; @Inject private static RSNodeDeque[][][] lastGroundItems = new RSNodeDeque[Constants.MAX_Z][Constants.SCENE_SIZE][Constants.SCENE_SIZE]; @@ -89,7 +92,7 @@ public abstract class RSTileMixin implements RSTile private GroundObject previousGroundObject; @Inject - private GameObject[] previousGameObjects; + private RSGameObject[] previousGameObjects; @Inject @Override @@ -135,7 +138,7 @@ public abstract class RSTileMixin implements RSTile wallObjectSpawned.setWallObject(current); client.getCallbacks().post(wallObjectSpawned); } - else if (current != null && previous != null) + else if (current != null) { WallObjectChanged wallObjectChanged = new WallObjectChanged(); wallObjectChanged.setTile(this); @@ -168,7 +171,7 @@ public abstract class RSTileMixin implements RSTile decorativeObjectSpawned.setDecorativeObject(current); client.getCallbacks().post(decorativeObjectSpawned); } - else if (current != null && previous != null) + else if (current != null) { DecorativeObjectChanged decorativeObjectChanged = new DecorativeObjectChanged(); decorativeObjectChanged.setTile(this); @@ -201,7 +204,7 @@ public abstract class RSTileMixin implements RSTile groundObjectSpawned.setGroundObject(current); client.getCallbacks().post(groundObjectSpawned); } - else if (current != null && previous != null) + else if (current != null) { GroundObjectChanged groundObjectChanged = new GroundObjectChanged(); groundObjectChanged.setTile(this); @@ -222,55 +225,96 @@ public abstract class RSTileMixin implements RSTile if (previousGameObjects == null) { - previousGameObjects = new GameObject[5]; + previousGameObjects = new RSGameObject[5]; } // Previous game object - GameObject previous = previousGameObjects[idx]; + RSGameObject previous = previousGameObjects[idx]; // GameObject that was changed. RSGameObject current = (RSGameObject) getGameObjects()[idx]; + // Update previous object to current + previousGameObjects[idx] = current; + // Last game object - GameObject last = lastGameObject; + RSGameObject last = lastGameObject; // Update last game object lastGameObject = current; - // Update previous object to current - previousGameObjects[idx] = current; - // Duplicate event, return - if (current != null && current.equals(last)) + if (current == previous) { return; } - // Characters seem to generate a constant stream of new GameObjects - if (current == null || !(current.getRenderable() instanceof Actor)) + if (current != null && current == last) { - if (current == null && previous != null) + // When >1 tile objects are added to the scene, the same GameObject is added to + // multiple tiles. We keep lastGameObject to prevent duplicate spawn events from + // firing for these objects. + return; + } + + // actors, projectiles, and graphics objects are added and removed from the scene each frame as GameObjects, + // so ignore them. + boolean currentInvalid = false, prevInvalid = false; + if (current != null) + { + RSEntity renderable = current.getRenderable(); + currentInvalid = renderable instanceof RSActor || renderable instanceof RSProjectile || renderable instanceof RSGraphicsObject; + } + + if (previous != null) + { + RSEntity renderable = previous.getRenderable(); + prevInvalid = renderable instanceof RSActor || renderable instanceof RSProjectile || renderable instanceof RSGraphicsObject; + } + + Logger logger = client.getLogger(); + if (current == null) + { + if (prevInvalid) { - GameObjectDespawned gameObjectDespawned = new GameObjectDespawned(); - gameObjectDespawned.setTile(this); - gameObjectDespawned.setGameObject(previous); - client.getCallbacks().post(gameObjectDespawned); + return; } - else if (current != null && previous == null) + + logger.trace("Game object despawn: {}", previous.getId()); + + GameObjectDespawned gameObjectDespawned = new GameObjectDespawned(); + gameObjectDespawned.setTile(this); + gameObjectDespawned.setGameObject(previous); + client.getCallbacks().post(gameObjectDespawned); + } + else if (previous == null) + { + if (currentInvalid) { - GameObjectSpawned gameObjectSpawned = new GameObjectSpawned(); - gameObjectSpawned.setTile(this); - gameObjectSpawned.setGameObject(current); - client.getCallbacks().post(gameObjectSpawned); + return; } - else if (current != null && previous != null) + + logger.trace("Game object spawn: {}", current.getId()); + + GameObjectSpawned gameObjectSpawned = new GameObjectSpawned(); + gameObjectSpawned.setTile(this); + gameObjectSpawned.setGameObject(current); + client.getCallbacks().post(gameObjectSpawned); + } + else + { + if (currentInvalid && prevInvalid) { - GameObjectChanged gameObjectsChanged = new GameObjectChanged(); - gameObjectsChanged.setTile(this); - gameObjectsChanged.setPrevious(previous); - gameObjectsChanged.setGameObject(current); - client.getCallbacks().post(gameObjectsChanged); + return; } + + logger.trace("Game object change: {} -> {}", previous.getId(), current.getId()); + + GameObjectChanged gameObjectsChanged = new GameObjectChanged(); + gameObjectsChanged.setTile(this); + gameObjectsChanged.setPrevious(previous); + gameObjectsChanged.setGameObject(current); + client.getCallbacks().post(gameObjectsChanged); } } diff --git a/mixins/src/main/java/net/runelite/mixins/RSTileModelMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileModelMixin.java similarity index 95% rename from mixins/src/main/java/net/runelite/mixins/RSTileModelMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTileModelMixin.java index 1ee1dbd707..e22bf131b0 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSTileModelMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileModelMixin.java @@ -2,7 +2,7 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSTileModel; +import net.runelite.rs.api.RSTileModel; @Mixin(RSTileModel.class) public abstract class RSTileModelMixin implements RSTileModel diff --git a/mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java similarity index 78% rename from mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java index 099875d24e..d5c224e73e 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java @@ -1,22 +1,22 @@ package net.runelite.mixins; -import api.Perspective; -import api.Point; -import api.TileObject; -import api.coords.LocalPoint; -import api.coords.WorldPoint; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.TileObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import java.awt.Graphics2D; import java.awt.Polygon; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixins; import net.runelite.api.mixins.Shadow; -import rs.api.RSBoundaryObject; -import rs.api.RSClient; -import rs.api.RSFloorDecoration; -import rs.api.RSGameObject; -import rs.api.RSGroundItemPile; -import rs.api.RSWallDecoration; +import net.runelite.rs.api.RSBoundaryObject; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSFloorDecoration; +import net.runelite.rs.api.RSGameObject; +import net.runelite.rs.api.RSGroundItemPile; +import net.runelite.rs.api.RSWallDecoration; @Mixins({ @Mixin(RSWallDecoration.class), diff --git a/mixins/src/main/java/net/runelite/mixins/RSTilePaintMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTilePaintMixin.java similarity index 96% rename from mixins/src/main/java/net/runelite/mixins/RSTilePaintMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTilePaintMixin.java index 132c557836..4f31d16757 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSTilePaintMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTilePaintMixin.java @@ -2,7 +2,7 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSTilePaint; +import net.runelite.rs.api.RSTilePaint; @Mixin(RSTilePaint.class) public abstract class RSTilePaintMixin implements RSTilePaint diff --git a/mixins/src/main/java/net/runelite/mixins/RSUserListMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSUserListMixin.java similarity index 86% rename from mixins/src/main/java/net/runelite/mixins/RSUserListMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSUserListMixin.java index 254dfffcfe..1a76beec25 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSUserListMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSUserListMixin.java @@ -3,15 +3,16 @@ package net.runelite.mixins; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; -import rs.api.RSUser; -import rs.api.RSUserList; -import rs.api.RSUsername; +import net.runelite.rs.api.RSUser; +import net.runelite.rs.api.RSUserList; +import net.runelite.rs.api.RSUsername; @Mixin(RSUserList.class) public abstract class RSUserListMixin implements RSUserList { /** * Default implementation of rl$add + * * @param name * @param prevName */ @@ -23,6 +24,7 @@ public abstract class RSUserListMixin implements RSUserList /** * Default implementation of rl$del + * * @param nameable */ @Inject @@ -43,5 +45,5 @@ public abstract class RSUserListMixin implements RSUserList public void remove(RSUser nameable) { rl$remove(nameable); - } + } } diff --git a/mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java similarity index 78% rename from mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java index f63c136096..86a757092b 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java @@ -1,13 +1,13 @@ package net.runelite.mixins; -import api.events.VarClientIntChanged; -import api.events.VarClientStrChanged; +import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.VarClientStrChanged; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSVarcs; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSVarcs; @Mixin(RSVarcs.class) public abstract class RSVarcsMixin implements RSVarcs diff --git a/mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java similarity index 83% rename from mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java index 141647da01..53dc51e9bb 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java @@ -1,17 +1,17 @@ package net.runelite.mixins; -import api.Model; -import api.Perspective; -import api.coords.LocalPoint; +import net.runelite.api.Model; +import net.runelite.api.Perspective; +import net.runelite.api.coords.LocalPoint; import java.awt.Polygon; import java.awt.geom.Area; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSEntity; -import rs.api.RSModel; -import rs.api.RSWallDecoration; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSEntity; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSWallDecoration; @Mixin(RSWallDecoration.class) public abstract class RSWallDecorationMixin implements RSWallDecoration @@ -37,7 +37,8 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration } @Inject - private RSModel getModel() + @Override + public RSModel getModel1() { RSEntity renderable = getRenderable(); if (renderable == null) @@ -60,7 +61,8 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration } @Inject - private RSModel getModel2() + @Override + public RSModel getModel2() { RSEntity renderable = getRenderable2(); if (renderable == null) @@ -89,7 +91,7 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration Area clickbox = new Area(); LocalPoint lp = getLocalLocation(); - Area clickboxA = Perspective.getClickbox(client, getModel(), 0, + Area clickboxA = Perspective.getClickbox(client, getModel1(), 0, new LocalPoint(lp.getX() + getXOffset(), lp.getY() + getYOffset())); Area clickboxB = Perspective.getClickbox(client, getModel2(), 0, lp); @@ -115,7 +117,7 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration @Override public Polygon getConvexHull() { - RSModel model = getModel(); + RSModel model = getModel1(); if (model == null) { diff --git a/mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java similarity index 92% rename from mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index db677024aa..4c59a88e53 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -24,16 +24,16 @@ */ package net.runelite.mixins; -import api.HashTable; -import api.Node; -import api.Point; -import api.WidgetNode; -import api.events.WidgetHiddenChanged; -import api.events.WidgetPositioned; -import api.widgets.Widget; -import static api.widgets.WidgetInfo.TO_CHILD; -import static api.widgets.WidgetInfo.TO_GROUP; -import api.widgets.WidgetItem; +import net.runelite.api.HashTable; +import net.runelite.api.Node; +import net.runelite.api.Point; +import net.runelite.api.WidgetNode; +import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.events.WidgetPositioned; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; +import net.runelite.api.widgets.WidgetItem; import java.awt.Rectangle; import java.util.ArrayList; import java.util.Arrays; @@ -43,10 +43,10 @@ import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSNode; -import rs.api.RSNodeHashTable; -import rs.api.RSWidget; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSNode; +import net.runelite.rs.api.RSNodeHashTable; +import net.runelite.rs.api.RSWidget; @Mixin(RSWidget.class) public abstract class RSWidgetMixin implements RSWidget @@ -258,6 +258,11 @@ public abstract class RSWidgetMixin implements RSWidget for (int i = 0; i < itemIds.length; ++i) { + if (itemIds[i] <= 0) + { + continue; + } + WidgetItem item = getWidgetItem(i); if (item != null) @@ -287,19 +292,17 @@ public abstract class RSWidgetMixin implements RSWidget int itemId = itemIds[index]; int itemQuantity = itemQuantities[index]; - Point widgetCanvasLocation = getCanvasLocation(); - - if (itemId <= 0 || itemQuantity <= 0 || columns <= 0) + if (columns <= 0) { return null; } int row = index / columns; int col = index % columns; - int itemX = widgetCanvasLocation.getX() + ((ITEM_SLOT_SIZE + xPitch) * col); - int itemY = widgetCanvasLocation.getY() + ((ITEM_SLOT_SIZE + yPitch) * row); + int itemX = rl$x + ((ITEM_SLOT_SIZE + xPitch) * col); + int itemY = rl$y + ((ITEM_SLOT_SIZE + yPitch) * row); - Rectangle bounds = new Rectangle(itemX - 1, itemY - 1, ITEM_SLOT_SIZE, ITEM_SLOT_SIZE); + Rectangle bounds = new Rectangle(itemX, itemY, ITEM_SLOT_SIZE, ITEM_SLOT_SIZE); return new WidgetItem(itemId - 1, itemQuantity, index, bounds, this); } diff --git a/mixins/src/main/java/net/runelite/mixins/RSWorldMapManagerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMapManagerMixin.java similarity index 92% rename from mixins/src/main/java/net/runelite/mixins/RSWorldMapManagerMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMapManagerMixin.java index 27dc832461..021aba098b 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSWorldMapManagerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMapManagerMixin.java @@ -3,8 +3,8 @@ package net.runelite.mixins; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSWorldMapManager; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSWorldMapManager; @Mixin(RSWorldMapManager.class) public abstract class RSWorldMapManagerMixin implements RSWorldMapManager diff --git a/mixins/src/main/java/net/runelite/mixins/RSWorldMapMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMapMixin.java similarity index 80% rename from mixins/src/main/java/net/runelite/mixins/RSWorldMapMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMapMixin.java index ba8725c3dd..108e1e820f 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSWorldMapMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMapMixin.java @@ -1,11 +1,11 @@ package net.runelite.mixins; -import api.Point; -import api.coords.WorldPoint; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSWorldMap; -import rs.api.RSWorldMapManager; +import net.runelite.rs.api.RSWorldMap; +import net.runelite.rs.api.RSWorldMapManager; @Mixin(RSWorldMap.class) public abstract class RSWorldMapMixin implements RSWorldMap diff --git a/mixins/src/main/java/net/runelite/mixins/RSWorldMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMixin.java similarity index 93% rename from mixins/src/main/java/net/runelite/mixins/RSWorldMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMixin.java index 43c5c461dc..eefb479963 100644 --- a/mixins/src/main/java/net/runelite/mixins/RSWorldMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWorldMixin.java @@ -24,15 +24,15 @@ */ package net.runelite.mixins; -import api.WorldType; -import api.events.WorldListLoad; +import net.runelite.api.WorldType; +import net.runelite.api.events.WorldListLoad; import java.util.EnumSet; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSWorld; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSWorld; @Mixin(RSWorld.class) public abstract class RSWorldMixin implements RSWorld diff --git a/mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java similarity index 93% rename from mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java index deddece59d..ab372ca932 100644 --- a/mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -25,10 +25,10 @@ package net.runelite.mixins; -import api.Client; -import static api.Opcodes.RUNELITE_EXECUTE; -import api.events.ScriptCallbackEvent; -import api.widgets.JavaScriptCallback; +import net.runelite.api.Client; +import static net.runelite.api.Opcodes.RUNELITE_EXECUTE; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.widgets.JavaScriptCallback; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.runelite.api.mixins.Copy; @@ -36,9 +36,9 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSScript; -import rs.api.RSScriptEvent; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSScript; +import net.runelite.rs.api.RSScriptEvent; @Mixin(RSClient.class) public abstract class ScriptVMMixin implements RSClient diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java new file mode 100644 index 0000000000..6338d07521 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.mixins; + +import net.runelite.api.SoundEffectVolume; +import net.runelite.api.events.AreaSoundEffectPlayed; +import net.runelite.api.events.SoundEffectPlayed; +import net.runelite.api.mixins.FieldHook; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSRawPcmStream; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSRawSound; +import net.runelite.rs.api.RSSoundEffect; +import net.runelite.rs.api.RSPcmStream; + +@Mixin(RSClient.class) +public abstract class SoundEffectMixin implements RSClient +{ + @Shadow("client") + private static RSClient client; + + @Inject + private static int lastSoundEffectCount; + + @Inject + @Override + public void playSoundEffect(int id) + { + playSoundEffect(id, 0, 0, 0, 0); + } + + @Inject + @Override + public void playSoundEffect(int id, int x, int y, int range) + { + playSoundEffect(id, x, y, range, 0); + } + + @Inject + @Override + public void playSoundEffect(int id, int x, int y, int range, int delay) + { + int position = ((x & 255) << 16) + ((y & 255) << 8) + (range & 255); + + int[] queuedSoundEffectIDs = getQueuedSoundEffectIDs(); + int[] queuedSoundEffectLoops = getQueuedSoundEffectLoops(); + int[] queuedSoundEffectDelays = getQueuedSoundEffectDelays(); + RSSoundEffect[] audioEffects = getAudioEffects(); + int[] soundLocations = getSoundLocations(); + int queuedSoundEffectCount = getQueuedSoundEffectCount(); + + queuedSoundEffectIDs[queuedSoundEffectCount] = id; + queuedSoundEffectLoops[queuedSoundEffectCount] = 1; + queuedSoundEffectDelays[queuedSoundEffectCount] = delay; + audioEffects[queuedSoundEffectCount] = null; + soundLocations[queuedSoundEffectCount] = position; + + setQueuedSoundEffectCount(queuedSoundEffectCount + 1); + } + + @Inject + @Override + public void playSoundEffect(int id, int volume) + { + RSSoundEffect soundEffect = getTrack(getIndexCache4(), id, 0); + if (soundEffect == null) + { + return; + } + + // If the current volume is not muted, use it instead + final int soundEffectVolume = getSoundEffectVolume(); + if (soundEffectVolume != SoundEffectVolume.MUTED) + { + volume = soundEffectVolume; + } + + RSRawSound rawAudioNode = soundEffect.toRawAudioNode().applyResampler(getSoundEffectResampler()); + RSRawPcmStream rawPcmStream = createRawPcmStream(rawAudioNode, 100, volume); + rawPcmStream.setNumLoops(1); + + getSoundEffectAudioQueue().addSubStream((RSPcmStream) rawPcmStream); + } + + @FieldHook("soundEffectCount") + @Inject + public static void queuedSoundEffectCountChanged(int idx) + { + int soundCount = client.getQueuedSoundEffectCount(); + if (soundCount == lastSoundEffectCount + 1) + { + int soundIndex = soundCount - 1; + int packedLocation = client.getSoundLocations()[soundIndex]; + + if (packedLocation == 0) + { + // Regular sound effect + + SoundEffectPlayed event = new SoundEffectPlayed(); + event.setSoundId(client.getQueuedSoundEffectIDs()[soundIndex]); + event.setDelay(client.getQueuedSoundEffectDelays()[soundIndex]); + client.getCallbacks().post(event); + } + else + { + // Area sound effect + + int x = (packedLocation >> 16) & 0xFF; + int y = (packedLocation >> 8) & 0xFF; + int range = (packedLocation) & 0xFF; + + AreaSoundEffectPlayed event = new AreaSoundEffectPlayed(); + event.setSoundId(client.getQueuedSoundEffectIDs()[soundIndex]); + event.setSceneX(x); + event.setSceneY(y); + event.setRange(range); + event.setDelay(client.getQueuedSoundEffectDelays()[soundIndex]); + client.getCallbacks().post(event); + } + } + + lastSoundEffectCount = soundCount; + } +} diff --git a/mixins/src/main/java/net/runelite/mixins/SpriteMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/SpriteMixin.java similarity index 88% rename from mixins/src/main/java/net/runelite/mixins/SpriteMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/SpriteMixin.java index c5cd6a6a8c..6bb2f91a8b 100644 --- a/mixins/src/main/java/net/runelite/mixins/SpriteMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/SpriteMixin.java @@ -1,15 +1,15 @@ package net.runelite.mixins; -import api.Sprite; +import net.runelite.api.Sprite; import java.util.HashMap; import java.util.Map; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; -import rs.api.RSAbstractIndexCache; -import rs.api.RSClient; -import rs.api.RSSprite; +import net.runelite.rs.api.RSAbstractIndexCache; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSSprite; @Mixin(RSClient.class) public abstract class SpriteMixin implements RSClient diff --git a/mixins/src/main/java/net/runelite/mixins/StretchedModeMaxSizeMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/StretchedModeMaxSizeMixin.java similarity index 93% rename from mixins/src/main/java/net/runelite/mixins/StretchedModeMaxSizeMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/StretchedModeMaxSizeMixin.java index 3e3a17eac6..b80d7c8b59 100644 --- a/mixins/src/main/java/net/runelite/mixins/StretchedModeMaxSizeMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/StretchedModeMaxSizeMixin.java @@ -6,8 +6,8 @@ import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSGameShell; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSGameShell; @Mixin(RSGameShell.class) public abstract class StretchedModeMaxSizeMixin implements RSGameShell diff --git a/mixins/src/main/java/net/runelite/mixins/StretchedModeMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/StretchedModeMixin.java similarity index 98% rename from mixins/src/main/java/net/runelite/mixins/StretchedModeMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/StretchedModeMixin.java index 20915002e8..99ba3f5260 100644 --- a/mixins/src/main/java/net/runelite/mixins/StretchedModeMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/StretchedModeMixin.java @@ -1,12 +1,12 @@ package net.runelite.mixins; -import api.Constants; +import net.runelite.api.Constants; import java.awt.Container; import java.awt.Dimension; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSClient; +import net.runelite.rs.api.RSClient; @Mixin(RSClient.class) public abstract class StretchedModeMixin implements RSClient diff --git a/mixins/src/main/java/net/runelite/mixins/VarbitMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java similarity index 92% rename from mixins/src/main/java/net/runelite/mixins/VarbitMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java index d0d693c04e..31f11b7c53 100644 --- a/mixins/src/main/java/net/runelite/mixins/VarbitMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java @@ -1,17 +1,17 @@ package net.runelite.mixins; -import api.VarClientInt; -import api.VarClientStr; -import api.Varbits; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.Map; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import rs.api.RSClient; -import rs.api.RSEvictingDualNodeHashTable; -import rs.api.RSVarbitDefinition; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSEvictingDualNodeHashTable; +import net.runelite.rs.api.RSVarbitDefinition; @Mixin(RSClient.class) public abstract class VarbitMixin implements RSClient diff --git a/mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java similarity index 87% rename from mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java index 9a181a477d..ac46b921a5 100644 --- a/mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java @@ -1,13 +1,13 @@ package net.runelite.mixins; -import api.Sprite; +import net.runelite.api.Sprite; import java.util.Map; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; -import rs.api.RSSprite; -import rs.api.RSWidget; +import net.runelite.rs.api.RSSprite; +import net.runelite.rs.api.RSWidget; @Mixin(RSWidget.class) public abstract class WidgetSpriteMixin implements RSWidget diff --git a/mixins/src/main/java/net/runelite/mixins/WorldHoppingMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/WorldHoppingMixin.java similarity index 84% rename from mixins/src/main/java/net/runelite/mixins/WorldHoppingMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/WorldHoppingMixin.java index 5e23d32dfb..0b29dfbe61 100644 --- a/mixins/src/main/java/net/runelite/mixins/WorldHoppingMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/WorldHoppingMixin.java @@ -1,11 +1,11 @@ package net.runelite.mixins; -import api.MenuAction; -import api.World; -import api.widgets.WidgetInfo; +import net.runelite.api.MenuAction; +import net.runelite.api.World; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import rs.api.RSClient; +import net.runelite.rs.api.RSClient; @Mixin(RSClient.class) public abstract class WorldHoppingMixin implements RSClient diff --git a/runelite-plugin-archetype/pom.xml b/runelite-plugin-archetype/pom.xml new file mode 100644 index 0000000000..1fd933b70e --- /dev/null +++ b/runelite-plugin-archetype/pom.xml @@ -0,0 +1,86 @@ + + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + runelite-plugin-archetype + maven-archetype + RuneLite Plugin Archetype + + + + + + src/main/resources + true + + archetype-resources/pom.xml + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + maven-archetype-plugin + 3.0.1 + + + org.apache.maven.plugins + maven-resources-plugin + 3.0.2 + + + \ + + + + + + diff --git a/runelite-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/runelite-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 0000000000..b67d8cde67 --- /dev/null +++ b/runelite-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,13 @@ + + + + + src/main/java + + **/*.java + + + + diff --git a/runelite-plugin-archetype/src/main/resources/archetype-resources/pom.xml b/runelite-plugin-archetype/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 0000000000..11882b973e --- /dev/null +++ b/runelite-plugin-archetype/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + \${groupId} + \${artifactId} + \${version} + jar + + + UTF-8 + 1.8 + 1.8 + + + + + runelite + RuneLite + http://repo.runelite.net + + + + + + net.runelite + client + ${project.version} + provided + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + install + + + + + + + run + + + + + + + diff --git a/runelite-plugin-archetype/src/test/resources/projects/compilationtest/archetype.properties b/runelite-plugin-archetype/src/test/resources/projects/compilationtest/archetype.properties new file mode 100644 index 0000000000..ace9df8523 --- /dev/null +++ b/runelite-plugin-archetype/src/test/resources/projects/compilationtest/archetype.properties @@ -0,0 +1,5 @@ +sourceEncoding=UTF-8 +groupId=org.example.runelite +artifactId=exampleplugin +version=1.0.0-SNAPSHOT +package=org.example.runelite.exampleplugin \ No newline at end of file diff --git a/runelite-plugin-archetype/src/test/resources/projects/compilationtest/goal.txt b/runelite-plugin-archetype/src/test/resources/projects/compilationtest/goal.txt new file mode 100644 index 0000000000..0b5987362f --- /dev/null +++ b/runelite-plugin-archetype/src/test/resources/projects/compilationtest/goal.txt @@ -0,0 +1 @@ +verify diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml new file mode 100644 index 0000000000..25f0b49f51 --- /dev/null +++ b/runelite-script-assembler-plugin/pom.xml @@ -0,0 +1,78 @@ + + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + script-assembler-plugin + Script Assembler Plugin + maven-plugin + + + + net.runelite + cache + ${project.version} + + + net.runelite + runelite-api + ${project.version} + + + + org.apache.maven + maven-plugin-api + 3.0.5 + + + org.apache.maven.plugin-tools + maven-plugin-annotations + 3.4 + + + + + + + org.apache.maven.plugins + maven-plugin-plugin + 3.4 + + + default-descriptor + process-classes + + + + + + diff --git a/runelite-script-assembler-plugin/src/main/java/net/runelite/script/AssembleMojo.java b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/AssembleMojo.java new file mode 100644 index 0000000000..09863ca3c1 --- /dev/null +++ b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/AssembleMojo.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.script; + +import com.google.common.io.Files; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import net.runelite.cache.IndexType; +import net.runelite.cache.definitions.ScriptDefinition; +import net.runelite.cache.definitions.savers.ScriptSaver; +import net.runelite.cache.script.assembler.Assembler; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; + +@Mojo( + name = "assemble", + defaultPhase = LifecyclePhase.GENERATE_RESOURCES +) +public class AssembleMojo extends AbstractMojo +{ + @Parameter(required = true) + private File scriptDirectory; + + @Parameter(required = true) + private File outputDirectory; + + private final Log log = getLog(); + + @Override + public void execute() throws MojoExecutionException, MojoFailureException + { + RuneLiteInstructions instructions = new RuneLiteInstructions(); + instructions.init(); + + Assembler assembler = new Assembler(instructions); + ScriptSaver saver = new ScriptSaver(); + + int count = 0; + File scriptOut = new File(outputDirectory, Integer.toString(IndexType.CLIENTSCRIPT.getNumber())); + scriptOut.mkdirs(); + + for (File scriptFile : scriptDirectory.listFiles((dir, name) -> name.endsWith(".rs2asm"))) + { + log.debug("Assembling " + scriptFile); + + try (FileInputStream fin = new FileInputStream(scriptFile)) + { + ScriptDefinition script = assembler.assemble(fin); + byte[] packedScript = saver.save(script); + + File targetFile = new File(scriptOut, Integer.toString(script.getId())); + Files.write(packedScript, targetFile); + + // Copy hash file + + File hashFile = new File(scriptDirectory, Files.getNameWithoutExtension(scriptFile.getName()) + ".hash"); + if (hashFile.exists()) + { + Files.copy(hashFile, new File(scriptOut, Integer.toString(script.getId()) + ".hash")); + } + else if (script.getId() < 10000) // Scripts >=10000 are RuneLite scripts, so they shouldn't have a .hash + { + throw new MojoExecutionException("Unable to find hash file for " + scriptFile); + } + + ++count; + } + catch (IOException ex) + { + throw new MojoFailureException("unable to open file", ex); + } + } + + log.info("Assembled " + count + " scripts"); + } +} diff --git a/runelite-script-assembler-plugin/src/main/java/net/runelite/script/IndexMojo.java b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/IndexMojo.java new file mode 100644 index 0000000000..fa41a2f064 --- /dev/null +++ b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/IndexMojo.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.script; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import static java.lang.Integer.parseInt; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; + +@Mojo( + name = "build-index", + defaultPhase = LifecyclePhase.GENERATE_RESOURCES +) +public class IndexMojo extends AbstractMojo +{ + @Parameter(required = true) + private File archiveOverlayDirectory; + + @Parameter(required = true) + private File indexFile; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException + { + try (DataOutputStream fout = new DataOutputStream(new FileOutputStream(indexFile))) + { + for (File indexFolder : archiveOverlayDirectory.listFiles()) + { + if (indexFolder.isDirectory()) + { + int indexId = parseInt(indexFolder.getName()); + for (File archiveFile : indexFolder.listFiles()) + { + int archiveId; + try + { + archiveId = parseInt(archiveFile.getName()); + } + catch (NumberFormatException ex) + { + continue; + } + + fout.writeInt(indexId << 16 | archiveId); + } + } + } + + fout.writeInt(-1); + } + catch (IOException ex) + { + throw new MojoExecutionException("error build index file", ex); + } + } + +} diff --git a/runelite-script-assembler-plugin/src/main/java/net/runelite/script/RuneLiteInstructions.java b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/RuneLiteInstructions.java new file mode 100644 index 0000000000..02073e8144 --- /dev/null +++ b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/RuneLiteInstructions.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.script; + +import static net.runelite.api.Opcodes.RUNELITE_EXECUTE; +import net.runelite.cache.script.Instructions; + +public class RuneLiteInstructions extends Instructions +{ + @Override + public void init() + { + super.init(); + add(RUNELITE_EXECUTE, "runelite_callback"); + } +} diff --git a/runescape-api/pom.xml b/runescape-api/pom.xml new file mode 100644 index 0000000000..710b68be9f --- /dev/null +++ b/runescape-api/pom.xml @@ -0,0 +1,46 @@ + + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + net.runelite.rs + runescape-api + RuneScape API + + + + net.runelite + runelite-api + ${project.version} + + + diff --git a/api/src/main/java/mapping/Construct.java b/runescape-api/src/main/java/net/runelite/mapping/Construct.java similarity index 100% rename from api/src/main/java/mapping/Construct.java rename to runescape-api/src/main/java/net/runelite/mapping/Construct.java diff --git a/runescape-api/src/main/java/net/runelite/mapping/Export.java b/runescape-api/src/main/java/net/runelite/mapping/Export.java new file mode 100644 index 0000000000..cd789618cd --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/mapping/Export.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.mapping; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target( +{ + ElementType.FIELD, ElementType.METHOD +}) +public @interface Export +{ + String value(); +} diff --git a/api/src/main/java/mapping/Implements.java b/runescape-api/src/main/java/net/runelite/mapping/Implements.java similarity index 100% rename from api/src/main/java/mapping/Implements.java rename to runescape-api/src/main/java/net/runelite/mapping/Implements.java diff --git a/runescape-api/src/main/java/net/runelite/mapping/Import.java b/runescape-api/src/main/java/net/runelite/mapping/Import.java new file mode 100644 index 0000000000..97e4e81d7f --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/mapping/Import.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.mapping; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target( +{ + ElementType.FIELD, ElementType.METHOD +}) +public @interface Import +{ + String value(); +} diff --git a/runescape-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java b/runescape-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java new file mode 100644 index 0000000000..b8e2873006 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.mapping; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ObfuscatedGetter +{ + int intValue() default 0; + + long longValue() default 0L; +} diff --git a/api/src/main/java/mapping/Hook.java b/runescape-api/src/main/java/net/runelite/mapping/ObfuscatedName.java similarity index 88% rename from api/src/main/java/mapping/Hook.java rename to runescape-api/src/main/java/net/runelite/mapping/ObfuscatedName.java index 6fa13fb8d5..10ccf9ecd4 100644 --- a/api/src/main/java/mapping/Hook.java +++ b/runescape-api/src/main/java/net/runelite/mapping/ObfuscatedName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Adam + * Copyright (c) 2016-2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,7 +24,6 @@ */ package net.runelite.mapping; -import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -33,12 +32,9 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target( { - ElementType.METHOD, ElementType.CONSTRUCTOR + ElementType.FIELD, ElementType.METHOD, ElementType.TYPE }) -@Documented -public @interface Hook +public @interface ObfuscatedName { String value(); - - boolean end() default false; } diff --git a/api/src/main/java/mapping/ObfuscatedSignature.java b/runescape-api/src/main/java/net/runelite/mapping/ObfuscatedSignature.java similarity index 100% rename from api/src/main/java/mapping/ObfuscatedSignature.java rename to runescape-api/src/main/java/net/runelite/mapping/ObfuscatedSignature.java diff --git a/api/src/main/java/rs/api/RSAbstractFont.java b/runescape-api/src/main/java/net/runelite/rs/api/RSAbstractFont.java similarity index 82% rename from api/src/main/java/rs/api/RSAbstractFont.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSAbstractFont.java index 337dbdc604..41e96907fb 100644 --- a/api/src/main/java/rs/api/RSAbstractFont.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSAbstractFont.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.FontTypeFace; +import net.runelite.api.FontTypeFace; import net.runelite.mapping.Import; public interface RSAbstractFont extends FontTypeFace diff --git a/api/src/main/java/rs/api/RSAbstractIndexCache.java b/runescape-api/src/main/java/net/runelite/rs/api/RSAbstractIndexCache.java similarity index 72% rename from api/src/main/java/rs/api/RSAbstractIndexCache.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSAbstractIndexCache.java index 793c87f69e..f561f1e562 100644 --- a/api/src/main/java/rs/api/RSAbstractIndexCache.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSAbstractIndexCache.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.IndexDataBase; +import net.runelite.api.IndexDataBase; import net.runelite.mapping.Import; public interface RSAbstractIndexCache extends IndexDataBase diff --git a/api/src/main/java/rs/api/RSAbstractRasterProvider.java b/runescape-api/src/main/java/net/runelite/rs/api/RSAbstractRasterProvider.java similarity index 96% rename from api/src/main/java/rs/api/RSAbstractRasterProvider.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSAbstractRasterProvider.java index 98cbc79094..c84af22d51 100644 --- a/api/src/main/java/rs/api/RSAbstractRasterProvider.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSAbstractRasterProvider.java @@ -26,9 +26,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.BufferProvider; +import net.runelite.api.BufferProvider; import net.runelite.mapping.Import; public interface RSAbstractRasterProvider extends BufferProvider diff --git a/api/src/main/java/rs/api/RSActor.java b/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java similarity index 98% rename from api/src/main/java/rs/api/RSActor.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSActor.java index cd46144323..24cc729f68 100644 --- a/api/src/main/java/rs/api/RSActor.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.Actor; +import net.runelite.api.Actor; import net.runelite.mapping.Import; public interface RSActor extends RSEntity, Actor diff --git a/api/src/main/java/rs/api/RSAnimation.java b/runescape-api/src/main/java/net/runelite/rs/api/RSAnimation.java similarity index 98% rename from api/src/main/java/rs/api/RSAnimation.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSAnimation.java index 1a53a19304..86df180557 100644 --- a/api/src/main/java/rs/api/RSAnimation.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSAnimation.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSBoundaryObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSBoundaryObject.java similarity index 89% rename from api/src/main/java/rs/api/RSBoundaryObject.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSBoundaryObject.java index fd93d3183c..650ee24834 100644 --- a/api/src/main/java/rs/api/RSBoundaryObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSBoundaryObject.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.WallObject; +import net.runelite.api.WallObject; import net.runelite.mapping.Import; public interface RSBoundaryObject extends WallObject diff --git a/api/src/main/java/rs/api/RSBuddy.java b/runescape-api/src/main/java/net/runelite/rs/api/RSBuddy.java similarity index 65% rename from api/src/main/java/rs/api/RSBuddy.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSBuddy.java index 45cb0b3b0f..e13893c244 100644 --- a/api/src/main/java/rs/api/RSBuddy.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSBuddy.java @@ -1,11 +1,11 @@ -package rs.api; +package net.runelite.rs.api; -import api.ChatPlayer; +import net.runelite.api.ChatPlayer; import net.runelite.mapping.Import; public interface RSBuddy extends ChatPlayer, RSUser { - @Import("world") + @Import("world0") @Override int getWorld(); diff --git a/api/src/main/java/rs/api/RSBuffer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSBuffer.java similarity index 84% rename from api/src/main/java/rs/api/RSBuffer.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSBuffer.java index 365272e06d..93fdebb463 100644 --- a/api/src/main/java/rs/api/RSBuffer.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSBuffer.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSCanvas.java b/runescape-api/src/main/java/net/runelite/rs/api/RSCanvas.java similarity index 51% rename from api/src/main/java/rs/api/RSCanvas.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSCanvas.java index 28d37bc0b4..f0295a0770 100644 --- a/api/src/main/java/rs/api/RSCanvas.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSCanvas.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; public interface RSCanvas { diff --git a/api/src/main/java/rs/api/RSChatChannel.java b/runescape-api/src/main/java/net/runelite/rs/api/RSChatChannel.java similarity index 78% rename from api/src/main/java/rs/api/RSChatChannel.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSChatChannel.java index 91bc1a9fbe..1adc2a9483 100644 --- a/api/src/main/java/rs/api/RSChatChannel.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSChatChannel.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.ChatLineBuffer; +import net.runelite.api.ChatLineBuffer; import net.runelite.mapping.Import; public interface RSChatChannel extends ChatLineBuffer diff --git a/api/src/main/java/rs/api/RSClanChat.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClanChat.java similarity index 86% rename from api/src/main/java/rs/api/RSClanChat.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSClanChat.java index dab7c5f895..4b13f47147 100644 --- a/api/src/main/java/rs/api/RSClanChat.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClanChat.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClanMate.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClanMate.java new file mode 100644 index 0000000000..1bcfb5b6df --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClanMate.java @@ -0,0 +1,7 @@ +package net.runelite.rs.api; + +import net.runelite.api.ClanMember; + +public interface RSClanMate extends RSBuddy, ClanMember +{ +} diff --git a/api/src/main/java/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java similarity index 92% rename from api/src/main/java/rs/api/RSClient.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 8868825de5..17f88f3eb3 100644 --- a/api/src/main/java/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -26,12 +26,12 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.Client; -import api.Sprite; -import api.World; -import api.widgets.Widget; +import net.runelite.api.Client; +import net.runelite.api.Sprite; +import net.runelite.api.World; +import net.runelite.api.widgets.Widget; import java.util.Map; import net.runelite.mapping.Construct; import net.runelite.mapping.Import; @@ -143,8 +143,10 @@ public interface RSClient extends RSGameShell, Client @Import("gameState") int getRSGameState(); + @Import("updateGameState") + void setGameState(int gameState); + @Import("checkClick") - @Override void setCheckClick(boolean checkClick); @Import("Scene_selectedScreenX") @@ -193,7 +195,7 @@ public interface RSClient extends RSGameShell, Client * * @param groupId the group ID * @return the widget group - * @see api.widgets.WidgetID + * @see net.runelite.api.widgets.WidgetID */ RSWidget[] getGroup(int groupId); @@ -252,10 +254,18 @@ public interface RSClient extends RSGameShell, Client @Override void setPassword(String password); + @Import("otp") + @Override + void setOtp(String otp); + @Import("currentLoginField") @Override int getCurrentLoginField(); + @Import("loginIndex") + @Override + int getLoginIndex(); + @Import("playerMenuActions") @Override String[] getPlayerOptions(); @@ -287,6 +297,7 @@ public interface RSClient extends RSGameShell, Client boolean isCheckClick(); @Import("menuOptionsCount") + @Override int getMenuOptionCount(); @Import("menuOptionsCount") @@ -502,8 +513,6 @@ public interface RSClient extends RSGameShell, Client /** * Get the widget top group. widgets[topGroup] contains widgets with * parentId -1, which are the widget roots. - * - * @return */ @Import("rootWidgetGroup") int getWidgetRoot(); @@ -523,11 +532,11 @@ public interface RSClient extends RSGameShell, Client @Import("mapDotSprites") RSSprite[] getMapDots(); - @Import("modIconSprites") + @Import("AbstractFont_modIconSprites") @Override RSIndexedSprite[] getModIcons(); - @Import("modIconSprites") + @Import("AbstractFont_modIconSprites") void setRSModIcons(RSIndexedSprite[] modIcons); @Construct @@ -553,8 +562,8 @@ public interface RSClient extends RSGameShell, Client @Import("soundLocations") int[] getSoundLocations(); - @Import("unknownSoundValues1") - int[] getUnknownSoundValues1(); + @Import("queuedSoundEffectLoops") + int[] getQueuedSoundEffectLoops(); @Import("queuedSoundEffectDelays") int[] getQueuedSoundEffectDelays(); @@ -565,6 +574,9 @@ public interface RSClient extends RSGameShell, Client @Import("soundEffectCount") void setQueuedSoundEffectCount(int queuedSoundEffectCount); + @Import("queueSoundEffect") + void queueSoundEffect(int id, int numLoops, int delay); + @Import("rasterProvider") @Override RSAbstractRasterProvider getBufferProvider(); @@ -778,6 +790,7 @@ public interface RSClient extends RSGameShell, Client boolean isInInstancedRegion(); @Import("itemDragDuration") + @Override int getItemPressedDuration(); @Import("itemDragDuration") @@ -930,6 +943,14 @@ public interface RSClient extends RSGameShell, Client @Import("Rasterizer2D_yClipEnd") int getEndY(); + @Import("dragInventoryWidget") + @Override + RSWidget getIf1DraggedWidget(); + + @Import("dragItemSlotSource") + @Override + int getIf1DraggedItemIndex(); + @Import("isSpellSelected") @Override void setSpellSelected(boolean selected); @@ -961,7 +982,7 @@ public interface RSClient extends RSGameShell, Client @Import("drawGradient") void rasterizerDrawGradient(int x, int y, int w, int h, int rgbTop, int rgbBottom); - @Import("Rasterizer2D_drawRectangleAlpha") + @Import("Rasterizer2D_fillRectangleAlpha") void rasterizerFillRectangleAlpha(int x, int y, int w, int h, int rgb, int a); @Import("Rasterizer2D_drawRectangle") @@ -971,12 +992,50 @@ public interface RSClient extends RSGameShell, Client void rasterizerDrawCircle(int x, int y, int r, int rgb); @Import("HealthBarDefinition_cached") - @Override RSEvictingDualNodeHashTable getHealthBarCache(); + @Import("HealthBarDefinition_cachedSprites") + RSEvictingDualNodeHashTable getHealthBarSpriteCache(); + @Import("renderSelf") + @Override + boolean getRenderSelf(); + + @Import("renderSelf") + @Override void setRenderSelf(boolean enabled); @Import("mouseRecorder") RSMouseRecorder getMouseRecorder(); + + @Import("selectedSpellName") + String getSelectedSpellName(); + + @Import("isSpellSelected") + boolean getIsSpellSelected(); + + @Import("readSoundEffect") + RSSoundEffect getTrack(RSAbstractIndexCache indexData, int id, int var0); + + @Import("createRawPcmStream") + RSRawPcmStream createRawPcmStream(RSRawSound audioNode, int var0, int volume); + + @Import("pcmStreamMixer") + RSPcmStreamMixer getSoundEffectAudioQueue(); + + @Import("indexCache4") + RSAbstractIndexCache getIndexCache4(); + + @Import("decimator") + RSDecimator getSoundEffectResampler(); + + @Import("soundEffectVolume") + int getSoundEffectVolume(); + + @Import("viewportWalking") + void setViewportWalking(boolean viewportWalking); + + @Import("crossSprites") + @Override + RSSprite[] getCrossSprites(); } diff --git a/api/src/main/java/rs/api/RSClientPreferences.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java similarity index 79% rename from api/src/main/java/rs/api/RSClientPreferences.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java index 5faf552236..e9a5e09e55 100644 --- a/api/src/main/java/rs/api/RSClientPreferences.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.Preferences; +import net.runelite.api.Preferences; import net.runelite.mapping.Import; public interface RSClientPreferences extends Preferences diff --git a/api/src/main/java/rs/api/RSCollisionMap.java b/runescape-api/src/main/java/net/runelite/rs/api/RSCollisionMap.java similarity index 66% rename from api/src/main/java/rs/api/RSCollisionMap.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSCollisionMap.java index c5202c120d..926f303b0b 100644 --- a/api/src/main/java/rs/api/RSCollisionMap.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSCollisionMap.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.CollisionData; +import net.runelite.api.CollisionData; import net.runelite.mapping.Import; public interface RSCollisionMap extends CollisionData diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSDecimator.java b/runescape-api/src/main/java/net/runelite/rs/api/RSDecimator.java new file mode 100644 index 0000000000..401b20c13f --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSDecimator.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018, trimbe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.rs.api; + +public interface RSDecimator +{ +} diff --git a/api/src/main/java/rs/api/RSDualNode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSDualNode.java similarity index 98% rename from api/src/main/java/rs/api/RSDualNode.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSDualNode.java index 89ef847bac..034a2e144d 100644 --- a/api/src/main/java/rs/api/RSDualNode.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSDualNode.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSDynamicObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSDynamicObject.java similarity index 53% rename from api/src/main/java/rs/api/RSDynamicObject.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSDynamicObject.java index ee582d4c45..cdaa72277c 100644 --- a/api/src/main/java/rs/api/RSDynamicObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSDynamicObject.java @@ -1,9 +1,10 @@ -package rs.api; +package net.runelite.rs.api; -import api.Renderable; +import net.runelite.api.DynamicObject; +import net.runelite.api.Renderable; import net.runelite.mapping.Import; -public interface RSDynamicObject extends RSEntity, Renderable +public interface RSDynamicObject extends RSEntity, DynamicObject, Renderable { @Import("id") int getId(); diff --git a/api/src/main/java/rs/api/RSEntity.java b/runescape-api/src/main/java/net/runelite/rs/api/RSEntity.java similarity index 96% rename from api/src/main/java/rs/api/RSEntity.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSEntity.java index a6e135ad08..89229d0fb6 100644 --- a/api/src/main/java/rs/api/RSEntity.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSEntity.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.Renderable; +import net.runelite.api.Renderable; import net.runelite.mapping.Import; public interface RSEntity extends RSNode, Renderable diff --git a/api/src/main/java/rs/api/RSEnumDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSEnumDefinition.java similarity index 84% rename from api/src/main/java/rs/api/RSEnumDefinition.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSEnumDefinition.java index 22c0ebe3c6..0e4206e29a 100644 --- a/api/src/main/java/rs/api/RSEnumDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSEnumDefinition.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.EnumDefinition; +import net.runelite.api.EnumDefinition; import net.runelite.mapping.Import; public interface RSEnumDefinition extends EnumDefinition, RSDualNode diff --git a/api/src/main/java/rs/api/RSEvictingDualNodeHashTable.java b/runescape-api/src/main/java/net/runelite/rs/api/RSEvictingDualNodeHashTable.java similarity index 84% rename from api/src/main/java/rs/api/RSEvictingDualNodeHashTable.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSEvictingDualNodeHashTable.java index b9a1563305..3f59cdaa47 100644 --- a/api/src/main/java/rs/api/RSEvictingDualNodeHashTable.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSEvictingDualNodeHashTable.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.NodeCache; +import net.runelite.api.NodeCache; import net.runelite.mapping.Import; public interface RSEvictingDualNodeHashTable extends NodeCache diff --git a/api/src/main/java/rs/api/RSFileOnDisk.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFileOnDisk.java similarity index 88% rename from api/src/main/java/rs/api/RSFileOnDisk.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSFileOnDisk.java index 315064b4f7..8f73327bae 100644 --- a/api/src/main/java/rs/api/RSFileOnDisk.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFileOnDisk.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import java.io.RandomAccessFile; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSFloorDecoration.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFloorDecoration.java similarity index 80% rename from api/src/main/java/rs/api/RSFloorDecoration.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSFloorDecoration.java index 0c8c5b65ac..e20c1056d7 100644 --- a/api/src/main/java/rs/api/RSFloorDecoration.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFloorDecoration.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.GroundObject; +import net.runelite.api.GroundObject; import net.runelite.mapping.Import; public interface RSFloorDecoration extends GroundObject diff --git a/api/src/main/java/rs/api/RSFont.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFont.java similarity index 64% rename from api/src/main/java/rs/api/RSFont.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSFont.java index 7b12a9d543..b12c97d946 100644 --- a/api/src/main/java/rs/api/RSFont.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFont.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; public interface RSFont extends RSAbstractFont { diff --git a/api/src/main/java/rs/api/RSFrames.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFrames.java similarity index 98% rename from api/src/main/java/rs/api/RSFrames.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSFrames.java index 45509475ad..69b065d90f 100644 --- a/api/src/main/java/rs/api/RSFrames.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFrames.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSFriend.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFriend.java new file mode 100644 index 0000000000..3b4e047066 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFriend.java @@ -0,0 +1,7 @@ +package net.runelite.rs.api; + +import net.runelite.api.Friend; + +public interface RSFriend extends Friend, RSBuddy +{ +} diff --git a/api/src/main/java/rs/api/RSFriendSystem.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendSystem.java similarity index 81% rename from api/src/main/java/rs/api/RSFriendSystem.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSFriendSystem.java index 1d01b23183..017971b308 100644 --- a/api/src/main/java/rs/api/RSFriendSystem.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendSystem.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.FriendManager; +import net.runelite.api.FriendManager; import net.runelite.mapping.Import; public interface RSFriendSystem extends FriendManager diff --git a/api/src/main/java/rs/api/RSFriendsList.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendsList.java similarity index 69% rename from api/src/main/java/rs/api/RSFriendsList.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSFriendsList.java index ef36674350..5617d00bc0 100644 --- a/api/src/main/java/rs/api/RSFriendsList.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendsList.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; public interface RSFriendsList extends RSUserList { diff --git a/api/src/main/java/rs/api/RSGameObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java similarity index 88% rename from api/src/main/java/rs/api/RSGameObject.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java index e649b310dc..9d5d9bed74 100644 --- a/api/src/main/java/rs/api/RSGameObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.GameObject; +import net.runelite.api.GameObject; import net.runelite.mapping.Import; public interface RSGameObject extends GameObject @@ -35,6 +35,7 @@ public interface RSGameObject extends GameObject int getHeight(); @Import("orientation") + @Override int getRsOrientation(); @Import("tag") diff --git a/api/src/main/java/rs/api/RSGameShell.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGameShell.java similarity index 97% rename from api/src/main/java/rs/api/RSGameShell.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSGameShell.java index a9647d544a..969e4f4cb3 100644 --- a/api/src/main/java/rs/api/RSGameShell.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGameShell.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.GameShell; +import net.runelite.api.GameShell; import java.awt.Canvas; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSGrandExchangeOffer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGrandExchangeOffer.java similarity index 85% rename from api/src/main/java/rs/api/RSGrandExchangeOffer.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSGrandExchangeOffer.java index 9bffb96730..3998a383eb 100644 --- a/api/src/main/java/rs/api/RSGrandExchangeOffer.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGrandExchangeOffer.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.GrandExchangeOffer; +import net.runelite.api.GrandExchangeOffer; import net.runelite.mapping.Import; public interface RSGrandExchangeOffer extends GrandExchangeOffer diff --git a/api/src/main/java/rs/api/RSGraphicsObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java similarity index 83% rename from api/src/main/java/rs/api/RSGraphicsObject.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java index 2471d7de4d..74fc9bccd2 100644 --- a/api/src/main/java/rs/api/RSGraphicsObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.GraphicsObject; +import net.runelite.api.GraphicsObject; import net.runelite.mapping.Import; public interface RSGraphicsObject extends GraphicsObject, RSEntity diff --git a/api/src/main/java/rs/api/RSGroundItem.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItem.java similarity index 82% rename from api/src/main/java/rs/api/RSGroundItem.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSGroundItem.java index f23800fe84..f4823f14b0 100644 --- a/api/src/main/java/rs/api/RSGroundItem.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItem.java @@ -1,7 +1,7 @@ -package rs.api; +package net.runelite.rs.api; -import api.Item; -import api.Tile; +import net.runelite.api.Item; +import net.runelite.api.Tile; import net.runelite.mapping.Import; public interface RSGroundItem extends RSEntity, Item diff --git a/api/src/main/java/rs/api/RSGroundItemPile.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItemPile.java similarity index 86% rename from api/src/main/java/rs/api/RSGroundItemPile.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSGroundItemPile.java index 3fc5742d90..c7e4d41e00 100644 --- a/api/src/main/java/rs/api/RSGroundItemPile.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItemPile.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.ItemLayer; +import net.runelite.api.ItemLayer; import net.runelite.mapping.Import; public interface RSGroundItemPile extends ItemLayer @@ -18,7 +18,7 @@ public interface RSGroundItemPile extends ItemLayer @Import("height") int getHeight(); - @Import("third") + @Import("first") @Override RSEntity getBottom(); @@ -26,7 +26,7 @@ public interface RSGroundItemPile extends ItemLayer @Override RSEntity getMiddle(); - @Import("first") + @Import("third") @Override RSEntity getTop(); diff --git a/api/src/main/java/rs/api/RSHealthBar.java b/runescape-api/src/main/java/net/runelite/rs/api/RSHealthBar.java similarity index 90% rename from api/src/main/java/rs/api/RSHealthBar.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSHealthBar.java index 13b8871a47..248ec7d624 100644 --- a/api/src/main/java/rs/api/RSHealthBar.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSHealthBar.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSHealthBarDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSHealthBarDefinition.java similarity index 72% rename from api/src/main/java/rs/api/RSHealthBarDefinition.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSHealthBarDefinition.java index d688530a85..110ce49826 100644 --- a/api/src/main/java/rs/api/RSHealthBarDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSHealthBarDefinition.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.HealthBar; +import net.runelite.api.HealthBar; import net.runelite.mapping.Import; public interface RSHealthBarDefinition extends RSDualNode, HealthBar @@ -8,6 +8,10 @@ public interface RSHealthBarDefinition extends RSDualNode, HealthBar @Import("width") int getHealthScale(); + @Import("spriteId1") + @Override + int getHealthBarFrontSpriteId(); + @Import("getSprite1") RSSprite getHealthBarFrontSprite(); diff --git a/api/src/main/java/rs/api/RSHealthBarUpdate.java b/runescape-api/src/main/java/net/runelite/rs/api/RSHealthBarUpdate.java similarity index 89% rename from api/src/main/java/rs/api/RSHealthBarUpdate.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSHealthBarUpdate.java index 9b2f9ee5d4..6541b7f328 100644 --- a/api/src/main/java/rs/api/RSHealthBarUpdate.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSHealthBarUpdate.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSIgnoreList.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIgnoreList.java similarity index 69% rename from api/src/main/java/rs/api/RSIgnoreList.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSIgnoreList.java index aa53114779..802fe122a0 100644 --- a/api/src/main/java/rs/api/RSIgnoreList.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIgnoreList.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; public interface RSIgnoreList extends RSUserList { diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSIgnored.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIgnored.java new file mode 100644 index 0000000000..5fcca27e00 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIgnored.java @@ -0,0 +1,7 @@ +package net.runelite.rs.api; + +import net.runelite.api.Ignore; + +public interface RSIgnored extends Ignore, RSUser +{ +} diff --git a/api/src/main/java/rs/api/RSIndexCache.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIndexCache.java similarity index 82% rename from api/src/main/java/rs/api/RSIndexCache.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSIndexCache.java index 18be69a891..bf68b6cba4 100644 --- a/api/src/main/java/rs/api/RSIndexCache.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIndexCache.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSIndexedSprite.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIndexedSprite.java similarity index 93% rename from api/src/main/java/rs/api/RSIndexedSprite.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSIndexedSprite.java index 4af8e04a37..c2b13deffa 100644 --- a/api/src/main/java/rs/api/RSIndexedSprite.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIndexedSprite.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.IndexedSprite; +import net.runelite.api.IndexedSprite; import net.runelite.mapping.Import; public interface RSIndexedSprite extends IndexedSprite diff --git a/api/src/main/java/rs/api/RSIntegerNode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIntegerNode.java similarity index 75% rename from api/src/main/java/rs/api/RSIntegerNode.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSIntegerNode.java index 3d2d2f819f..2a5e5bb3bb 100644 --- a/api/src/main/java/rs/api/RSIntegerNode.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIntegerNode.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.IntegerNode; +import net.runelite.api.IntegerNode; import net.runelite.mapping.Import; public interface RSIntegerNode extends RSNode, IntegerNode diff --git a/api/src/main/java/rs/api/RSItemContainer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSItemContainer.java similarity index 73% rename from api/src/main/java/rs/api/RSItemContainer.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSItemContainer.java index 964bd545fc..abbad17e57 100644 --- a/api/src/main/java/rs/api/RSItemContainer.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSItemContainer.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.ItemContainer; +import net.runelite.api.ItemContainer; import net.runelite.mapping.Import; public interface RSItemContainer extends RSNode, ItemContainer diff --git a/api/src/main/java/rs/api/RSItemDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSItemDefinition.java similarity index 92% rename from api/src/main/java/rs/api/RSItemDefinition.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSItemDefinition.java index 2c624b3dc7..609ef5eb45 100644 --- a/api/src/main/java/rs/api/RSItemDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSItemDefinition.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.ItemDefinition; +import net.runelite.api.ItemDefinition; import net.runelite.mapping.Import; public interface RSItemDefinition extends ItemDefinition @@ -17,7 +17,7 @@ public interface RSItemDefinition extends ItemDefinition @Override int getNote(); - @Import("notedId") + @Import("note") @Override int getLinkedNoteId(); diff --git a/api/src/main/java/rs/api/RSIterableNodeDeque.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeDeque.java similarity index 66% rename from api/src/main/java/rs/api/RSIterableNodeDeque.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeDeque.java index 17ba1b7a32..31f039d181 100644 --- a/api/src/main/java/rs/api/RSIterableNodeDeque.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeDeque.java @@ -1,9 +1,9 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; public interface RSIterableNodeDeque { - @Import("current") + @Import("sentinel") RSNode getCurrent(); } diff --git a/api/src/main/java/rs/api/RSIterableNodeHashTable.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java similarity index 68% rename from api/src/main/java/rs/api/RSIterableNodeHashTable.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java index ed732da8d9..3d8c5efab0 100644 --- a/api/src/main/java/rs/api/RSIterableNodeHashTable.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.IterableHashTable; +import net.runelite.api.IterableHashTable; import net.runelite.mapping.Import; public interface RSIterableNodeHashTable extends IterableHashTable diff --git a/api/src/main/java/rs/api/RSKeyHandler.java b/runescape-api/src/main/java/net/runelite/rs/api/RSKeyHandler.java similarity index 69% rename from api/src/main/java/rs/api/RSKeyHandler.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSKeyHandler.java index 886b285419..c683aa129a 100644 --- a/api/src/main/java/rs/api/RSKeyHandler.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSKeyHandler.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.KeyFocusListener; +import net.runelite.api.KeyFocusListener; import java.awt.event.FocusListener; import java.awt.event.KeyListener; diff --git a/api/src/main/java/rs/api/RSLoginType.java b/runescape-api/src/main/java/net/runelite/rs/api/RSLoginType.java similarity index 53% rename from api/src/main/java/rs/api/RSLoginType.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSLoginType.java index ffb1c207eb..ecbde757f7 100644 --- a/api/src/main/java/rs/api/RSLoginType.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSLoginType.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; public interface RSLoginType { diff --git a/api/src/main/java/rs/api/RSMessage.java b/runescape-api/src/main/java/net/runelite/rs/api/RSMessage.java similarity index 72% rename from api/src/main/java/rs/api/RSMessage.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSMessage.java index 7c7b90a6db..f2bb4ee988 100644 --- a/api/src/main/java/rs/api/RSMessage.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSMessage.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.MessageNode; +import net.runelite.api.MessageNode; import net.runelite.mapping.Import; public interface RSMessage extends MessageNode @@ -12,19 +12,19 @@ public interface RSMessage extends MessageNode @Import("type") int getRSType(); - @Import("prefix") + @Import("sender") @Override String getName(); - @Import("prefix") + @Import("sender") @Override void setName(String name); - @Import("sender") + @Import("prefix") @Override String getSender(); - @Import("sender") + @Import("prefix") @Override void setSender(String sender); @@ -35,4 +35,11 @@ public interface RSMessage extends MessageNode @Import("text") @Override void setValue(String value); + + @Import("isFromFriend") + @Override + boolean isFromFriend(); + + @Import("senderUsername") + RSUsername getSenderUsername(); } diff --git a/api/src/main/java/rs/api/RSModel.java b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java similarity index 96% rename from api/src/main/java/rs/api/RSModel.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSModel.java index 39fd248cee..c4e2786ca4 100644 --- a/api/src/main/java/rs/api/RSModel.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.Model; +import net.runelite.api.Model; import java.awt.Polygon; import net.runelite.mapping.Import; @@ -118,9 +118,6 @@ public interface RSModel extends RSEntity, Model @Import("rotateY270Ccw") void rotateY270Ccw(); - @Import("isSingleTile") - boolean isSingleTile(); - @Import("radius") @Override int getRadius(); @@ -157,8 +154,11 @@ public interface RSModel extends RSEntity, Model @Override int getXYZMag(); - void interpolateFrames(RSFrames frames, int frameId, RSFrames nextFrames, int nextFrameId, int interval, - int intervalCount); + @Import("isSingleTile") + @Override + boolean isClickable(); + + void interpolateFrames(RSFrames frames, int frameId, RSFrames nextFrames, int nextFrameId, int interval, int intervalCount); /** * Compute the convex hull of this model diff --git a/api/src/main/java/rs/api/RSModelData.java b/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java similarity index 96% rename from api/src/main/java/rs/api/RSModelData.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java index 7dc6c4798f..77eaf9ce9c 100644 --- a/api/src/main/java/rs/api/RSModelData.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSMouseHandler.java b/runescape-api/src/main/java/net/runelite/rs/api/RSMouseHandler.java similarity index 88% rename from api/src/main/java/rs/api/RSMouseHandler.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSMouseHandler.java index 853716f7db..b89b833c85 100644 --- a/api/src/main/java/rs/api/RSMouseHandler.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSMouseHandler.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import java.awt.event.FocusListener; import java.awt.event.MouseListener; diff --git a/api/src/main/java/rs/api/RSMouseRecorder.java b/runescape-api/src/main/java/net/runelite/rs/api/RSMouseRecorder.java similarity index 77% rename from api/src/main/java/rs/api/RSMouseRecorder.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSMouseRecorder.java index 9427606814..d7eeba34d1 100644 --- a/api/src/main/java/rs/api/RSMouseRecorder.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSMouseRecorder.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.MouseRecorder; +import net.runelite.api.MouseRecorder; import net.runelite.mapping.Import; public interface RSMouseRecorder extends MouseRecorder diff --git a/api/src/main/java/rs/api/RSMouseWheelHandler.java b/runescape-api/src/main/java/net/runelite/rs/api/RSMouseWheelHandler.java similarity index 79% rename from api/src/main/java/rs/api/RSMouseWheelHandler.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSMouseWheelHandler.java index 4d49700d5d..2add3af142 100644 --- a/api/src/main/java/rs/api/RSMouseWheelHandler.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSMouseWheelHandler.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import java.awt.event.MouseWheelListener; diff --git a/api/src/main/java/rs/api/RSNPC.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNPC.java similarity index 80% rename from api/src/main/java/rs/api/RSNPC.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSNPC.java index b32f8e4c74..c34ce43381 100644 --- a/api/src/main/java/rs/api/RSNPC.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNPC.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.NPC; +import net.runelite.api.NPC; import net.runelite.mapping.Import; public interface RSNPC extends RSActor, NPC diff --git a/api/src/main/java/rs/api/RSNPCDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNPCDefinition.java similarity index 91% rename from api/src/main/java/rs/api/RSNPCDefinition.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSNPCDefinition.java index c34073e54d..fef328c669 100644 --- a/api/src/main/java/rs/api/RSNPCDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNPCDefinition.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.NPCDefinition; +import net.runelite.api.NPCDefinition; import net.runelite.mapping.Import; public interface RSNPCDefinition extends NPCDefinition diff --git a/api/src/main/java/rs/api/RSNode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNode.java similarity index 96% rename from api/src/main/java/rs/api/RSNode.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSNode.java index c159177e68..ddb124464d 100644 --- a/api/src/main/java/rs/api/RSNode.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNode.java @@ -22,14 +22,14 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.Node; +import net.runelite.api.Node; import net.runelite.mapping.Import; public interface RSNode extends Node { - @Import("next") + @Import("previous") @Override RSNode getNext(); @@ -37,7 +37,7 @@ public interface RSNode extends Node @Override long getHash(); - @Import("previous") + @Import("next") @Override RSNode getPrevious(); diff --git a/api/src/main/java/rs/api/RSNodeDeque.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java similarity index 84% rename from api/src/main/java/rs/api/RSNodeDeque.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java index 1d19ecab80..c903f20f8c 100644 --- a/api/src/main/java/rs/api/RSNodeDeque.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSNodeHashTable.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeHashTable.java similarity index 77% rename from api/src/main/java/rs/api/RSNodeHashTable.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSNodeHashTable.java index fc18df3b3b..e93b478531 100644 --- a/api/src/main/java/rs/api/RSNodeHashTable.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeHashTable.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.HashTable; +import net.runelite.api.HashTable; import net.runelite.mapping.Import; public interface RSNodeHashTable extends HashTable diff --git a/api/src/main/java/rs/api/RSObjectDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectDefinition.java similarity index 87% rename from api/src/main/java/rs/api/RSObjectDefinition.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSObjectDefinition.java index feeb0922ae..7bd9db4f4e 100644 --- a/api/src/main/java/rs/api/RSObjectDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectDefinition.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.ObjectDefinition; +import net.runelite.api.ObjectDefinition; import net.runelite.mapping.Import; public interface RSObjectDefinition extends ObjectDefinition diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSPacketBuffer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSPacketBuffer.java new file mode 100644 index 0000000000..614734671d --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSPacketBuffer.java @@ -0,0 +1,7 @@ +package net.runelite.rs.api; + +import net.runelite.api.PacketBuffer; + +public interface RSPacketBuffer extends PacketBuffer +{ +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStream.java b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStream.java new file mode 100644 index 0000000000..0c5e118782 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStream.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018, trimbe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.rs.api; + +public interface RSPcmStream +{ +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStreamMixer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStreamMixer.java new file mode 100644 index 0000000000..8ae48313be --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStreamMixer.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, trimbe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.rs.api; + +import net.runelite.mapping.Import; + +public interface RSPcmStreamMixer +{ + @Import("addSubStream") + void addSubStream(RSPcmStream taskDataNode); +} diff --git a/api/src/main/java/rs/api/RSPlayer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSPlayer.java similarity index 95% rename from api/src/main/java/rs/api/RSPlayer.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSPlayer.java index 6211560c92..8bfecef721 100644 --- a/api/src/main/java/rs/api/RSPlayer.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSPlayer.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.Player; +import net.runelite.api.Player; import net.runelite.mapping.Import; public interface RSPlayer extends RSActor, Player @@ -58,6 +58,8 @@ public interface RSPlayer extends RSActor, Player @Override boolean isFriend(); + boolean isFriended(); + @Import("headIconPrayer") int getRsOverheadIcon(); diff --git a/api/src/main/java/rs/api/RSPlayerAppearance.java b/runescape-api/src/main/java/net/runelite/rs/api/RSPlayerAppearance.java similarity index 84% rename from api/src/main/java/rs/api/RSPlayerAppearance.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSPlayerAppearance.java index b1bf272845..3f084e3114 100644 --- a/api/src/main/java/rs/api/RSPlayerAppearance.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSPlayerAppearance.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.PlayerAppearance; +import net.runelite.api.PlayerAppearance; import net.runelite.mapping.Import; public interface RSPlayerAppearance extends PlayerAppearance diff --git a/api/src/main/java/rs/api/RSProjectile.java b/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java similarity index 97% rename from api/src/main/java/rs/api/RSProjectile.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java index e2c8b16a53..ae8ab12836 100644 --- a/api/src/main/java/rs/api/RSProjectile.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java @@ -26,9 +26,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.Projectile; +import net.runelite.api.Projectile; import net.runelite.mapping.Import; public interface RSProjectile extends RSEntity, Projectile diff --git a/api/src/main/java/rs/api/RSRasterProvider.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRasterProvider.java similarity index 95% rename from api/src/main/java/rs/api/RSRasterProvider.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSRasterProvider.java index 83f8d33640..5ef9913681 100644 --- a/api/src/main/java/rs/api/RSRasterProvider.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRasterProvider.java @@ -26,9 +26,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.MainBufferProvider; +import net.runelite.api.MainBufferProvider; import java.awt.Component; import java.awt.Image; import net.runelite.mapping.Import; diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRawPcmStream.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRawPcmStream.java new file mode 100644 index 0000000000..0677551901 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRawPcmStream.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, trimbe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.rs.api; + +import net.runelite.mapping.Import; + +public interface RSRawPcmStream +{ + @Import("setNumLoops") + void setNumLoops(int numLoops); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRawSound.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRawSound.java new file mode 100644 index 0000000000..0f64b67d2d --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRawSound.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, trimbe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.rs.api; + +import net.runelite.mapping.Import; + +public interface RSRawSound +{ + @Import("resample") + RSRawSound applyResampler(RSDecimator resampler); +} diff --git a/api/src/main/java/rs/api/RSReflectionCheck.java b/runescape-api/src/main/java/net/runelite/rs/api/RSReflectionCheck.java similarity index 90% rename from api/src/main/java/rs/api/RSReflectionCheck.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSReflectionCheck.java index 5de9c99b1e..616206cd71 100644 --- a/api/src/main/java/rs/api/RSReflectionCheck.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSReflectionCheck.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import java.lang.reflect.Field; import java.lang.reflect.Method; diff --git a/api/src/main/java/rs/api/RSRunException.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRunException.java similarity index 80% rename from api/src/main/java/rs/api/RSRunException.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSRunException.java index acdd484585..872d1a9f90 100644 --- a/api/src/main/java/rs/api/RSRunException.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRunException.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSScene.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java similarity index 79% rename from api/src/main/java/rs/api/RSScene.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSScene.java index 9df00300fc..0949305e33 100644 --- a/api/src/main/java/rs/api/RSScene.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java @@ -1,13 +1,13 @@ -package rs.api; +package net.runelite.rs.api; -import api.Scene; -import api.Tile; +import net.runelite.api.Scene; +import net.runelite.api.Tile; import net.runelite.mapping.Import; public interface RSScene extends Scene { - //@Import("Scene_gameObjects") --- unused and causing trouble - //RSGameObject[] getObjects(); + @Import("tempGameObjects") + RSGameObject[] getObjects(); @Import("tiles") @Override diff --git a/api/src/main/java/rs/api/RSScript.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java similarity index 77% rename from api/src/main/java/rs/api/RSScript.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSScript.java index eb76b24058..7a1c730f5a 100644 --- a/api/src/main/java/rs/api/RSScript.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.Script; +import net.runelite.api.Script; import net.runelite.mapping.Import; public interface RSScript extends Script, RSDualNode diff --git a/api/src/main/java/rs/api/RSScriptEvent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java similarity index 74% rename from api/src/main/java/rs/api/RSScriptEvent.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java index 885879cd1d..68fab899fc 100644 --- a/api/src/main/java/rs/api/RSScriptEvent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java @@ -1,7 +1,7 @@ -package rs.api; +package net.runelite.rs.api; -import api.ScriptEvent; -import api.widgets.Widget; +import net.runelite.api.widgets.Widget; +import net.runelite.api.ScriptEvent; import net.runelite.mapping.Import; public interface RSScriptEvent extends ScriptEvent diff --git a/api/src/main/java/rs/api/RSSequenceDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java similarity index 94% rename from api/src/main/java/rs/api/RSSequenceDefinition.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java index 591e535a01..97c8d9a91a 100644 --- a/api/src/main/java/rs/api/RSSequenceDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSSkeleton.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSkeleton.java similarity index 98% rename from api/src/main/java/rs/api/RSSkeleton.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSSkeleton.java index 85428bbd29..9ed93c5c43 100644 --- a/api/src/main/java/rs/api/RSSkeleton.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSkeleton.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java new file mode 100644 index 0000000000..cb93c6fd70 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.rs.api; + +import net.runelite.mapping.Import; + +public interface RSSoundEffect +{ + @Import("toRawSound") + RSRawSound toRawAudioNode(); +} diff --git a/api/src/main/java/rs/api/RSSprite.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSprite.java similarity index 70% rename from api/src/main/java/rs/api/RSSprite.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSSprite.java index 98425e05b2..d85d4e1427 100644 --- a/api/src/main/java/rs/api/RSSprite.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSprite.java @@ -1,11 +1,11 @@ -package rs.api; +package net.runelite.rs.api; -import api.Sprite; +import net.runelite.api.Sprite; import net.runelite.mapping.Import; public interface RSSprite extends Sprite { - @Import("drawAt") + @Import("drawAt2") @Override void drawAt(int x, int y); @@ -30,9 +30,9 @@ public interface RSSprite extends Sprite @Import("height") void setMaxHeight(int maxHeight); - @Import("xOffset") - void setOffsetX(int offsetX); - @Import("yOffset") - void setOffsetY(int offsetY); + void setOffsetX(int offsetX); // <-- I don't even know + + @Import("xOffset") + void setOffsetY(int offsetY); // <-- I don't even know } diff --git a/api/src/main/java/rs/api/RSTexture.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTexture.java similarity index 84% rename from api/src/main/java/rs/api/RSTexture.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSTexture.java index aa525f793c..c3171219dd 100644 --- a/api/src/main/java/rs/api/RSTexture.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTexture.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.Texture; +import net.runelite.api.Texture; import net.runelite.mapping.Import; public interface RSTexture extends Texture, RSNode diff --git a/api/src/main/java/rs/api/RSTextureProvider.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTextureProvider.java similarity index 86% rename from api/src/main/java/rs/api/RSTextureProvider.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSTextureProvider.java index 30306c1a4f..f39ac5085d 100644 --- a/api/src/main/java/rs/api/RSTextureProvider.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTextureProvider.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.TextureProvider; +import net.runelite.api.TextureProvider; import net.runelite.mapping.Import; public interface RSTextureProvider extends TextureProvider diff --git a/api/src/main/java/rs/api/RSTile.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTile.java similarity index 76% rename from api/src/main/java/rs/api/RSTile.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSTile.java index eb0ff71378..735fda68b1 100644 --- a/api/src/main/java/rs/api/RSTile.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTile.java @@ -1,13 +1,13 @@ -package rs.api; +package net.runelite.rs.api; -import api.DecorativeObject; -import api.GameObject; -import api.GroundObject; -import api.ItemLayer; -import api.SceneTileModel; -import api.SceneTilePaint; -import api.Tile; -import api.WallObject; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameObject; +import net.runelite.api.GroundObject; +import net.runelite.api.ItemLayer; +import net.runelite.api.SceneTileModel; +import net.runelite.api.SceneTilePaint; +import net.runelite.api.Tile; +import net.runelite.api.WallObject; import net.runelite.mapping.Import; public interface RSTile extends Tile @@ -57,8 +57,8 @@ public interface RSTile extends Tile @Import("minPlane") int getPhysicalLevel(); - //@Import("flags") - //int getFlags(); ---- unused, think it's gameobjectedgemask + @Import("gameObjectsEdgeMask") + int getFlags(); @Import("linkedBelowTile") @Override diff --git a/api/src/main/java/rs/api/RSTileModel.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTileModel.java similarity index 92% rename from api/src/main/java/rs/api/RSTileModel.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSTileModel.java index 1863e8b61f..616380d9dc 100644 --- a/api/src/main/java/rs/api/RSTileModel.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTileModel.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.SceneTileModel; +import net.runelite.api.SceneTileModel; import net.runelite.mapping.Import; public interface RSTileModel extends SceneTileModel diff --git a/api/src/main/java/rs/api/RSTilePaint.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTilePaint.java similarity index 85% rename from api/src/main/java/rs/api/RSTilePaint.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSTilePaint.java index 9e1d4355e6..46588a2561 100644 --- a/api/src/main/java/rs/api/RSTilePaint.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTilePaint.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.SceneTilePaint; +import net.runelite.api.SceneTilePaint; import net.runelite.mapping.Import; public interface RSTilePaint extends SceneTilePaint diff --git a/api/src/main/java/rs/api/RSUser.java b/runescape-api/src/main/java/net/runelite/rs/api/RSUser.java similarity index 76% rename from api/src/main/java/rs/api/RSUser.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSUser.java index 9a57f8f3f6..798e7a8aa8 100644 --- a/api/src/main/java/rs/api/RSUser.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSUser.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.Nameable; +import net.runelite.api.Nameable; import net.runelite.mapping.Import; public interface RSUser extends Nameable, Comparable diff --git a/api/src/main/java/rs/api/RSUserList.java b/runescape-api/src/main/java/net/runelite/rs/api/RSUserList.java similarity index 95% rename from api/src/main/java/rs/api/RSUserList.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSUserList.java index 4542b5ef30..b530f68019 100644 --- a/api/src/main/java/rs/api/RSUserList.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSUserList.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSUsername.java b/runescape-api/src/main/java/net/runelite/rs/api/RSUsername.java similarity index 98% rename from api/src/main/java/rs/api/RSUsername.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSUsername.java index 9183b83cdb..52d1a14802 100644 --- a/api/src/main/java/rs/api/RSUsername.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSUsername.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSVarbitDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSVarbitDefinition.java similarity index 88% rename from api/src/main/java/rs/api/RSVarbitDefinition.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSVarbitDefinition.java index d3328a7d38..2624226dd5 100644 --- a/api/src/main/java/rs/api/RSVarbitDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSVarbitDefinition.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSVarcs.java b/runescape-api/src/main/java/net/runelite/rs/api/RSVarcs.java similarity index 82% rename from api/src/main/java/rs/api/RSVarcs.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSVarcs.java index 93f0ad15b1..8fbd54e337 100644 --- a/api/src/main/java/rs/api/RSVarcs.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSVarcs.java @@ -1,4 +1,4 @@ -package rs.api; +package net.runelite.rs.api; import java.util.Map; import net.runelite.mapping.Import; diff --git a/api/src/main/java/rs/api/RSWallDecoration.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWallDecoration.java similarity index 82% rename from api/src/main/java/rs/api/RSWallDecoration.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWallDecoration.java index f671202a9d..4d01d9771b 100644 --- a/api/src/main/java/rs/api/RSWallDecoration.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWallDecoration.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.DecorativeObject; +import net.runelite.api.DecorativeObject; import net.runelite.mapping.Import; public interface RSWallDecoration extends DecorativeObject @@ -21,7 +21,7 @@ public interface RSWallDecoration extends DecorativeObject @Import("yOffset") int getYOffset(); - @Import("orientation") + @Import("orientation2") int getOrientation(); @Import("entity1") diff --git a/api/src/main/java/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java similarity index 98% rename from api/src/main/java/rs/api/RSWidget.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index 947c3443dc..f8134a75b5 100644 --- a/api/src/main/java/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -26,9 +26,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rs.api; +package net.runelite.rs.api; -import api.widgets.Widget; +import net.runelite.api.widgets.Widget; import net.runelite.mapping.Import; public interface RSWidget extends Widget @@ -217,11 +217,11 @@ public interface RSWidget extends Widget @Override void setScrollHeight(int height); - @Import("spriteId") + @Import("spriteId2") @Override int getSpriteId(); - @Import("spriteId") + @Import("spriteId2") @Override void setSpriteId(int spriteId); diff --git a/api/src/main/java/rs/api/RSWidgetGroupParent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidgetGroupParent.java similarity index 69% rename from api/src/main/java/rs/api/RSWidgetGroupParent.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWidgetGroupParent.java index b3e1f9c4be..34c867e031 100644 --- a/api/src/main/java/rs/api/RSWidgetGroupParent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidgetGroupParent.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.WidgetNode; +import net.runelite.api.WidgetNode; import net.runelite.mapping.Import; public interface RSWidgetGroupParent extends RSNode, WidgetNode diff --git a/api/src/main/java/rs/api/RSWorld.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWorld.java similarity index 93% rename from api/src/main/java/rs/api/RSWorld.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWorld.java index d176873c8f..ecd6aa2278 100644 --- a/api/src/main/java/rs/api/RSWorld.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWorld.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.World; +import net.runelite.api.World; import net.runelite.mapping.Import; public interface RSWorld extends World diff --git a/api/src/main/java/rs/api/RSWorldMap.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMap.java similarity index 65% rename from api/src/main/java/rs/api/RSWorldMap.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWorldMap.java index fe74a34d86..eb7f92d551 100644 --- a/api/src/main/java/rs/api/RSWorldMap.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMap.java @@ -1,7 +1,7 @@ -package rs.api; +package net.runelite.rs.api; -import api.RenderOverview; -import api.WorldMapData; +import net.runelite.api.RenderOverview; +import net.runelite.api.WorldMapData; import net.runelite.mapping.Import; public interface RSWorldMap extends RenderOverview @@ -12,7 +12,7 @@ public interface RSWorldMap extends RenderOverview @Import("worldMapY") int getWorldMapY(); - @Import("zoomTarget") + @Import("zoom") float getWorldMapZoom(); @Import("worldMapTargetX") @@ -21,17 +21,17 @@ public interface RSWorldMap extends RenderOverview @Import("worldMapTargetY") int getWorldMapTargetY(); - //@Import("worldMapDisplayWidth") - //int getWorldMapDisplayWidth(); -//Both unused - //@Import("worldMapDisplayHeight") - //int getWorldMapDisplayHeight(); + @Import("worldMapDisplayWidth") + int getWorldMapDisplayWidth(); - //@Import("worldMapDisplayX") - //int getWorldMapDisplayX(); + @Import("worldMapDisplayHeight") + int getWorldMapDisplayHeight(); - //@Import("worldMapDisplayY") - //int getWorldMapDisplayY(); + @Import("worldMapDisplayX") + int getWorldMapDisplayX(); + + @Import("worldMapDisplayY") + int getWorldMapDisplayY(); @Import("setWorldMapPosition") void setWorldMapPosition(int worldMapX, int worldMapY, boolean changedSurface); @@ -47,7 +47,7 @@ public interface RSWorldMap extends RenderOverview @Override void initializeWorldMap(WorldMapData var1); - @Import("mainMapArea") + @Import("getCurrentMapArea") @Override RSWorldMapArea getWorldMapData(); } diff --git a/api/src/main/java/rs/api/RSWorldMapArea.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapArea.java similarity index 71% rename from api/src/main/java/rs/api/RSWorldMapArea.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapArea.java index 6035b64b51..75f5079120 100644 --- a/api/src/main/java/rs/api/RSWorldMapArea.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapArea.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.WorldMapData; +import net.runelite.api.WorldMapData; import net.runelite.mapping.Import; public interface RSWorldMapArea extends WorldMapData diff --git a/api/src/main/java/rs/api/RSWorldMapElement.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapElement.java similarity index 72% rename from api/src/main/java/rs/api/RSWorldMapElement.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapElement.java index 6957121a56..f627dd8a63 100644 --- a/api/src/main/java/rs/api/RSWorldMapElement.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapElement.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.MapElementConfig; +import net.runelite.api.MapElementConfig; import net.runelite.mapping.Import; public interface RSWorldMapElement extends RSDualNode, MapElementConfig diff --git a/api/src/main/java/rs/api/RSWorldMapManager.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapManager.java similarity index 83% rename from api/src/main/java/rs/api/RSWorldMapManager.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapManager.java index 1c1a74fa55..9a534ce187 100644 --- a/api/src/main/java/rs/api/RSWorldMapManager.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapManager.java @@ -1,6 +1,6 @@ -package rs.api; +package net.runelite.rs.api; -import api.WorldMapManager; +import net.runelite.api.WorldMapManager; import net.runelite.mapping.Import; public interface RSWorldMapManager extends WorldMapManager diff --git a/runescape-client/pom.xml b/runescape-client/pom.xml new file mode 100644 index 0000000000..04e2850dde --- /dev/null +++ b/runescape-client/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + + net.runelite + runelite-parent + 1.5.28-SNAPSHOT + + + net.runelite.rs + rs-client + RuneScape Client + + + + net.runelite.rs + runescape-api + 1.5.28-SNAPSHOT + + + + junit + junit + 4.12 + test + + + org.slf4j + slf4j-api + 1.7.12 + test + + + org.slf4j + slf4j-simple + 1.7.12 + test + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + true + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -parameters + + + + + + \ No newline at end of file diff --git a/rs-client/src/main/java/AbstractByteArrayCopier.java b/runescape-client/src/main/java/AbstractByteArrayCopier.java similarity index 90% rename from rs-client/src/main/java/AbstractByteArrayCopier.java rename to runescape-client/src/main/java/AbstractByteArrayCopier.java index 246ec924b4..f87ef77718 100644 --- a/rs-client/src/main/java/AbstractByteArrayCopier.java +++ b/runescape-client/src/main/java/AbstractByteArrayCopier.java @@ -13,7 +13,6 @@ public abstract class AbstractByteArrayCopier { @ObfuscatedSignature( signature = "Lit;" ) - @Export("__gu_et") static IndexCache __gu_et; static { @@ -41,8 +40,9 @@ public abstract class AbstractByteArrayCopier { signature = "(II)Liw;", garbageValue = "1102198559" ) - public static VarcInt method4021(int var0) { - VarcInt var1 = (VarcInt)VarcInt.__iw_f.get((long)var0); + @Export("getVarcInt") + public static VarcInt getVarcInt(int var0) { + VarcInt var1 = (VarcInt)VarcInt.cachedVarcInts.get((long)var0); if(var1 != null) { return var1; } else { @@ -52,7 +52,7 @@ public abstract class AbstractByteArrayCopier { var1.__q_411(new Buffer(var2)); } - VarcInt.__iw_f.put(var1, (long)var0); + VarcInt.cachedVarcInts.put(var1, (long)var0); return var1; } } @@ -62,7 +62,8 @@ public abstract class AbstractByteArrayCopier { signature = "(II)V", garbageValue = "-1941491045" ) - public static void method4023(int var0) { + @Export("unloadWidgetGroup") + public static void unloadWidgetGroup(int var0) { if(var0 != -1) { if(Widget.loadedWidgetGroups[var0]) { Widget.Widget_indexCache.__h_399(var0); diff --git a/rs-client/src/main/java/AbstractFont.java b/runescape-client/src/main/java/AbstractFont.java similarity index 99% rename from rs-client/src/main/java/AbstractFont.java rename to runescape-client/src/main/java/AbstractFont.java index c78e90518f..967f2b291c 100644 --- a/rs-client/src/main/java/AbstractFont.java +++ b/runescape-client/src/main/java/AbstractFont.java @@ -667,7 +667,7 @@ public abstract class AbstractFont extends Rasterizer2D { try { var9 = MouseHandler.method1085(var8.substring(4)); IndexedSprite var10 = AbstractFont_modIconSprites[var9]; - var10.__q_496(var2, var3 + this.ascent - var10.height); + var10.drawAt(var2, var3 + this.ascent - var10.height); var2 += var10.width; var5 = -1; } catch (Exception var14) { @@ -773,7 +773,7 @@ public abstract class AbstractFont extends Rasterizer2D { ++var8; var14 = MouseHandler.method1085(var11.substring(4)); IndexedSprite var15 = AbstractFont_modIconSprites[var14]; - var15.__q_496(var12 + var2, var13 + (var3 + this.ascent - var15.height)); + var15.drawAt(var12 + var2, var13 + (var3 + this.ascent - var15.height)); var2 += var15.width; var7 = -1; } catch (Exception var19) { diff --git a/rs-client/src/main/java/AbstractIndexCache.java b/runescape-client/src/main/java/AbstractIndexCache.java similarity index 98% rename from rs-client/src/main/java/AbstractIndexCache.java rename to runescape-client/src/main/java/AbstractIndexCache.java index bfd06c03eb..22249e8e50 100644 --- a/rs-client/src/main/java/AbstractIndexCache.java +++ b/runescape-client/src/main/java/AbstractIndexCache.java @@ -24,7 +24,6 @@ public abstract class AbstractIndexCache { @ObfuscatedGetter( intValue = -244224193 ) - @Export("__ir_s") static int __ir_s; @ObfuscatedName("au") @Export("garbageCollector") @@ -33,7 +32,6 @@ public abstract class AbstractIndexCache { @ObfuscatedGetter( intValue = 334735939 ) - @Export("__ir_bu") static int __ir_bu; @ObfuscatedName("di") @ObfuscatedSignature( @@ -247,7 +245,6 @@ public abstract class AbstractIndexCache { signature = "(II)V", garbageValue = "2102142648" ) - @Export("__f_392") void __f_392(int var1) { } @@ -317,7 +314,6 @@ public abstract class AbstractIndexCache { signature = "(II)Z", garbageValue = "-1923759754" ) - @Export("__u_393") public boolean __u_393(int var1) { if(this.records.length == 1) { return this.tryLoadRecord(0, var1); @@ -348,7 +344,6 @@ public abstract class AbstractIndexCache { signature = "(I)Z", garbageValue = "1694975256" ) - @Export("__l_394") public boolean __l_394() { boolean var1 = true; @@ -447,7 +442,6 @@ public abstract class AbstractIndexCache { signature = "(IB)[I", garbageValue = "28" ) - @Export("__j_395") public int[] __j_395(int var1) { return var1 >= 0 && var1 < this.recordIds.length?this.recordIds[var1]:null; } @@ -457,7 +451,6 @@ public abstract class AbstractIndexCache { signature = "(II)I", garbageValue = "1178362496" ) - @Export("__s_396") public int __s_396(int var1) { return this.records[var1].length; } @@ -467,7 +460,6 @@ public abstract class AbstractIndexCache { signature = "(I)I", garbageValue = "1702434573" ) - @Export("__t_397") public int __t_397() { return this.records.length; } @@ -477,7 +469,6 @@ public abstract class AbstractIndexCache { signature = "(B)V", garbageValue = "38" ) - @Export("__y_398") public void __y_398() { for(int var1 = 0; var1 < this.archives.length; ++var1) { this.archives[var1] = null; @@ -490,7 +481,6 @@ public abstract class AbstractIndexCache { signature = "(II)V", garbageValue = "330258899" ) - @Export("__h_399") public void __h_399(int var1) { for(int var2 = 0; var2 < this.records[var1].length; ++var2) { this.records[var1][var2] = null; @@ -503,7 +493,6 @@ public abstract class AbstractIndexCache { signature = "(I)V", garbageValue = "-709581639" ) - @Export("__b_400") public void __b_400() { for(int var1 = 0; var1 < this.records.length; ++var1) { if(this.records[var1] != null) { @@ -640,7 +629,6 @@ public abstract class AbstractIndexCache { signature = "(Ljava/lang/String;Ljava/lang/String;B)Z", garbageValue = "68" ) - @Export("__ag_401") public boolean __ag_401(String var1, String var2) { var1 = var1.toLowerCase(); var2 = var2.toLowerCase(); @@ -698,7 +686,6 @@ public abstract class AbstractIndexCache { signature = "(Ljava/lang/String;B)V", garbageValue = "40" ) - @Export("__ar_402") public void __ar_402(String var1) { var1 = var1.toLowerCase(); int var2 = this.archiveNameHashTable.get(Client.hashString(var1)); diff --git a/rs-client/src/main/java/AbstractRasterProvider.java b/runescape-client/src/main/java/AbstractRasterProvider.java similarity index 96% rename from rs-client/src/main/java/AbstractRasterProvider.java rename to runescape-client/src/main/java/AbstractRasterProvider.java index 7a487402b9..4d6fcf99ea 100644 --- a/rs-client/src/main/java/AbstractRasterProvider.java +++ b/runescape-client/src/main/java/AbstractRasterProvider.java @@ -8,8 +8,8 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("AbstractRasterProvider") public abstract class AbstractRasterProvider { @ObfuscatedName("ca") - @Export("__lp_ca") - static boolean __lp_ca; + @Export("mouseCam") + static boolean mouseCam; @ObfuscatedName("q") @Export("pixels") public int[] pixels; diff --git a/rs-client/src/main/java/AbstractSocket.java b/runescape-client/src/main/java/AbstractSocket.java similarity index 100% rename from rs-client/src/main/java/AbstractSocket.java rename to runescape-client/src/main/java/AbstractSocket.java diff --git a/rs-client/src/main/java/AbstractSound.java b/runescape-client/src/main/java/AbstractSound.java similarity index 100% rename from rs-client/src/main/java/AbstractSound.java rename to runescape-client/src/main/java/AbstractSound.java diff --git a/rs-client/src/main/java/AbstractUserComparator.java b/runescape-client/src/main/java/AbstractUserComparator.java similarity index 95% rename from rs-client/src/main/java/AbstractUserComparator.java rename to runescape-client/src/main/java/AbstractUserComparator.java index 2dae4f18da..2ce70ecb9b 100644 --- a/rs-client/src/main/java/AbstractUserComparator.java +++ b/runescape-client/src/main/java/AbstractUserComparator.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("AbstractUserComparator") public abstract class AbstractUserComparator implements Comparator { @ObfuscatedName("f") - @Export("__f") Comparator __f; @ObfuscatedName("e") @@ -16,7 +15,6 @@ public abstract class AbstractUserComparator implements Comparator { signature = "(Ljava/util/Comparator;B)V", garbageValue = "-2" ) - @Export("__e_460") final void __e_460(Comparator var1) { if(this.__f == null) { this.__f = var1; @@ -31,12 +29,10 @@ public abstract class AbstractUserComparator implements Comparator { signature = "(Ljs;Ljs;I)I", garbageValue = "-962181316" ) - @Export("__x_461") protected final int __x_461(User var1, User var2) { return this.__f == null?0:this.__f.compare(var1, var2); } - @Export("__equals_462") @ObfuscatedName("equals") public boolean __equals_462(Object var1) { return super.equals(var1); diff --git a/rs-client/src/main/java/AbstractWorldMapIcon.java b/runescape-client/src/main/java/AbstractWorldMapIcon.java similarity index 96% rename from rs-client/src/main/java/AbstractWorldMapIcon.java rename to runescape-client/src/main/java/AbstractWorldMapIcon.java index c487caa190..f98c6c3107 100644 --- a/rs-client/src/main/java/AbstractWorldMapIcon.java +++ b/runescape-client/src/main/java/AbstractWorldMapIcon.java @@ -11,7 +11,6 @@ public abstract class AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -1942470229 ) - @Export("__ak_qj") static int __ak_qj; @ObfuscatedName("ka") @ObfuscatedGetter( @@ -35,13 +34,11 @@ public abstract class AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -521086143 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1065362217 ) - @Export("__x") int __x; @ObfuscatedSignature( @@ -85,7 +82,6 @@ public abstract class AbstractWorldMapIcon { signature = "(IIB)Z", garbageValue = "-63" ) - @Export("__y_66") boolean __y_66(int var1, int var2) { return this.__b_68(var1, var2)?true:this.__c_69(var1, var2); } @@ -95,7 +91,6 @@ public abstract class AbstractWorldMapIcon { signature = "(I)Z", garbageValue = "1150380891" ) - @Export("__h_67") boolean __h_67() { return this.__m_15() >= 0; } @@ -105,7 +100,6 @@ public abstract class AbstractWorldMapIcon { signature = "(III)Z", garbageValue = "484201257" ) - @Export("__b_68") boolean __b_68(int var1, int var2) { if(!this.__h_67()) { return false; @@ -157,7 +151,6 @@ public abstract class AbstractWorldMapIcon { signature = "(III)Z", garbageValue = "1201712205" ) - @Export("__c_69") boolean __c_69(int var1, int var2) { WorldMapLabel var3 = this.__f_16(); return var3 == null?false:(var1 >= this.__e - var3.width / 2 && var1 <= var3.width / 2 + this.__e?var2 >= this.__x && var2 <= var3.height + this.__x:false); diff --git a/rs-client/src/main/java/AccessFile.java b/runescape-client/src/main/java/AccessFile.java similarity index 80% rename from rs-client/src/main/java/AccessFile.java rename to runescape-client/src/main/java/AccessFile.java index ad6fd753e6..cf25c7a265 100644 --- a/rs-client/src/main/java/AccessFile.java +++ b/runescape-client/src/main/java/AccessFile.java @@ -16,13 +16,11 @@ public final class AccessFile { @ObfuscatedGetter( intValue = -1762891465 ) - @Export("__dk_o") static int __dk_o; @ObfuscatedName("lm") @ObfuscatedSignature( signature = "Lho;" ) - @Export("__dk_lm") static Widget __dk_lm; @ObfuscatedName("m") @Export("file") @@ -142,7 +140,6 @@ public final class AccessFile { return var4; } - @Export("__finalize_211") @ObfuscatedName("finalize") protected void __finalize_211() throws Throwable { if(this.file != null) { @@ -157,31 +154,32 @@ public final class AccessFile { signature = "(Lho;Ljv;IIZI)V", garbageValue = "-728558316" ) - static final void method2726(Widget var0, ItemDefinition var1, int var2, int var3, boolean var4) { - String[] var5 = var1.inventoryActions; - byte var6 = -1; - String var7 = null; - if(var5 != null && var5[var3] != null) { - if(var3 == 0) { - var6 = 33; - } else if(var3 == 1) { - var6 = 34; - } else if(var3 == 2) { - var6 = 35; - } else if(var3 == 3) { - var6 = 36; + @Export("addWidgetItemMenuItem") + static final void addWidgetItemMenuItem(Widget widget, ItemDefinition definition, int var2, int actionIndex, boolean shiftClick) { + String[] var5 = definition.inventoryActions; + byte opcode = -1; + String action = null; + if(var5 != null && var5[actionIndex] != null) { + if(actionIndex == 0) { + opcode = 33; + } else if(actionIndex == 1) { + opcode = 34; + } else if(actionIndex == 2) { + opcode = 35; + } else if(actionIndex == 3) { + opcode = 36; } else { - var6 = 37; + opcode = 37; } - var7 = var5[var3]; - } else if(var3 == 4) { - var6 = 37; - var7 = "Drop"; + action = var5[actionIndex]; + } else if(actionIndex == 4) { + opcode = 37; + action = "Drop"; } - if(var6 != -1 && var7 != null) { - class16.insertMenuItem(var7, BufferedFile.colorStartTag(16748608) + var1.name, var6, var1.id, var2, var0.id, var4); + if(opcode != -1 && action != null) { + class16.insertMenuItem(action, BufferedFile.colorStartTag(0xff9040) + definition.name, opcode, definition.id, var2, widget.id, shiftClick); } } diff --git a/rs-client/src/main/java/Actor.java b/runescape-client/src/main/java/Actor.java similarity index 69% rename from rs-client/src/main/java/Actor.java rename to runescape-client/src/main/java/Actor.java index 4e6b943df3..ecd96ba288 100644 --- a/rs-client/src/main/java/Actor.java +++ b/runescape-client/src/main/java/Actor.java @@ -23,10 +23,8 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 1439711403 ) - @Export("__ac") int __ac; @ObfuscatedName("ay") - @Export("__ay") boolean __ay; @ObfuscatedName("ah") @ObfuscatedGetter( @@ -95,7 +93,6 @@ public abstract class Actor extends Entity { @Export("isAutoChatting") boolean isAutoChatting; @ObfuscatedName("az") - @Export("__az") boolean __az; @ObfuscatedName("au") @ObfuscatedGetter( @@ -152,7 +149,6 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 139384875 ) - @Export("__bc") int __bc; @ObfuscatedName("bo") @ObfuscatedGetter( @@ -200,7 +196,6 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = -1523249259 ) - @Export("__bj") int __bj; @ObfuscatedName("bi") @ObfuscatedGetter( @@ -224,7 +219,6 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 886371765 ) - @Export("__bt") int __bt; @ObfuscatedName("bp") @ObfuscatedGetter( @@ -236,43 +230,36 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 2121599561 ) - @Export("__bf") int __bf; @ObfuscatedName("bh") @ObfuscatedGetter( intValue = 280591281 ) - @Export("__bh") int __bh; @ObfuscatedName("be") @ObfuscatedGetter( intValue = 837989037 ) - @Export("__be") int __be; @ObfuscatedName("bv") @ObfuscatedGetter( intValue = -1857513783 ) - @Export("__bv") int __bv; @ObfuscatedName("bw") @ObfuscatedGetter( intValue = -1630403001 ) - @Export("__bw") int __bw; @ObfuscatedName("cr") @ObfuscatedGetter( intValue = 1367256299 ) - @Export("__cr") int __cr; @ObfuscatedName("cv") @ObfuscatedGetter( intValue = -1723834619 ) - @Export("__cv") int __cv; @ObfuscatedName("ce") @ObfuscatedGetter( @@ -296,13 +283,11 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 1252341007 ) - @Export("__cm") int __cm; @ObfuscatedName("cj") @ObfuscatedGetter( intValue = -336931157 ) - @Export("__cj") int __cj; @ObfuscatedName("cu") @ObfuscatedGetter( @@ -323,13 +308,11 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = -1583514013 ) - @Export("__cq") int __cq; @ObfuscatedName("ch") @ObfuscatedGetter( intValue = 1584102533 ) - @Export("__ch") int __ch; Actor() { @@ -386,6 +369,7 @@ public abstract class Actor extends Entity { signature = "(B)Z", garbageValue = "1" ) + @Export("isVisible") boolean isVisible() { return false; } @@ -395,7 +379,6 @@ public abstract class Actor extends Entity { signature = "(I)V", garbageValue = "1415393262" ) - @Export("__bb_143") final void __bb_143() { this.pathLength = 0; this.__ch = 0; @@ -424,7 +407,7 @@ public abstract class Actor extends Entity { int var10 = -1; int var11 = 0; if(var1 >= 0) { - HitSplatDefinition var12 = class72.getHitSplatDefinition(var1); + HitSplatDefinition var12 = LoginScreenAnimation.getHitSplatDefinition(var1); var10 = var12.__c; var11 = var12.__i; } @@ -583,343 +566,343 @@ public abstract class Actor extends Entity { garbageValue = "493234011" ) @Export("menuAction") - static final void menuAction(int var0, int var1, int var2, int var3, String var4, String var5, int var6, int var7) { - if(var2 >= 2000) { - var2 -= 2000; + static final void menuAction(int arg1, int arg2, int opcode, int arg0, String action, String target, int mouseX, int mouseY) { + if(opcode >= 2000) { + opcode -= 2000; } PacketBufferNode var8; - if(var2 == 1) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_an, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); var8.packetBuffer.writeShortLE(HealthBarDefinition.selectedItemSlot); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var8.packetBuffer.writeIntLE(ServerPacket.selectedItemWidget); - var8.packetBuffer.__bx_323(var0 + class50.baseX); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); + var8.packetBuffer.writeShort(arg0); var8.packetBuffer.writeShortLE(MenuAction.selectedItemId); Client.packetWriter.__q_167(var8); - } else if(var2 == 2) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 2) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cg, Client.packetWriter.isaacCipher); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShort(var0 + class50.baseX); - var8.packetBuffer.__bo_322(var3); + var8.packetBuffer.writeShort(arg1 + class50.baseX); + var8.packetBuffer.__bo_322(arg0); var8.packetBuffer.writeIntLE16(ServerBuild.__iy_lo); var8.packetBuffer.writeShort(Client.__client_lc); - var8.packetBuffer.writeShortLE(GraphicsObject.baseY + var1); + var8.packetBuffer.writeShortLE(GraphicsObject.baseY + arg2); Client.packetWriter.__q_167(var8); - } else if(var2 == 3) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 3) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_d, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(GraphicsObject.baseY + var1); + var8.packetBuffer.writeShort(GraphicsObject.baseY + arg2); var8.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bo_322(var3); - var8.packetBuffer.__bx_323(var0 + class50.baseX); + var8.packetBuffer.__bo_322(arg0); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); Client.packetWriter.__q_167(var8); - } else if(var2 == 4) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 4) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cv, Client.packetWriter.isaacCipher); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShort(var3); - var8.packetBuffer.writeShort(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShort(var0 + class50.baseX); + var8.packetBuffer.writeShort(arg0); + var8.packetBuffer.writeShort(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShort(arg1 + class50.baseX); Client.packetWriter.__q_167(var8); - } else if(var2 == 5) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 5) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cq, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var0 + class50.baseX); - var8.packetBuffer.__bo_322(var3); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); + var8.packetBuffer.__bo_322(arg0); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 6) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 6) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_w, Client.packetWriter.isaacCipher); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.__bo_322(var0 + class50.baseX); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); } else { PacketBufferNode var9; Npc var13; - if(var2 == 7) { - var13 = Client.npcs[var3]; + if(opcode == 7) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_r, Client.packetWriter.isaacCipher); var9.packetBuffer.__bx_323(MenuAction.selectedItemId); var9.packetBuffer.writeShort(HealthBarDefinition.selectedItemSlot); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.writeInt(ServerPacket.selectedItemWidget); Client.packetWriter.__q_167(var9); } - } else if(var2 == 8) { - var13 = Client.npcs[var3]; + } else if(opcode == 8) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cb, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.writeIntLE(ServerBuild.__iy_lo); var9.packetBuffer.__bo_322(Client.__client_lc); Client.packetWriter.__q_167(var9); } - } else if(var2 == 9) { - var13 = Client.npcs[var3]; + } else if(opcode == 9) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bt, Client.packetWriter.isaacCipher); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 10) { - var13 = Client.npcs[var3]; + } else if(opcode == 10) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_f, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 11) { - var13 = Client.npcs[var3]; + } else if(opcode == 11) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_ah, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 12) { - var13 = Client.npcs[var3]; + } else if(opcode == 12) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bc, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); var9.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 13) { - var13 = Client.npcs[var3]; + } else if(opcode == 13) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_ac, Client.packetWriter.isaacCipher); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var9); } } else { Player var15; - if(var2 == 14) { - var15 = Client.players[var3]; + if(opcode == 14) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cy, Client.packetWriter.isaacCipher); var9.packetBuffer.__bx_323(HealthBarDefinition.selectedItemSlot); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.writeIntME(ServerPacket.selectedItemWidget); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); var9.packetBuffer.writeShort(MenuAction.selectedItemId); Client.packetWriter.__q_167(var9); } - } else if(var2 == 15) { - var15 = Client.players[var3]; + } else if(opcode == 15) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bq, Client.packetWriter.isaacCipher); var9.packetBuffer.writeIntLE16(ServerBuild.__iy_lo); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.__bo_322(Client.__client_lc); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 16) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 16) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_t, Client.packetWriter.isaacCipher); var8.packetBuffer.writeIntME(ServerPacket.selectedItemWidget); var8.packetBuffer.__bx_323(MenuAction.selectedItemId); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var8.packetBuffer.writeShortLE(HealthBarDefinition.selectedItemSlot); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.__bx_323(var0 + class50.baseX); - var8.packetBuffer.writeShortLE(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); + var8.packetBuffer.writeShortLE(GraphicsObject.baseY + arg2); Client.packetWriter.__q_167(var8); - } else if(var2 == 17) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 17) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_bb, Client.packetWriter.isaacCipher); var8.packetBuffer.writeIntME(ServerBuild.__iy_lo); var8.packetBuffer.writeShort(Client.__client_lc); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.__bo_322(var0 + class50.baseX); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); - } else if(var2 == 18) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 18) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_u, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShortLE(var3); - var8.packetBuffer.writeShortLE(var0 + class50.baseX); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShortLE(arg0); + var8.packetBuffer.writeShortLE(arg1 + class50.baseX); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 19) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 19) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_bh, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.__bo_322(var0 + class50.baseX); - var8.packetBuffer.writeShort(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); + var8.packetBuffer.writeShort(GraphicsObject.baseY + arg2); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 20) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 20) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_g, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(GraphicsObject.baseY + var1); + var8.packetBuffer.writeShortLE(GraphicsObject.baseY + arg2); var8.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShortLE(var0 + class50.baseX); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeShortLE(arg1 + class50.baseX); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); - } else if(var2 == 21) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 21) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_av, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShortLE(var3); - var8.packetBuffer.writeShort(var0 + class50.baseX); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShortLE(arg0); + var8.packetBuffer.writeShort(arg1 + class50.baseX); var8.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 22) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 22) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_ai, Client.packetWriter.isaacCipher); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShort(var0 + class50.baseX); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShort(arg1 + class50.baseX); Client.packetWriter.__q_167(var8); - } else if(var2 == 23) { + } else if(opcode == 23) { if(Client.isMenuOpen) { class65.scene.__as_250(); } else { - class65.scene.menuOpen(SoundSystem.plane, var0, var1, true); + class65.scene.menuOpen(SoundSystem.plane, arg1, arg2, true); } } else { PacketBufferNode var10; Widget var16; - if(var2 == 24) { - var16 = Huffman.getWidget(var1); + if(opcode == 24) { + var16 = Huffman.getWidget(arg2); boolean var12 = true; if(var16.contentType > 0) { var12 = ViewportMouse.method2957(var16); @@ -927,15 +910,15 @@ public abstract class Actor extends Entity { if(var12) { var10 = Interpreter.method1915(ClientPacket.__gs_bz, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); + var10.packetBuffer.writeInt(arg2); Client.packetWriter.__q_167(var10); } } else { - if(var2 == 25) { - var16 = class204.getWidgetChild(var1, var0); + if(opcode == 25) { + var16 = class204.getWidgetChild(arg2, arg1); if(var16 != null) { Player.method1281(); - class25.method350(var1, var0, class211.method4107(class1.getWidgetClickMask(var16)), var16.itemId); + class25.method350(arg2, arg1, class211.method4107(class1.getWidgetClickMask(var16)), var16.itemId); Client.isItemSelected = 0; Client.selectedSpellActionName = class198.method3745(var16); if(Client.selectedSpellActionName == null) { @@ -952,26 +935,26 @@ public abstract class Actor extends Entity { return; } - if(var2 == 26) { + if(opcode == 26) { WorldMapLabelSize.method198(); } else { int var11; Widget var14; - if(var2 == 28) { + if(opcode == 28) { var8 = Interpreter.method1915(ClientPacket.__gs_bz, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); + var8.packetBuffer.writeInt(arg2); Client.packetWriter.__q_167(var8); - var14 = Huffman.getWidget(var1); + var14 = Huffman.getWidget(arg2); if(var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { var11 = var14.cs1Instructions[0][1]; Varps.Varps_main[var11] = 1 - Varps.Varps_main[var11]; IndexCache.method4703(var11); } - } else if(var2 == 29) { + } else if(opcode == 29) { var8 = Interpreter.method1915(ClientPacket.__gs_bz, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); + var8.packetBuffer.writeInt(arg2); Client.packetWriter.__q_167(var8); - var14 = Huffman.getWidget(var1); + var14 = Huffman.getWidget(arg2); if(var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { var11 = var14.cs1Instructions[0][1]; if(Varps.Varps_main[var11] != var14.cs1ComparisonValues[0]) { @@ -979,90 +962,90 @@ public abstract class Actor extends Entity { IndexCache.method4703(var11); } } - } else if(var2 == 30) { + } else if(opcode == 30) { if(Client.__client_mo == null) { - TilePaint.method3060(var1, var0); - Client.__client_mo = class204.getWidgetChild(var1, var0); + TilePaint.method3060(arg2, arg1); + Client.__client_mo = class204.getWidgetChild(arg2, arg1); class22.method295(Client.__client_mo); } - } else if(var2 == 31) { + } else if(opcode == 31) { var8 = Interpreter.method1915(ClientPacket.__gs_bu, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntME(var1); + var8.packetBuffer.writeIntME(arg2); var8.packetBuffer.writeIntLE16(ServerPacket.selectedItemWidget); var8.packetBuffer.__bx_323(HealthBarDefinition.selectedItemSlot); var8.packetBuffer.writeShortLE(MenuAction.selectedItemId); - var8.packetBuffer.writeShortLE(var0); - var8.packetBuffer.__bx_323(var3); + var8.packetBuffer.writeShortLE(arg1); + var8.packetBuffer.__bx_323(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 32) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 32) { var8 = Interpreter.method1915(ClientPacket.__gs_q, Client.packetWriter.isaacCipher); var8.packetBuffer.writeIntME(ServerBuild.__iy_lo); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.writeShort(var0); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.writeShort(arg1); + var8.packetBuffer.writeShortLE(arg0); var8.packetBuffer.writeShortLE(Client.__client_lc); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 33) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 33) { var8 = Interpreter.method1915(ClientPacket.__gs_ck, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(var3); - var8.packetBuffer.writeIntME(var1); - var8.packetBuffer.writeShort(var0); + var8.packetBuffer.writeShortLE(arg0); + var8.packetBuffer.writeIntME(arg2); + var8.packetBuffer.writeShort(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 34) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 34) { var8 = Interpreter.method1915(ClientPacket.__gs_cc, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bo_322(var3); - var8.packetBuffer.writeIntLE16(var1); - var8.packetBuffer.__bx_323(var0); + var8.packetBuffer.__bo_322(arg0); + var8.packetBuffer.writeIntLE16(arg2); + var8.packetBuffer.__bx_323(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 35) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 35) { var8 = Interpreter.method1915(ClientPacket.__gs_bp, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntLE(var1); - var8.packetBuffer.__bx_323(var0); - var8.packetBuffer.__bx_323(var3); + var8.packetBuffer.writeIntLE(arg2); + var8.packetBuffer.__bx_323(arg1); + var8.packetBuffer.__bx_323(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 36) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 36) { var8 = Interpreter.method1915(ClientPacket.__gs_l, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.__bx_323(var0); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.__bx_323(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 37) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 37) { var8 = Interpreter.method1915(ClientPacket.__gs_bd, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.writeShort(var0); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.writeShort(arg1); + var8.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; } else { - if(var2 == 38) { + if(opcode == 38) { Player.method1281(); - var16 = Huffman.getWidget(var1); + var16 = Huffman.getWidget(arg2); Client.isItemSelected = 1; - HealthBarDefinition.selectedItemSlot = var0; - ServerPacket.selectedItemWidget = var1; - MenuAction.selectedItemId = var3; + HealthBarDefinition.selectedItemSlot = arg1; + ServerPacket.selectedItemWidget = arg2; + MenuAction.selectedItemId = arg0; class22.method295(var16); - Client.selectedItemName = BufferedFile.colorStartTag(16748608) + Skills.getItemDefinition(var3).name + BufferedFile.colorStartTag(16777215); + Client.selectedItemName = BufferedFile.colorStartTag(16748608) + Skills.getItemDefinition(arg0).name + BufferedFile.colorStartTag(16777215); if(Client.selectedItemName == null) { Client.selectedItemName = "null"; } @@ -1070,174 +1053,174 @@ public abstract class Actor extends Entity { return; } - if(var2 == 39) { + if(opcode == 39) { var8 = Interpreter.method1915(ClientPacket.__gs_au, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.writeIntLE16(var1); - var8.packetBuffer.writeShortLE(var0); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.writeIntLE16(arg2); + var8.packetBuffer.writeShortLE(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 40) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 40) { var8 = Interpreter.method1915(ClientPacket.__gs_ag, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntLE16(var1); - var8.packetBuffer.writeShortLE(var0); - var8.packetBuffer.__bo_322(var3); + var8.packetBuffer.writeIntLE16(arg2); + var8.packetBuffer.writeShortLE(arg1); + var8.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 41) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 41) { var8 = Interpreter.method1915(ClientPacket.__gs_bl, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntLE(var1); - var8.packetBuffer.__bo_322(var0); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeIntLE(arg2); + var8.packetBuffer.__bo_322(arg1); + var8.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 42) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 42) { var8 = Interpreter.method1915(ClientPacket.__gs_bm, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.__bo_322(var0); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.__bo_322(arg1); + var8.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 43) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 43) { var8 = Interpreter.method1915(ClientPacket.__gs_ay, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(var3); - var8.packetBuffer.writeIntME(var1); - var8.packetBuffer.writeShort(var0); + var8.packetBuffer.writeShort(arg0); + var8.packetBuffer.writeIntME(arg2); + var8.packetBuffer.writeShort(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 44) { - var15 = Client.players[var3]; + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 44) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_ao, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 45) { - var15 = Client.players[var3]; + } else if(opcode == 45) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bn, Client.packetWriter.isaacCipher); var9.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 46) { - var15 = Client.players[var3]; + } else if(opcode == 46) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_by, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 47) { - var15 = Client.players[var3]; + } else if(opcode == 47) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_aq, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 48) { - var15 = Client.players[var3]; + } else if(opcode == 48) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cm, Client.packetWriter.isaacCipher); var9.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 49) { - var15 = Client.players[var3]; + } else if(opcode == 49) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cf, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 50) { - var15 = Client.players[var3]; + } else if(opcode == 50) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_be, Client.packetWriter.isaacCipher); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 51) { - var15 = Client.players[var3]; + } else if(opcode == 51) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_af, Client.packetWriter.isaacCipher); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); Client.packetWriter.__q_167(var9); } } else { label921: { - if(var2 != 57) { - if(var2 == 58) { - var16 = class204.getWidgetChild(var1, var0); + if(opcode != 57) { + if(opcode == 58) { + var16 = class204.getWidgetChild(arg2, arg1); if(var16 != null) { var9 = Interpreter.method1915(ClientPacket.__gs_cs, Client.packetWriter.isaacCipher); var9.packetBuffer.writeShortLE(Client.__client_lc); - var9.packetBuffer.writeIntLE16(var1); + var9.packetBuffer.writeIntLE16(arg2); var9.packetBuffer.writeShortLE(Client.__client_mh); - var9.packetBuffer.__bx_323(var0); + var9.packetBuffer.__bx_323(arg1); var9.packetBuffer.writeInt(ServerBuild.__iy_lo); var9.packetBuffer.__bx_323(var16.itemId); Client.packetWriter.__q_167(var9); @@ -1245,39 +1228,39 @@ public abstract class Actor extends Entity { break label921; } - if(var2 == 1001) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1001) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cp, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeShort(arg0); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bo_322(var0 + class50.baseX); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); Client.packetWriter.__q_167(var8); break label921; } - if(var2 == 1002) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1002) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; var8 = Interpreter.method1915(ClientPacket.__gs_al, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bo_322(var3); + var8.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var8); break label921; } - if(var2 == 1003) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1003) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - var13 = Client.npcs[var3]; + var13 = Client.npcs[arg0]; if(var13 != null) { NpcDefinition var17 = var13.definition; if(var17.transforms != null) { @@ -1293,44 +1276,44 @@ public abstract class Actor extends Entity { break label921; } - if(var2 == 1004) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1004) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; var8 = Interpreter.method1915(ClientPacket.__gs_p, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); break label921; } - if(var2 == 1005) { - var16 = Huffman.getWidget(var1); - if(var16 != null && var16.itemQuantities[var0] >= 100000) { - WorldMapIcon1.method219(27, "", var16.itemQuantities[var0] + " x " + Skills.getItemDefinition(var3).name); + if(opcode == 1005) { + var16 = Huffman.getWidget(arg2); + if(var16 != null && var16.itemQuantities[arg1] >= 100000) { + WorldMapIcon1.method219(27, "", var16.itemQuantities[arg1] + " x " + Skills.getItemDefinition(arg0).name); } else { var9 = Interpreter.method1915(ClientPacket.__gs_p, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var9); } Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; break label921; } - if(var2 != 1007) { - if(var2 == 1008 || var2 == 1011 || var2 == 1010 || var2 == 1009 || var2 == 1012) { - class60.worldMap0.menuAction(var2, var3, new TileLocation(var0), new TileLocation(var1)); + if(opcode != 1007) { + if(opcode == 1008 || opcode == 1011 || opcode == 1010 || opcode == 1009 || opcode == 1012) { + class60.worldMap0.menuAction(opcode, arg0, new TileLocation(arg1), new TileLocation(arg2)); } break label921; } } - var16 = class204.getWidgetChild(var1, var0); + var16 = class204.getWidgetChild(arg2, arg1); if(var16 != null) { - class171.method3494(var3, var1, var0, var16.itemId, var5); + class171.method3494(arg0, arg2, arg1, var16.itemId, target); } } } diff --git a/rs-client/src/main/java/Animation.java b/runescape-client/src/main/java/Animation.java similarity index 97% rename from rs-client/src/main/java/Animation.java rename to runescape-client/src/main/java/Animation.java index a6157a7c73..826dd5043d 100644 --- a/rs-client/src/main/java/Animation.java +++ b/runescape-client/src/main/java/Animation.java @@ -7,16 +7,12 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Animation") public class Animation { @ObfuscatedName("m") - @Export("__dz_m") static int[] __dz_m; @ObfuscatedName("f") - @Export("__dz_f") static int[] __dz_f; @ObfuscatedName("q") - @Export("__dz_q") static int[] __dz_q; @ObfuscatedName("w") - @Export("__dz_w") static int[] __dz_w; @ObfuscatedName("o") @ObfuscatedSignature( diff --git a/rs-client/src/main/java/AttackOption.java b/runescape-client/src/main/java/AttackOption.java similarity index 98% rename from rs-client/src/main/java/AttackOption.java rename to runescape-client/src/main/java/AttackOption.java index 3395856851..49787eda2c 100644 --- a/rs-client/src/main/java/AttackOption.java +++ b/runescape-client/src/main/java/AttackOption.java @@ -34,17 +34,15 @@ public enum AttackOption implements Enumerated { @Export("AttackOption_hidden") AttackOption_hidden(3); @ObfuscatedName("sp") - @Export("__cj_sp") static short[] __cj_sp; @ObfuscatedName("ay") - @Export("__cj_ay") static String __cj_ay; @ObfuscatedName("bo") @ObfuscatedSignature( signature = "[Llq;" ) - @Export("__cj_bo") - static IndexedSprite[] __cj_bo; + @Export("worldSelectArrows") + static IndexedSprite[] worldSelectArrows; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -1461217963 @@ -61,6 +59,7 @@ public enum AttackOption implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } diff --git a/rs-client/src/main/java/AudioFilter.java b/runescape-client/src/main/java/AudioFilter.java similarity index 94% rename from rs-client/src/main/java/AudioFilter.java rename to runescape-client/src/main/java/AudioFilter.java index 84c98f85b8..4c84f460d0 100644 --- a/rs-client/src/main/java/AudioFilter.java +++ b/runescape-client/src/main/java/AudioFilter.java @@ -7,28 +7,20 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("AudioFilter") public class AudioFilter { @ObfuscatedName("u") - @Export("__di_u") static float[][] __di_u; @ObfuscatedName("g") - @Export("__di_g") static int[][] __di_g; @ObfuscatedName("l") - @Export("__di_l") static float __di_l; @ObfuscatedName("e") - @Export("__di_e") static int __di_e; @ObfuscatedName("m") - @Export("__m") int[] __m; @ObfuscatedName("q") - @Export("__q") int[][][] __q; @ObfuscatedName("w") - @Export("__w") int[][][] __w; @ObfuscatedName("o") - @Export("__o") int[] __o; static { @@ -44,7 +36,6 @@ public class AudioFilter { } @ObfuscatedName("m") - @Export("__m_205") float __m_205(int var1, int var2, float var3) { float var4 = (float)this.__w[var1][0][var2] + var3 * (float)(this.__w[var1][1][var2] - this.__w[var1][0][var2]); var4 *= 0.0015258789F; @@ -52,7 +43,6 @@ public class AudioFilter { } @ObfuscatedName("q") - @Export("__q_206") float __q_206(int var1, int var2, float var3) { float var4 = (float)this.__q[var1][0][var2] + var3 * (float)(this.__q[var1][1][var2] - this.__q[var1][0][var2]); var4 *= 1.2207031E-4F; @@ -60,7 +50,6 @@ public class AudioFilter { } @ObfuscatedName("w") - @Export("__w_207") int __w_207(int var1, float var2) { float var3; if(var1 == 0) { @@ -111,7 +100,6 @@ public class AudioFilter { @ObfuscatedSignature( signature = "(Lgr;Lde;)V" ) - @Export("__o_208") final void __o_208(Buffer var1, SoundEnvelope var2) { int var3 = var1.readUnsignedByte(); this.__m[0] = var3 >> 4; diff --git a/rs-client/src/main/java/BoundaryObject.java b/runescape-client/src/main/java/BoundaryObject.java similarity index 94% rename from rs-client/src/main/java/BoundaryObject.java rename to runescape-client/src/main/java/BoundaryObject.java index 607e7880e8..8c65d3323a 100644 --- a/rs-client/src/main/java/BoundaryObject.java +++ b/runescape-client/src/main/java/BoundaryObject.java @@ -11,7 +11,6 @@ public final class BoundaryObject { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__ej_jv") static Widget __ej_jv; @ObfuscatedName("m") @ObfuscatedGetter( @@ -78,10 +77,11 @@ public final class BoundaryObject { signature = "(Ljava/lang/String;B)V", garbageValue = "103" ) - static final void method3235(String var0) { + @Export("doCheat") + static final void doCheat(String var0) { if(var0.equalsIgnoreCase("toggleroof")) { ReflectionCheck.clientPreferences.roofsHidden = !ReflectionCheck.clientPreferences.roofsHidden; - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); if(ReflectionCheck.clientPreferences.roofsHidden) { WorldMapIcon1.method219(99, "", "Roofs are now all hidden"); } else { @@ -107,7 +107,7 @@ public final class BoundaryObject { } if(var0.equalsIgnoreCase("showcoord")) { - class60.worldMap0.__bc = !class60.worldMap0.__bc; + class60.worldMap0.showCoord = !class60.worldMap0.showCoord; } if(var0.equalsIgnoreCase("fpson")) { diff --git a/rs-client/src/main/java/Bounds.java b/runescape-client/src/main/java/Bounds.java similarity index 93% rename from rs-client/src/main/java/Bounds.java rename to runescape-client/src/main/java/Bounds.java index f265d60cf0..45b2743682 100644 --- a/rs-client/src/main/java/Bounds.java +++ b/runescape-client/src/main/java/Bounds.java @@ -11,25 +11,21 @@ public class Bounds { @ObfuscatedGetter( intValue = -2004088829 ) - @Export("__m") public int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1887298731 ) - @Export("__f") public int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 2001187823 ) - @Export("__q") public int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 1377856837 ) - @Export("__w") public int __w; public Bounds(int var1, int var2, int var3, int var4) { @@ -46,7 +42,6 @@ public class Bounds { signature = "(IIB)V", garbageValue = "1" ) - @Export("__m_487") public void __m_487(int var1, int var2) { this.__m = var1; this.__f = var2; @@ -57,7 +52,6 @@ public class Bounds { signature = "(III)V", garbageValue = "-11269827" ) - @Export("__f_488") public void __f_488(int var1, int var2) { this.__q = var1; this.__w = var2; @@ -68,7 +62,6 @@ public class Bounds { signature = "(Lla;Lla;I)V", garbageValue = "-2123792170" ) - @Export("__q_490") public void __q_490(Bounds var1, Bounds var2) { this.__w_491(var1, var2); this.__o_492(var1, var2); @@ -79,7 +72,6 @@ public class Bounds { signature = "(Lla;Lla;I)V", garbageValue = "314675149" ) - @Export("__w_491") void __w_491(Bounds var1, Bounds var2) { var2.__m = this.__m; var2.__q = this.__q; @@ -103,7 +95,6 @@ public class Bounds { signature = "(Lla;Lla;S)V", garbageValue = "128" ) - @Export("__o_492") void __o_492(Bounds var1, Bounds var2) { var2.__f = this.__f; var2.__w = this.__w; @@ -127,7 +118,6 @@ public class Bounds { signature = "(I)I", garbageValue = "-1842151293" ) - @Export("__u_493") int __u_493() { return this.__m + this.__q; } @@ -137,12 +127,10 @@ public class Bounds { signature = "(B)I", garbageValue = "-22" ) - @Export("__g_494") int __g_494() { return this.__f + this.__w; } - @Export("__toString_489") @ObfuscatedName("toString") public String __toString_489() { return null; diff --git a/rs-client/src/main/java/Buddy.java b/runescape-client/src/main/java/Buddy.java similarity index 96% rename from rs-client/src/main/java/Buddy.java rename to runescape-client/src/main/java/Buddy.java index 12b1fe48b4..42a54d7e6b 100644 --- a/rs-client/src/main/java/Buddy.java +++ b/runescape-client/src/main/java/Buddy.java @@ -66,7 +66,8 @@ public class Buddy extends User { signature = "(I)V", garbageValue = "1868787018" ) - static final void method5554() { + @Export("processOverheadText") + static final void processOverheadText() { int[] var0 = Players.Players_indices; int var1; diff --git a/rs-client/src/main/java/Buffer.java b/runescape-client/src/main/java/Buffer.java similarity index 96% rename from rs-client/src/main/java/Buffer.java rename to runescape-client/src/main/java/Buffer.java index a278f911ea..c711dc32c1 100644 --- a/rs-client/src/main/java/Buffer.java +++ b/runescape-client/src/main/java/Buffer.java @@ -9,10 +9,8 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Buffer") public class Buffer extends Node { @ObfuscatedName("q") - @Export("__gr_q") static int[] __gr_q; @ObfuscatedName("o") - @Export("__gr_o") static long[] __gr_o; @ObfuscatedName("m") @Export("array") @@ -75,7 +73,6 @@ public class Buffer extends Node { signature = "(S)V", garbageValue = "13572" ) - @Export("__f_295") public void __f_295() { if(this.array != null) { VertexNormal.method2984(this.array); @@ -202,7 +199,6 @@ public class Buffer extends Node { signature = "(Ljava/lang/CharSequence;B)V", garbageValue = "58" ) - @Export("__j_296") public void __j_296(CharSequence var1) { int var3 = var1.length(); int var4 = 0; @@ -228,7 +224,6 @@ public class Buffer extends Node { signature = "([BIII)V", garbageValue = "-1915344405" ) - @Export("__s_297") public void __s_297(byte[] var1, int var2, int var3) { for(int var4 = var2; var4 < var3 + var2; ++var4) { this.array[++this.index - 1] = var1[var4]; @@ -241,7 +236,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-225163682" ) - @Export("__t_298") public void __t_298(int var1) { this.array[this.index - var1 - 4] = (byte)(var1 >> 24); this.array[this.index - var1 - 3] = (byte)(var1 >> 16); @@ -254,7 +248,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-1298210761" ) - @Export("__y_299") public void __y_299(int var1) { this.array[this.index - var1 - 2] = (byte)(var1 >> 8); this.array[this.index - var1 - 1] = (byte)var1; @@ -265,7 +258,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-1839722163" ) - @Export("__h_300") public void __h_300(int var1) { this.array[this.index - var1 - 1] = (byte)var1; } @@ -291,7 +283,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "820873705" ) - @Export("__c_301") public void __c_301(int var1) { if((var1 & -128) != 0) { if((var1 & -16384) != 0) { @@ -337,7 +328,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-86" ) - @Export("__ag_302") public int __ag_302() { this.index += 2; return (this.array[this.index - 1] & 255) + ((this.array[this.index - 2] & 255) << 8); @@ -348,7 +338,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "1" ) - @Export("__aq_303") public int __aq_303() { this.index += 2; int var1 = (this.array[this.index - 1] & 255) + ((this.array[this.index - 2] & 255) << 8); @@ -462,7 +451,6 @@ public class Buffer extends Node { signature = "(B)Ljava/lang/String;", garbageValue = "-14" ) - @Export("__aw_304") public String __aw_304() { byte var1 = this.array[++this.index - 1]; if(var1 != 0) { @@ -535,7 +523,6 @@ public class Buffer extends Node { signature = "([BIIB)V", garbageValue = "-122" ) - @Export("__al_305") public void __al_305(byte[] var1, int var2, int var3) { for(int var4 = var2; var4 < var3 + var2; ++var4) { var1[var4] = this.array[++this.index - 1]; @@ -548,7 +535,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-24" ) - @Export("__ab_306") public int __ab_306() { int var1 = this.array[this.index] & 255; return var1 < 128?this.readUnsignedByte() - 64:this.__ag_302() - 49152; @@ -559,7 +545,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "1370512869" ) - @Export("__ae_307") public int __ae_307() { int var1 = this.array[this.index] & 255; return var1 < 128?this.readUnsignedByte():this.__ag_302() - 32768; @@ -570,7 +555,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "1177684230" ) - @Export("__at_308") public int __at_308() { int var1 = 0; @@ -588,7 +572,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "103" ) - @Export("__ad_309") public int __ad_309() { return this.array[this.index] < 0?this.readInt() & Integer.MAX_VALUE:this.__ag_302(); } @@ -598,7 +581,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1151173205" ) - @Export("__ap_310") public int __ap_310() { if(this.array[this.index] < 0) { return this.readInt() & Integer.MAX_VALUE; @@ -613,7 +595,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "984135559" ) - @Export("__as_311") public int __as_311() { byte var1 = this.array[++this.index - 1]; @@ -765,7 +746,6 @@ public class Buffer extends Node { signature = "(II)I", garbageValue = "-484928770" ) - @Export("__aa_312") public int __aa_312(int var1) { byte[] var3 = this.array; int var4 = this.index; @@ -785,7 +765,6 @@ public class Buffer extends Node { signature = "(B)Z", garbageValue = "-11" ) - @Export("__ax_313") public boolean __ax_313() { this.index -= 4; byte[] var2 = this.array; @@ -807,7 +786,6 @@ public class Buffer extends Node { signature = "(IB)V", garbageValue = "-47" ) - @Export("__af_314") public void __af_314(int var1) { this.array[++this.index - 1] = (byte)(var1 + 128); } @@ -817,7 +795,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-1336494664" ) - @Export("__ai_315") public void __ai_315(int var1) { this.array[++this.index - 1] = (byte)(0 - var1); } @@ -827,7 +804,6 @@ public class Buffer extends Node { signature = "(IB)V", garbageValue = "21" ) - @Export("__ba_316") public void __ba_316(int var1) { this.array[++this.index - 1] = (byte)(128 - var1); } @@ -837,7 +813,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-86972759" ) - @Export("__bb_317") public int __bb_317() { return this.array[++this.index - 1] - 128 & 255; } @@ -857,7 +832,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "359814653" ) - @Export("__bq_318") public int __bq_318() { return 128 - this.array[++this.index - 1] & 255; } @@ -867,7 +841,6 @@ public class Buffer extends Node { signature = "(I)B", garbageValue = "2130167320" ) - @Export("__bn_319") public byte __bn_319() { return (byte)(this.array[++this.index - 1] - 128); } @@ -877,7 +850,6 @@ public class Buffer extends Node { signature = "(I)B", garbageValue = "1415936818" ) - @Export("__bk_320") public byte __bk_320() { return (byte)(0 - this.array[++this.index - 1]); } @@ -887,7 +859,6 @@ public class Buffer extends Node { signature = "(I)B", garbageValue = "1496705333" ) - @Export("__bd_321") public byte __bd_321() { return (byte)(128 - this.array[++this.index - 1]); } @@ -908,7 +879,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "189694315" ) - @Export("__bo_322") public void __bo_322(int var1) { this.array[++this.index - 1] = (byte)(var1 >> 8); this.array[++this.index - 1] = (byte)(var1 + 128); @@ -919,7 +889,6 @@ public class Buffer extends Node { signature = "(IB)V", garbageValue = "-7" ) - @Export("__bx_323") public void __bx_323(int var1) { this.array[++this.index - 1] = (byte)(var1 + 128); this.array[++this.index - 1] = (byte)(var1 >> 8); @@ -930,7 +899,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "2147134369" ) - @Export("__by_324") public int __by_324() { this.index += 2; return ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] & 255); @@ -941,7 +909,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1489217204" ) - @Export("__bu_325") public int __bu_325() { this.index += 2; return (this.array[this.index - 1] - 128 & 255) + ((this.array[this.index - 2] & 255) << 8); @@ -952,7 +919,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-86" ) - @Export("__bm_326") public int __bm_326() { this.index += 2; return ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] - 128 & 255); @@ -963,7 +929,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "54" ) - @Export("__bl_327") public int __bl_327() { this.index += 2; int var1 = ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] & 255); @@ -979,7 +944,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "388487388" ) - @Export("__br_328") public int __br_328() { this.index += 2; int var1 = ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] - 128 & 255); @@ -995,7 +959,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-88751042" ) - @Export("__bj_329") public int __bj_329() { this.index += 3; return (this.array[this.index - 3] & 255) + ((this.array[this.index - 2] & 255) << 8) + ((this.array[this.index - 1] & 255) << 16); @@ -1045,7 +1008,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1322860835" ) - @Export("__bt_330") public int __bt_330() { this.index += 4; return (this.array[this.index - 4] & 255) + ((this.array[this.index - 3] & 255) << 8) + ((this.array[this.index - 2] & 255) << 16) + ((this.array[this.index - 1] & 255) << 24); @@ -1056,7 +1018,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1731171028" ) - @Export("__bp_331") public int __bp_331() { this.index += 4; return ((this.array[this.index - 2] & 255) << 24) + ((this.array[this.index - 4] & 255) << 8) + (this.array[this.index - 3] & 255) + ((this.array[this.index - 1] & 255) << 16); @@ -1067,7 +1028,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-126" ) - @Export("__bf_332") public int __bf_332() { this.index += 4; return ((this.array[this.index - 1] & 255) << 8) + ((this.array[this.index - 4] & 255) << 16) + (this.array[this.index - 2] & 255) + ((this.array[this.index - 3] & 255) << 24); @@ -1078,7 +1038,6 @@ public class Buffer extends Node { signature = "([BIII)V", garbageValue = "1303287859" ) - @Export("__bh_333") public void __bh_333(byte[] var1, int var2, int var3) { for(int var4 = var2; var4 < var3 + var2; ++var4) { var1[var4] = (byte)(this.array[++this.index - 1] - 128); @@ -1091,7 +1050,8 @@ public class Buffer extends Node { signature = "(B)V", garbageValue = "1" ) - public static void method3915() { + @Export("clearHealthbarCaches") + public static void clearHealthbarCaches() { HealthBarDefinition.HealthBarDefinition_cached.clear(); HealthBarDefinition.HealthBarDefinition_cachedSprites.clear(); } diff --git a/rs-client/src/main/java/BufferedFile.java b/runescape-client/src/main/java/BufferedFile.java similarity index 98% rename from rs-client/src/main/java/BufferedFile.java rename to runescape-client/src/main/java/BufferedFile.java index c6217ee7c9..5b4292d34b 100644 --- a/rs-client/src/main/java/BufferedFile.java +++ b/runescape-client/src/main/java/BufferedFile.java @@ -23,13 +23,11 @@ public class BufferedFile { @ObfuscatedGetter( longValue = -7773729680030815835L ) - @Export("__q") long __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -846810907 ) - @Export("__w") int __w; @ObfuscatedName("o") @Export("writeBuffer") @@ -38,25 +36,21 @@ public class BufferedFile { @ObfuscatedGetter( longValue = 5249231081498323007L ) - @Export("__u") long __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -1558233611 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( longValue = -6819476051574242871L ) - @Export("__l") long __l; @ObfuscatedName("e") @ObfuscatedGetter( longValue = -3728247331531750871L ) - @Export("__e") long __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -68,7 +62,6 @@ public class BufferedFile { @ObfuscatedGetter( longValue = 5720856138805191881L ) - @Export("__d") long __d; @ObfuscatedSignature( diff --git a/rs-client/src/main/java/BufferedNetSocket.java b/runescape-client/src/main/java/BufferedNetSocket.java similarity index 95% rename from rs-client/src/main/java/BufferedNetSocket.java rename to runescape-client/src/main/java/BufferedNetSocket.java index c954347832..1b5b13c43e 100644 --- a/rs-client/src/main/java/BufferedNetSocket.java +++ b/runescape-client/src/main/java/BufferedNetSocket.java @@ -39,6 +39,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(II)Z", garbageValue = "1765046516" ) + @Export("isAvailable") public boolean isAvailable(int var1) throws IOException { return this.source.isAvailable(var1); } @@ -48,6 +49,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(I)I", garbageValue = "-1078471130" ) + @Export("available") public int available() throws IOException { return this.source.available(); } @@ -57,6 +59,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(I)I", garbageValue = "516705222" ) + @Export("readUnsignedByte") public int readUnsignedByte() throws IOException { return this.source.readUnsignedByte(); } @@ -66,6 +69,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "([BIII)I", garbageValue = "-1089665746" ) + @Export("read") public int read(byte[] var1, int var2, int var3) throws IOException { return this.source.read(var1, var2, var3); } @@ -75,6 +79,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "([BIIB)V", garbageValue = "-86" ) + @Export("write") public void write(byte[] var1, int var2, int var3) throws IOException { this.sink.write(var1, var2, var3); } @@ -84,6 +89,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(I)V", garbageValue = "-1252618448" ) + @Export("close") public void close() { this.sink.close(); @@ -96,7 +102,6 @@ public class BufferedNetSocket extends AbstractSocket { this.source.close(); } - @Export("__finalize_280") @ObfuscatedName("finalize") protected void __finalize_280() { this.close(); diff --git a/rs-client/src/main/java/BufferedSink.java b/runescape-client/src/main/java/BufferedSink.java similarity index 100% rename from rs-client/src/main/java/BufferedSink.java rename to runescape-client/src/main/java/BufferedSink.java diff --git a/rs-client/src/main/java/BufferedSource.java b/runescape-client/src/main/java/BufferedSource.java similarity index 99% rename from rs-client/src/main/java/BufferedSource.java rename to runescape-client/src/main/java/BufferedSource.java index f0aee8a0c5..5069205f88 100644 --- a/rs-client/src/main/java/BufferedSource.java +++ b/runescape-client/src/main/java/BufferedSource.java @@ -14,7 +14,6 @@ public class BufferedSource implements Runnable { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__fh_x") public static AbstractIndexCache __fh_x; @ObfuscatedName("m") @Export("thread") diff --git a/rs-client/src/main/java/ByteArrayNode.java b/runescape-client/src/main/java/ByteArrayNode.java similarity index 100% rename from rs-client/src/main/java/ByteArrayNode.java rename to runescape-client/src/main/java/ByteArrayNode.java diff --git a/rs-client/src/main/java/ByteArrayPool.java b/runescape-client/src/main/java/ByteArrayPool.java similarity index 94% rename from rs-client/src/main/java/ByteArrayPool.java rename to runescape-client/src/main/java/ByteArrayPool.java index 97268c74fd..8ac8278150 100644 --- a/rs-client/src/main/java/ByteArrayPool.java +++ b/runescape-client/src/main/java/ByteArrayPool.java @@ -35,7 +35,6 @@ public class ByteArrayPool { @Export("ByteArrayPool_large") static byte[][] ByteArrayPool_large; @ObfuscatedName("g") - @Export("__gi_g") static int[] __gi_g; @ObfuscatedName("dz") @ObfuscatedSignature( @@ -91,15 +90,15 @@ public class ByteArrayPool { return var2; } - if(class179.__fe_e != null) { + if(RouteStrategy.__fe_e != null) { for(int var4 = 0; var4 < __gi_g.length; ++var4) { if(__gi_g[var4] != var0) { if(var0 < __gi_g[var4]) { ; } } else if(WorldMapSection2.__ah_l[var4] > 0) { - byte[] var3 = class179.__fe_e[var4][--WorldMapSection2.__ah_l[var4]]; - class179.__fe_e[var4][WorldMapSection2.__ah_l[var4]] = null; + byte[] var3 = RouteStrategy.__fe_e[var4][--WorldMapSection2.__ah_l[var4]]; + RouteStrategy.__fe_e[var4][WorldMapSection2.__ah_l[var4]] = null; return var3; } } diff --git a/rs-client/src/main/java/Bzip2Decompressor.java b/runescape-client/src/main/java/Bzip2Decompressor.java similarity index 100% rename from rs-client/src/main/java/Bzip2Decompressor.java rename to runescape-client/src/main/java/Bzip2Decompressor.java diff --git a/rs-client/src/main/java/Bzip2State.java b/runescape-client/src/main/java/Bzip2State.java similarity index 82% rename from rs-client/src/main/java/Bzip2State.java rename to runescape-client/src/main/java/Bzip2State.java index aca4b3ea42..41c6b17ddc 100644 --- a/rs-client/src/main/java/Bzip2State.java +++ b/runescape-client/src/main/java/Bzip2State.java @@ -7,163 +7,125 @@ import net.runelite.mapping.ObfuscatedName; @Implements("Bzip2State") public final class Bzip2State { @ObfuscatedName("m") - @Export("__m") final int __m; @ObfuscatedName("f") - @Export("__f") final int __f; @ObfuscatedName("q") - @Export("__q") final int __q; @ObfuscatedName("w") - @Export("__w") final int __w; @ObfuscatedName("o") - @Export("__o") final int __o; @ObfuscatedName("u") - @Export("__u") final int __u; @ObfuscatedName("g") - @Export("__g") byte[] __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -1510817847 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -473971741 ) - @Export("__e") int __e; @ObfuscatedName("x") - @Export("__x") byte[] __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = -861462251 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( intValue = 594179173 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 1860254567 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") - @Export("__i") byte __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -1994129645 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1793367959 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = -1987934943 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 1172102327 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = 1502359789 ) - @Export("__t") int __t; @ObfuscatedName("y") @ObfuscatedGetter( intValue = -953353963 ) - @Export("__y") int __y; @ObfuscatedName("h") @ObfuscatedGetter( intValue = -1981923611 ) - @Export("__h") int __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") @ObfuscatedGetter( intValue = -557334365 ) - @Export("__c") int __c; @ObfuscatedName("r") - @Export("__r") int[] __r; @ObfuscatedName("v") @ObfuscatedGetter( intValue = -886333045 ) - @Export("__v") int __v; @ObfuscatedName("ag") - @Export("__ag") boolean[] __ag; @ObfuscatedName("aq") - @Export("__aq") boolean[] __aq; @ObfuscatedName("aj") - @Export("__aj") byte[] __aj; @ObfuscatedName("av") - @Export("__av") byte[] __av; @ObfuscatedName("ar") - @Export("__ar") int[] __ar; @ObfuscatedName("ac") - @Export("__ac") byte[] __ac; @ObfuscatedName("ay") - @Export("__ay") byte[] __ay; @ObfuscatedName("ah") - @Export("__ah") byte[][] __ah; @ObfuscatedName("ak") - @Export("__ak") int[][] __ak; @ObfuscatedName("aw") - @Export("__aw") int[][] __aw; @ObfuscatedName("al") - @Export("__al") int[][] __al; @ObfuscatedName("ab") - @Export("__ab") int[] __ab; @ObfuscatedName("ae") @ObfuscatedGetter( intValue = 444639767 ) - @Export("__ae") int __ae; Bzip2State() { diff --git a/rs-client/src/main/java/Canvas.java b/runescape-client/src/main/java/Canvas.java similarity index 87% rename from rs-client/src/main/java/Canvas.java rename to runescape-client/src/main/java/Canvas.java index 80de74600b..ccea55acb9 100644 --- a/rs-client/src/main/java/Canvas.java +++ b/runescape-client/src/main/java/Canvas.java @@ -15,13 +15,11 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Canvas") public final class Canvas extends java.awt.Canvas { @ObfuscatedName("s") - @Export("__ao_s") public static String[] __ao_s; @ObfuscatedName("gk") @ObfuscatedGetter( intValue = -1131782991 ) - @Export("__ao_gk") static int __ao_gk; @ObfuscatedName("jk") @ObfuscatedSignature( @@ -120,10 +118,10 @@ public final class Canvas extends java.awt.Canvas { int var3; int var4; if(var0 == 100) { - class179.Interpreter_intStackSize -= 3; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - int var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; + RouteStrategy.Interpreter_intStackSize -= 3; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + int var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; if(var4 == 0) { throw new RuntimeException(); } else { @@ -170,22 +168,22 @@ public final class Canvas extends java.awt.Canvas { class22.method295(var10); return 1; } else if(var0 == 102) { - var9 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var9 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); var9.children = null; class22.method295(var9); return 1; } else if(var0 != 200) { if(var0 == 201) { - var9 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var9 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); if(var9 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; if(var2) { WorldMapIcon1.__t_i = var9; } else { class12.__n_n = var9; } } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; @@ -193,19 +191,19 @@ public final class Canvas extends java.awt.Canvas { return 2; } } else { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; Widget var11 = class204.getWidgetChild(var3, var4); if(var11 != null && var4 != -1) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; if(var2) { WorldMapIcon1.__t_i = var11; } else { class12.__n_n = var11; } } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; diff --git a/rs-client/src/main/java/ChatChannel.java b/runescape-client/src/main/java/ChatChannel.java similarity index 83% rename from rs-client/src/main/java/ChatChannel.java rename to runescape-client/src/main/java/ChatChannel.java index 662bf6a8b3..66e6aaea2f 100644 --- a/rs-client/src/main/java/ChatChannel.java +++ b/runescape-client/src/main/java/ChatChannel.java @@ -188,31 +188,31 @@ public class ChatChannel { ) static final void method2237(Widget var0, int var1, int var2) { if(var0.buttonType == 1) { - Tiles.method1106(var0.buttonText, "", 24, 0, 0, var0.id); + Tiles.insertMenuItemNoShift(var0.buttonText, "", 24, 0, 0, var0.id); } String var3; if(var0.buttonType == 2 && !Client.isSpellSelected) { var3 = class198.method3745(var0); if(var3 != null) { - Tiles.method1106(var3, BufferedFile.colorStartTag(65280) + var0.spellName, 25, 0, -1, var0.id); + Tiles.insertMenuItemNoShift(var3, BufferedFile.colorStartTag(65280) + var0.spellName, 25, 0, -1, var0.id); } } if(var0.buttonType == 3) { - Tiles.method1106("Close", "", 26, 0, 0, var0.id); + Tiles.insertMenuItemNoShift("Close", "", 26, 0, 0, var0.id); } if(var0.buttonType == 4) { - Tiles.method1106(var0.buttonText, "", 28, 0, 0, var0.id); + Tiles.insertMenuItemNoShift(var0.buttonText, "", 28, 0, 0, var0.id); } if(var0.buttonType == 5) { - Tiles.method1106(var0.buttonText, "", 29, 0, 0, var0.id); + Tiles.insertMenuItemNoShift(var0.buttonText, "", 29, 0, 0, var0.id); } if(var0.buttonType == 6 && Client.__client_mo == null) { - Tiles.method1106(var0.buttonText, "", 30, 0, -1, var0.id); + Tiles.insertMenuItemNoShift(var0.buttonText, "", 30, 0, -1, var0.id); } int var4; @@ -237,11 +237,11 @@ public class ChatChannel { ItemDefinition var8 = Skills.getItemDefinition(var0.itemIds[var13] - 1); if(Client.isItemSelected == 1 && WorldMapAreaData.method708(class1.getWidgetClickMask(var0))) { if(var0.id != ServerPacket.selectedItemWidget || var13 != HealthBarDefinition.selectedItemSlot) { - Tiles.method1106("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var8.name, 31, var8.id, var13, var0.id); + Tiles.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var8.name, 31, var8.id, var13, var0.id); } } else if(Client.isSpellSelected && WorldMapAreaData.method708(class1.getWidgetClickMask(var0))) { if((FloorDecoration.selectedSpellFlags & 16) == 16) { - Tiles.method1106(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var8.name, 32, var8.id, var13, var0.id); + Tiles.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var8.name, 32, var8.id, var13, var0.id); } } else { String[] var9 = var8.inventoryActions; @@ -254,24 +254,24 @@ public class ChatChannel { if(WorldMapAreaData.method708(class1.getWidgetClickMask(var0))) { for(var11 = 4; var11 >= 3; --var11) { if(var10 != var11) { - AccessFile.method2726(var0, var8, var13, var11, false); + AccessFile.addWidgetItemMenuItem(var0, var8, var13, var11, false); } } } if(SecureRandomFuture.method2101(class1.getWidgetClickMask(var0))) { - Tiles.method1106("Use", BufferedFile.colorStartTag(16748608) + var8.name, 38, var8.id, var13, var0.id); + Tiles.insertMenuItemNoShift("Use", BufferedFile.colorStartTag(16748608) + var8.name, 38, var8.id, var13, var0.id); } if(WorldMapAreaData.method708(class1.getWidgetClickMask(var0))) { for(var11 = 2; var11 >= 0; --var11) { if(var11 != var10) { - AccessFile.method2726(var0, var8, var13, var11, false); + AccessFile.addWidgetItemMenuItem(var0, var8, var13, var11, false); } } if(var10 >= 0) { - AccessFile.method2726(var0, var8, var13, var10, true); + AccessFile.addWidgetItemMenuItem(var0, var8, var13, var10, true); } } @@ -300,12 +300,12 @@ public class ChatChannel { var12 = 43; } - Tiles.method1106(var9[var11], BufferedFile.colorStartTag(16748608) + var8.name, var12, var8.id, var13, var0.id); + Tiles.insertMenuItemNoShift(var9[var11], BufferedFile.colorStartTag(0xff9040) + var8.name, var12, var8.id, var13, var0.id); } } } - Tiles.method1106("Examine", BufferedFile.colorStartTag(16748608) + var8.name, 1005, var8.id, var13, var0.id); + Tiles.insertMenuItemNoShift("Examine", BufferedFile.colorStartTag(0xff9040) + var8.name, 1005, var8.id, var13, var0.id); } } } @@ -318,19 +318,19 @@ public class ChatChannel { if(var0.isIf3) { if(Client.isSpellSelected) { if(WorldComparator.method58(class1.getWidgetClickMask(var0)) && (FloorDecoration.selectedSpellFlags & 32) == 32) { - Tiles.method1106(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + var0.dataText, 58, 0, var0.childIndex, var0.id); + Tiles.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + var0.dataText, 58, 0, var0.childIndex, var0.id); } } else { for(var13 = 9; var13 >= 5; --var13) { String var14 = GameShell.method1060(var0, var13); if(var14 != null) { - Tiles.method1106(var14, var0.dataText, 1007, var13 + 1, var0.childIndex, var0.id); + Tiles.insertMenuItemNoShift(var14, var0.dataText, 1007, var13 + 1, var0.childIndex, var0.id); } } var3 = class198.method3745(var0); if(var3 != null) { - Tiles.method1106(var3, var0.dataText, 25, 0, var0.childIndex, var0.id); + Tiles.insertMenuItemNoShift(var3, var0.dataText, 25, 0, var0.childIndex, var0.id); } for(var4 = 4; var4 >= 0; --var4) { @@ -343,7 +343,7 @@ public class ChatChannel { var5 = class1.getWidgetClickMask(var0); boolean var16 = (var5 & 1) != 0; if(var16) { - Tiles.method1106("Continue", "", 30, 0, var0.childIndex, var0.id); + Tiles.insertMenuItemNoShift("Continue", "", 30, 0, var0.childIndex, var0.id); } } } diff --git a/rs-client/src/main/java/ClanChat.java b/runescape-client/src/main/java/ClanChat.java similarity index 96% rename from rs-client/src/main/java/ClanChat.java rename to runescape-client/src/main/java/ClanChat.java index a0871d5700..608c06c72c 100644 --- a/rs-client/src/main/java/ClanChat.java +++ b/runescape-client/src/main/java/ClanChat.java @@ -26,7 +26,6 @@ public class ClanChat extends UserList { @Export("owner") public String owner; @ObfuscatedName("k") - @Export("__k") public byte __k; @ObfuscatedName("n") @ObfuscatedGetter( @@ -38,7 +37,6 @@ public class ClanChat extends UserList { @ObfuscatedGetter( intValue = 386706253 ) - @Export("__i") int __i; @ObfuscatedSignature( @@ -58,6 +56,7 @@ public class ClanChat extends UserList { signature = "(I)Ljs;", garbageValue = "-2063112195" ) + @Export("newInstance") User newInstance() { return new ClanMate(); } @@ -67,6 +66,7 @@ public class ClanChat extends UserList { signature = "(II)[Ljs;", garbageValue = "861814350" ) + @Export("newTypedArray") User[] newTypedArray(int var1) { return new ClanMate[var1]; } @@ -76,7 +76,6 @@ public class ClanChat extends UserList { signature = "(Ljava/lang/String;I)V", garbageValue = "242122326" ) - @Export("__q_472") final void __q_472(String var1) { this.name = HealthBarUpdate.method1722(var1); } @@ -86,7 +85,6 @@ public class ClanChat extends UserList { signature = "(Ljava/lang/String;B)V", garbageValue = "103" ) - @Export("__x_473") final void __x_473(String var1) { this.owner = HealthBarUpdate.method1722(var1); } @@ -150,7 +148,6 @@ public class ClanChat extends UserList { signature = "(Lgr;B)V", garbageValue = "24" ) - @Export("__a_474") public final void __a_474(Buffer var1) { Username var2 = new Username(var1.readStringCp1252NullTerminated(), this.loginType); int var3 = var1.__ag_302(); @@ -219,9 +216,8 @@ public class ClanChat extends UserList { signature = "(Ljk;I)V", garbageValue = "-128608554" ) - @Export("__cp_475") final void __cp_475(ClanMate var1) { - if(var1.username().__equals_466(this.localUser.username())) { + if(var1.username().equals(this.localUser.username())) { this.rank = var1.rank; } diff --git a/rs-client/src/main/java/ClanMate.java b/runescape-client/src/main/java/ClanMate.java similarity index 100% rename from rs-client/src/main/java/ClanMate.java rename to runescape-client/src/main/java/ClanMate.java diff --git a/rs-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java similarity index 97% rename from rs-client/src/main/java/Client.java rename to runescape-client/src/main/java/Client.java index cf7667e30a..413e46bf08 100644 --- a/rs-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -30,7 +30,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1348053843 ) - @Export("__client_oo") static int __client_oo; @ObfuscatedName("os") @ObfuscatedGetter( @@ -42,19 +41,14 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( longValue = 8818983958751331899L ) - @Export("__client_oa") static long __client_oa; @ObfuscatedName("od") - @Export("__client_od") static boolean[] __client_od; @ObfuscatedName("oq") - @Export("__client_oq") static boolean[] __client_oq; @ObfuscatedName("ot") - @Export("__client_ot") static boolean[] __client_ot; @ObfuscatedName("nt") - @Export("__client_nt") static boolean __client_nt; @ObfuscatedName("ng") @ObfuscatedGetter( @@ -69,19 +63,15 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -451622431 ) - @Export("__client_ss") public static int __client_ss; @ObfuscatedName("na") @ObfuscatedGetter( intValue = -934082817 ) - @Export("__client_na") static int __client_na; @ObfuscatedName("nn") - @Export("__client_nn") static boolean __client_nn; @ObfuscatedName("qq") - @Export("__client_qq") static boolean __client_qq; @ObfuscatedName("mt") @ObfuscatedGetter( @@ -99,7 +89,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -843739713 ) - @Export("__client_nw") static int __client_nw; @ObfuscatedName("mr") @ObfuscatedSignature( @@ -123,7 +112,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1939745821 ) - @Export("__client_nl") static int __client_nl; @ObfuscatedName("mx") @ObfuscatedSignature( @@ -173,13 +161,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1019025247 ) - @Export("__client_nk") static int __client_nk; @ObfuscatedName("np") @ObfuscatedGetter( intValue = 1881890525 ) - @Export("__client_np") static int __client_np; @ObfuscatedName("pd") @ObfuscatedGetter( @@ -197,13 +183,10 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -34294211 ) - @Export("__client_qy") static int __client_qy; @ObfuscatedName("tp") - @Export("__client_tp") static int[] __client_tp; @ObfuscatedName("th") - @Export("__client_th") static int[] __client_th; @ObfuscatedName("ny") @Export("isDraggingWidget") @@ -236,28 +219,23 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -818676431 ) - @Export("__client_qc") static int __client_qc; @ObfuscatedName("nz") - @Export("__client_nz") static int[] __client_nz; @ObfuscatedName("ns") @ObfuscatedGetter( intValue = 743073293 ) - @Export("__client_ns") static int __client_ns; @ObfuscatedName("sd") @ObfuscatedGetter( intValue = 944933439 ) - @Export("__client_sd") static int __client_sd; @ObfuscatedName("ru") @ObfuscatedSignature( signature = "Lhi;" ) - @Export("__client_ru") static PlayerAppearance __client_ru; @ObfuscatedName("qa") @ObfuscatedGetter( @@ -281,7 +259,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1605855913 ) - @Export("__client_sl") static int __client_sl; @ObfuscatedName("md") @ObfuscatedSignature( @@ -296,31 +273,27 @@ public final class Client extends GameShell implements Usernamed { @Export("indexCacheLoaderIndex") static int indexCacheLoaderIndex; @ObfuscatedName("qn") - @Export("unknownSoundValues1") - static int[] unknownSoundValues1; + @Export("queuedSoundEffectLoops") + static int[] queuedSoundEffectLoops; @ObfuscatedName("qd") @Export("queuedSoundEffectDelays") static int[] queuedSoundEffectDelays; @ObfuscatedName("nr") - @Export("__client_nr") static int[] __client_nr; @ObfuscatedName("nv") @ObfuscatedGetter( intValue = -758575207 ) - @Export("__client_nv") static int __client_nv; @ObfuscatedName("nd") @ObfuscatedGetter( intValue = 760022015 ) - @Export("__client_nd") static int __client_nd; @ObfuscatedName("ni") @ObfuscatedGetter( intValue = 1990512261 ) - @Export("__client_ni") static int __client_ni; @ObfuscatedName("qe") @ObfuscatedSignature( @@ -341,13 +314,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 587773171 ) - @Export("__client_ph") static int __client_ph; @ObfuscatedName("pp") @ObfuscatedGetter( longValue = -1704358328771670975L ) - @Export("__client_pp") static long __client_pp; @ObfuscatedName("sk") @ObfuscatedSignature( @@ -359,40 +330,32 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__client_mo") static Widget __client_mo; @ObfuscatedName("qf") @ObfuscatedGetter( intValue = 1365951359 ) - @Export("__client_qf") static int __client_qf; @ObfuscatedName("nh") @ObfuscatedGetter( intValue = -278874973 ) - @Export("__client_nh") static int __client_nh; @ObfuscatedName("rw") - @Export("__client_rw") static short __client_rw; @ObfuscatedName("qp") @ObfuscatedGetter( intValue = -1352723865 ) - @Export("__client_qp") - static int __client_qp; + @Export("soundEffectVolume") + static int soundEffectVolume; @ObfuscatedName("rm") - @Export("__client_rm") static short __client_rm; @ObfuscatedName("rs") - @Export("__client_rs") static short __client_rs; @ObfuscatedName("rp") - @Export("__client_rp") static short __client_rp; @ObfuscatedName("ri") - @Export("__client_ri") static short __client_ri; @ObfuscatedName("pi") @ObfuscatedGetter( @@ -407,7 +370,6 @@ public final class Client extends GameShell implements Usernamed { @Export("viewportZoom") static int viewportZoom; @ObfuscatedName("rv") - @Export("__client_rv") static short __client_rv; @ObfuscatedName("ry") @ObfuscatedGetter( @@ -443,7 +405,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1694810089 ) - @Export("__client_mb") static int __client_mb; @ObfuscatedName("rr") @ObfuscatedGetter( @@ -461,16 +422,13 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -460406997 ) - @Export("__client_pm") static int __client_pm; @ObfuscatedName("pl") @ObfuscatedGetter( intValue = -1362734353 ) - @Export("__client_pl") static int __client_pl; @ObfuscatedName("rh") - @Export("__client_rh") static boolean[] __client_rh; @ObfuscatedName("ml") @ObfuscatedGetter( @@ -488,64 +446,49 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 206275573 ) - @Export("__client_sx") static int __client_sx; @ObfuscatedName("rd") - @Export("__client_rd") static int[] __client_rd; @ObfuscatedName("rl") - @Export("__client_rl") static int[] __client_rl; @ObfuscatedName("rj") - @Export("__client_rj") static int[] __client_rj; @ObfuscatedName("rk") - @Export("__client_rk") static int[] __client_rk; @ObfuscatedName("pn") - @Export("__client_pn") static int[] __client_pn; @ObfuscatedName("pq") - @Export("__client_pq") static int[] __client_pq; @ObfuscatedName("oh") @ObfuscatedSignature( signature = "Lje;" ) - @Export("__client_oh") static NodeDeque __client_oh; @ObfuscatedName("oc") @ObfuscatedSignature( signature = "Lje;" ) - @Export("__client_oc") static NodeDeque __client_oc; @ObfuscatedName("rb") - @Export("__client_rb") static short __client_rb; @ObfuscatedName("re") - @Export("__client_re") static short __client_re; @ObfuscatedName("mf") @ObfuscatedGetter( intValue = -1715020411 ) - @Export("__client_mf") static int __client_mf; @ObfuscatedName("pu") - @Export("__client_pu") static long[] __client_pu; @ObfuscatedName("ms") @ObfuscatedGetter( intValue = 2128395635 ) - @Export("__client_ms") static int __client_ms; @ObfuscatedName("nc") @ObfuscatedGetter( intValue = 344308849 ) - @Export("__client_nc") static int __client_nc; @ObfuscatedName("nf") @Export("changedSkills") @@ -557,13 +500,11 @@ public final class Client extends GameShell implements Usernamed { @Export("changedSkillsCount") static int changedSkillsCount; @ObfuscatedName("mn") - @Export("__client_mn") static boolean __client_mn; @ObfuscatedName("pb") @ObfuscatedGetter( intValue = 1230692157 ) - @Export("__client_pb") static int __client_pb; @ObfuscatedName("nq") @ObfuscatedGetter( @@ -575,19 +516,15 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 535219347 ) - @Export("__client_mh") static int __client_mh; @ObfuscatedName("pz") - @Export("__client_pz") static String __client_pz; @ObfuscatedName("sj") @ObfuscatedSignature( signature = "Lbj;" ) - @Export("__client_sj") static OwnWorldComparator __client_sj; @ObfuscatedName("pv") - @Export("__client_pv") static int[] __client_pv; @ObfuscatedName("w") @ObfuscatedSignature( @@ -596,7 +533,6 @@ public final class Client extends GameShell implements Usernamed { @Export("collisionMaps") static CollisionMap[] collisionMaps; @ObfuscatedName("ai") - @Export("__client_ai") static boolean __client_ai; @ObfuscatedName("ba") @ObfuscatedGetter( @@ -635,7 +571,6 @@ public final class Client extends GameShell implements Usernamed { @Export("clientType") static int clientType; @ObfuscatedName("bl") - @Export("__client_bl") static boolean __client_bl; @ObfuscatedName("br") @ObfuscatedGetter( @@ -662,22 +597,18 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1731573291 ) - @Export("__client_cn") static int __client_cn; @ObfuscatedName("cq") @ObfuscatedGetter( intValue = -1313705721 ) - @Export("__client_cq") static int __client_cq; @ObfuscatedName("ch") @ObfuscatedGetter( longValue = -6574384275386813769L ) - @Export("__client_ch") static long __client_ch; @ObfuscatedName("cw") - @Export("__client_cw") static boolean __client_cw; @ObfuscatedName("cg") @Export("displayFps") @@ -764,7 +695,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1154760205 ) - @Export("__client_dp") static int __client_dp; @ObfuscatedName("ek") @ObfuscatedGetter( @@ -782,19 +712,16 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 755300107 ) - @Export("__client_ex") static int __client_ex; @ObfuscatedName("ej") @ObfuscatedGetter( intValue = -964416527 ) - @Export("__client_ej") static int __client_ej; @ObfuscatedName("el") @ObfuscatedGetter( intValue = 689094231 ) - @Export("__client_el") static int __client_el; @ObfuscatedName("en") @ObfuscatedSignature( @@ -805,7 +732,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -447055355 ) - @Export("__client_eo") static int __client_eo; @ObfuscatedName("ew") @Export("Login_isUsernameRemembered") @@ -817,7 +743,6 @@ public final class Client extends GameShell implements Usernamed { @Export("secureRandomFuture") static SecureRandomFuture secureRandomFuture; @ObfuscatedName("ev") - @Export("__client_ev") static byte[] __client_ev; @ObfuscatedName("ez") @ObfuscatedSignature( @@ -838,10 +763,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 516059665 ) - @Export("__client_fw") static int __client_fw; @ObfuscatedName("fg") - @Export("__client_fg") static int[] __client_fg; @ObfuscatedName("fj") @ObfuscatedSignature( @@ -853,10 +776,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1050480853 ) - @Export("__client_fd") static int __client_fd; @ObfuscatedName("fh") - @Export("__client_fh") static boolean __client_fh; @ObfuscatedName("fx") @Export("useBufferedSocket") @@ -874,31 +795,26 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 829228151 ) - @Export("__client_fe") static int __client_fe; @ObfuscatedName("fn") @ObfuscatedGetter( intValue = -597100741 ) - @Export("__client_fn") static int __client_fn; @ObfuscatedName("fk") @ObfuscatedGetter( intValue = 8470625 ) - @Export("__client_fk") static int __client_fk; @ObfuscatedName("gp") @ObfuscatedGetter( intValue = 685418907 ) - @Export("__client_gp") static int __client_gp; @ObfuscatedName("gh") @ObfuscatedGetter( intValue = -1456975367 ) - @Export("__client_gh") static int __client_gh; @ObfuscatedName("gg") @Export("isInInstance") @@ -907,46 +823,38 @@ public final class Client extends GameShell implements Usernamed { @Export("instanceChunkTemplates") static int[][][] instanceChunkTemplates; @ObfuscatedName("gd") - @Export("__client_gd") static final int[] __client_gd; @ObfuscatedName("gy") @ObfuscatedGetter( intValue = -134014371 ) - @Export("__client_gy") static int __client_gy; @ObfuscatedName("hx") @ObfuscatedGetter( intValue = -1406125895 ) - @Export("__client_hx") static int __client_hx; @ObfuscatedName("hn") @ObfuscatedGetter( intValue = -516933613 ) - @Export("__client_hn") static int __client_hn; @ObfuscatedName("hr") @ObfuscatedGetter( intValue = 1664350313 ) - @Export("__client_hr") static int __client_hr; @ObfuscatedName("hg") @ObfuscatedGetter( intValue = 1658018867 ) - @Export("__client_hg") static int __client_hg; @ObfuscatedName("hh") - @Export("__client_hh") static boolean __client_hh; @ObfuscatedName("hd") @ObfuscatedGetter( intValue = 438998245 ) - @Export("__client_hd") static int __client_hd; @ObfuscatedName("hw") @ObfuscatedGetter( @@ -964,25 +872,21 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 218086227 ) - @Export("__client_hv") static int __client_hv; @ObfuscatedName("hu") @ObfuscatedGetter( intValue = -480633777 ) - @Export("__client_hu") static int __client_hu; @ObfuscatedName("hi") @ObfuscatedGetter( intValue = 402871301 ) - @Export("__client_hi") static int __client_hi; @ObfuscatedName("ht") @ObfuscatedGetter( intValue = 1502058429 ) - @Export("__client_ht") static int __client_ht; @ObfuscatedName("hj") @ObfuscatedGetter( @@ -994,25 +898,22 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1005832199 ) - @Export("__client_ho") - static int __client_ho; + @Export("cameraFollowHeight") + static int cameraFollowHeight; @ObfuscatedName("hc") @ObfuscatedGetter( intValue = -441913785 ) - @Export("__client_hc") static int __client_hc; @ObfuscatedName("hk") @ObfuscatedGetter( intValue = -1149138989 ) - @Export("__client_hk") static int __client_hk; @ObfuscatedName("if") @ObfuscatedGetter( intValue = -952172003 ) - @Export("__client_if") static int __client_if; @ObfuscatedName("ie") @ObfuscatedGetter( @@ -1024,31 +925,25 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 351193663 ) - @Export("__client_in") static int __client_in; @ObfuscatedName("il") @ObfuscatedGetter( intValue = -1063713523 ) - @Export("__client_il") public static int __client_il; @ObfuscatedName("ij") - @Export("__client_ij") static boolean __client_ij; @ObfuscatedName("iy") @ObfuscatedGetter( intValue = -1213062413 ) - @Export("__client_iy") static int __client_iy; @ObfuscatedName("is") - @Export("__client_is") static boolean __client_is; @ObfuscatedName("ik") @ObfuscatedGetter( intValue = 910983131 ) - @Export("__client_ik") static int __client_ik; @ObfuscatedName("ir") @ObfuscatedGetter( @@ -1141,13 +1036,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1691923909 ) - @Export("__client_ju") static int __client_ju; @ObfuscatedName("jz") @ObfuscatedGetter( intValue = -1267243587 ) - @Export("__client_jz") static int __client_jz; @ObfuscatedName("jp") @ObfuscatedGetter( @@ -1159,13 +1052,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 813973829 ) - @Export("__client_ja") static int __client_ja; @ObfuscatedName("je") @ObfuscatedGetter( intValue = 1959822241 ) - @Export("__client_je") static int __client_je; @ObfuscatedName("jy") @ObfuscatedGetter( @@ -1174,7 +1065,6 @@ public final class Client extends GameShell implements Usernamed { @Export("dragItemSlotDestination") static int dragItemSlotDestination; @ObfuscatedName("jl") - @Export("__client_jl") static boolean __client_jl; @ObfuscatedName("jt") @ObfuscatedGetter( @@ -1186,7 +1076,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1084498299 ) - @Export("__client_jc") static int __client_jc; @ObfuscatedName("jj") @Export("showLoadingMessages") @@ -1207,7 +1096,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -836962805 ) - @Export("__client_jo") static int __client_jo; @ObfuscatedName("js") @Export("renderSelf") @@ -1216,16 +1104,13 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1208823721 ) - @Export("__client_ke") static int __client_ke; @ObfuscatedName("ky") @ObfuscatedGetter( intValue = -64320473 ) - @Export("__client_ky") static int __client_ky; @ObfuscatedName("kd") - @Export("__client_kd") static int[] __client_kd; @ObfuscatedName("kp") @Export("playerMenuOpcodes") @@ -1237,7 +1122,6 @@ public final class Client extends GameShell implements Usernamed { @Export("playerOptionsPriorities") static boolean[] playerOptionsPriorities; @ObfuscatedName("kn") - @Export("__client_kn") static int[] __client_kn; @ObfuscatedName("kx") @ObfuscatedGetter( @@ -1255,7 +1139,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedSignature( signature = "Lje;" ) - @Export("__client_kh") static NodeDeque __client_kh; @ObfuscatedName("kk") @ObfuscatedSignature( @@ -1282,7 +1165,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -898263359 ) - @Export("__client_ku") static int __client_ku; @ObfuscatedName("kc") @Export("isMenuOpen") @@ -1330,25 +1212,21 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 26099827 ) - @Export("__client_lq") static int __client_lq; @ObfuscatedName("ln") @ObfuscatedGetter( intValue = 885052255 ) - @Export("__client_ln") static int __client_ln; @ObfuscatedName("lb") @ObfuscatedGetter( intValue = 699084605 ) - @Export("__client_lb") static int __client_lb; @ObfuscatedName("ls") @ObfuscatedGetter( intValue = -274968037 ) - @Export("__client_ls") static int __client_ls; @ObfuscatedName("lz") @ObfuscatedGetter( @@ -1363,7 +1241,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 196309625 ) - @Export("__client_lc") static int __client_lc; static { @@ -1442,7 +1319,7 @@ public final class Client extends GameShell implements Usernamed { __client_hi = 0; __client_ht = 0; oculusOrbState = 0; - __client_ho = 50; + cameraFollowHeight = 50; __client_hc = 0; __client_hk = 0; __client_if = 0; @@ -1602,11 +1479,11 @@ public final class Client extends GameShell implements Usernamed { __client_qf = 255; __client_qy = -1; __client_qq = false; - __client_qp = 127; + soundEffectVolume = 127; __client_qc = 127; soundEffectCount = 0; soundEffectIds = new int[50]; - unknownSoundValues1 = new int[50]; + queuedSoundEffectLoops = new int[50]; queuedSoundEffectDelays = new int[50]; soundLocations = new int[50]; soundEffects = new SoundEffect[50]; @@ -1663,6 +1540,7 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "1297880469" ) + @Export("setUp") protected final void setUp() { WorldMapCacheName.method633(new int[]{20, 260, 10000}, new int[]{1000, 100, 500}); class2.port1 = gameBuild == 0?43594:worldId + 40000; @@ -1736,7 +1614,7 @@ public final class Client extends GameShell implements Usernamed { class214.__hf_u = null; } - class13.method163(); + class13.playPcmPlayers(); class171.method3498(); MouseHandler var47 = MouseHandler.MouseHandler_instance; synchronized(MouseHandler.MouseHandler_instance) { @@ -1820,7 +1698,7 @@ public final class Client extends GameShell implements Usernamed { class68.drawLoadingMessage("Loading - please wait." + "
    " + " (" + 100 + "%" + ")", true); } - class13.method163(); + class13.playPcmPlayers(); class65.scene.clear(); for(var48 = 0; var48 < 4; ++var48) { @@ -1836,7 +1714,7 @@ public final class Client extends GameShell implements Usernamed { } } - class13.method163(); + class13.playPcmPlayers(); Tiles.Tiles_minPlane = 99; Tiles.__bq_w = new byte[4][104][104]; Fonts.__kz_o = new byte[4][104][104]; @@ -1874,7 +1752,7 @@ public final class Client extends GameShell implements Usernamed { var5 = (class308.regions[var49] & 255) * 64 - GraphicsObject.baseY; var6 = class40.regionLandArchives[var49]; if(var6 != null) { - class13.method163(); + class13.playPcmPlayers(); Varcs.method2166(var6, var4, var5, GameObject.__eh_fy * 8 - 48, WorldMapLabelSize.__s_fi * 8 - 48, collisionMaps); } } @@ -1884,7 +1762,7 @@ public final class Client extends GameShell implements Usernamed { var5 = (class308.regions[var49] & 255) * 64 - GraphicsObject.baseY; var6 = class40.regionLandArchives[var49]; if(var6 == null && WorldMapLabelSize.__s_fi < 800) { - class13.method163(); + class13.playPcmPlayers(); UserComparator6.method3390(var4, var5, 64, 64); } } @@ -1896,7 +1774,7 @@ public final class Client extends GameShell implements Usernamed { if(var50 != null) { var5 = (class308.regions[var49] >> 8) * 64 - class50.baseX; var51 = (class308.regions[var49] & 255) * 64 - GraphicsObject.baseY; - class13.method163(); + class13.playPcmPlayers(); Scene var7 = class65.scene; CollisionMap[] var8 = collisionMaps; Buffer var9 = new Buffer(var50); @@ -1971,7 +1849,7 @@ public final class Client extends GameShell implements Usernamed { break label1186; } - class13.method163(); + class13.playPcmPlayers(); for(var4 = 0; var4 < 13; ++var4) { for(var5 = 0; var5 < 13; ++var5) { @@ -1997,7 +1875,7 @@ public final class Client extends GameShell implements Usernamed { } } - class13.method163(); + class13.playPcmPlayers(); for(var4 = 0; var4 < 13; ++var4) { for(var5 = 0; var5 < 13; ++var5) { @@ -2058,7 +1936,7 @@ public final class Client extends GameShell implements Usernamed { } UserComparator10.method3352(true); - class13.method163(); + class13.playPcmPlayers(); Scene var65 = class65.scene; CollisionMap[] var71 = collisionMaps; @@ -2548,7 +2426,7 @@ public final class Client extends GameShell implements Usernamed { } } - class13.method163(); + class13.playPcmPlayers(); ScriptEvent.method1179(); ObjectDefinition.__jr_o.clear(); PacketBufferNode var67; @@ -2575,7 +2453,7 @@ public final class Client extends GameShell implements Usernamed { } GameShell.updateGameState(30); - class13.method163(); + class13.playPcmPlayers(); BufferedSink.method3603(); var67 = Interpreter.method1915(ClientPacket.__gs_bv, packetWriter.isaacCipher); packetWriter.__q_167(var67); @@ -2715,6 +2593,7 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "-1879956387" ) + @Export("kill0") protected final void kill0() { if(class196.varcs.hasUnwrittenChanges()) { class196.varcs.write(); @@ -3641,7 +3520,7 @@ public final class Client extends GameShell implements Usernamed { switch(field658.field1984) { case 0: case 3: - var3.writeMedium(class13.__i_af); + var3.writeMedium(class13.otpInt); ++var3.index; break; case 1: @@ -3808,7 +3687,7 @@ public final class Client extends GameShell implements Usernamed { ReflectionCheck.clientPreferences.rememberedUsername = null; } - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); rights = ((AbstractSocket)var1).readUnsignedByte(); __client_mn = ((AbstractSocket)var1).readUnsignedByte() == 1; localPlayerIndex = ((AbstractSocket)var1).readUnsignedByte(); @@ -3983,7 +3862,7 @@ public final class Client extends GameShell implements Usernamed { class48.method868(); } else { if(!isMenuOpen) { - class30.method569(); + class30.resetMenuEntries(); } int var1; @@ -4127,7 +4006,7 @@ public final class Client extends GameShell implements Usernamed { } PacketBufferNode var18; - if(MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.__lp_ca && MouseHandler.MouseHandler_lastButton == 4 || MouseHandler.MouseHandler_lastButton == 2) { + if(MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.mouseCam && MouseHandler.MouseHandler_lastButton == 4 || MouseHandler.MouseHandler_lastButton == 2) { long var16 = (MouseHandler.MouseHandler_lastPressedTimeMillis - mouseLastLastPressedTimeMillis * -1L) / 50L; if(var16 > 4095L) { var16 = 4095L; @@ -4244,7 +4123,7 @@ public final class Client extends GameShell implements Usernamed { } } - Buddy.method5554(); + Buddy.processOverheadText(); ++__client_gy; if(mouseCrossColor != 0) { mouseCrossState += 20; @@ -4281,7 +4160,7 @@ public final class Client extends GameShell implements Usernamed { } } - if(FriendSystem.method1868() && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81] && mouseWheelRotation != 0) { + if(FriendSystem.jmodCheck() && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81] && mouseWheelRotation != 0) { var3 = Canvas.localPlayer.plane - mouseWheelRotation; if(var3 < 0) { var3 = 0; @@ -4383,7 +4262,7 @@ public final class Client extends GameShell implements Usernamed { } else if(menuOptionsCount > 0) { var3 = __client_ja; var4 = __client_je; - class231.method4520(UnitPriceComparator.tempMenuAction, var3, var4); + class231.processTempMenuAction(UnitPriceComparator.tempMenuAction, var3, var4); UnitPriceComparator.tempMenuAction = null; } @@ -4637,7 +4516,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "-1792846917" ) - @Export("__ge_137") void __ge_137() { int var1 = SoundCache.canvasWidth; int var2 = Huffman.canvasHeight; @@ -4694,11 +4572,11 @@ public final class Client extends GameShell implements Usernamed { Rasterizer2D.Rasterizer2D_resetClip(); if(showMouseCross) { if(mouseCrossColor == 1) { - KeyHandler.crossSprites[mouseCrossState / 100].__a_505(mouseCrossX - 8, mouseCrossY - 8); + KeyHandler.crossSprites[mouseCrossState / 100].drawAt2(mouseCrossX - 8, mouseCrossY - 8); } if(mouseCrossColor == 2) { - KeyHandler.crossSprites[mouseCrossState / 100 + 4].__a_505(mouseCrossX - 8, mouseCrossY - 8); + KeyHandler.crossSprites[mouseCrossState / 100 + 4].drawAt2(mouseCrossX - 8, mouseCrossY - 8); } } @@ -4710,14 +4588,14 @@ public final class Client extends GameShell implements Usernamed { int var8; if(!isMenuOpen) { if(__client_lq != -1) { - class39.method741(__client_lq, __client_ln); + class39.drawMenuActionTextAt(__client_lq, __client_ln); } } else { var1 = class25.menuX; var2 = GameShell.menuY; var3 = class214.menuWidth; var4 = AbstractWorldMapIcon.menuHeight; - int var5 = 6116423; + int var5 = 0x5d5447; Rasterizer2D.Rasterizer2D_fillRectangle(var1, var2, var3, var4, var5); Rasterizer2D.Rasterizer2D_fillRectangle(var1 + 1, var2 + 1, var3 - 2, 16, 0); Rasterizer2D.Rasterizer2D_drawRectangle(var1 + 1, var2 + 18, var3 - 2, var4 - 19, 0); @@ -4729,9 +4607,9 @@ public final class Client extends GameShell implements Usernamed { int var10; for(var8 = 0; var8 < menuOptionsCount; ++var8) { var9 = var2 + (menuOptionsCount - 1 - var8) * 15 + 31; - var10 = 16777215; + var10 = 0xffffff; if(var6 > var1 && var6 < var3 + var1 && var7 > var9 - 13 && var7 < var9 + 3) { - var10 = 16776960; + var10 = 0xffff00; } Font var11 = class2.fontBold12; @@ -4762,9 +4640,9 @@ public final class Client extends GameShell implements Usernamed { if(gameDrawingMode == 3) { for(var1 = 0; var1 < rootWidgetCount; ++var1) { if(__client_oq[var1]) { - Rasterizer2D.Rasterizer2D_moreAlpha(rootWidgetXs[var1], rootWidgetYs[var1], rootWidgetWidths[var1], rootWidgetHeights[var1], 16711935, 128); + Rasterizer2D.Rasterizer2D_fillRectangleAlpha(rootWidgetXs[var1], rootWidgetYs[var1], rootWidgetWidths[var1], rootWidgetHeights[var1], 0xff00ff, 128); } else if(__client_ot[var1]) { - Rasterizer2D.Rasterizer2D_moreAlpha(rootWidgetXs[var1], rootWidgetYs[var1], rootWidgetWidths[var1], rootWidgetHeights[var1], 16711680, 128); + Rasterizer2D.Rasterizer2D_fillRectangleAlpha(rootWidgetXs[var1], rootWidgetYs[var1], rootWidgetWidths[var1], rootWidgetHeights[var1], 0xff0000, 128); } } } @@ -4803,8 +4681,8 @@ public final class Client extends GameShell implements Usernamed { SoundEffect var16 = SoundEffect.readSoundEffect(class25.indexCache4, var15.soundEffectId, 0); if(var16 != null) { RawSound var17 = var16.toRawSound().resample(MilliClock.decimator); - RawPcmStream var18 = RawPcmStream.method2497(var17, 100, var7); - var18.__x_181(-1); + RawPcmStream var18 = RawPcmStream.createRawPcmStream(var17, 100, var7); + var18.setNumLoops(-1); TaskHandler.pcmStreamMixer.addSubStream(var18); var15.stream1 = var18; } @@ -4820,8 +4698,8 @@ public final class Client extends GameShell implements Usernamed { SoundEffect var20 = SoundEffect.readSoundEffect(class25.indexCache4, var15.soundEffectIds[var8], 0); if(var20 != null) { RawSound var21 = var20.toRawSound().resample(MilliClock.decimator); - RawPcmStream var19 = RawPcmStream.method2497(var21, 100, var7); - var19.__x_181(0); + RawPcmStream var19 = RawPcmStream.createRawPcmStream(var21, 100, var7); + var19.setNumLoops(0); TaskHandler.pcmStreamMixer.addSubStream(var19); var15.stream2 = var19; var15.__n = var15.__x + (int)(Math.random() * (double)(var15.__d - var15.__x)); @@ -4855,7 +4733,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(Lcl;I)Z", garbageValue = "1488446149" ) - @Export("__hg_138") final boolean __hg_138(PacketWriter var1) { AbstractSocket var2 = var1.getSocket(); PacketBuffer var3 = var1.packetBuffer; @@ -5054,7 +4931,7 @@ public final class Client extends GameShell implements Usernamed { } } - PlayerType.method4547(var5); + PlayerType.clearItemContainer(var5); var7 = var3.__ag_302(); for(var8 = 0; var8 < var7; ++var8) { @@ -6223,7 +6100,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "-387903382" ) - @Export("__hi_139") final void __hi_139() { boolean var1 = false; @@ -6269,7 +6145,7 @@ public final class Client extends GameShell implements Usernamed { int var13; if(isMenuOpen) { int var12; - if(var15 != 1 && (AbstractRasterProvider.__lp_ca || var15 != 4)) { + if(var15 != 1 && (AbstractRasterProvider.mouseCam || var15 != 4)) { var2 = MouseHandler.MouseHandler_x; var12 = MouseHandler.MouseHandler_y; if(var2 < class25.menuX - 10 || var2 > class25.menuX + class214.menuWidth + 10 || var12 < GameShell.menuY - 10 || var12 > AbstractWorldMapIcon.menuHeight + GameShell.menuY + 10) { @@ -6278,7 +6154,7 @@ public final class Client extends GameShell implements Usernamed { } } - if(var15 == 1 || !AbstractRasterProvider.__lp_ca && var15 == 4) { + if(var15 == 1 || !AbstractRasterProvider.mouseCam && var15 == 4) { var2 = class25.menuX; var12 = GameShell.menuY; var13 = class214.menuWidth; @@ -6302,7 +6178,7 @@ public final class Client extends GameShell implements Usernamed { } } else { var2 = menuOptionsCount - 1; - if((var15 == 1 || !AbstractRasterProvider.__lp_ca && var15 == 4) && var2 >= 0) { + if((var15 == 1 || !AbstractRasterProvider.mouseCam && var15 == 4) && var2 >= 0) { var13 = menuOpcodes[var2]; if(var13 == 39 || var13 == 40 || var13 == 41 || var13 == 42 || var13 == 43 || var13 == 33 || var13 == 34 || var13 == 35 || var13 == 36 || var13 == 37 || var13 == 38 || var13 == 1005) { var5 = menuArguments1[var2]; @@ -6321,11 +6197,11 @@ public final class Client extends GameShell implements Usernamed { } } - if((var15 == 1 || !AbstractRasterProvider.__lp_ca && var15 == 4) && this.shouldLeftClickOpenMenu()) { + if((var15 == 1 || !AbstractRasterProvider.mouseCam && var15 == 4) && this.shouldLeftClickOpenMenu()) { var15 = 2; } - if((var15 == 1 || !AbstractRasterProvider.__lp_ca && var15 == 4) && menuOptionsCount > 0) { + if((var15 == 1 || !AbstractRasterProvider.mouseCam && var15 == 4) && menuOptionsCount > 0) { WorldMapSection0.method245(var2); } @@ -6340,7 +6216,7 @@ public final class Client extends GameShell implements Usernamed { if(DevicePcmPlayerProvider.dragInventoryWidget != null && !__client_jl && menuOptionsCount > 0 && !this.shouldLeftClickOpenMenu()) { int var10 = __client_ja; int var11 = __client_je; - class231.method4520(UnitPriceComparator.tempMenuAction, var10, var11); + class231.processTempMenuAction(UnitPriceComparator.tempMenuAction, var10, var11); UnitPriceComparator.tempMenuAction = null; } @@ -6439,7 +6315,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(ZI)V", garbageValue = "-271438207" ) - @Export("__iu_141") final void __iu_141(boolean var1) { int var2 = rootWidgetGroup; int var3 = SoundCache.canvasWidth; @@ -6477,7 +6352,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "715978124" ) - @Export("__jh_142") final void __jh_142() { class22.method295(clickedWidget); ++MouseRecorder.widgetDragDuration; @@ -6574,7 +6448,7 @@ public final class Client extends GameShell implements Usernamed { } else if(menuOptionsCount > 0) { int var13 = widgetClickX + __client_nk; int var14 = widgetClickY + __client_np; - class231.method4520(UnitPriceComparator.tempMenuAction, var13, var14); + class231.processTempMenuAction(UnitPriceComparator.tempMenuAction, var13, var14); UnitPriceComparator.tempMenuAction = null; } @@ -6594,6 +6468,7 @@ public final class Client extends GameShell implements Usernamed { signature = "(B)Lkp;", garbageValue = "-87" ) + @Export("username") public Username username() { return Canvas.localPlayer != null?Canvas.localPlayer.username:null; } diff --git a/rs-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java similarity index 89% rename from rs-client/src/main/java/ClientPacket.java rename to runescape-client/src/main/java/ClientPacket.java index 7745a7e89c..cf9ef3997d 100644 --- a/rs-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -11,607 +11,506 @@ public class ClientPacket implements ClientPacketMarker { @ObfuscatedGetter( intValue = 1076448827 ) - @Export("__gs_qh") static int __gs_qh; @ObfuscatedName("m") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_m") public static final ClientPacket __gs_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_f") public static final ClientPacket __gs_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_q") public static final ClientPacket __gs_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_w") public static final ClientPacket __gs_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_o") public static final ClientPacket __gs_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_u") public static final ClientPacket __gs_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_g") public static final ClientPacket __gs_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_l") public static final ClientPacket __gs_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_e") public static final ClientPacket __gs_e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_x") public static final ClientPacket __gs_x; @ObfuscatedName("d") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_d") public static final ClientPacket __gs_d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_k") public static final ClientPacket __gs_k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_n") public static final ClientPacket __gs_n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_i") public static final ClientPacket __gs_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_a") public static final ClientPacket __gs_a; @ObfuscatedName("z") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_z") public static final ClientPacket __gs_z; @ObfuscatedName("j") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_j") public static final ClientPacket __gs_j; @ObfuscatedName("s") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_s") public static final ClientPacket __gs_s; @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_t") public static final ClientPacket __gs_t; @ObfuscatedName("y") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_y") public static final ClientPacket __gs_y; @ObfuscatedName("h") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_h") public static final ClientPacket __gs_h; @ObfuscatedName("b") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_b") public static final ClientPacket __gs_b; @ObfuscatedName("c") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_c") public static final ClientPacket __gs_c; @ObfuscatedName("r") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_r") public static final ClientPacket __gs_r; @ObfuscatedName("p") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_p") public static final ClientPacket __gs_p; @ObfuscatedName("v") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_v") public static final ClientPacket __gs_v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ag") public static final ClientPacket __gs_ag; @ObfuscatedName("aq") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aq") public static final ClientPacket __gs_aq; @ObfuscatedName("aj") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aj") public static final ClientPacket __gs_aj; @ObfuscatedName("av") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_av") public static final ClientPacket __gs_av; @ObfuscatedName("ar") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ar") public static final ClientPacket __gs_ar; @ObfuscatedName("ac") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ac") public static final ClientPacket __gs_ac; @ObfuscatedName("ay") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ay") public static final ClientPacket __gs_ay; @ObfuscatedName("ah") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ah") public static final ClientPacket __gs_ah; @ObfuscatedName("ak") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ak") public static final ClientPacket __gs_ak; @ObfuscatedName("aw") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aw") public static final ClientPacket __gs_aw; @ObfuscatedName("al") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_al") public static final ClientPacket __gs_al; @ObfuscatedName("ab") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ab") public static final ClientPacket __gs_ab; @ObfuscatedName("ae") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ae") public static final ClientPacket __gs_ae; @ObfuscatedName("at") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_at") public static final ClientPacket __gs_at; @ObfuscatedName("ad") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ad") public static final ClientPacket __gs_ad; @ObfuscatedName("ap") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ap") public static final ClientPacket __gs_ap; @ObfuscatedName("as") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_as") public static final ClientPacket __gs_as; @ObfuscatedName("am") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_am") static final ClientPacket __gs_am; @ObfuscatedName("an") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_an") public static final ClientPacket __gs_an; @ObfuscatedName("az") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_az") public static final ClientPacket __gs_az; @ObfuscatedName("au") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_au") public static final ClientPacket __gs_au; @ObfuscatedName("ao") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ao") public static final ClientPacket __gs_ao; @ObfuscatedName("aa") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aa") public static final ClientPacket __gs_aa; @ObfuscatedName("ax") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ax") public static final ClientPacket __gs_ax; @ObfuscatedName("af") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_af") public static final ClientPacket __gs_af; @ObfuscatedName("ai") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ai") public static final ClientPacket __gs_ai; @ObfuscatedName("ba") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ba") public static final ClientPacket __gs_ba; @ObfuscatedName("bb") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bb") public static final ClientPacket __gs_bb; @ObfuscatedName("bs") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bs") public static final ClientPacket __gs_bs; @ObfuscatedName("bq") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bq") public static final ClientPacket __gs_bq; @ObfuscatedName("bn") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bn") public static final ClientPacket __gs_bn; @ObfuscatedName("bk") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bk") public static final ClientPacket __gs_bk; @ObfuscatedName("bd") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bd") public static final ClientPacket __gs_bd; @ObfuscatedName("bc") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bc") public static final ClientPacket __gs_bc; @ObfuscatedName("bo") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bo") public static final ClientPacket __gs_bo; @ObfuscatedName("bx") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bx") public static final ClientPacket __gs_bx; @ObfuscatedName("by") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_by") public static final ClientPacket __gs_by; @ObfuscatedName("bu") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bu") public static final ClientPacket __gs_bu; @ObfuscatedName("bm") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bm") public static final ClientPacket __gs_bm; @ObfuscatedName("bl") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bl") public static final ClientPacket __gs_bl; @ObfuscatedName("br") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_br") public static final ClientPacket __gs_br; @ObfuscatedName("bj") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bj") public static final ClientPacket __gs_bj; @ObfuscatedName("bi") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bi") public static final ClientPacket __gs_bi; @ObfuscatedName("bz") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bz") public static final ClientPacket __gs_bz; @ObfuscatedName("bg") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bg") public static final ClientPacket __gs_bg; @ObfuscatedName("bt") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bt") public static final ClientPacket __gs_bt; @ObfuscatedName("bp") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bp") public static final ClientPacket __gs_bp; @ObfuscatedName("bf") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bf") public static final ClientPacket __gs_bf; @ObfuscatedName("bh") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bh") public static final ClientPacket __gs_bh; @ObfuscatedName("be") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_be") public static final ClientPacket __gs_be; @ObfuscatedName("bv") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bv") public static final ClientPacket __gs_bv; @ObfuscatedName("bw") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bw") public static final ClientPacket __gs_bw; @ObfuscatedName("cr") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cr") public static final ClientPacket __gs_cr; @ObfuscatedName("cv") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cv") public static final ClientPacket __gs_cv; @ObfuscatedName("ce") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ce") public static final ClientPacket __gs_ce; @ObfuscatedName("cy") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cy") public static final ClientPacket __gs_cy; @ObfuscatedName("cs") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cs") public static final ClientPacket __gs_cs; @ObfuscatedName("cm") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cm") public static final ClientPacket __gs_cm; @ObfuscatedName("cj") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cj") public static final ClientPacket __gs_cj; @ObfuscatedName("cu") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cu") public static final ClientPacket __gs_cu; @ObfuscatedName("cb") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cb") public static final ClientPacket __gs_cb; @ObfuscatedName("ck") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ck") public static final ClientPacket __gs_ck; @ObfuscatedName("cn") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cn") public static final ClientPacket __gs_cn; @ObfuscatedName("cq") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cq") public static final ClientPacket __gs_cq; @ObfuscatedName("ch") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ch") public static final ClientPacket __gs_ch; @ObfuscatedName("cw") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cw") public static final ClientPacket __gs_cw; @ObfuscatedName("cg") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cg") public static final ClientPacket __gs_cg; @ObfuscatedName("cf") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cf") public static final ClientPacket __gs_cf; @ObfuscatedName("cp") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cp") public static final ClientPacket __gs_cp; @ObfuscatedName("cl") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cl") public static final ClientPacket __gs_cl; @ObfuscatedName("ct") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ct") public static final ClientPacket __gs_ct; @ObfuscatedName("cz") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cz") public static final ClientPacket __gs_cz; @ObfuscatedName("cc") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cc") public static final ClientPacket __gs_cc; @ObfuscatedName("ci") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ci") static final ClientPacket __gs_ci; @ObfuscatedName("cd") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/ClientPacketMarker.java b/runescape-client/src/main/java/ClientPacketMarker.java similarity index 100% rename from rs-client/src/main/java/ClientPacketMarker.java rename to runescape-client/src/main/java/ClientPacketMarker.java diff --git a/rs-client/src/main/java/ClientParameter.java b/runescape-client/src/main/java/ClientParameter.java similarity index 91% rename from rs-client/src/main/java/ClientParameter.java rename to runescape-client/src/main/java/ClientParameter.java index 2023de1536..19961d5bed 100644 --- a/rs-client/src/main/java/ClientParameter.java +++ b/runescape-client/src/main/java/ClientParameter.java @@ -16,121 +16,101 @@ public class ClientParameter { @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_m") static final ClientParameter __ji_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_f") static final ClientParameter __ji_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_q") static final ClientParameter __ji_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_w") static final ClientParameter __ji_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_o") static final ClientParameter __ji_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_u") static final ClientParameter __ji_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_g") static final ClientParameter __ji_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_l") static final ClientParameter __ji_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_e") static final ClientParameter __ji_e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_x") static final ClientParameter __ji_x; @ObfuscatedName("d") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_d") static final ClientParameter __ji_d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_k") static final ClientParameter __ji_k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_n") public static final ClientParameter __ji_n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_i") public static final ClientParameter __ji_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_a") static final ClientParameter __ji_a; @ObfuscatedName("z") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_z") static final ClientParameter __ji_z; @ObfuscatedName("j") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_j") static final ClientParameter __ji_j; @ObfuscatedName("s") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_s") static final ClientParameter __ji_s; @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_t") static final ClientParameter __ji_t; @ObfuscatedName("fp") @ObfuscatedSignature( signature = "Lfu;" ) - @Export("__ji_fp") static AbstractSocket __ji_fp; @ObfuscatedName("y") @Export("id") @@ -190,7 +170,7 @@ public class ClientParameter { var3.population = var1.__aq_303(); } - MilliClock.method3400(ItemContainer.worlds, 0, ItemContainer.worlds.length - 1, World.__bt_e, World.__bt_l); + MilliClock.method3400(ItemContainer.worlds, 0, ItemContainer.worlds.length - 1, World.sortOption1, World.sortOption2); FriendLoginUpdate.__kn_x = null; return true; } diff --git a/rs-client/src/main/java/ClientPreferences.java b/runescape-client/src/main/java/ClientPreferences.java similarity index 99% rename from rs-client/src/main/java/ClientPreferences.java rename to runescape-client/src/main/java/ClientPreferences.java index fdde50a4f3..33ece76295 100644 --- a/rs-client/src/main/java/ClientPreferences.java +++ b/runescape-client/src/main/java/ClientPreferences.java @@ -14,7 +14,6 @@ public class ClientPreferences { @ObfuscatedGetter( intValue = 1548448409 ) - @Export("__bf_m") static int __bf_m; @ObfuscatedName("gr") @ObfuscatedSignature( @@ -110,7 +109,6 @@ public class ClientPreferences { signature = "(ZI)V", garbageValue = "1213718182" ) - @Export("__m_150") void __m_150(boolean var1) { } diff --git a/rs-client/src/main/java/Clock.java b/runescape-client/src/main/java/Clock.java similarity index 100% rename from rs-client/src/main/java/Clock.java rename to runescape-client/src/main/java/Clock.java diff --git a/rs-client/src/main/java/CollisionMap.java b/runescape-client/src/main/java/CollisionMap.java similarity index 98% rename from rs-client/src/main/java/CollisionMap.java rename to runescape-client/src/main/java/CollisionMap.java index 7d335a8657..a55c80bc1b 100644 --- a/rs-client/src/main/java/CollisionMap.java +++ b/runescape-client/src/main/java/CollisionMap.java @@ -68,7 +68,6 @@ public class CollisionMap { signature = "(IIIIZB)V", garbageValue = "2" ) - @Export("__f_283") public void __f_283(int var1, int var2, int var3, int var4, boolean var5) { var1 -= this.xInset; var2 -= this.yInset; @@ -221,7 +220,6 @@ public class CollisionMap { signature = "(IIIIZI)V", garbageValue = "1813281219" ) - @Export("__q_284") public void __q_284(int var1, int var2, int var3, int var4, boolean var5) { int var6 = 256; if(var5) { @@ -248,7 +246,6 @@ public class CollisionMap { signature = "(III)V", garbageValue = "1082834717" ) - @Export("__w_285") public void __w_285(int var1, int var2) { var1 -= this.xInset; var2 -= this.yInset; @@ -260,7 +257,6 @@ public class CollisionMap { signature = "(III)V", garbageValue = "2022671149" ) - @Export("__o_286") public void __o_286(int var1, int var2) { var1 -= this.xInset; var2 -= this.yInset; @@ -272,7 +268,6 @@ public class CollisionMap { signature = "(IIII)V", garbageValue = "953350100" ) - @Export("__u_287") void __u_287(int var1, int var2, int var3) { this.flags[var1][var2] |= var3; } @@ -282,7 +277,6 @@ public class CollisionMap { signature = "(IIIIZB)V", garbageValue = "54" ) - @Export("__g_288") public void __g_288(int var1, int var2, int var3, int var4, boolean var5) { var1 -= this.xInset; var2 -= this.yInset; @@ -435,7 +429,6 @@ public class CollisionMap { signature = "(IIIIIZB)V", garbageValue = "23" ) - @Export("__l_289") public void __l_289(int var1, int var2, int var3, int var4, int var5, boolean var6) { int var7 = 256; if(var6) { @@ -468,7 +461,6 @@ public class CollisionMap { signature = "(IIII)V", garbageValue = "52290294" ) - @Export("__e_290") void __e_290(int var1, int var2, int var3) { this.flags[var1][var2] &= ~var3; } @@ -478,7 +470,6 @@ public class CollisionMap { signature = "(IIB)V", garbageValue = "37" ) - @Export("__x_291") public void __x_291(int var1, int var2) { var1 -= this.xInset; var2 -= this.yInset; diff --git a/rs-client/src/main/java/Decimator.java b/runescape-client/src/main/java/Decimator.java similarity index 88% rename from rs-client/src/main/java/Decimator.java rename to runescape-client/src/main/java/Decimator.java index 339f08741d..1d376b3d10 100644 --- a/rs-client/src/main/java/Decimator.java +++ b/runescape-client/src/main/java/Decimator.java @@ -189,23 +189,23 @@ public class Decimator { var6 = Scene.Scene_cameraPitchCosine; var7 = Scene.Scene_cameraYawSine; var8 = Scene.Scene_cameraYawCosine; - byte var9 = 50; - short var10 = 3500; - var11 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * var9 / Rasterizer3D.Rasterizer3D_zoom; - var12 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * var9 / Rasterizer3D.Rasterizer3D_zoom; - var13 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * var10 / Rasterizer3D.Rasterizer3D_zoom; - int var14 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * var10 / Rasterizer3D.Rasterizer3D_zoom; - int var15 = Rasterizer3D.method3007(var12, var9, var6, var5); - var16 = Rasterizer3D.method3008(var12, var9, var6, var5); + byte clickboxClose = 50; + short clickboxFar = 3500; + var11 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * clickboxClose / Rasterizer3D.Rasterizer3D_zoom; + var12 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * clickboxClose / Rasterizer3D.Rasterizer3D_zoom; + var13 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * clickboxFar / Rasterizer3D.Rasterizer3D_zoom; + int var14 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * clickboxFar / Rasterizer3D.Rasterizer3D_zoom; + int var15 = Rasterizer3D.rot1(var12, clickboxClose, var6, var5); + var16 = Rasterizer3D.rot2(var12, clickboxClose, var6, var5); var12 = var15; - var15 = Rasterizer3D.method3007(var14, var10, var6, var5); - var17 = Rasterizer3D.method3008(var14, var10, var6, var5); + var15 = Rasterizer3D.rot1(var14, clickboxFar, var6, var5); + var17 = Rasterizer3D.rot2(var14, clickboxFar, var6, var5); var14 = var15; - var15 = Rasterizer3D.method3005(var11, var16, var8, var7); - var16 = Rasterizer3D.method3006(var11, var16, var8, var7); + var15 = Rasterizer3D.rot3(var11, var16, var8, var7); + var16 = Rasterizer3D.rot4(var11, var16, var8, var7); var11 = var15; - var15 = Rasterizer3D.method3005(var13, var17, var8, var7); - var17 = Rasterizer3D.method3006(var13, var17, var8, var7); + var15 = Rasterizer3D.rot3(var13, var17, var8, var7); + var17 = Rasterizer3D.rot4(var13, var17, var8, var7); AccessFile.__dk_o = (var11 + var15) / 2; ViewportMouse.__dm_u = (var14 + var12) / 2; ViewportMouse.__dm_g = (var17 + var16) / 2; diff --git a/rs-client/src/main/java/DemotingHashTable.java b/runescape-client/src/main/java/DemotingHashTable.java similarity index 100% rename from rs-client/src/main/java/DemotingHashTable.java rename to runescape-client/src/main/java/DemotingHashTable.java diff --git a/rs-client/src/main/java/DesktopPlatformInfoProvider.java b/runescape-client/src/main/java/DesktopPlatformInfoProvider.java similarity index 98% rename from rs-client/src/main/java/DesktopPlatformInfoProvider.java rename to runescape-client/src/main/java/DesktopPlatformInfoProvider.java index c99809fbaf..b04a824018 100644 --- a/rs-client/src/main/java/DesktopPlatformInfoProvider.java +++ b/runescape-client/src/main/java/DesktopPlatformInfoProvider.java @@ -1,4 +1,5 @@ import java.util.Random; +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -11,6 +12,7 @@ public class DesktopPlatformInfoProvider implements PlatformInfoProvider { signature = "(I)Llb;", garbageValue = "-843739713" ) + @Export("get") public PlatformInfo get() { byte var1; if(WorldMapSection3.osNameLowerCase.startsWith("win")) { diff --git a/rs-client/src/main/java/DevicePcmPlayer.java b/runescape-client/src/main/java/DevicePcmPlayer.java similarity index 100% rename from rs-client/src/main/java/DevicePcmPlayer.java rename to runescape-client/src/main/java/DevicePcmPlayer.java diff --git a/rs-client/src/main/java/DevicePcmPlayerProvider.java b/runescape-client/src/main/java/DevicePcmPlayerProvider.java similarity index 98% rename from rs-client/src/main/java/DevicePcmPlayerProvider.java rename to runescape-client/src/main/java/DevicePcmPlayerProvider.java index b5bda991c5..91034e8a5c 100644 --- a/rs-client/src/main/java/DevicePcmPlayerProvider.java +++ b/runescape-client/src/main/java/DevicePcmPlayerProvider.java @@ -26,6 +26,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { signature = "(B)Lco;", garbageValue = "-49" ) + @Export("player") public PcmPlayer player() { return new DevicePcmPlayer(); } @@ -308,7 +309,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { } if(var10.contentType == 1402) { - class16.field85.method1782(var12, Client.cycle); + class16.loginScreenRunesAnimation.method1782(var12, Client.cycle); } } @@ -367,7 +368,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { if(var10.inventorySprites != null && var30 < 20) { Sprite var42 = var10.getInventorySprite(var30); if(var42 != null) { - var42.__a_505(var22, var23); + var42.drawAt2(var22, var23); } else if(Widget.__ho_j) { class22.method295(var10); } @@ -438,7 +439,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { } else if(var10 == BoundaryObject.__ej_jv && var30 == Client.__client_jz) { var27.__h_508(var22, var23, 128); } else { - var27.__a_505(var22, var23); + var27.drawAt2(var22, var23); } } else { class22.method295(var10); @@ -474,7 +475,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { if(var14 == 0) { Rasterizer2D.Rasterizer2D_fillRectangle(var12, var13, var10.width, var10.height, var30); } else { - Rasterizer2D.Rasterizer2D_moreAlpha(var12, var13, var10.width, var10.height, var30, 256 - (var14 & 255)); + Rasterizer2D.Rasterizer2D_fillRectangleAlpha(var12, var13, var10.width, var10.height, var30, 256 - (var14 & 255)); } } } else if(var14 == 0) { @@ -536,7 +537,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { if(!var10.isIf3) { var37 = var10.getSprite(class238.runCs1(var10)); if(var37 != null) { - var37.__a_505(var12, var13); + var37.drawAt2(var12, var13); } else if(Widget.__ho_j) { class22.method295(var10); } @@ -561,7 +562,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { } else if(var14 != 0) { var37.__c_509(var12, var13, var10.width, var10.height, 256 - (var14 & 255)); } else if(var20 == var10.width && var21 == var10.height) { - var37.__a_505(var12, var13); + var37.drawAt2(var12, var13); } else { var37.__j_506(var12, var13, var10.width, var10.height); } @@ -577,7 +578,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { } else if(var14 != 0) { var37.__h_508(var12 + var20 * var24, var13 + var21 * var25, 256 - (var14 & 255)); } else { - var37.__a_505(var12 + var20 * var24, var13 + var25 * var21); + var37.drawAt2(var12 + var20 * var24, var13 + var25 * var21); } } } diff --git a/rs-client/src/main/java/DirectByteArrayCopier.java b/runescape-client/src/main/java/DirectByteArrayCopier.java similarity index 96% rename from rs-client/src/main/java/DirectByteArrayCopier.java rename to runescape-client/src/main/java/DirectByteArrayCopier.java index 546bc285e8..0bf9f0d78a 100644 --- a/rs-client/src/main/java/DirectByteArrayCopier.java +++ b/runescape-client/src/main/java/DirectByteArrayCopier.java @@ -16,6 +16,7 @@ public class DirectByteArrayCopier extends AbstractByteArrayCopier { signature = "(I)[B", garbageValue = "-1219910462" ) + @Export("get") byte[] get() { byte[] var1 = new byte[this.directBuffer.capacity()]; this.directBuffer.position(0); @@ -28,6 +29,7 @@ public class DirectByteArrayCopier extends AbstractByteArrayCopier { signature = "([BI)V", garbageValue = "-2034091753" ) + @Export("set") void set(byte[] var1) { this.directBuffer = ByteBuffer.allocateDirect(var1.length); this.directBuffer.position(0); diff --git a/rs-client/src/main/java/DirectWrapper.java b/runescape-client/src/main/java/DirectWrapper.java similarity index 92% rename from rs-client/src/main/java/DirectWrapper.java rename to runescape-client/src/main/java/DirectWrapper.java index cf3f5cab78..64bb73c154 100644 --- a/rs-client/src/main/java/DirectWrapper.java +++ b/runescape-client/src/main/java/DirectWrapper.java @@ -15,11 +15,13 @@ public class DirectWrapper extends Wrapper { } @ObfuscatedName("m") + @Export("get") Object get() { return this.obj; } @ObfuscatedName("f") + @Export("isSoft") boolean isSoft() { return false; } diff --git a/rs-client/src/main/java/DualNode.java b/runescape-client/src/main/java/DualNode.java similarity index 100% rename from rs-client/src/main/java/DualNode.java rename to runescape-client/src/main/java/DualNode.java diff --git a/rs-client/src/main/java/DualNodeDeque.java b/runescape-client/src/main/java/DualNodeDeque.java similarity index 100% rename from rs-client/src/main/java/DualNodeDeque.java rename to runescape-client/src/main/java/DualNodeDeque.java diff --git a/rs-client/src/main/java/DynamicObject.java b/runescape-client/src/main/java/DynamicObject.java similarity index 86% rename from rs-client/src/main/java/DynamicObject.java rename to runescape-client/src/main/java/DynamicObject.java index 891cc10b79..af0b3ff97a 100644 --- a/rs-client/src/main/java/DynamicObject.java +++ b/runescape-client/src/main/java/DynamicObject.java @@ -74,15 +74,15 @@ public class DynamicObject extends Entity { @ObfuscatedSignature( signature = "(IIIIIIIZLex;)V" ) - DynamicObject(int var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8, Entity var9) { + DynamicObject(int var1, int var2, int var3, int var4, int var5, int var6, int animationID, boolean var8, Entity var9) { this.id = var1; this.type = var2; this.orientation = var3; this.plane = var4; this.x = var5; this.y = var6; - if(var7 != -1) { - this.sequenceDefinition = WorldMapAreaData.getSequenceDefinition(var7); + if(animationID != -1) { + this.sequenceDefinition = WorldMapAreaData.getSequenceDefinition(animationID); this.frame = 0; this.cycleStart = Client.cycle - 1; if(this.sequenceDefinition.__t == 0 && var9 != null && var9 instanceof DynamicObject) { @@ -107,6 +107,7 @@ public class DynamicObject extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { if(this.sequenceDefinition != null) { int var1 = Client.cycle - this.cycleStart; @@ -208,17 +209,17 @@ public class DynamicObject extends Entity { ) static int method2223(int var0, Script var1, boolean var2) { if(var0 == 5000) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.publicChatMode; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.publicChatMode; return 1; } else if(var0 == 5001) { - class179.Interpreter_intStackSize -= 3; - Client.publicChatMode = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - IndexCacheLoader.field512 = WorldMapElement.method4783(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + RouteStrategy.Interpreter_intStackSize -= 3; + Client.publicChatMode = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + IndexCacheLoader.field512 = WorldMapElement.method4783(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); if(IndexCacheLoader.field512 == null) { IndexCacheLoader.field512 = class310.field3805; } - Client.__client_pl = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; + Client.__client_pl = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; PacketBufferNode var18 = Interpreter.method1915(ClientPacket.__gs_z, Client.packetWriter.isaacCipher); var18.packetBuffer.writeByte(Client.publicChatMode); var18.packetBuffer.writeByte(IndexCacheLoader.field512.field3804); @@ -230,9 +231,9 @@ public class DynamicObject extends Entity { int var4; if(var0 == 5002) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - class179.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - int var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + int var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; PacketBufferNode var6 = Interpreter.method1915(ClientPacket.__gs_ae, Client.packetWriter.isaacCipher); var6.packetBuffer.writeByte(WorldMapRegion.method550(var3) + 2); var6.packetBuffer.writeStringCp1252NullTerminated(var3); @@ -243,58 +244,58 @@ public class DynamicObject extends Entity { } else { int var10; if(var0 == 5003) { - class179.Interpreter_intStackSize -= 2; - var10 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var10 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; Message var15 = Message.method1226(var10, var4); if(var15 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var15.count; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var15.cycle; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var15.count; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var15.cycle; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var15.sender != null?var15.sender:""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var15.prefix != null?var15.prefix:""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var15.text != null?var15.text:""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var15.isFromFriend()?1:(var15.isFromIgnored()?2:0); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var15.isFromFriend()?1:(var15.isFromIgnored()?2:0); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 5004) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Message var16 = NetCache.method4708(var10); if(var16 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var16.type; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var16.cycle; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var16.type; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var16.cycle; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16.sender != null?var16.sender:""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16.prefix != null?var16.prefix:""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16.text != null?var16.text:""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var16.isFromFriend()?1:(var16.isFromIgnored()?2:0); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var16.isFromFriend()?1:(var16.isFromIgnored()?2:0); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 5005) { if(IndexCacheLoader.field512 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = IndexCacheLoader.field512.field3804; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = IndexCacheLoader.field512.field3804; } return 1; } else if(var0 == 5008) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; String var14 = var3.toLowerCase(); byte var17 = 0; if(var14.startsWith("yellow:")) { @@ -433,23 +434,23 @@ public class DynamicObject extends Entity { return 1; } else if(var0 != 5015) { if(var0 == 5016) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.__client_pl; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.__client_pl; return 1; } else if(var0 == 5017) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WidgetGroupParent.method1174(var10); + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WidgetGroupParent.method1174(var10); return 1; } else if(var0 == 5018) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class12.method161(var10); + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class12.method161(var10); return 1; } else if(var0 == 5019) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = SpriteMask.method4391(var10); + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = SpriteMask.method4391(var10); return 1; } else if(var0 == 5020) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - BoundaryObject.method3235(var3); + BoundaryObject.doCheat(var3); return 1; } else if(var0 == 5021) { Client.__client_pz = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize].toLowerCase().trim(); diff --git a/rs-client/src/main/java/Entity.java b/runescape-client/src/main/java/Entity.java similarity index 100% rename from rs-client/src/main/java/Entity.java rename to runescape-client/src/main/java/Entity.java diff --git a/rs-client/src/main/java/EnumDefinition.java b/runescape-client/src/main/java/EnumDefinition.java similarity index 100% rename from rs-client/src/main/java/EnumDefinition.java rename to runescape-client/src/main/java/EnumDefinition.java diff --git a/rs-client/src/main/java/Enumerated.java b/runescape-client/src/main/java/Enumerated.java similarity index 85% rename from rs-client/src/main/java/Enumerated.java rename to runescape-client/src/main/java/Enumerated.java index 9667cfd0d9..65f99d25ad 100644 --- a/rs-client/src/main/java/Enumerated.java +++ b/runescape-client/src/main/java/Enumerated.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -10,5 +11,6 @@ public interface Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") int rsOrdinal(); } diff --git a/rs-client/src/main/java/EvictingDualNodeHashTable.java b/runescape-client/src/main/java/EvictingDualNodeHashTable.java similarity index 99% rename from rs-client/src/main/java/EvictingDualNodeHashTable.java rename to runescape-client/src/main/java/EvictingDualNodeHashTable.java index 0201ac4f50..c655b8180b 100644 --- a/rs-client/src/main/java/EvictingDualNodeHashTable.java +++ b/runescape-client/src/main/java/EvictingDualNodeHashTable.java @@ -10,7 +10,6 @@ public final class EvictingDualNodeHashTable { @ObfuscatedSignature( signature = "Lfn;" ) - @Export("__m") DualNode __m; @ObfuscatedName("f") @Export("capacity") diff --git a/rs-client/src/main/java/FaceNormal.java b/runescape-client/src/main/java/FaceNormal.java similarity index 97% rename from rs-client/src/main/java/FaceNormal.java rename to runescape-client/src/main/java/FaceNormal.java index c301844a78..88ab031bd5 100644 --- a/rs-client/src/main/java/FaceNormal.java +++ b/runescape-client/src/main/java/FaceNormal.java @@ -14,31 +14,26 @@ public class FaceNormal { @ObfuscatedGetter( intValue = 422473713 ) - @Export("__el_x") public static int __el_x; @ObfuscatedName("gm") @ObfuscatedSignature( signature = "Lln;" ) - @Export("__el_gm") static Sprite __el_gm; @ObfuscatedName("m") @ObfuscatedGetter( intValue = -2074333261 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1376860893 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 2619977 ) - @Export("__q") int __q; @ObfuscatedName("f") diff --git a/rs-client/src/main/java/FloorDecoration.java b/runescape-client/src/main/java/FloorDecoration.java similarity index 100% rename from rs-client/src/main/java/FloorDecoration.java rename to runescape-client/src/main/java/FloorDecoration.java diff --git a/rs-client/src/main/java/Font.java b/runescape-client/src/main/java/Font.java similarity index 97% rename from rs-client/src/main/java/Font.java rename to runescape-client/src/main/java/Font.java index 57d955d98c..55ef8f5fe3 100644 --- a/rs-client/src/main/java/Font.java +++ b/runescape-client/src/main/java/Font.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; @@ -13,6 +14,7 @@ public final class Font extends AbstractFont { } @ObfuscatedName("m") + @Export("drawGlyph") final void drawGlyph(byte[] var1, int var2, int var3, int var4, int var5, int var6) { int var7 = var3 * Rasterizer2D.Rasterizer2D_width + var2; int var8 = Rasterizer2D.Rasterizer2D_width - var4; @@ -54,6 +56,7 @@ public final class Font extends AbstractFont { } @ObfuscatedName("f") + @Export("drawGlyphAlpha") final void drawGlyphAlpha(byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7) { int var8 = var3 * Rasterizer2D.Rasterizer2D_width + var2; int var9 = Rasterizer2D.Rasterizer2D_width - var4; diff --git a/rs-client/src/main/java/FontName.java b/runescape-client/src/main/java/FontName.java similarity index 73% rename from rs-client/src/main/java/FontName.java rename to runescape-client/src/main/java/FontName.java index 621620cf0b..89099885cc 100644 --- a/rs-client/src/main/java/FontName.java +++ b/runescape-client/src/main/java/FontName.java @@ -43,7 +43,6 @@ public class FontName { @Export("FontName_verdana15") public static final FontName FontName_verdana15; @ObfuscatedName("g") - @Export("__g") String __g; static { @@ -78,11 +77,12 @@ public class FontName { signature = "(I)V", garbageValue = "-1587423260" ) - static void method5636() { - Login.__cu_bk = false; - Login.__cu_g.drawAt(Login.__cu_q, 0); - Fonts.__kz_l.drawAt(Login.__cu_q + 382, 0); - WorldMapSectionType.__h_e.__q_496(Login.__cu_q + 382 - WorldMapSectionType.__h_e.subWidth / 2, 18); + @Export("closeWorldSelect") + static void closeWorldSelect() { + Login.worldSelectOpen = false; + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + Fonts.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + WorldMapSectionType.logoSprite.drawAt(Login.xPadding + 382 - WorldMapSectionType.logoSprite.subWidth / 2, 18); } @ObfuscatedName("s") @@ -106,18 +106,18 @@ public class FontName { static int method5639(int var0, Script var1, boolean var2) { if(var0 == 3600) { if(WorldMapArea.friendSystem.__g == 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -2; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -2; } else if(WorldMapArea.friendSystem.__g == 1) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.friendsList.size(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.friendsList.size(); } return 1; } else { int var3; if(var0 == 3601) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(WorldMapArea.friendSystem.__m_151() && var3 >= 0 && var3 < WorldMapArea.friendSystem.friendsList.size()) { Friend var8 = (Friend)WorldMapArea.friendSystem.friendsList.get(var3); Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var8.name(); @@ -129,20 +129,20 @@ public class FontName { return 1; } else if(var0 == 3602) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(WorldMapArea.friendSystem.__m_151() && var3 >= 0 && var3 < WorldMapArea.friendSystem.friendsList.size()) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ((Buddy)WorldMapArea.friendSystem.friendsList.get(var3)).world0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ((Buddy)WorldMapArea.friendSystem.friendsList.get(var3)).world0; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 3603) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(WorldMapArea.friendSystem.__m_151() && var3 >= 0 && var3 < WorldMapArea.friendSystem.friendsList.size()) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ((Buddy)WorldMapArea.friendSystem.friendsList.get(var3)).rank; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ((Buddy)WorldMapArea.friendSystem.friendsList.get(var3)).rank; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; @@ -150,7 +150,7 @@ public class FontName { String var5; if(var0 == 3604) { var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - int var6 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + int var6 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; method5638(var5, var6); return 1; } else if(var0 == 3605) { @@ -172,7 +172,7 @@ public class FontName { } else if(var0 == 3609) { var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; var5 = NpcDefinition.method5161(var5); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.isFriended(new Username(var5, KeyHandler.loginType), false)?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.isFriended(new Username(var5, KeyHandler.loginType), false)?1:0; return 1; } else if(var0 == 3611) { if(PacketWriter.clanChat != null) { @@ -184,14 +184,14 @@ public class FontName { return 1; } else if(var0 == 3612) { if(PacketWriter.clanChat != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = PacketWriter.clanChat.size(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = PacketWriter.clanChat.size(); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 3613) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(PacketWriter.clanChat != null && var3 < PacketWriter.clanChat.size()) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = PacketWriter.clanChat.get(var3).username().getName(); } else { @@ -200,32 +200,32 @@ public class FontName { return 1; } else if(var0 == 3614) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(PacketWriter.clanChat != null && var3 < PacketWriter.clanChat.size()) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ((Buddy)PacketWriter.clanChat.get(var3)).world(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ((Buddy)PacketWriter.clanChat.get(var3)).world(); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 3615) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(PacketWriter.clanChat != null && var3 < PacketWriter.clanChat.size()) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ((Buddy)PacketWriter.clanChat.get(var3)).rank; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ((Buddy)PacketWriter.clanChat.get(var3)).rank; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 3616) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = PacketWriter.clanChat != null?PacketWriter.clanChat.__k:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = PacketWriter.clanChat != null?PacketWriter.clanChat.__k:0; return 1; } else if(var0 == 3617) { var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; IndexStoreActionHandler.method4655(var5); return 1; } else if(var0 == 3618) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = PacketWriter.clanChat != null?PacketWriter.clanChat.rank:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = PacketWriter.clanChat != null?PacketWriter.clanChat.rank:0; return 1; } else if(var0 == 3619) { var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; @@ -236,14 +236,14 @@ public class FontName { return 1; } else if(var0 == 3621) { if(!WorldMapArea.friendSystem.__m_151()) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.ignoreList.size(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.ignoreList.size(); } return 1; } else if(var0 == 3622) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(WorldMapArea.friendSystem.__m_151() && var3 >= 0 && var3 < WorldMapArea.friendSystem.ignoreList.size()) { Ignored var4 = (Ignored)WorldMapArea.friendSystem.ignoreList.get(var3); Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.name(); @@ -257,14 +257,14 @@ public class FontName { } else if(var0 == 3623) { var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; var5 = NpcDefinition.method5161(var5); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.isIgnored(new Username(var5, KeyHandler.loginType))?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapArea.friendSystem.isIgnored(new Username(var5, KeyHandler.loginType))?1:0; return 1; } else if(var0 == 3624) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - if(PacketWriter.clanChat != null && var3 < PacketWriter.clanChat.size() && PacketWriter.clanChat.get(var3).username().__equals_466(Canvas.localPlayer.username)) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + if(PacketWriter.clanChat != null && var3 < PacketWriter.clanChat.size() && PacketWriter.clanChat.get(var3).username().equals(Canvas.localPlayer.username)) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; @@ -277,11 +277,11 @@ public class FontName { return 1; } else if(var0 == 3626) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(PacketWriter.clanChat != null && var3 < PacketWriter.clanChat.size() && ((ClanMate)PacketWriter.clanChat.get(var3)).isFriend()) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; @@ -292,43 +292,43 @@ public class FontName { } else { boolean var7; if(var0 == 3629) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator1(var7)); return 1; } else if(var0 == 3630) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator2(var7)); return 1; } else if(var0 == 3631) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator3(var7)); return 1; } else if(var0 == 3632) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator4(var7)); return 1; } else if(var0 == 3633) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator5(var7)); return 1; } else if(var0 == 3634) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator6(var7)); return 1; } else if(var0 == 3635) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator7(var7)); return 1; } else if(var0 == 3636) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator8(var7)); return 1; } else if(var0 == 3637) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator9(var7)); return 1; } else if(var0 == 3638) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new UserComparator10(var7)); return 1; } else if(var0 == 3639) { @@ -338,11 +338,11 @@ public class FontName { WorldMapArea.friendSystem.ignoreList.removeComparator(); return 1; } else if(var0 == 3641) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.ignoreList.addComparator(new UserComparator1(var7)); return 1; } else if(var0 == 3642) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.ignoreList.addComparator(new UserComparator2(var7)); return 1; } else if(var0 == 3643) { @@ -355,70 +355,70 @@ public class FontName { return 1; } else if(var0 == 3645) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator1(var7)); } return 1; } else if(var0 == 3646) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator2(var7)); } return 1; } else if(var0 == 3647) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator3(var7)); } return 1; } else if(var0 == 3648) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator4(var7)); } return 1; } else if(var0 == 3649) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator5(var7)); } return 1; } else if(var0 == 3650) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator6(var7)); } return 1; } else if(var0 == 3651) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator7(var7)); } return 1; } else if(var0 == 3652) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator8(var7)); } return 1; } else if(var0 == 3653) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator9(var7)); } return 1; } else if(var0 == 3654) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new UserComparator10(var7)); } @@ -431,11 +431,11 @@ public class FontName { return 1; } else if(var0 == 3656) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapArea.friendSystem.friendsList.addComparator(new class157(var7)); return 1; } else if(var0 == 3657) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(PacketWriter.clanChat != null) { PacketWriter.clanChat.addComparator(new class157(var7)); } @@ -446,11 +446,11 @@ public class FontName { } } } else { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(PacketWriter.clanChat != null && var3 < PacketWriter.clanChat.size() && ((ClanMate)PacketWriter.clanChat.get(var3)).isIgnored()) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; @@ -470,14 +470,14 @@ public class FontName { DevicePcmPlayerProvider.method841(); WorldMapManager.method673(); WorldMapLabel.method440(); - class72.method1780(); + LoginScreenAnimation.method1780(); SequenceDefinition.SequenceDefinition_cached.clear(); SequenceDefinition.__jh_o.clear(); UserComparator3.method3379(); VarbitDefinition.VarbitDefinition_cached.clear(); VarpDefinition.VarpDefinition_cached.clear(); GrandExchangeEvents.method69(); - Buffer.method3915(); + Buffer.clearHealthbarCaches(); StructDefinition.__jq_f.clear(); InvDefinition.method4754(); Projectile.method2089(); @@ -581,7 +581,7 @@ public class FontName { static final void method5635() { for(int var0 = 0; var0 < Players.Players_count; ++var0) { Player var1 = Client.players[Players.Players_indices[var0]]; - var1.__u_128(); + var1.clearIsInClanChat(); } } diff --git a/rs-client/src/main/java/Fonts.java b/runescape-client/src/main/java/Fonts.java similarity index 95% rename from rs-client/src/main/java/Fonts.java rename to runescape-client/src/main/java/Fonts.java index 0da8788136..98f2077878 100644 --- a/rs-client/src/main/java/Fonts.java +++ b/runescape-client/src/main/java/Fonts.java @@ -14,25 +14,22 @@ public class Fonts { @Export("indexStore255") static IndexStore indexStore255; @ObfuscatedName("o") - @Export("__kz_o") static byte[][][] __kz_o; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lln;" ) - @Export("__kz_l") - static Sprite __kz_l; + @Export("rightTitleSprite") + static Sprite rightTitleSprite; @ObfuscatedName("m") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__m") AbstractIndexCache __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__f") AbstractIndexCache __f; @ObfuscatedName("q") @Export("map") diff --git a/rs-client/src/main/java/Formatting.java b/runescape-client/src/main/java/Formatting.java similarity index 65% rename from rs-client/src/main/java/Formatting.java rename to runescape-client/src/main/java/Formatting.java index 7c021f1425..1a656b9e0a 100644 --- a/rs-client/src/main/java/Formatting.java +++ b/runescape-client/src/main/java/Formatting.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Formatting") public class Formatting { @ObfuscatedName("d") - @Export("__cy_d") static int[] __cy_d; @ObfuscatedName("dh") @ObfuscatedSignature( @@ -24,18 +23,18 @@ public class Formatting { static int method2023(int var0, Script var1, boolean var2) { Widget var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; if(var0 == 1700) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.itemId; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.itemId; return 1; } else if(var0 == 1701) { if(var3.itemId != -1) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.itemQuantity; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.itemQuantity; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 1702) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.childIndex; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.childIndex; return 1; } else { return 2; @@ -52,9 +51,9 @@ public class Formatting { int var4; int var6; if(var0 == 3400) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; EnumDefinition var5 = Interpreter.getEnum(var3); if(var5.valType != 's') { ; @@ -75,19 +74,19 @@ public class Formatting { return 1; } else if(var0 != 3408) { if(var0 == 3411) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; EnumDefinition var10 = Interpreter.getEnum(var3); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var10.size(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var10.size(); return 1; } else { return 2; } } else { - class179.Interpreter_intStackSize -= 4; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - int var9 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - var6 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3]; + RouteStrategy.Interpreter_intStackSize -= 4; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + int var9 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + var6 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3]; EnumDefinition var7 = Interpreter.getEnum(var9); if(var3 == var7.keyType && var4 == var7.valType) { for(int var8 = 0; var8 < var7.size0; ++var8) { @@ -95,7 +94,7 @@ public class Formatting { if(var4 == 115) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var7.stringVals[var8]; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var7.intVals[var8]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var7.intVals[var8]; } var7 = null; @@ -107,7 +106,7 @@ public class Formatting { if(var4 == 115) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var7.defaultString; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var7.defaultInt; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var7.defaultInt; } } @@ -116,7 +115,7 @@ public class Formatting { if(var4 == 115) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = "null"; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; diff --git a/rs-client/src/main/java/Frames.java b/runescape-client/src/main/java/Frames.java similarity index 96% rename from rs-client/src/main/java/Frames.java rename to runescape-client/src/main/java/Frames.java index 30895668fb..cca71579cf 100644 --- a/rs-client/src/main/java/Frames.java +++ b/runescape-client/src/main/java/Frames.java @@ -13,8 +13,8 @@ public class Frames extends DualNode { @ObfuscatedSignature( signature = "[Llq;" ) - @Export("__en_bc") - static IndexedSprite[] __en_bc; + @Export("worldSelectFlagSprites") + static IndexedSprite[] worldSelectFlagSprites; @ObfuscatedName("m") @ObfuscatedSignature( signature = "[Ldz;" diff --git a/rs-client/src/main/java/Friend.java b/runescape-client/src/main/java/Friend.java similarity index 97% rename from rs-client/src/main/java/Friend.java rename to runescape-client/src/main/java/Friend.java index 7fb5401ec7..946be4825c 100644 --- a/rs-client/src/main/java/Friend.java +++ b/runescape-client/src/main/java/Friend.java @@ -11,10 +11,8 @@ public class Friend extends Buddy { @Export("soundSystemExecutor") static ScheduledExecutorService soundSystemExecutor; @ObfuscatedName("m") - @Export("__m") boolean __m; @ObfuscatedName("f") - @Export("__f") boolean __f; @ObfuscatedName("m") diff --git a/rs-client/src/main/java/FriendLoginUpdate.java b/runescape-client/src/main/java/FriendLoginUpdate.java similarity index 97% rename from rs-client/src/main/java/FriendLoginUpdate.java rename to runescape-client/src/main/java/FriendLoginUpdate.java index 950f6b6589..8745b5bdc2 100644 --- a/rs-client/src/main/java/FriendLoginUpdate.java +++ b/runescape-client/src/main/java/FriendLoginUpdate.java @@ -11,7 +11,6 @@ public class FriendLoginUpdate extends Link { @ObfuscatedSignature( signature = "Ley;" ) - @Export("__kn_x") static UrlRequest __kn_x; @ObfuscatedName("q") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/FriendSystem.java b/runescape-client/src/main/java/FriendSystem.java similarity index 94% rename from rs-client/src/main/java/FriendSystem.java rename to runescape-client/src/main/java/FriendSystem.java index 0f02e5ef71..908cc6f100 100644 --- a/rs-client/src/main/java/FriendSystem.java +++ b/runescape-client/src/main/java/FriendSystem.java @@ -29,7 +29,6 @@ public class FriendSystem { @ObfuscatedGetter( intValue = 1477282369 ) - @Export("__g") int __g; @ObfuscatedSignature( @@ -47,7 +46,6 @@ public class FriendSystem { signature = "(B)Z", garbageValue = "-114" ) - @Export("__m_151") boolean __m_151() { return this.__g == 2; } @@ -57,7 +55,6 @@ public class FriendSystem { signature = "(I)V", garbageValue = "-2125539725" ) - @Export("__f_152") final void __f_152() { this.__g = 1; } @@ -67,7 +64,6 @@ public class FriendSystem { signature = "(Lgr;II)V", garbageValue = "-1440726810" ) - @Export("__q_153") final void __q_153(Buffer var1, int var2) { this.friendsList.read(var1, var2); this.__g = 2; @@ -79,7 +75,6 @@ public class FriendSystem { signature = "(I)V", garbageValue = "-1408945788" ) - @Export("__w_154") final void __w_154() { for(FriendLoginUpdate var1 = (FriendLoginUpdate)this.friendsList.friendLoginUpdates.__f_438(); var1 != null; var1 = (FriendLoginUpdate)this.friendsList.friendLoginUpdates.__q_439()) { if((long)var1.time < class203.currentTimeMs() / 1000L - 5L) { @@ -116,7 +111,7 @@ public class FriendSystem { ) @Export("isFriended") final boolean isFriended(Username var1, boolean var2) { - return var1 != null && (var1.__equals_466(Canvas.localPlayer.username) || this.friendsList.isFriended(var1, var2)); + return var1 != null && (var1.equals(Canvas.localPlayer.username) || this.friendsList.isFriended(var1, var2)); } @ObfuscatedName("g") @@ -134,7 +129,6 @@ public class FriendSystem { signature = "(Ljava/lang/String;I)V", garbageValue = "-1721017960" ) - @Export("__l_157") final void __l_157(String var1) { if(var1 != null) { Username var2 = new Username(var1, this.loginType); @@ -145,7 +139,7 @@ public class FriendSystem { var10000 = null; var4 = "Your friend list is full. Max of 200 for free users, and 400 for members"; WorldMapIcon1.method219(30, "", var4); - } else if(Canvas.localPlayer.username.__equals_466(var2)) { + } else if(Canvas.localPlayer.username.equals(var2)) { var10000 = null; var4 = "You can\'t add yourself to your own friend list"; WorldMapIcon1.method219(30, "", var4); @@ -179,7 +173,6 @@ public class FriendSystem { signature = "(B)Z", garbageValue = "57" ) - @Export("__e_158") final boolean __e_158() { return this.friendsList.isFull() || this.friendsList.size() >= 200 && Client.__client_jo != 1; } @@ -189,7 +182,6 @@ public class FriendSystem { signature = "(Ljava/lang/String;B)V", garbageValue = "30" ) - @Export("__x_159") final void __x_159(String var1) { if(var1 != null) { Username var2 = new Username(var1, this.loginType); @@ -200,7 +192,7 @@ public class FriendSystem { var10000 = null; var4 = "Your ignore list is full. Max of 100 for free users, and 400 for members"; WorldMapIcon1.method219(30, "", var4); - } else if(Canvas.localPlayer.username.__equals_466(var2)) { + } else if(Canvas.localPlayer.username.equals(var2)) { var10000 = null; var4 = "You can\'t add yourself to your own ignore list"; WorldMapIcon1.method219(30, "", var4); @@ -228,7 +220,6 @@ public class FriendSystem { signature = "(B)Z", garbageValue = "120" ) - @Export("__a_160") final boolean __a_160() { return this.ignoreList.isFull() || this.ignoreList.size() >= 100 && Client.__client_jo != 1; } @@ -284,8 +275,8 @@ public class FriendSystem { signature = "(Lkp;S)Z", garbageValue = "-543" ) - @Export("__t_161") - final boolean __t_161(Username var1) { + @Export("isFriendAndHasWorld") + final boolean isFriendAndHasWorld(Username var1) { Friend var2 = (Friend)this.friendsList.getByUsername(var1); return var2 != null && var2.hasWorld(); } @@ -299,7 +290,7 @@ public class FriendSystem { Widget var3; if(var0 >= 2000) { var0 -= 1000; - var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); } else { var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; } @@ -327,7 +318,8 @@ public class FriendSystem { signature = "(B)Z", garbageValue = "0" ) - public static boolean method1868() { + @Export("jmodCheck") + public static boolean jmodCheck() { return Client.rights >= 2; } } diff --git a/rs-client/src/main/java/FriendsList.java b/runescape-client/src/main/java/FriendsList.java similarity index 97% rename from rs-client/src/main/java/FriendsList.java rename to runescape-client/src/main/java/FriendsList.java index dd2ac0d342..b39fda53a7 100644 --- a/rs-client/src/main/java/FriendsList.java +++ b/runescape-client/src/main/java/FriendsList.java @@ -17,7 +17,6 @@ public class FriendsList extends UserList { @ObfuscatedGetter( intValue = -217526077 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedSignature( @@ -41,6 +40,7 @@ public class FriendsList extends UserList { signature = "(I)Ljs;", garbageValue = "-2063112195" ) + @Export("newInstance") User newInstance() { return new Friend(); } @@ -50,6 +50,7 @@ public class FriendsList extends UserList { signature = "(II)[Ljs;", garbageValue = "861814350" ) + @Export("newTypedArray") User[] newTypedArray(int var1) { return new Friend[var1]; } @@ -108,7 +109,7 @@ public class FriendsList extends UserList { boolean var14 = true; for(FriendLoginUpdate var13 = (FriendLoginUpdate)this.friendLoginUpdates.__f_438(); var13 != null; var13 = (FriendLoginUpdate)this.friendLoginUpdates.__q_439()) { - if(var13.username.__equals_466(var4)) { + if(var13.username.equals(var4)) { if(var6 != 0 && var13.world == 0) { var13.remove(); var14 = false; diff --git a/rs-client/src/main/java/GameObject.java b/runescape-client/src/main/java/GameObject.java similarity index 98% rename from rs-client/src/main/java/GameObject.java rename to runescape-client/src/main/java/GameObject.java index 85f50711d9..8bb9660616 100644 --- a/rs-client/src/main/java/GameObject.java +++ b/runescape-client/src/main/java/GameObject.java @@ -17,7 +17,6 @@ public final class GameObject { @ObfuscatedGetter( intValue = -457229589 ) - @Export("__eh_fy") static int __eh_fy; @ObfuscatedName("m") @ObfuscatedGetter( @@ -83,7 +82,6 @@ public final class GameObject { @ObfuscatedGetter( intValue = 1941106389 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/GameShell.java b/runescape-client/src/main/java/GameShell.java similarity index 98% rename from rs-client/src/main/java/GameShell.java rename to runescape-client/src/main/java/GameShell.java index 0fb0767d13..dad3bf2500 100644 --- a/rs-client/src/main/java/GameShell.java +++ b/runescape-client/src/main/java/GameShell.java @@ -43,7 +43,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @ObfuscatedGetter( intValue = -281664295 ) - @Export("__ba_q") static int __ba_q; @ObfuscatedName("o") @ObfuscatedGetter( @@ -58,19 +57,16 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @ObfuscatedGetter( intValue = -1179083285 ) - @Export("__ba_l") static int __ba_l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1698831905 ) - @Export("__ba_e") static int __ba_e; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 425367827 ) - @Export("__ba_d") static int __ba_d; @ObfuscatedName("k") @ObfuscatedGetter( @@ -79,22 +75,18 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @Export("fps") protected static int fps; @ObfuscatedName("a") - @Export("__ba_a") static long[] __ba_a; @ObfuscatedName("j") - @Export("__ba_j") static long[] __ba_j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = -2078849253 ) - @Export("__ba_s") static int __ba_s; @ObfuscatedName("aw") @ObfuscatedGetter( intValue = -1042005999 ) - @Export("__ba_aw") static int __ba_aw; @ObfuscatedName("an") @Export("hasFocus") @@ -175,7 +167,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @Export("canvas") java.awt.Canvas canvas; @ObfuscatedName("ah") - @Export("__ah") volatile boolean __ah; @ObfuscatedName("al") @Export("resizeCanvasNextFrame") @@ -405,7 +396,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "-1773624745" ) - @Export("__j_113") protected abstract void __j_113(); @ObfuscatedName("p") @@ -613,7 +603,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(B)V", garbageValue = "0" ) - @Export("__av_93") void __av_93() { long var1 = class203.currentTimeMs(); long var3 = __ba_j[__ba_s]; @@ -635,7 +624,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(B)V", garbageValue = "-2" ) - @Export("__ar_94") void __ar_94() { Container var1 = this.container(); long var2 = class203.currentTimeMs(); @@ -678,7 +666,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "-1999661001" ) - @Export("__ac_95") final void __ac_95() { Bounds var1 = this.getFrameContentBounds(); if(var1.__q != this.contentWidth || this.contentHeight != var1.__w || this.resizeCanvasNextFrame) { @@ -693,7 +680,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "1147427427" ) - @Export("__ay_96") final void __ay_96() { this.resizeCanvasNextFrame = true; } @@ -753,7 +739,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "1445885427" ) - @Export("__al_111") protected abstract void __al_111(); @ObfuscatedName("ab") @@ -833,7 +818,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "-1283386969" ) - @Export("__ad_108") protected final void __ad_108() { PlayerType.__ij_ak = null; class231.__hb_av = null; @@ -904,10 +888,8 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "1860808291" ) - @Export("__au_110") protected abstract void __au_110(); - @Export("__destroy_99") @ObfuscatedName("destroy") public final void __destroy_99() { if(this == gameShell && !isKilled) { @@ -993,7 +975,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.kill(); } - @Export("__start_97") @ObfuscatedName("start") public final void __start_97() { if(this == gameShell && !isKilled) { @@ -1040,11 +1021,9 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene public final void windowOpened(WindowEvent var1) { } - @Export("__init_109") @ObfuscatedName("init") public abstract void __init_109(); - @Export("__stop_98") @ObfuscatedName("stop") public final void __stop_98() { if(this == gameShell && !isKilled) { diff --git a/rs-client/src/main/java/GrandExchangeEvent.java b/runescape-client/src/main/java/GrandExchangeEvent.java similarity index 83% rename from rs-client/src/main/java/GrandExchangeEvent.java rename to runescape-client/src/main/java/GrandExchangeEvent.java index 77af9c38ae..07f41da157 100644 --- a/rs-client/src/main/java/GrandExchangeEvent.java +++ b/runescape-client/src/main/java/GrandExchangeEvent.java @@ -17,7 +17,6 @@ public class GrandExchangeEvent { @ObfuscatedGetter( longValue = -6503890758391257651L ) - @Export("__f") public final long __f; @ObfuscatedName("q") @ObfuscatedSignature( @@ -57,7 +56,6 @@ public class GrandExchangeEvent { signature = "(I)Ljava/lang/String;", garbageValue = "1672323214" ) - @Export("__m_3") public String __m_3() { return this.string1; } @@ -67,7 +65,6 @@ public class GrandExchangeEvent { signature = "(I)Ljava/lang/String;", garbageValue = "-271438207" ) - @Export("__f_4") public String __f_4() { return this.string2; } @@ -92,7 +89,7 @@ public class GrandExchangeEvent { } if(var3 != null) { - class179.Interpreter_intStackSize = 0; + RouteStrategy.Interpreter_intStackSize = 0; Interpreter.Interpreter_stringStackSize = 0; var17 = -1; int[] var5 = var3.opcodes; @@ -192,36 +189,36 @@ public class GrandExchangeEvent { throw new IllegalStateException(); } } else if(var29 == 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6[var17]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6[var17]; } else if(var29 == 1) { var11 = var6[var17]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Varps.Varps_main[var11]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Varps.Varps_main[var11]; } else if(var29 == 2) { var11 = var6[var17]; - Varps.Varps_main[var11] = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + Varps.Varps_main[var11] = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; IndexCache.method4703(var11); } else if(var29 == 3) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.stringOperands[var17]; } else if(var29 == 6) { var17 += var6[var17]; } else if(var29 == 7) { - class179.Interpreter_intStackSize -= 2; - if(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] != Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]) { + RouteStrategy.Interpreter_intStackSize -= 2; + if(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] != Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]) { var17 += var6[var17]; } } else if(var29 == 8) { - class179.Interpreter_intStackSize -= 2; - if(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] == Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]) { + RouteStrategy.Interpreter_intStackSize -= 2; + if(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] == Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]) { var17 += var6[var17]; } } else if(var29 == 9) { - class179.Interpreter_intStackSize -= 2; - if(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] < Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]) { + RouteStrategy.Interpreter_intStackSize -= 2; + if(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] < Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]) { var17 += var6[var17]; } } else if(var29 == 10) { - class179.Interpreter_intStackSize -= 2; - if(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] > Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]) { + RouteStrategy.Interpreter_intStackSize -= 2; + if(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] > Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]) { var17 += var6[var17]; } } else if(var29 == 21) { @@ -238,24 +235,24 @@ public class GrandExchangeEvent { Interpreter.Interpreter_stringLocals = var34.stringLocals; } else if(var29 == 25) { var11 = var6[var17]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapSection2.getVarbit(var11); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapSection2.getVarbit(var11); } else if(var29 == 27) { var11 = var6[var17]; - class68.method1695(var11, Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + class68.method1695(var11, Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); } else if(var29 == 31) { - class179.Interpreter_intStackSize -= 2; - if(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] <= Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]) { + RouteStrategy.Interpreter_intStackSize -= 2; + if(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] <= Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]) { var17 += var6[var17]; } } else if(var29 == 32) { - class179.Interpreter_intStackSize -= 2; - if(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] >= Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]) { + RouteStrategy.Interpreter_intStackSize -= 2; + if(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] >= Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]) { var17 += var6[var17]; } } else if(var29 == 33) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Username.Interpreter_intLocals[var6[var17]]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Username.Interpreter_intLocals[var6[var17]]; } else if(var29 == 34) { - Username.Interpreter_intLocals[var6[var17]] = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + Username.Interpreter_intLocals[var6[var17]] = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; } else if(var29 == 35) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Interpreter.Interpreter_stringLocals[var6[var17]]; } else if(var29 == 36) { @@ -266,20 +263,20 @@ public class GrandExchangeEvent { String var31 = class277.method5356(Interpreter.Interpreter_stringStack, Interpreter.Interpreter_stringStackSize, var11); Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var31; } else if(var29 == 38) { - --class179.Interpreter_intStackSize; + --RouteStrategy.Interpreter_intStackSize; } else if(var29 == 39) { --Interpreter.Interpreter_stringStackSize; } else { int var15; if(var29 != 40) { if(var29 == 42) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class196.varcs.getInt(var6[var17]); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class196.varcs.getInt(var6[var17]); } else if(var29 == 43) { - class196.varcs.setInt(var6[var17], Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + class196.varcs.setInt(var6[var17], Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); } else if(var29 == 44) { var11 = var6[var17] >> 16; var20 = var6[var17] & 65535; - int var21 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + int var21 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var21 < 0 || var21 > 5000) { throw new RuntimeException(); } @@ -295,21 +292,21 @@ public class GrandExchangeEvent { } } else if(var29 == 45) { var11 = var6[var17]; - var20 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var20 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var20 < 0 || var20 >= Interpreter.Interpreter_arrayLengths[var11]) { throw new RuntimeException(); } - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Interpreter.Interpreter_arrays[var11][var20]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Interpreter.Interpreter_arrays[var11][var20]; } else if(var29 == 46) { var11 = var6[var17]; - class179.Interpreter_intStackSize -= 2; - var20 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; + RouteStrategy.Interpreter_intStackSize -= 2; + var20 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; if(var20 < 0 || var20 >= Interpreter.Interpreter_arrayLengths[var11]) { throw new RuntimeException(); } - Interpreter.Interpreter_arrays[var11][var20] = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_arrays[var11][var20] = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; } else if(var29 == 47) { var18 = class196.varcs.getStringOld(var6[var17]); if(var18 == null) { @@ -330,7 +327,7 @@ public class GrandExchangeEvent { } IterableNodeHashTable var33 = var3.switches[var6[var17]]; - IntegerNode var30 = (IntegerNode)var33.get((long)Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + IntegerNode var30 = (IntegerNode)var33.get((long)Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); if(var30 != null) { var17 += var30.integer; } @@ -342,14 +339,14 @@ public class GrandExchangeEvent { String[] var14 = new String[var12.localStringCount]; for(var15 = 0; var15 < var12.intArgumentCount; ++var15) { - var13[var15] = Interpreter.Interpreter_intStack[var15 + (class179.Interpreter_intStackSize - var12.intArgumentCount)]; + var13[var15] = Interpreter.Interpreter_intStack[var15 + (RouteStrategy.Interpreter_intStackSize - var12.intArgumentCount)]; } for(var15 = 0; var15 < var12.stringArgumentCount; ++var15) { var14[var15] = Interpreter.Interpreter_stringStack[var15 + (Interpreter.Interpreter_stringStackSize - var12.stringArgumentCount)]; } - class179.Interpreter_intStackSize -= var12.intArgumentCount; + RouteStrategy.Interpreter_intStackSize -= var12.intArgumentCount; Interpreter.Interpreter_stringStackSize -= var12.stringArgumentCount; ScriptFrame var19 = new ScriptFrame(); var19.script = var3; diff --git a/rs-client/src/main/java/GrandExchangeEvents.java b/runescape-client/src/main/java/GrandExchangeEvents.java similarity index 74% rename from rs-client/src/main/java/GrandExchangeEvents.java rename to runescape-client/src/main/java/GrandExchangeEvents.java index f23a12fa99..fba00b388a 100644 --- a/rs-client/src/main/java/GrandExchangeEvents.java +++ b/runescape-client/src/main/java/GrandExchangeEvents.java @@ -12,22 +12,17 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("GrandExchangeEvents") public class GrandExchangeEvents { @ObfuscatedName("f") - @Export("__g_f") public static Comparator __g_f; @ObfuscatedName("q") - @Export("__g_q") public static Comparator __g_q; @ObfuscatedName("w") - @Export("__g_w") public static Comparator __g_w; @ObfuscatedName("o") - @Export("__g_o") public static Comparator __g_o; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1605454211 ) - @Export("__g_z") static int __g_z; @ObfuscatedName("hs") @ObfuscatedGetter( @@ -121,51 +116,51 @@ public class GrandExchangeEvents { garbageValue = "620886402" ) static int method75(int var0, Script var1, boolean var2) { - Widget var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + Widget var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); if(var0 == 2600) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollX; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollX; return 1; } else if(var0 == 2601) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollY; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollY; return 1; } else if(var0 == 2602) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.text; return 1; } else if(var0 == 2603) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollWidth; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollWidth; return 1; } else if(var0 == 2604) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.scrollHeight; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollHeight; return 1; } else if(var0 == 2605) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelZoom; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelZoom; return 1; } else if(var0 == 2606) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelAngleX; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelAngleX; return 1; } else if(var0 == 2607) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelAngleZ; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelAngleZ; return 1; } else if(var0 == 2608) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.modelAngleY; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelAngleY; return 1; } else if(var0 == 2609) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.transparency; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.transparency; return 1; } else if(var0 == 2610) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.__af; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.__af; return 1; } else if(var0 == 2611) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.color; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.color; return 1; } else if(var0 == 2612) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.color2; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.color2; return 1; } else if(var0 == 2613) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.rectangleMode.rsOrdinal(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.rectangleMode.rsOrdinal(); return 1; } else if(var0 == 2614) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.__bv?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.__bv?1:0; return 1; } else { return 2; diff --git a/rs-client/src/main/java/GrandExchangeOffer.java b/runescape-client/src/main/java/GrandExchangeOffer.java similarity index 97% rename from rs-client/src/main/java/GrandExchangeOffer.java rename to runescape-client/src/main/java/GrandExchangeOffer.java index 9afb606857..07df2e51e1 100644 --- a/rs-client/src/main/java/GrandExchangeOffer.java +++ b/runescape-client/src/main/java/GrandExchangeOffer.java @@ -12,7 +12,6 @@ public class GrandExchangeOffer { @ObfuscatedGetter( intValue = -1286287981 ) - @Export("__x_rg") static int __x_rg; @ObfuscatedName("l") @ObfuscatedGetter( @@ -95,7 +94,6 @@ public class GrandExchangeOffer { signature = "(II)V", garbageValue = "1339285061" ) - @Export("__o_9") void __o_9(int var1) { this.state &= -8; this.state = (byte)(this.state | var1 & 7); @@ -106,7 +104,6 @@ public class GrandExchangeOffer { signature = "(II)V", garbageValue = "743094900" ) - @Export("__u_10") void __u_10(int var1) { this.state &= -9; if(var1 == 1) { @@ -163,7 +160,7 @@ public class GrandExchangeOffer { static final void method121() { for(int var0 = 0; var0 < Players.Players_count; ++var0) { Player var1 = Client.players[Players.Players_indices[var0]]; - var1.__q_125(); + var1.clearIsFriend(); } Iterator var2 = Messages.Messages_hashTable.iterator(); diff --git a/rs-client/src/main/java/GraphicsObject.java b/runescape-client/src/main/java/GraphicsObject.java similarity index 97% rename from rs-client/src/main/java/GraphicsObject.java rename to runescape-client/src/main/java/GraphicsObject.java index a9152aa015..e717317aa6 100644 --- a/rs-client/src/main/java/GraphicsObject.java +++ b/runescape-client/src/main/java/GraphicsObject.java @@ -11,14 +11,13 @@ public final class GraphicsObject extends Entity { @ObfuscatedGetter( intValue = -1807262579 ) - @Export("__bw_d") static int __bw_d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Llq;" ) - @Export("__bw_k") - static IndexedSprite __bw_k; + @Export("options_buttons_4Sprite") + static IndexedSprite options_buttons_4Sprite; @ObfuscatedName("fr") @ObfuscatedGetter( intValue = -438288575 @@ -130,6 +129,7 @@ public final class GraphicsObject extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { SpotAnimationDefinition var1 = class50.getSpotAnimationDefinition(this.id); Model var2; diff --git a/rs-client/src/main/java/GroundItem.java b/runescape-client/src/main/java/GroundItem.java similarity index 98% rename from rs-client/src/main/java/GroundItem.java rename to runescape-client/src/main/java/GroundItem.java index 223075772e..515facdfdb 100644 --- a/rs-client/src/main/java/GroundItem.java +++ b/runescape-client/src/main/java/GroundItem.java @@ -25,6 +25,7 @@ public final class GroundItem extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { return Skills.getItemDefinition(this.id).getModel(this.quantity); } diff --git a/rs-client/src/main/java/GroundItemPile.java b/runescape-client/src/main/java/GroundItemPile.java similarity index 96% rename from rs-client/src/main/java/GroundItemPile.java rename to runescape-client/src/main/java/GroundItemPile.java index 1f5d488216..4b9c5708bd 100644 --- a/rs-client/src/main/java/GroundItemPile.java +++ b/runescape-client/src/main/java/GroundItemPile.java @@ -11,8 +11,8 @@ public final class GroundItemPile { @ObfuscatedGetter( intValue = -704675849 ) - @Export("__dr_ao") - static int __dr_ao; + @Export("optionButtonSpriteSubHeight") + static int optionButtonSpriteSubHeight; @ObfuscatedName("m") @ObfuscatedSignature( signature = "Lex;" diff --git a/rs-client/src/main/java/GzipDecompressor.java b/runescape-client/src/main/java/GzipDecompressor.java similarity index 98% rename from rs-client/src/main/java/GzipDecompressor.java rename to runescape-client/src/main/java/GzipDecompressor.java index 1e2fb1a529..26ba4cbf74 100644 --- a/rs-client/src/main/java/GzipDecompressor.java +++ b/runescape-client/src/main/java/GzipDecompressor.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("GzipDecompressor") public class GzipDecompressor { @ObfuscatedName("ck") - @Export("__go_ck") public static char __go_ck; @ObfuscatedName("m") @Export("inflater") diff --git a/rs-client/src/main/java/HealthBar.java b/runescape-client/src/main/java/HealthBar.java similarity index 100% rename from rs-client/src/main/java/HealthBar.java rename to runescape-client/src/main/java/HealthBar.java diff --git a/rs-client/src/main/java/HealthBarDefinition.java b/runescape-client/src/main/java/HealthBarDefinition.java similarity index 98% rename from rs-client/src/main/java/HealthBarDefinition.java rename to runescape-client/src/main/java/HealthBarDefinition.java index 80128ffc07..b147b45c00 100644 --- a/rs-client/src/main/java/HealthBarDefinition.java +++ b/runescape-client/src/main/java/HealthBarDefinition.java @@ -11,13 +11,11 @@ public class HealthBarDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ii_m") public static AbstractIndexCache __ii_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ii_f") public static AbstractIndexCache __ii_f; @ObfuscatedName("q") @ObfuscatedSignature( @@ -41,7 +39,6 @@ public class HealthBarDefinition extends DualNode { @ObfuscatedGetter( intValue = 1515955705 ) - @Export("__o") public int __o; @ObfuscatedName("l") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/HealthBarUpdate.java b/runescape-client/src/main/java/HealthBarUpdate.java similarity index 100% rename from rs-client/src/main/java/HealthBarUpdate.java rename to runescape-client/src/main/java/HealthBarUpdate.java diff --git a/rs-client/src/main/java/HitSplatDefinition.java b/runescape-client/src/main/java/HitSplatDefinition.java similarity index 95% rename from rs-client/src/main/java/HitSplatDefinition.java rename to runescape-client/src/main/java/HitSplatDefinition.java index 80ade46bc1..961a1c899c 100644 --- a/rs-client/src/main/java/HitSplatDefinition.java +++ b/runescape-client/src/main/java/HitSplatDefinition.java @@ -11,19 +11,16 @@ public class HitSplatDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jm_m") static AbstractIndexCache __jm_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jm_f") static AbstractIndexCache __jm_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jm_q") static AbstractIndexCache __jm_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -35,7 +32,6 @@ public class HitSplatDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jm_o") static EvictingDualNodeHashTable __jm_o; @ObfuscatedName("u") @ObfuscatedSignature( @@ -53,70 +49,58 @@ public class HitSplatDefinition extends DualNode { @ObfuscatedGetter( intValue = -1151968735 ) - @Export("surfaceOffsetY") public int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = -102270561 ) - @Export("__i") public int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -1533306389 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1677628889 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 1683792491 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 1845590719 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = -389283589 ) - @Export("__t") public int __t; @ObfuscatedName("y") @ObfuscatedGetter( intValue = 1751286975 ) - @Export("__y") public int __y; @ObfuscatedName("h") @ObfuscatedGetter( intValue = 199815415 ) - @Export("__h") public int __h; @ObfuscatedName("b") - @Export("__b") String __b; @ObfuscatedName("c") @ObfuscatedGetter( intValue = 1003116765 ) - @Export("__c") public int __c; @ObfuscatedName("r") @ObfuscatedGetter( intValue = 1498880475 ) - @Export("__r") public int __r; @ObfuscatedName("p") @Export("transforms") @@ -265,7 +249,7 @@ public class HitSplatDefinition extends DualNode { var2 = this.transforms[this.transforms.length - 1]; } - return var2 != -1?class72.getHitSplatDefinition(var2):null; + return var2 != -1? LoginScreenAnimation.getHitSplatDefinition(var2):null; } @ObfuscatedName("u") @@ -292,7 +276,6 @@ public class HitSplatDefinition extends DualNode { signature = "(I)Lln;", garbageValue = "-1692599381" ) - @Export("__g_417") public Sprite __g_417() { if(this.__a < 0) { return null; @@ -316,7 +299,6 @@ public class HitSplatDefinition extends DualNode { signature = "(B)Lln;", garbageValue = "-15" ) - @Export("__l_418") public Sprite __l_418() { if(this.__z < 0) { return null; @@ -340,7 +322,6 @@ public class HitSplatDefinition extends DualNode { signature = "(B)Lln;", garbageValue = "-49" ) - @Export("__e_419") public Sprite __e_419() { if(this.__j < 0) { return null; @@ -364,7 +345,6 @@ public class HitSplatDefinition extends DualNode { signature = "(I)Lln;", garbageValue = "393569067" ) - @Export("__x_420") public Sprite __x_420() { if(this.__s < 0) { return null; diff --git a/rs-client/src/main/java/Huffman.java b/runescape-client/src/main/java/Huffman.java similarity index 98% rename from rs-client/src/main/java/Huffman.java rename to runescape-client/src/main/java/Huffman.java index 4561d9a722..cf37ace67f 100644 --- a/rs-client/src/main/java/Huffman.java +++ b/runescape-client/src/main/java/Huffman.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Huffman") public class Huffman { @ObfuscatedName("e") - @Export("__gd_e") static int[][] __gd_e; @ObfuscatedName("p") @ObfuscatedGetter( @@ -17,13 +16,10 @@ public class Huffman { @Export("canvasHeight") public static int canvasHeight; @ObfuscatedName("m") - @Export("__m") int[] __m; @ObfuscatedName("f") - @Export("__f") byte[] __f; @ObfuscatedName("q") - @Export("__q") int[] __q; public Huffman(byte[] var1) { @@ -114,7 +110,6 @@ public class Huffman { signature = "([BII[BIB)I", garbageValue = "64" ) - @Export("__m_293") public int __m_293(byte[] var1, int var2, int var3, byte[] var4, int var5) { int var6 = 0; int var7 = var5 << 3; @@ -165,7 +160,6 @@ public class Huffman { signature = "([BI[BIII)I", garbageValue = "-2094399899" ) - @Export("__f_294") public int __f_294(byte[] var1, int var2, byte[] var3, int var4, int var5) { if(var5 == 0) { return 0; diff --git a/rs-client/src/main/java/IgnoreList.java b/runescape-client/src/main/java/IgnoreList.java similarity index 98% rename from rs-client/src/main/java/IgnoreList.java rename to runescape-client/src/main/java/IgnoreList.java index 17bef395e7..3257e5fa90 100644 --- a/rs-client/src/main/java/IgnoreList.java +++ b/runescape-client/src/main/java/IgnoreList.java @@ -26,6 +26,7 @@ public class IgnoreList extends UserList { signature = "(I)Ljs;", garbageValue = "-2063112195" ) + @Export("newInstance") User newInstance() { return new Ignored(); } @@ -35,6 +36,7 @@ public class IgnoreList extends UserList { signature = "(II)[Ljs;", garbageValue = "861814350" ) + @Export("newTypedArray") User[] newTypedArray(int var1) { return new Ignored[var1]; } diff --git a/rs-client/src/main/java/Ignored.java b/runescape-client/src/main/java/Ignored.java similarity index 89% rename from rs-client/src/main/java/Ignored.java rename to runescape-client/src/main/java/Ignored.java index 1a0cca68eb..87c2827f60 100644 --- a/rs-client/src/main/java/Ignored.java +++ b/runescape-client/src/main/java/Ignored.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Ignored") public class Ignored extends User { @ObfuscatedName("at") - @Export("__ks_at") protected static String __ks_at; @ObfuscatedName("m") @ObfuscatedGetter( @@ -48,9 +47,9 @@ public class Ignored extends User { ) @Export("queueSoundEffect") static void queueSoundEffect(int var0, int var1, int var2) { - if(Client.__client_qp != 0 && var1 != 0 && Client.soundEffectCount < 50) { + if(Client.soundEffectVolume != 0 && var1 != 0 && Client.soundEffectCount < 50) { Client.soundEffectIds[Client.soundEffectCount] = var0; - Client.unknownSoundValues1[Client.soundEffectCount] = var1; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var1; Client.queuedSoundEffectDelays[Client.soundEffectCount] = var2; Client.soundEffects[Client.soundEffectCount] = null; Client.soundLocations[Client.soundEffectCount] = 0; diff --git a/rs-client/src/main/java/IndexCache.java b/runescape-client/src/main/java/IndexCache.java similarity index 97% rename from rs-client/src/main/java/IndexCache.java rename to runescape-client/src/main/java/IndexCache.java index e10c660ead..6f39f6bf7b 100644 --- a/rs-client/src/main/java/IndexCache.java +++ b/runescape-client/src/main/java/IndexCache.java @@ -30,10 +30,8 @@ public class IndexCache extends AbstractIndexCache { @Export("index") int index; @ObfuscatedName("v") - @Export("__v") volatile boolean __v; @ObfuscatedName("ag") - @Export("__ag") boolean __ag; @ObfuscatedName("aq") @Export("validArchives") @@ -54,7 +52,6 @@ public class IndexCache extends AbstractIndexCache { @ObfuscatedGetter( intValue = -1884661133 ) - @Export("__ac") int __ac; static { @@ -106,6 +103,7 @@ public class IndexCache extends AbstractIndexCache { signature = "(II)I", garbageValue = "-1809769865" ) + @Export("archiveLoadPercent") int archiveLoadPercent(int var1) { return super.archives[var1] != null?100:(this.validArchives[var1]?100:class54.method1086(this.index, var1)); } @@ -115,6 +113,7 @@ public class IndexCache extends AbstractIndexCache { signature = "(II)V", garbageValue = "-1829145107" ) + @Export("loadArchive") void loadArchive(int var1) { if(this.indexStore != null && this.validArchives != null && this.validArchives[var1]) { IndexStore var2 = this.indexStore; @@ -146,7 +145,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(I)Z", garbageValue = "1750279412" ) - @Export("__cx_404") public boolean __cx_404() { return this.__v; } @@ -156,7 +154,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(I)I", garbageValue = "1671499504" ) - @Export("__ca_405") public int __ca_405() { if(this.__v) { return 100; @@ -357,7 +354,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(IB)Z", garbageValue = "0" ) - @Export("__dn_407") public boolean __dn_407(int var1) { return this.validArchives[var1]; } @@ -367,7 +363,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(II)Z", garbageValue = "1419648188" ) - @Export("__df_408") public boolean __df_408(int var1) { return this.__j_395(var1) != null; } @@ -480,23 +475,23 @@ public class IndexCache extends AbstractIndexCache { if(var4 == 4) { if(var2 == 0) { - Client.__client_qp = 127; + Client.soundEffectVolume = 127; } if(var2 == 1) { - Client.__client_qp = 96; + Client.soundEffectVolume = 96; } if(var2 == 2) { - Client.__client_qp = 64; + Client.soundEffectVolume = 64; } if(var2 == 3) { - Client.__client_qp = 32; + Client.soundEffectVolume = 32; } if(var2 == 4) { - Client.__client_qp = 0; + Client.soundEffectVolume = 0; } } diff --git a/rs-client/src/main/java/IndexCacheLoader.java b/runescape-client/src/main/java/IndexCacheLoader.java similarity index 53% rename from rs-client/src/main/java/IndexCacheLoader.java rename to runescape-client/src/main/java/IndexCacheLoader.java index 54d9978e81..352fa614f5 100644 --- a/rs-client/src/main/java/IndexCacheLoader.java +++ b/runescape-client/src/main/java/IndexCacheLoader.java @@ -16,16 +16,14 @@ public class IndexCacheLoader { @ObfuscatedSignature( signature = "Llq;" ) - @Export("__bd_u") - static IndexedSprite __bd_u; + @Export("titlebuttonSprite") + static IndexedSprite titlebuttonSprite; @ObfuscatedName("x") - @Export("__bd_x") public static short[][] __bd_x; @ObfuscatedName("er") @ObfuscatedGetter( intValue = 636454135 ) - @Export("__bd_er") static int __bd_er; @ObfuscatedName("gw") @Export("regionMapArchiveIds") @@ -40,13 +38,11 @@ public class IndexCacheLoader { @ObfuscatedGetter( intValue = 1459455501 ) - @Export("__q") final int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 782003089 ) - @Export("__w") int __w; @ObfuscatedSignature( @@ -63,7 +59,6 @@ public class IndexCacheLoader { signature = "(I)Z", garbageValue = "1352221725" ) - @Export("__m_122") boolean __m_122() { this.__w = 0; @@ -83,9 +78,9 @@ public class IndexCacheLoader { ) @Export("drawTitle") static void drawTitle(Font var0, Font var1, Font var2) { - Login.__cu_q = (SoundCache.canvasWidth - 765) / 2; - Login.__cu_y = Login.__cu_q + 202; - Varps.__hv_h = Login.__cu_y + 180; + Login.xPadding = (SoundCache.canvasWidth - 765) / 2; + Login.loginBoxX = Login.xPadding + 202; + Varps.loginBoxCenter = Login.loginBoxX + 180; int var9; int var11; int var19; @@ -94,136 +89,136 @@ public class IndexCacheLoader { int var27; int var28; int var48; - if(Login.__cu_bk) { - if(class30.__ar_bd == null) { - class30.__ar_bd = class2.method20(WorldMapSection3.indexCache8, "sl_back", ""); + if(Login.worldSelectOpen) { + if(class30.worldSelectBackSprites == null) { + class30.worldSelectBackSprites = class2.method20(WorldMapSection3.indexCache8, "sl_back", ""); } IndexCache var36; int var37; int var39; IndexedSprite[] var40; - if(Frames.__en_bc == null) { + if(Frames.worldSelectFlagSprites == null) { var36 = WorldMapSection3.indexCache8; var39 = var36.getArchiveId("sl_flags"); var37 = var36.getRecordId(var39, ""); - if(!SpriteMask.method4392(var36, var39, var37)) { + if(!SpriteMask.loadSprite(var36, var39, var37)) { var40 = null; } else { - var40 = WorldMapLabel.method444(); + var40 = WorldMapLabel.createIndexedSpriteArray(); } - Frames.__en_bc = var40; + Frames.worldSelectFlagSprites = var40; } - if(AttackOption.__cj_bo == null) { + if(AttackOption.worldSelectArrows == null) { var36 = WorldMapSection3.indexCache8; var39 = var36.getArchiveId("sl_arrows"); var37 = var36.getRecordId(var39, ""); - if(!SpriteMask.method4392(var36, var39, var37)) { + if(!SpriteMask.loadSprite(var36, var39, var37)) { var40 = null; } else { - var40 = WorldMapLabel.method444(); + var40 = WorldMapLabel.createIndexedSpriteArray(); } - AttackOption.__cj_bo = var40; + AttackOption.worldSelectArrows = var40; } - if(UrlRequest.__ey_bx == null) { + if(UrlRequest.worldSelectStars == null) { var36 = WorldMapSection3.indexCache8; var39 = var36.getArchiveId("sl_stars"); var37 = var36.getRecordId(var39, ""); - if(!SpriteMask.method4392(var36, var39, var37)) { + if(!SpriteMask.loadSprite(var36, var39, var37)) { var40 = null; } else { - var40 = WorldMapLabel.method444(); + var40 = WorldMapLabel.createIndexedSpriteArray(); } - UrlRequest.__ey_bx = var40; + UrlRequest.worldSelectStars = var40; } - if(SecureRandomFuture.__cn_bu == null) { - SecureRandomFuture.__cn_bu = MenuAction.method2025(WorldMapSection3.indexCache8, "leftarrow", ""); + if(SecureRandomFuture.worldSelectLeftSprite == null) { + SecureRandomFuture.worldSelectLeftSprite = MenuAction.loadIndexedSpriteByName(WorldMapSection3.indexCache8, "leftarrow", ""); } - if(NetSocket.__fb_bm == null) { - NetSocket.__fb_bm = MenuAction.method2025(WorldMapSection3.indexCache8, "rightarrow", ""); + if(NetSocket.worldSelectRightSprite == null) { + NetSocket.worldSelectRightSprite = MenuAction.loadIndexedSpriteByName(WorldMapSection3.indexCache8, "rightarrow", ""); } - Rasterizer2D.Rasterizer2D_fillRectangle(Login.__cu_q, 23, 765, 480, 0); - Rasterizer2D.drawGradient(Login.__cu_q, 0, 125, 23, 12425273, 9135624); - Rasterizer2D.drawGradient(Login.__cu_q + 125, 0, 640, 23, 5197647, 2697513); - var0.drawCentered("Select a world", Login.__cu_q + 62, 15, 0, -1); - if(UrlRequest.__ey_bx != null) { - UrlRequest.__ey_bx[1].__q_496(Login.__cu_q + 140, 1); - var1.draw("Members only world", Login.__cu_q + 152, 10, 16777215, -1); - UrlRequest.__ey_bx[0].__q_496(Login.__cu_q + 140, 12); - var1.draw("Free world", Login.__cu_q + 152, 21, 16777215, -1); + Rasterizer2D.Rasterizer2D_fillRectangle(Login.xPadding, 23, 765, 480, 0); + Rasterizer2D.drawGradient(Login.xPadding, 0, 125, 23, 12425273, 9135624); + Rasterizer2D.drawGradient(Login.xPadding + 125, 0, 640, 23, 5197647, 2697513); + var0.drawCentered("Select a world", Login.xPadding + 62, 15, 0, -1); + if(UrlRequest.worldSelectStars != null) { + UrlRequest.worldSelectStars[1].drawAt(Login.xPadding + 140, 1); + var1.draw("Members only world", Login.xPadding + 152, 10, 16777215, -1); + UrlRequest.worldSelectStars[0].drawAt(Login.xPadding + 140, 12); + var1.draw("Free world", Login.xPadding + 152, 21, 16777215, -1); } - if(AttackOption.__cj_bo != null) { - var48 = Login.__cu_q + 280; - if(World.__bt_e[0] == 0 && World.__bt_l[0] == 0) { - AttackOption.__cj_bo[2].__q_496(var48, 4); + if(AttackOption.worldSelectArrows != null) { + var48 = Login.xPadding + 280; + if(World.sortOption1[0] == 0 && World.sortOption2[0] == 0) { + AttackOption.worldSelectArrows[2].drawAt(var48, 4); } else { - AttackOption.__cj_bo[0].__q_496(var48, 4); + AttackOption.worldSelectArrows[0].drawAt(var48, 4); } - if(World.__bt_e[0] == 0 && World.__bt_l[0] == 1) { - AttackOption.__cj_bo[3].__q_496(var48 + 15, 4); + if(World.sortOption1[0] == 0 && World.sortOption2[0] == 1) { + AttackOption.worldSelectArrows[3].drawAt(var48 + 15, 4); } else { - AttackOption.__cj_bo[1].__q_496(var48 + 15, 4); + AttackOption.worldSelectArrows[1].drawAt(var48 + 15, 4); } var0.draw("World", var48 + 32, 17, 16777215, -1); - var24 = Login.__cu_q + 390; - if(World.__bt_e[0] == 1 && World.__bt_l[0] == 0) { - AttackOption.__cj_bo[2].__q_496(var24, 4); + var24 = Login.xPadding + 390; + if(World.sortOption1[0] == 1 && World.sortOption2[0] == 0) { + AttackOption.worldSelectArrows[2].drawAt(var24, 4); } else { - AttackOption.__cj_bo[0].__q_496(var24, 4); + AttackOption.worldSelectArrows[0].drawAt(var24, 4); } - if(World.__bt_e[0] == 1 && World.__bt_l[0] == 1) { - AttackOption.__cj_bo[3].__q_496(var24 + 15, 4); + if(World.sortOption1[0] == 1 && World.sortOption2[0] == 1) { + AttackOption.worldSelectArrows[3].drawAt(var24 + 15, 4); } else { - AttackOption.__cj_bo[1].__q_496(var24 + 15, 4); + AttackOption.worldSelectArrows[1].drawAt(var24 + 15, 4); } var0.draw("Players", var24 + 32, 17, 16777215, -1); - var39 = Login.__cu_q + 500; - if(World.__bt_e[0] == 2 && World.__bt_l[0] == 0) { - AttackOption.__cj_bo[2].__q_496(var39, 4); + var39 = Login.xPadding + 500; + if(World.sortOption1[0] == 2 && World.sortOption2[0] == 0) { + AttackOption.worldSelectArrows[2].drawAt(var39, 4); } else { - AttackOption.__cj_bo[0].__q_496(var39, 4); + AttackOption.worldSelectArrows[0].drawAt(var39, 4); } - if(World.__bt_e[0] == 2 && World.__bt_l[0] == 1) { - AttackOption.__cj_bo[3].__q_496(var39 + 15, 4); + if(World.sortOption1[0] == 2 && World.sortOption2[0] == 1) { + AttackOption.worldSelectArrows[3].drawAt(var39 + 15, 4); } else { - AttackOption.__cj_bo[1].__q_496(var39 + 15, 4); + AttackOption.worldSelectArrows[1].drawAt(var39 + 15, 4); } var0.draw("Location", var39 + 32, 17, 16777215, -1); - var37 = Login.__cu_q + 610; - if(World.__bt_e[0] == 3 && World.__bt_l[0] == 0) { - AttackOption.__cj_bo[2].__q_496(var37, 4); + var37 = Login.xPadding + 610; + if(World.sortOption1[0] == 3 && World.sortOption2[0] == 0) { + AttackOption.worldSelectArrows[2].drawAt(var37, 4); } else { - AttackOption.__cj_bo[0].__q_496(var37, 4); + AttackOption.worldSelectArrows[0].drawAt(var37, 4); } - if(World.__bt_e[0] == 3 && World.__bt_l[0] == 1) { - AttackOption.__cj_bo[3].__q_496(var37 + 15, 4); + if(World.sortOption1[0] == 3 && World.sortOption2[0] == 1) { + AttackOption.worldSelectArrows[3].drawAt(var37 + 15, 4); } else { - AttackOption.__cj_bo[1].__q_496(var37 + 15, 4); + AttackOption.worldSelectArrows[1].drawAt(var37 + 15, 4); } var0.draw("Type", var37 + 32, 17, 16777215, -1); } - Rasterizer2D.Rasterizer2D_fillRectangle(Login.__cu_q + 708, 4, 50, 16, 0); - var1.drawCentered("Cancel", Login.__cu_q + 708 + 25, 16, 16777215, -1); - Login.__cu_bl = -1; - if(class30.__ar_bd != null) { + Rasterizer2D.Rasterizer2D_fillRectangle(Login.xPadding + 708, 4, 50, 16, 0); + var1.drawCentered("Cancel", Login.xPadding + 708 + 25, 16, 16777215, -1); + Login.hoveredWorldIndex = -1; + if(class30.worldSelectBackSprites != null) { var23 = 88; byte var51 = 19; var39 = 765 / (var23 + 1) - 1; @@ -258,23 +253,23 @@ public class IndexCacheLoader { var9 = (765 - var39 * var23 - var27 * (var39 - 1)) / 2; int var10 = (480 - var37 * var51 - var28 * (var37 - 1)) / 2; var11 = (var37 + World.worldsCount - 1) / var37; - Login.__cu_bj = var11 - var39; - if(SecureRandomFuture.__cn_bu != null && Login.__cu_br > 0) { - SecureRandomFuture.__cn_bu.__q_496(8, Huffman.canvasHeight / 2 - SecureRandomFuture.__cn_bu.subHeight / 2); + Login.worldSelectPagesCount = var11 - var39; + if(SecureRandomFuture.worldSelectLeftSprite != null && Login.worldSelectPage > 0) { + SecureRandomFuture.worldSelectLeftSprite.drawAt(8, Huffman.canvasHeight / 2 - SecureRandomFuture.worldSelectLeftSprite.subHeight / 2); } - if(NetSocket.__fb_bm != null && Login.__cu_br < Login.__cu_bj) { - NetSocket.__fb_bm.__q_496(SoundCache.canvasWidth - NetSocket.__fb_bm.subWidth - 8, Huffman.canvasHeight / 2 - NetSocket.__fb_bm.subHeight / 2); + if(NetSocket.worldSelectRightSprite != null && Login.worldSelectPage < Login.worldSelectPagesCount) { + NetSocket.worldSelectRightSprite.drawAt(SoundCache.canvasWidth - NetSocket.worldSelectRightSprite.subWidth - 8, Huffman.canvasHeight / 2 - NetSocket.worldSelectRightSprite.subHeight / 2); } int var41 = var10 + 23; - int var42 = var9 + Login.__cu_q; + int var42 = var9 + Login.xPadding; int var43 = 0; boolean var15 = false; - int var16 = Login.__cu_br; + int var16 = Login.worldSelectPage; int var44; - for(var44 = var37 * var16; var44 < World.worldsCount && var16 - Login.__cu_br < var39; ++var44) { + for(var44 = var37 * var16; var44 < World.worldsCount && var16 - Login.worldSelectPage < var39; ++var44) { World var29 = ItemContainer.worlds[var44]; boolean var46 = true; String var20 = Integer.toString(var29.population); @@ -288,41 +283,41 @@ public class IndexCacheLoader { int var22 = 0; byte var21; - if(var29.__j_149()) { - if(var29.__e_144()) { + if(var29.isBeta()) { + if(var29.isMembersOnly()) { var21 = 7; } else { var21 = 6; } - } else if(var29.__z_148()) { - var22 = 16711680; - if(var29.__e_144()) { + } else if(var29.isDeadman()) { + var22 = 0xff0000; + if(var29.isMembersOnly()) { var21 = 5; } else { var21 = 4; } - } else if(var29.__d_146()) { - if(var29.__e_144()) { + } else if(var29.isPvp()) { + if(var29.isMembersOnly()) { var21 = 3; } else { var21 = 2; } - } else if(var29.__e_144()) { + } else if(var29.isMembersOnly()) { var21 = 1; } else { var21 = 0; } if(MouseHandler.MouseHandler_x >= var42 && MouseHandler.MouseHandler_y >= var41 && MouseHandler.MouseHandler_x < var42 + var23 && MouseHandler.MouseHandler_y < var51 + var41 && var46) { - Login.__cu_bl = var44; - class30.__ar_bd[var21].__t_507(var42, var41, 128, 16777215); + Login.hoveredWorldIndex = var44; + class30.worldSelectBackSprites[var21].drawAtTransOverlay(var42, var41, 128, 0xffffff); var15 = true; } else { - class30.__ar_bd[var21].drawAt(var42, var41); + class30.worldSelectBackSprites[var21].drawAt(var42, var41); } - if(Frames.__en_bc != null) { - Frames.__en_bc[(var29.__e_144()?8:0) + var29.location].__q_496(var42 + 29, var41); + if(Frames.worldSelectFlagSprites != null) { + Frames.worldSelectFlagSprites[(var29.isMembersOnly()?8:0) + var29.location].drawAt(var42 + 29, var41); } var0.drawCentered(Integer.toString(var29.id), var42 + 15, var51 / 2 + var41 + 5, var22, -1); @@ -338,7 +333,7 @@ public class IndexCacheLoader { } if(var15) { - var44 = var1.stringWidth(ItemContainer.worlds[Login.__cu_bl].activity) + 6; + var44 = var1.stringWidth(ItemContainer.worlds[Login.hoveredWorldIndex].activity) + 6; int var45 = var1.ascent + 8; var19 = MouseHandler.MouseHandler_y + 25; if(var45 + var19 > 480) { @@ -347,24 +342,24 @@ public class IndexCacheLoader { Rasterizer2D.Rasterizer2D_fillRectangle(MouseHandler.MouseHandler_x - var44 / 2, var19, var44, var45, 16777120); Rasterizer2D.Rasterizer2D_drawRectangle(MouseHandler.MouseHandler_x - var44 / 2, var19, var44, var45, 0); - var1.drawCentered(ItemContainer.worlds[Login.__cu_bl].activity, MouseHandler.MouseHandler_x, var19 + var1.ascent + 4, 0, -1); + var1.drawCentered(ItemContainer.worlds[Login.hoveredWorldIndex].activity, MouseHandler.MouseHandler_x, var19 + var1.ascent + 4, 0, -1); } } class197.rasterProvider.drawFull(0, 0); } else { - Login.__cu_g.drawAt(Login.__cu_q, 0); - Fonts.__kz_l.drawAt(Login.__cu_q + 382, 0); - WorldMapSectionType.__h_e.__q_496(Login.__cu_q + 382 - WorldMapSectionType.__h_e.subWidth / 2, 18); + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + Fonts.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + WorldMapSectionType.logoSprite.drawAt(Login.xPadding + 382 - WorldMapSectionType.logoSprite.subWidth / 2, 18); if(Client.gameState == 0 || Client.gameState == 5) { var23 = 20; - var0.drawCentered("RuneScape is loading - please wait...", Login.__cu_y + 180, 245 - var23, 16777215, -1); + var0.drawCentered("RuneScape is loading - please wait...", Login.loginBoxX + 180, 245 - var23, 16777215, -1); var24 = 253 - var23; - Rasterizer2D.Rasterizer2D_drawRectangle(Login.__cu_y + 180 - 152, var24, 304, 34, 9179409); - Rasterizer2D.Rasterizer2D_drawRectangle(Login.__cu_y + 180 - 151, var24 + 1, 302, 32, 0); - Rasterizer2D.Rasterizer2D_fillRectangle(Login.__cu_y + 180 - 150, var24 + 2, Login.Login_loadingPercent * 3, 30, 9179409); - Rasterizer2D.Rasterizer2D_fillRectangle(Login.__cu_y + 180 - 150 + Login.Login_loadingPercent * 3, var24 + 2, 300 - Login.Login_loadingPercent * 3, 30, 0); - var0.drawCentered(Login.Login_loadingText, Login.__cu_y + 180, 276 - var23, 16777215, -1); + Rasterizer2D.Rasterizer2D_drawRectangle(Login.loginBoxX + 180 - 152, var24, 304, 34, 9179409); + Rasterizer2D.Rasterizer2D_drawRectangle(Login.loginBoxX + 180 - 151, var24 + 1, 302, 32, 0); + Rasterizer2D.Rasterizer2D_fillRectangle(Login.loginBoxX + 180 - 150, var24 + 2, Login.Login_loadingPercent * 3, 30, 9179409); + Rasterizer2D.Rasterizer2D_fillRectangle(Login.loginBoxX + 180 - 150 + Login.Login_loadingPercent * 3, var24 + 2, 300 - Login.Login_loadingPercent * 3, 30, 0); + var0.drawCentered(Login.Login_loadingText, Login.loginBoxX + 180, 276 - var23, 16777215, -1); } String var7; @@ -375,17 +370,17 @@ public class IndexCacheLoader { short var47; short var49; if(Client.gameState == 20) { - Login.__cu_o.__q_496(Login.__cu_y + 180 - Login.__cu_o.subWidth / 2, 271 - Login.__cu_o.subHeight / 2); + Login.titleboxSprite.drawAt(Login.loginBoxX + 180 - Login.titleboxSprite.subWidth / 2, 271 - Login.titleboxSprite.subHeight / 2); var47 = 201; - var0.drawCentered(Login.Login_response1, Login.__cu_y + 180, var47, 16776960, 0); + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 15; - var0.drawCentered(Login.Login_response2, Login.__cu_y + 180, var48, 16776960, 0); + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var0.drawCentered(Login.Login_response3, Login.__cu_y + 180, var48, 16776960, 0); + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; var48 += 7; - if(Login.__cu_aw != 4) { - var0.draw("Login: ", Login.__cu_y + 180 - 110, var48, 16777215, 0); + if(Login.loginIndex != 4) { + var0.draw("Login: ", Login.loginBoxX + 180 - 110, var48, 16777215, 0); var49 = 200; if(ReflectionCheck.clientPreferences.hideUsername) { var8 = Login.Login_username; @@ -399,56 +394,56 @@ public class IndexCacheLoader { ; } - var0.draw(AbstractFont.escapeBrackets(var25), Login.__cu_y + 180 - 70, var48, 16777215, 0); + var0.draw(AbstractFont.escapeBrackets(var25), Login.loginBoxX + 180 - 70, var48, 16777215, 0); var48 += 15; var8 = "Password: "; var30 = Login.Login_password; var31 = class168.method3450('*', var30.length()); - var0.draw(var8 + var31, Login.__cu_y + 180 - 108, var48, 16777215, 0); + var0.draw(var8 + var31, Login.loginBoxX + 180 - 108, var48, 16777215, 0); var48 += 15; } } if(Client.gameState == 10 || Client.gameState == 11) { - Login.__cu_o.__q_496(Login.__cu_y, 171); + Login.titleboxSprite.drawAt(Login.loginBoxX, 171); short var5; - if(Login.__cu_aw == 0) { + if(Login.loginIndex == 0) { var47 = 251; - var0.drawCentered("Welcome to RuneScape", Login.__cu_y + 180, var47, 16776960, 0); + var0.drawCentered("Welcome to RuneScape", Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 30; - var24 = Login.__cu_y + 180 - 80; + var24 = Login.loginBoxX + 180 - 80; var5 = 291; - __bd_u.__q_496(var24 - 73, var5 - 20); + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawLines("New User", var24 - 73, var5 - 20, 144, 40, 16777215, 0, 1, 1, 0); - var24 = Login.__cu_y + 180 + 80; - __bd_u.__q_496(var24 - 73, var5 - 20); + var24 = Login.loginBoxX + 180 + 80; + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawLines("Existing User", var24 - 73, var5 - 20, 144, 40, 16777215, 0, 1, 1, 0); - } else if(Login.__cu_aw == 1) { - var0.drawCentered(Login.Login_response0, Login.__cu_y + 180, 201, 16776960, 0); + } else if(Login.loginIndex == 1) { + var0.drawCentered(Login.Login_response0, Login.loginBoxX + 180, 201, 16776960, 0); var47 = 236; - var0.drawCentered(Login.Login_response1, Login.__cu_y + 180, var47, 16777215, 0); + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var47, 16777215, 0); var48 = var47 + 15; - var0.drawCentered(Login.Login_response2, Login.__cu_y + 180, var48, 16777215, 0); + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var48, 16777215, 0); var48 += 15; - var0.drawCentered(Login.Login_response3, Login.__cu_y + 180, var48, 16777215, 0); + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var48, 16777215, 0); var48 += 15; - var24 = Login.__cu_y + 180 - 80; + var24 = Login.loginBoxX + 180 - 80; var5 = 321; - __bd_u.__q_496(var24 - 73, var5 - 20); + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawCentered("Continue", var24, var5 + 5, 16777215, 0); - var24 = Login.__cu_y + 180 + 80; - __bd_u.__q_496(var24 - 73, var5 - 20); + var24 = Login.loginBoxX + 180 + 80; + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawCentered("Cancel", var24, var5 + 5, 16777215, 0); - } else if(Login.__cu_aw == 2) { + } else if(Login.loginIndex == 2) { var47 = 201; - var0.drawCentered(Login.Login_response1, Varps.__hv_h, var47, 16776960, 0); + var0.drawCentered(Login.Login_response1, Varps.loginBoxCenter, var47, 16776960, 0); var48 = var47 + 15; - var0.drawCentered(Login.Login_response2, Varps.__hv_h, var48, 16776960, 0); + var0.drawCentered(Login.Login_response2, Varps.loginBoxCenter, var48, 16776960, 0); var48 += 15; - var0.drawCentered(Login.Login_response3, Varps.__hv_h, var48, 16776960, 0); + var0.drawCentered(Login.Login_response3, Varps.loginBoxCenter, var48, 16776960, 0); var48 += 15; var48 += 7; - var0.draw("Login: ", Varps.__hv_h - 110, var48, 16777215, 0); + var0.draw("Login: ", Varps.loginBoxCenter - 110, var48, 16777215, 0); var49 = 200; if(ReflectionCheck.clientPreferences.hideUsername) { var8 = Login.Login_username; @@ -462,35 +457,35 @@ public class IndexCacheLoader { ; } - var0.draw(AbstractFont.escapeBrackets(var25) + (Login.currentLoginField == 0 & Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Varps.__hv_h - 70, var48, 16777215, 0); + var0.draw(AbstractFont.escapeBrackets(var25) + (Login.currentLoginField == 0 & Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Varps.loginBoxCenter - 70, var48, 16777215, 0); var48 += 15; var8 = "Password: "; var30 = Login.Login_password; var31 = class168.method3450('*', var30.length()); - var0.draw(var8 + var31 + (Login.currentLoginField == 1 & Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Varps.__hv_h - 108, var48, 16777215, 0); + var0.draw(var8 + var31 + (Login.currentLoginField == 1 & Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Varps.loginBoxCenter - 108, var48, 16777215, 0); var48 += 15; var47 = 277; - var11 = Varps.__hv_h + -117; + var11 = Varps.loginBoxCenter + -117; boolean var13 = Client.Login_isUsernameRemembered; boolean var14 = Login.__cu_aa; - IndexedSprite var32 = var13?(var14?KeyHandler.__an_i:class308.__kw_n):(var14?GraphicsObject.__bw_k:Login.__cu_d); - var32.__q_496(var11, var47); + IndexedSprite var32 = var13?(var14?KeyHandler.options_buttons_6Sprite :class308.options_buttons_2Sprite):(var14?GraphicsObject.options_buttons_4Sprite :Login.options_buttons_0Sprite); + var32.drawAt(var11, var47); var11 = var11 + var32.subWidth + 5; var1.draw("Remember username", var11, var47 + 13, 16776960, 0); - var11 = Varps.__hv_h + 24; + var11 = Varps.loginBoxCenter + 24; boolean var17 = ReflectionCheck.clientPreferences.hideUsername; boolean var18 = Login.__cu_ax; - IndexedSprite var34 = var17?(var18?KeyHandler.__an_i:class308.__kw_n):(var18?GraphicsObject.__bw_k:Login.__cu_d); - var34.__q_496(var11, var47); + IndexedSprite var34 = var17?(var18?KeyHandler.options_buttons_6Sprite :class308.options_buttons_2Sprite):(var18?GraphicsObject.options_buttons_4Sprite :Login.options_buttons_0Sprite); + var34.drawAt(var11, var47); var11 = var11 + var34.subWidth + 5; var1.draw("Hide username", var11, var47 + 13, 16776960, 0); var48 = var47 + 15; - var19 = Varps.__hv_h - 80; + var19 = Varps.loginBoxCenter - 80; short var35 = 321; - __bd_u.__q_496(var19 - 73, var35 - 20); + titlebuttonSprite.drawAt(var19 - 73, var35 - 20); var0.drawCentered("Login", var19, var35 + 5, 16777215, 0); - var19 = Varps.__hv_h + 80; - __bd_u.__q_496(var19 - 73, var35 - 20); + var19 = Varps.loginBoxCenter + 80; + titlebuttonSprite.drawAt(var19 - 73, var35 - 20); var0.drawCentered("Cancel", var19, var35 + 5, 16777215, 0); var47 = 357; switch(Login.__cu_ac) { @@ -501,76 +496,76 @@ public class IndexCacheLoader { AttackOption.__cj_ay = "Can\'t login? Click here."; } - TilePaint.__eb_ah = new Bounds(Varps.__hv_h, var47, var1.stringWidth(AttackOption.__cj_ay), 11); - UrlRequester.__eo_ak = new Bounds(Varps.__hv_h, var47, var1.stringWidth("Still having trouble logging in?"), 11); - var1.drawCentered(AttackOption.__cj_ay, Varps.__hv_h, var47, 16777215, 0); - } else if(Login.__cu_aw == 3) { + TilePaint.__eb_ah = new Bounds(Varps.loginBoxCenter, var47, var1.stringWidth(AttackOption.__cj_ay), 11); + UrlRequester.__eo_ak = new Bounds(Varps.loginBoxCenter, var47, var1.stringWidth("Still having trouble logging in?"), 11); + var1.drawCentered(AttackOption.__cj_ay, Varps.loginBoxCenter, var47, 16777215, 0); + } else if(Login.loginIndex == 3) { var47 = 201; - var0.drawCentered("Invalid credentials.", Login.__cu_y + 180, var47, 16776960, 0); + var0.drawCentered("Invalid credentials.", Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 20; - var1.drawCentered("For accounts created after 24th November 2010, please use your", Login.__cu_y + 180, var48, 16776960, 0); + var1.drawCentered("For accounts created after 24th November 2010, please use your", Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var1.drawCentered("email address to login. Otherwise please login with your username.", Login.__cu_y + 180, var48, 16776960, 0); + var1.drawCentered("email address to login. Otherwise please login with your username.", Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var24 = Login.__cu_y + 180; + var24 = Login.loginBoxX + 180; var5 = 276; - __bd_u.__q_496(var24 - 73, var5 - 20); + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var2.drawCentered("Try again", var24, var5 + 5, 16777215, 0); - var24 = Login.__cu_y + 180; + var24 = Login.loginBoxX + 180; var5 = 326; - __bd_u.__q_496(var24 - 73, var5 - 20); + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var2.drawCentered("Forgotten password?", var24, var5 + 5, 16777215, 0); } else { String var26; - if(Login.__cu_aw == 4) { - var0.drawCentered("Authenticator", Login.__cu_y + 180, 201, 16776960, 0); + if(Login.loginIndex == 4) { + var0.drawCentered("Authenticator", Login.loginBoxX + 180, 201, 16776960, 0); var47 = 236; - var0.drawCentered(Login.Login_response1, Login.__cu_y + 180, var47, 16777215, 0); + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var47, 16777215, 0); var48 = var47 + 15; - var0.drawCentered(Login.Login_response2, Login.__cu_y + 180, var48, 16777215, 0); + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var48, 16777215, 0); var48 += 15; - var0.drawCentered(Login.Login_response3, Login.__cu_y + 180, var48, 16777215, 0); + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var48, 16777215, 0); var48 += 15; var26 = "PIN: "; - var7 = Login.__cu_ai; + var7 = Login.otp; var25 = class168.method3450('*', var7.length()); - var0.draw(var26 + var25 + (Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Login.__cu_y + 180 - 108, var48, 16777215, 0); + var0.draw(var26 + var25 + (Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Login.loginBoxX + 180 - 108, var48, 16777215, 0); var48 -= 8; - var0.draw("Trust this computer", Login.__cu_y + 180 - 9, var48, 16776960, 0); + var0.draw("Trust this computer", Login.loginBoxX + 180 - 9, var48, 16776960, 0); var48 += 15; - var0.draw("for 30 days: ", Login.__cu_y + 180 - 9, var48, 16776960, 0); - var28 = Login.__cu_y + 180 - 9 + var0.stringWidth("for 30 days: ") + 15; + var0.draw("for 30 days: ", Login.loginBoxX + 180 - 9, var48, 16776960, 0); + var28 = Login.loginBoxX + 180 - 9 + var0.stringWidth("for 30 days: ") + 15; var9 = var48 - var0.ascent; IndexedSprite var52; if(Login.__cu_ba) { - var52 = class308.__kw_n; + var52 = class308.options_buttons_2Sprite; } else { - var52 = Login.__cu_d; + var52 = Login.options_buttons_0Sprite; } - var52.__q_496(var28, var9); + var52.drawAt(var28, var9); var48 += 15; - var11 = Login.__cu_y + 180 - 80; + var11 = Login.loginBoxX + 180 - 80; short var12 = 321; - __bd_u.__q_496(var11 - 73, var12 - 20); + titlebuttonSprite.drawAt(var11 - 73, var12 - 20); var0.drawCentered("Continue", var11, var12 + 5, 16777215, 0); - var11 = Login.__cu_y + 180 + 80; - __bd_u.__q_496(var11 - 73, var12 - 20); + var11 = Login.loginBoxX + 180 + 80; + titlebuttonSprite.drawAt(var11 - 73, var12 - 20); var0.drawCentered("Cancel", var11, var12 + 5, 16777215, 0); - var1.drawCentered("Can\'t Log In?", Login.__cu_y + 180, var12 + 36, 255, 0); + var1.drawCentered("Can\'t Log In?", Login.loginBoxX + 180, var12 + 36, 255, 0); } else { short var50; - if(Login.__cu_aw == 5) { - var0.drawCentered("Forgotten your password?", Login.__cu_y + 180, 201, 16776960, 0); + if(Login.loginIndex == 5) { + var0.drawCentered("Forgotten your password?", Login.loginBoxX + 180, 201, 16776960, 0); var47 = 221; - var2.drawCentered(Login.Login_response1, Login.__cu_y + 180, var47, 16776960, 0); + var2.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 15; - var2.drawCentered(Login.Login_response2, Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var2.drawCentered(Login.Login_response3, Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; var48 += 14; - var0.draw("Username/email: ", Login.__cu_y + 180 - 145, var48, 16777215, 0); + var0.draw("Username/email: ", Login.loginBoxX + 180 - 145, var48, 16777215, 0); var49 = 174; if(ReflectionCheck.clientPreferences.hideUsername) { var8 = Login.Login_username; @@ -584,60 +579,60 @@ public class IndexCacheLoader { ; } - var0.draw(AbstractFont.escapeBrackets(var25) + (Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Login.__cu_y + 180 - 34, var48, 16777215, 0); + var0.draw(AbstractFont.escapeBrackets(var25) + (Client.cycle % 40 < 20?BufferedFile.colorStartTag(16776960) + "|":""), Login.loginBoxX + 180 - 34, var48, 16777215, 0); var48 += 15; - var27 = Login.__cu_y + 180 - 80; + var27 = Login.loginBoxX + 180 - 80; var50 = 321; - __bd_u.__q_496(var27 - 73, var50 - 20); + titlebuttonSprite.drawAt(var27 - 73, var50 - 20); var0.drawCentered("Recover", var27, var50 + 5, 16777215, 0); - var27 = Login.__cu_y + 180 + 80; - __bd_u.__q_496(var27 - 73, var50 - 20); + var27 = Login.loginBoxX + 180 + 80; + titlebuttonSprite.drawAt(var27 - 73, var50 - 20); var0.drawCentered("Back", var27, var50 + 5, 16777215, 0); var50 = 356; - var1.drawCentered("Still having trouble logging in?", Varps.__hv_h, var50, 268435455, 0); - } else if(Login.__cu_aw == 6) { + var1.drawCentered("Still having trouble logging in?", Varps.loginBoxCenter, var50, 268435455, 0); + } else if(Login.loginIndex == 6) { var47 = 201; - var0.drawCentered(Login.Login_response1, Login.__cu_y + 180, var47, 16776960, 0); + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 15; - var0.drawCentered(Login.Login_response2, Login.__cu_y + 180, var48, 16776960, 0); + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var0.drawCentered(Login.Login_response3, Login.__cu_y + 180, var48, 16776960, 0); + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var24 = Login.__cu_y + 180; + var24 = Login.loginBoxX + 180; var5 = 321; - __bd_u.__q_496(var24 - 73, var5 - 20); + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawCentered("Back", var24, var5 + 5, 16777215, 0); - } else if(Login.__cu_aw == 7) { + } else if(Login.loginIndex == 7) { var47 = 216; - var0.drawCentered("Your date of birth isn\'t set.", Login.__cu_y + 180, var47, 16776960, 0); + var0.drawCentered("Your date of birth isn\'t set.", Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 15; - var2.drawCentered("Please verify your account status by", Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered("Please verify your account status by", Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var2.drawCentered("setting your date of birth.", Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered("setting your date of birth.", Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var24 = Login.__cu_y + 180 - 80; + var24 = Login.loginBoxX + 180 - 80; var5 = 321; - __bd_u.__q_496(var24 - 73, var5 - 20); + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawCentered("Set Date of Birth", var24, var5 + 5, 16777215, 0); - var24 = Login.__cu_y + 180 + 80; - __bd_u.__q_496(var24 - 73, var5 - 20); + var24 = Login.loginBoxX + 180 + 80; + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawCentered("Back", var24, var5 + 5, 16777215, 0); - } else if(Login.__cu_aw == 8) { + } else if(Login.loginIndex == 8) { var47 = 216; - var0.drawCentered("Sorry, but your account is not eligible to play.", Login.__cu_y + 180, var47, 16776960, 0); + var0.drawCentered("Sorry, but your account is not eligible to play.", Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 15; - var2.drawCentered("For more information, please take a look at", Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered("For more information, please take a look at", Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var2.drawCentered("our privacy policy.", Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered("our privacy policy.", Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var24 = Login.__cu_y + 180 - 80; + var24 = Login.loginBoxX + 180 - 80; var5 = 321; - __bd_u.__q_496(var24 - 73, var5 - 20); + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawCentered("Privacy Policy", var24, var5 + 5, 16777215, 0); - var24 = Login.__cu_y + 180 + 80; - __bd_u.__q_496(var24 - 73, var5 - 20); + var24 = Login.loginBoxX + 180 + 80; + titlebuttonSprite.drawAt(var24 - 73, var5 - 20); var0.drawCentered("Back", var24, var5 + 5, 16777215, 0); - } else if(Login.__cu_aw == 12) { + } else if(Login.loginIndex == 12) { var47 = 201; String var4 = ""; var26 = ""; @@ -657,19 +652,19 @@ public class IndexCacheLoader { MouseHandler.method1084(false); } - var0.drawCentered(var4, Login.__cu_y + 180, var47, 16776960, 0); + var0.drawCentered(var4, Login.loginBoxX + 180, var47, 16776960, 0); var48 = var47 + 15; - var2.drawCentered(var26, Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered(var26, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var2.drawCentered(var25, Login.__cu_y + 180, var48, 16776960, 0); + var2.drawCentered(var25, Login.loginBoxX + 180, var48, 16776960, 0); var48 += 15; - var27 = Login.__cu_y + 180; + var27 = Login.loginBoxX + 180; var50 = 276; - __bd_u.__q_496(var27 - 73, var50 - 20); + titlebuttonSprite.drawAt(var27 - 73, var50 - 20); var0.drawCentered("Support Page", var27, var50 + 5, 16777215, 0); - var27 = Login.__cu_y + 180; + var27 = Login.loginBoxX + 180; var50 = 326; - __bd_u.__q_496(var27 - 73, var50 - 20); + titlebuttonSprite.drawAt(var27 - 73, var50 - 20); var0.drawCentered("Back", var27, var50 + 5, 16777215, 0); } } @@ -679,20 +674,20 @@ public class IndexCacheLoader { if(Client.gameState >= 10) { int[] var3 = new int[4]; Rasterizer2D.Rasterizer2D_getClipArray(var3); - Rasterizer2D.Rasterizer2D_setClip(Login.__cu_q, 0, Login.__cu_q + 765, Huffman.canvasHeight); - class16.field85.method1782(Login.__cu_q - 22, Client.cycle); - class16.field85.method1782(Login.__cu_q + 22 + 765 - 128, Client.cycle); + Rasterizer2D.Rasterizer2D_setClip(Login.xPadding, 0, Login.xPadding + 765, Huffman.canvasHeight); + class16.loginScreenRunesAnimation.method1782(Login.xPadding - 22, Client.cycle); + class16.loginScreenRunesAnimation.method1782(Login.xPadding + 22 + 765 - 128, Client.cycle); Rasterizer2D.Rasterizer2D_setClipArray(var3); } - KeyHandler.__an_x[ReflectionCheck.clientPreferences.titleMusicDisabled?1:0].__q_496(Login.__cu_q + 765 - 40, 463); + KeyHandler.title_muteSprite[ReflectionCheck.clientPreferences.titleMusicDisabled?1:0].drawAt(Login.xPadding + 765 - 40, 463); if(Client.gameState > 5 && Client.language == 0) { if(class277.__jn_by != null) { - var48 = Login.__cu_q + 5; + var48 = Login.xPadding + 5; var49 = 463; byte var38 = 100; byte var6 = 35; - class277.__jn_by.__q_496(var48, var49); + class277.__jn_by.drawAt(var48, var49); var0.drawCentered("World" + " " + Client.worldId, var38 / 2 + var48, var6 / 2 + var49 - 2, 16777215, 0); if(FriendLoginUpdate.__kn_x != null) { var1.drawCentered("Loading...", var38 / 2 + var48, var6 / 2 + var49 + 12, 16777215, 0); @@ -700,7 +695,7 @@ public class IndexCacheLoader { var1.drawCentered("Click to switch", var38 / 2 + var48, var6 / 2 + var49 + 12, 16777215, 0); } } else { - class277.__jn_by = MenuAction.method2025(WorldMapSection3.indexCache8, "sl_button", ""); + class277.__jn_by = MenuAction.loadIndexedSpriteByName(WorldMapSection3.indexCache8, "sl_button", ""); } } diff --git a/rs-client/src/main/java/IndexStore.java b/runescape-client/src/main/java/IndexStore.java similarity index 79% rename from rs-client/src/main/java/IndexStore.java rename to runescape-client/src/main/java/IndexStore.java index ab9552b2f2..c17efeb20a 100644 --- a/rs-client/src/main/java/IndexStore.java +++ b/runescape-client/src/main/java/IndexStore.java @@ -277,20 +277,20 @@ public final class IndexStore { signature = "(IIILfe;Lfy;B)Z", garbageValue = "1" ) - static final boolean method3585(int var0, int var1, int var2, class179 var3, CollisionMap var4) { + static final boolean method3585(int var0, int var1, int var2, RouteStrategy var3, CollisionMap var4) { int var5 = var0; int var6 = var1; byte var7 = 64; byte var8 = 64; int var9 = var0 - var7; int var10 = var1 - var8; - class178.__fi_q[var7][var8] = 99; - class178.__fi_w[var7][var8] = 0; + class178.directions[var7][var8] = 99; + class178.distances[var7][var8] = 0; byte var11 = 0; int var12 = 0; - class178.__fi_l[var11] = var0; + class178.bufferX[var11] = var0; int var20 = var11 + 1; - class178.__fi_e[var11] = var1; + class178.bufferY[var11] = var1; int[][] var13 = var4.flags; while(true) { @@ -313,8 +313,8 @@ public final class IndexStore { return false; } - var5 = class178.__fi_l[var12]; - var6 = class178.__fi_e[var12]; + var5 = class178.bufferX[var12]; + var6 = class178.bufferY[var12]; var12 = var12 + 1 & 4095; var18 = var5 - var9; var19 = var6 - var10; @@ -326,17 +326,17 @@ public final class IndexStore { return true; } - var16 = class178.__fi_w[var18][var19] + 1; - if(var18 > 0 && class178.__fi_q[var18 - 1][var19] == 0 && (var13[var14 - 1][var15] & 19136782) == 0 && (var13[var14 - 1][var15 + var2 - 1] & 19136824) == 0) { + var16 = class178.distances[var18][var19] + 1; + if(var18 > 0 && class178.directions[var18 - 1][var19] == 0 && (var13[var14 - 1][var15] & 19136782) == 0 && (var13[var14 - 1][var15 + var2 - 1] & 19136824) == 0) { var17 = 1; while(true) { if(var17 >= var2 - 1) { - class178.__fi_l[var20] = var5 - 1; - class178.__fi_e[var20] = var6; + class178.bufferX[var20] = var5 - 1; + class178.bufferY[var20] = var6; var20 = var20 + 1 & 4095; - class178.__fi_q[var18 - 1][var19] = 2; - class178.__fi_w[var18 - 1][var19] = var16; + class178.directions[var18 - 1][var19] = 2; + class178.distances[var18 - 1][var19] = var16; break; } @@ -348,16 +348,16 @@ public final class IndexStore { } } - if(var18 < 128 - var2 && class178.__fi_q[var18 + 1][var19] == 0 && (var13[var14 + var2][var15] & 19136899) == 0 && (var13[var14 + var2][var15 + var2 - 1] & 19136992) == 0) { + if(var18 < 128 - var2 && class178.directions[var18 + 1][var19] == 0 && (var13[var14 + var2][var15] & 19136899) == 0 && (var13[var14 + var2][var15 + var2 - 1] & 19136992) == 0) { var17 = 1; while(true) { if(var17 >= var2 - 1) { - class178.__fi_l[var20] = var5 + 1; - class178.__fi_e[var20] = var6; + class178.bufferX[var20] = var5 + 1; + class178.bufferY[var20] = var6; var20 = var20 + 1 & 4095; - class178.__fi_q[var18 + 1][var19] = 8; - class178.__fi_w[var18 + 1][var19] = var16; + class178.directions[var18 + 1][var19] = 8; + class178.distances[var18 + 1][var19] = var16; break; } @@ -369,16 +369,16 @@ public final class IndexStore { } } - if(var19 > 0 && class178.__fi_q[var18][var19 - 1] == 0 && (var13[var14][var15 - 1] & 19136782) == 0 && (var13[var14 + var2 - 1][var15 - 1] & 19136899) == 0) { + if(var19 > 0 && class178.directions[var18][var19 - 1] == 0 && (var13[var14][var15 - 1] & 19136782) == 0 && (var13[var14 + var2 - 1][var15 - 1] & 19136899) == 0) { var17 = 1; while(true) { if(var17 >= var2 - 1) { - class178.__fi_l[var20] = var5; - class178.__fi_e[var20] = var6 - 1; + class178.bufferX[var20] = var5; + class178.bufferY[var20] = var6 - 1; var20 = var20 + 1 & 4095; - class178.__fi_q[var18][var19 - 1] = 1; - class178.__fi_w[var18][var19 - 1] = var16; + class178.directions[var18][var19 - 1] = 1; + class178.distances[var18][var19 - 1] = var16; break; } @@ -390,16 +390,16 @@ public final class IndexStore { } } - if(var19 < 128 - var2 && class178.__fi_q[var18][var19 + 1] == 0 && (var13[var14][var15 + var2] & 19136824) == 0 && (var13[var14 + var2 - 1][var15 + var2] & 19136992) == 0) { + if(var19 < 128 - var2 && class178.directions[var18][var19 + 1] == 0 && (var13[var14][var15 + var2] & 19136824) == 0 && (var13[var14 + var2 - 1][var15 + var2] & 19136992) == 0) { var17 = 1; while(true) { if(var17 >= var2 - 1) { - class178.__fi_l[var20] = var5; - class178.__fi_e[var20] = var6 + 1; + class178.bufferX[var20] = var5; + class178.bufferY[var20] = var6 + 1; var20 = var20 + 1 & 4095; - class178.__fi_q[var18][var19 + 1] = 4; - class178.__fi_w[var18][var19 + 1] = var16; + class178.directions[var18][var19 + 1] = 4; + class178.distances[var18][var19 + 1] = var16; break; } @@ -411,16 +411,16 @@ public final class IndexStore { } } - if(var18 > 0 && var19 > 0 && class178.__fi_q[var18 - 1][var19 - 1] == 0 && (var13[var14 - 1][var15 - 1] & 19136782) == 0) { + if(var18 > 0 && var19 > 0 && class178.directions[var18 - 1][var19 - 1] == 0 && (var13[var14 - 1][var15 - 1] & 19136782) == 0) { var17 = 1; while(true) { if(var17 >= var2) { - class178.__fi_l[var20] = var5 - 1; - class178.__fi_e[var20] = var6 - 1; + class178.bufferX[var20] = var5 - 1; + class178.bufferY[var20] = var6 - 1; var20 = var20 + 1 & 4095; - class178.__fi_q[var18 - 1][var19 - 1] = 3; - class178.__fi_w[var18 - 1][var19 - 1] = var16; + class178.directions[var18 - 1][var19 - 1] = 3; + class178.distances[var18 - 1][var19 - 1] = var16; break; } @@ -432,16 +432,16 @@ public final class IndexStore { } } - if(var18 < 128 - var2 && var19 > 0 && class178.__fi_q[var18 + 1][var19 - 1] == 0 && (var13[var14 + var2][var15 - 1] & 19136899) == 0) { + if(var18 < 128 - var2 && var19 > 0 && class178.directions[var18 + 1][var19 - 1] == 0 && (var13[var14 + var2][var15 - 1] & 19136899) == 0) { var17 = 1; while(true) { if(var17 >= var2) { - class178.__fi_l[var20] = var5 + 1; - class178.__fi_e[var20] = var6 - 1; + class178.bufferX[var20] = var5 + 1; + class178.bufferY[var20] = var6 - 1; var20 = var20 + 1 & 4095; - class178.__fi_q[var18 + 1][var19 - 1] = 9; - class178.__fi_w[var18 + 1][var19 - 1] = var16; + class178.directions[var18 + 1][var19 - 1] = 9; + class178.distances[var18 + 1][var19 - 1] = var16; break; } @@ -453,22 +453,22 @@ public final class IndexStore { } } - if(var18 > 0 && var19 < 128 - var2 && class178.__fi_q[var18 - 1][var19 + 1] == 0 && (var13[var14 - 1][var15 + var2] & 19136824) == 0) { + if(var18 > 0 && var19 < 128 - var2 && class178.directions[var18 - 1][var19 + 1] == 0 && (var13[var14 - 1][var15 + var2] & 19136824) == 0) { for(var17 = 1; var17 < var2; ++var17) { if((var13[var14 - 1][var15 + var17] & 19136830) != 0 || (var13[var17 + (var14 - 1)][var15 + var2] & 19137016) != 0) { continue label277; } } - class178.__fi_l[var20] = var5 - 1; - class178.__fi_e[var20] = var6 + 1; + class178.bufferX[var20] = var5 - 1; + class178.bufferY[var20] = var6 + 1; var20 = var20 + 1 & 4095; - class178.__fi_q[var18 - 1][var19 + 1] = 6; - class178.__fi_w[var18 - 1][var19 + 1] = var16; + class178.directions[var18 - 1][var19 + 1] = 6; + class178.distances[var18 - 1][var19 + 1] = var16; } } while(var18 >= 128 - var2); } while(var19 >= 128 - var2); - } while(class178.__fi_q[var18 + 1][var19 + 1] != 0); + } while(class178.directions[var18 + 1][var19 + 1] != 0); } while((var13[var14 + var2][var15 + var2] & 19136992) != 0); for(var17 = 1; var17 < var2; ++var17) { @@ -477,11 +477,11 @@ public final class IndexStore { } } - class178.__fi_l[var20] = var5 + 1; - class178.__fi_e[var20] = var6 + 1; + class178.bufferX[var20] = var5 + 1; + class178.bufferY[var20] = var6 + 1; var20 = var20 + 1 & 4095; - class178.__fi_q[var18 + 1][var19 + 1] = 12; - class178.__fi_w[var18 + 1][var19 + 1] = var16; + class178.directions[var18 + 1][var19 + 1] = 12; + class178.distances[var18 + 1][var19 + 1] = var16; } } } diff --git a/rs-client/src/main/java/IndexStoreAction.java b/runescape-client/src/main/java/IndexStoreAction.java similarity index 98% rename from rs-client/src/main/java/IndexStoreAction.java rename to runescape-client/src/main/java/IndexStoreAction.java index db7bb30f1e..99aa4acd1b 100644 --- a/rs-client/src/main/java/IndexStoreAction.java +++ b/runescape-client/src/main/java/IndexStoreAction.java @@ -11,7 +11,6 @@ public class IndexStoreAction extends Node { @ObfuscatedGetter( intValue = -1086790653 ) - @Export("__ik_rt") static int __ik_rt; @ObfuscatedName("a") @ObfuscatedSignature( @@ -23,7 +22,6 @@ public class IndexStoreAction extends Node { @ObfuscatedGetter( intValue = -1753937079 ) - @Export("__ik_cn") public static int __ik_cn; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/IndexStoreActionHandler.java b/runescape-client/src/main/java/IndexStoreActionHandler.java similarity index 99% rename from rs-client/src/main/java/IndexStoreActionHandler.java rename to runescape-client/src/main/java/IndexStoreActionHandler.java index 3df9d6688d..5d0c97e34c 100644 --- a/rs-client/src/main/java/IndexStoreActionHandler.java +++ b/runescape-client/src/main/java/IndexStoreActionHandler.java @@ -23,7 +23,6 @@ public class IndexStoreActionHandler implements Runnable { @ObfuscatedGetter( intValue = -1282224505 ) - @Export("__iv_q") static int __iv_q; @ObfuscatedName("w") @Export("IndexStoreActionHandler_lock") diff --git a/rs-client/src/main/java/IndexedSprite.java b/runescape-client/src/main/java/IndexedSprite.java similarity index 89% rename from rs-client/src/main/java/IndexedSprite.java rename to runescape-client/src/main/java/IndexedSprite.java index e85171962f..9a0e481697 100644 --- a/rs-client/src/main/java/IndexedSprite.java +++ b/runescape-client/src/main/java/IndexedSprite.java @@ -85,41 +85,41 @@ public final class IndexedSprite extends Rasterizer2D { } @ObfuscatedName("q") - @Export("__q_496") - public void __q_496(int var1, int var2) { - var1 += this.xOffset; - var2 += this.yOffset; - int var3 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; + @Export("drawAt") + public void drawAt(int x, int y) { + x += this.xOffset; + y += this.yOffset; + int var3 = x + y * Rasterizer2D.Rasterizer2D_width; int var4 = 0; int var5 = this.subHeight; int var6 = this.subWidth; int var7 = Rasterizer2D.Rasterizer2D_width - var6; int var8 = 0; int var9; - if(var2 < Rasterizer2D.Rasterizer2D_yClipStart) { - var9 = Rasterizer2D.Rasterizer2D_yClipStart - var2; + if(y < Rasterizer2D.Rasterizer2D_yClipStart) { + var9 = Rasterizer2D.Rasterizer2D_yClipStart - y; var5 -= var9; - var2 = Rasterizer2D.Rasterizer2D_yClipStart; + y = Rasterizer2D.Rasterizer2D_yClipStart; var4 += var9 * var6; var3 += var9 * Rasterizer2D.Rasterizer2D_width; } - if(var5 + var2 > Rasterizer2D.Rasterizer2D_yClipEnd) { - var5 -= var5 + var2 - Rasterizer2D.Rasterizer2D_yClipEnd; + if(var5 + y > Rasterizer2D.Rasterizer2D_yClipEnd) { + var5 -= var5 + y - Rasterizer2D.Rasterizer2D_yClipEnd; } - if(var1 < Rasterizer2D.Rasterizer2D_xClipStart) { - var9 = Rasterizer2D.Rasterizer2D_xClipStart - var1; + if(x < Rasterizer2D.Rasterizer2D_xClipStart) { + var9 = Rasterizer2D.Rasterizer2D_xClipStart - x; var6 -= var9; - var1 = Rasterizer2D.Rasterizer2D_xClipStart; + x = Rasterizer2D.Rasterizer2D_xClipStart; var4 += var9; var3 += var9; var8 += var9; var7 += var9; } - if(var6 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { - var9 = var6 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; + if(var6 + x > Rasterizer2D.Rasterizer2D_xClipEnd) { + var9 = var6 + x - Rasterizer2D.Rasterizer2D_xClipEnd; var6 -= var9; var8 += var9; var7 += var9; @@ -131,7 +131,6 @@ public final class IndexedSprite extends Rasterizer2D { } @ObfuscatedName("o") - @Export("__o_497") public void __o_497(int var1, int var2, int var3, int var4) { int var5 = this.subWidth; int var6 = this.subHeight; diff --git a/rs-client/src/main/java/Instrument.java b/runescape-client/src/main/java/Instrument.java similarity index 98% rename from rs-client/src/main/java/Instrument.java rename to runescape-client/src/main/java/Instrument.java index f12708ef4a..e6f6ae9645 100644 --- a/rs-client/src/main/java/Instrument.java +++ b/runescape-client/src/main/java/Instrument.java @@ -35,49 +35,41 @@ public class Instrument { @ObfuscatedSignature( signature = "Lde;" ) - @Export("__m") SoundEnvelope __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__f") SoundEnvelope __f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__q") SoundEnvelope __q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__w") SoundEnvelope __w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__o") SoundEnvelope __o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__u") SoundEnvelope __u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__g") SoundEnvelope __g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__l") SoundEnvelope __l; @ObfuscatedName("e") @Export("oscillatorVolume") @@ -104,7 +96,6 @@ public class Instrument { @ObfuscatedSignature( signature = "Lde;" ) - @Export("__a") SoundEnvelope __a; @ObfuscatedName("z") @Export("duration") diff --git a/rs-client/src/main/java/IntHashTable.java b/runescape-client/src/main/java/IntHashTable.java similarity index 100% rename from rs-client/src/main/java/IntHashTable.java rename to runescape-client/src/main/java/IntHashTable.java diff --git a/rs-client/src/main/java/IntegerNode.java b/runescape-client/src/main/java/IntegerNode.java similarity index 100% rename from rs-client/src/main/java/IntegerNode.java rename to runescape-client/src/main/java/IntegerNode.java diff --git a/rs-client/src/main/java/Interpreter.java b/runescape-client/src/main/java/Interpreter.java similarity index 94% rename from rs-client/src/main/java/Interpreter.java rename to runescape-client/src/main/java/Interpreter.java index 126aba22f8..61ace7fd65 100644 --- a/rs-client/src/main/java/Interpreter.java +++ b/runescape-client/src/main/java/Interpreter.java @@ -48,22 +48,17 @@ public class Interpreter { @Export("Interpreter_calendar") static Calendar Interpreter_calendar; @ObfuscatedName("z") - @Export("__bv_z") static final String[] __bv_z; @ObfuscatedName("s") - @Export("__bv_s") static boolean __bv_s; @ObfuscatedName("t") - @Export("__bv_t") static boolean __bv_t; @ObfuscatedName("y") @ObfuscatedGetter( intValue = -1019558835 ) - @Export("__bv_y") static int __bv_y; @ObfuscatedName("r") - @Export("__bv_r") static final double __bv_r; static { @@ -141,7 +136,8 @@ public class Interpreter { signature = "(IIB)V", garbageValue = "76" ) - static void method1975(int var0, int var1) { + @Export("changeWorldSelectSorting") + static void changeWorldSelectSorting(int var0, int var1) { int[] var2 = new int[4]; int[] var3 = new int[4]; var2[0] = var0; @@ -149,16 +145,16 @@ public class Interpreter { int var4 = 1; for(int var5 = 0; var5 < 4; ++var5) { - if(World.__bt_e[var5] != var0) { - var2[var4] = World.__bt_e[var5]; - var3[var4] = World.__bt_l[var5]; + if(World.sortOption1[var5] != var0) { + var2[var4] = World.sortOption1[var5]; + var3[var4] = World.sortOption2[var5]; ++var4; } } - World.__bt_e = var2; - World.__bt_l = var3; - MilliClock.method3400(ItemContainer.worlds, 0, ItemContainer.worlds.length - 1, World.__bt_e, World.__bt_l); + World.sortOption1 = var2; + World.sortOption2 = var3; + MilliClock.method3400(ItemContainer.worlds, 0, ItemContainer.worlds.length - 1, World.sortOption1, World.sortOption2); } @ObfuscatedName("w") diff --git a/rs-client/src/main/java/InvDefinition.java b/runescape-client/src/main/java/InvDefinition.java similarity index 98% rename from rs-client/src/main/java/InvDefinition.java rename to runescape-client/src/main/java/InvDefinition.java index 241df58b96..922b60700a 100644 --- a/rs-client/src/main/java/InvDefinition.java +++ b/runescape-client/src/main/java/InvDefinition.java @@ -11,7 +11,6 @@ public class InvDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__ib_f") static EvictingDualNodeHashTable __ib_f; @ObfuscatedName("q") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/IsaacCipher.java b/runescape-client/src/main/java/IsaacCipher.java similarity index 97% rename from rs-client/src/main/java/IsaacCipher.java rename to runescape-client/src/main/java/IsaacCipher.java index e10d46a0f7..11f5951763 100644 --- a/rs-client/src/main/java/IsaacCipher.java +++ b/runescape-client/src/main/java/IsaacCipher.java @@ -11,31 +11,25 @@ public final class IsaacCipher { @ObfuscatedGetter( intValue = 1514845493 ) - @Export("__w") int __w; @ObfuscatedName("o") - @Export("__o") int[] __o; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -1670027699 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -325762649 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1951204929 ) - @Export("__e") int __e; public IsaacCipher(int[] var1) { @@ -54,7 +48,6 @@ public final class IsaacCipher { signature = "(I)I", garbageValue = "-7509790" ) - @Export("__m_336") final int __m_336() { if(0 == --this.__w + 1) { this.__q_338(); @@ -69,7 +62,6 @@ public final class IsaacCipher { signature = "(I)I", garbageValue = "-506873526" ) - @Export("__f_337") final int __f_337() { if(this.__w == 0) { this.__q_338(); @@ -84,7 +76,6 @@ public final class IsaacCipher { signature = "(B)V", garbageValue = "124" ) - @Export("__q_338") final void __q_338() { this.__l += ++this.__e; @@ -115,7 +106,6 @@ public final class IsaacCipher { signature = "(I)V", garbageValue = "579890110" ) - @Export("__w_339") final void __w_339() { int var9 = -1640531527; int var8 = -1640531527; @@ -267,7 +257,7 @@ public final class IsaacCipher { } else if(var0 == -1) { class54.method1089("No response from server.", "Please try using a different world.", ""); } else if(var0 == 3) { - Login.__cu_aw = 3; + Login.loginIndex = 3; Login.__cu_ac = 1; } else if(var0 == 4) { class32.method578(0); @@ -322,7 +312,7 @@ public final class IsaacCipher { } else if(var0 == 38) { class54.method1089("You need to vote to play!", "Visit runescape.com and vote,", "and then come back here!"); } else if(var0 == 55) { - Login.__cu_aw = 8; + Login.loginIndex = 8; } else { if(var0 == 56) { class54.method1089("Enter the 6-digit code generated by your", "authenticator app.", ""); @@ -337,7 +327,7 @@ public final class IsaacCipher { } if(var0 == 61) { - Login.__cu_aw = 7; + Login.loginIndex = 7; } else { class54.method1089("Unexpected server response", "Please try using a different world.", ""); } diff --git a/rs-client/src/main/java/ItemContainer.java b/runescape-client/src/main/java/ItemContainer.java similarity index 99% rename from rs-client/src/main/java/ItemContainer.java rename to runescape-client/src/main/java/ItemContainer.java index 577023f80e..8a99037d41 100644 --- a/rs-client/src/main/java/ItemContainer.java +++ b/runescape-client/src/main/java/ItemContainer.java @@ -22,7 +22,6 @@ public class ItemContainer extends Node { @ObfuscatedSignature( signature = "Lit;" ) - @Export("__bc_dm") static IndexCache __bc_dm; @ObfuscatedName("f") @Export("ids") diff --git a/rs-client/src/main/java/ItemDefinition.java b/runescape-client/src/main/java/ItemDefinition.java similarity index 99% rename from rs-client/src/main/java/ItemDefinition.java rename to runescape-client/src/main/java/ItemDefinition.java index 14304761f6..79a6776a68 100644 --- a/rs-client/src/main/java/ItemDefinition.java +++ b/runescape-client/src/main/java/ItemDefinition.java @@ -47,7 +47,6 @@ public class ItemDefinition extends DualNode { @ObfuscatedGetter( intValue = 1070080857 ) - @Export("__a") int __a; @ObfuscatedName("z") @Export("name") @@ -200,10 +199,8 @@ public class ItemDefinition extends DualNode { @Export("femaleHeadModel2") int femaleHeadModel2; @ObfuscatedName("az") - @Export("__az") int[] __az; @ObfuscatedName("au") - @Export("__au") int[] __au; @ObfuscatedName("ao") @ObfuscatedGetter( @@ -493,7 +490,6 @@ public class ItemDefinition extends DualNode { signature = "(Ljv;Ljv;I)V", garbageValue = "2051877377" ) - @Export("__o_426") void __o_426(ItemDefinition var1, ItemDefinition var2) { this.__a = var1.__a; this.zoom2d = var1.zoom2d; @@ -517,7 +513,6 @@ public class ItemDefinition extends DualNode { signature = "(Ljv;Ljv;I)V", garbageValue = "227754762" ) - @Export("__u_427") void __u_427(ItemDefinition var1, ItemDefinition var2) { this.__a = var1.__a; this.zoom2d = var1.zoom2d; @@ -561,7 +556,6 @@ public class ItemDefinition extends DualNode { signature = "(Ljv;Ljv;I)V", garbageValue = "2084647027" ) - @Export("__g_428") void __g_428(ItemDefinition var1, ItemDefinition var2) { this.__a = var1.__a; this.zoom2d = var1.zoom2d; @@ -586,7 +580,6 @@ public class ItemDefinition extends DualNode { signature = "(II)Ldw;", garbageValue = "-223149161" ) - @Export("__l_429") public final ModelData __l_429(int var1) { int var3; if(this.__az != null && var1 > 1) { @@ -686,7 +679,6 @@ public class ItemDefinition extends DualNode { signature = "(IB)Ljv;", garbageValue = "0" ) - @Export("__x_430") public ItemDefinition __x_430(int var1) { if(this.__az != null && var1 > 1) { int var2 = -1; @@ -710,7 +702,6 @@ public class ItemDefinition extends DualNode { signature = "(ZI)Z", garbageValue = "-918880706" ) - @Export("__z_431") public final boolean __z_431(boolean var1) { int var2 = this.maleModel; int var3 = this.maleModel1; @@ -746,7 +737,6 @@ public class ItemDefinition extends DualNode { signature = "(ZB)Ldw;", garbageValue = "-123" ) - @Export("__j_432") public final ModelData __j_432(boolean var1) { int var2 = this.maleModel; int var3 = this.maleModel1; @@ -803,7 +793,6 @@ public class ItemDefinition extends DualNode { signature = "(ZI)Z", garbageValue = "-998582497" ) - @Export("__s_433") public final boolean __s_433(boolean var1) { int var2 = this.maleHeadModel; int var3 = this.maleHeadModel2; @@ -833,7 +822,6 @@ public class ItemDefinition extends DualNode { signature = "(ZI)Ldw;", garbageValue = "-1820885439" ) - @Export("__t_434") public final ModelData __t_434(boolean var1) { int var2 = this.maleHeadModel; int var3 = this.maleHeadModel2; diff --git a/rs-client/src/main/java/IterableDualNodeQueue.java b/runescape-client/src/main/java/IterableDualNodeQueue.java similarity index 96% rename from rs-client/src/main/java/IterableDualNodeQueue.java rename to runescape-client/src/main/java/IterableDualNodeQueue.java index f08c441a67..da2bea045e 100644 --- a/rs-client/src/main/java/IterableDualNodeQueue.java +++ b/runescape-client/src/main/java/IterableDualNodeQueue.java @@ -55,7 +55,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "()Lfn;" ) - @Export("__q_448") public DualNode __q_448() { DualNode var1 = this.sentinel.previousDual; if(var1 == this.sentinel) { @@ -70,7 +69,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "()Lfn;" ) - @Export("__w_449") public DualNode __w_449() { return this.__o_450((DualNode)null); } @@ -79,7 +77,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "(Lfn;)Lfn;" ) - @Export("__o_450") DualNode __o_450(DualNode var1) { DualNode var2; if(var1 == null) { @@ -101,7 +98,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "()Lfn;" ) - @Export("__u_451") public DualNode __u_451() { DualNode var1 = this.head; if(var1 == this.sentinel) { diff --git a/rs-client/src/main/java/IterableDualNodeQueueIterator.java b/runescape-client/src/main/java/IterableDualNodeQueueIterator.java similarity index 96% rename from rs-client/src/main/java/IterableDualNodeQueueIterator.java rename to runescape-client/src/main/java/IterableDualNodeQueueIterator.java index 72fd6289c4..76c1205ba7 100644 --- a/rs-client/src/main/java/IterableDualNodeQueueIterator.java +++ b/runescape-client/src/main/java/IterableDualNodeQueueIterator.java @@ -17,13 +17,11 @@ public class IterableDualNodeQueueIterator implements Iterator { @ObfuscatedSignature( signature = "Lfn;" ) - @Export("__f") DualNode __f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lfn;" ) - @Export("__q") DualNode __q; @ObfuscatedSignature( @@ -57,7 +55,6 @@ public class IterableDualNodeQueueIterator implements Iterator { return this.queue.sentinel != this.__f; } - @Export("__remove_442") @ObfuscatedName("remove") public void __remove_442() { if(this.__q == null) { diff --git a/rs-client/src/main/java/IterableNodeDeque.java b/runescape-client/src/main/java/IterableNodeDeque.java similarity index 100% rename from rs-client/src/main/java/IterableNodeDeque.java rename to runescape-client/src/main/java/IterableNodeDeque.java diff --git a/rs-client/src/main/java/IterableNodeDequeDescendingIterator.java b/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java similarity index 94% rename from rs-client/src/main/java/IterableNodeDequeDescendingIterator.java rename to runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java index 3b1a863597..dd0e92ce91 100644 --- a/rs-client/src/main/java/IterableNodeDequeDescendingIterator.java +++ b/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java @@ -17,13 +17,11 @@ public class IterableNodeDequeDescendingIterator implements Iterator { @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__f") Node __f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__q") Node __q; @ObfuscatedSignature( @@ -38,14 +36,12 @@ public class IterableNodeDequeDescendingIterator implements Iterator { @ObfuscatedSignature( signature = "(Lja;)V" ) - @Export("__u_443") void __u_443(IterableNodeDeque var1) { this.deque = var1; this.__g_444(); } @ObfuscatedName("g") - @Export("__g_444") void __g_444() { this.__f = this.deque != null?this.deque.sentinel.previous:null; this.__q = null; @@ -72,7 +68,6 @@ public class IterableNodeDequeDescendingIterator implements Iterator { return var1; } - @Export("__remove_447") @ObfuscatedName("remove") public void __remove_447() { if(this.__q == null) { diff --git a/rs-client/src/main/java/IterableNodeHashTable.java b/runescape-client/src/main/java/IterableNodeHashTable.java similarity index 100% rename from rs-client/src/main/java/IterableNodeHashTable.java rename to runescape-client/src/main/java/IterableNodeHashTable.java diff --git a/rs-client/src/main/java/IterableNodeHashTableIterator.java b/runescape-client/src/main/java/IterableNodeHashTableIterator.java similarity index 95% rename from rs-client/src/main/java/IterableNodeHashTableIterator.java rename to runescape-client/src/main/java/IterableNodeHashTableIterator.java index f6ac847231..87ce727ad7 100644 --- a/rs-client/src/main/java/IterableNodeHashTableIterator.java +++ b/runescape-client/src/main/java/IterableNodeHashTableIterator.java @@ -17,16 +17,13 @@ public class IterableNodeHashTableIterator implements Iterator { @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__f") Node __f; @ObfuscatedName("q") - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__w") Node __w; @ObfuscatedSignature( @@ -39,7 +36,6 @@ public class IterableNodeHashTableIterator implements Iterator { } @ObfuscatedName("u") - @Export("__u_483") void __u_483() { this.__f = this.hashTable.buckets[0].previous; this.__q = 1; @@ -89,7 +85,6 @@ public class IterableNodeHashTableIterator implements Iterator { } } - @Export("__remove_486") @ObfuscatedName("remove") public void __remove_486() { if(this.__w == null) { diff --git a/rs-client/src/main/java/KeyHandler.java b/runescape-client/src/main/java/KeyHandler.java similarity index 96% rename from rs-client/src/main/java/KeyHandler.java rename to runescape-client/src/main/java/KeyHandler.java index e7322e5206..7bd6aa523f 100644 --- a/rs-client/src/main/java/KeyHandler.java +++ b/runescape-client/src/main/java/KeyHandler.java @@ -16,7 +16,6 @@ public final class KeyHandler implements KeyListener, FocusListener { @ObfuscatedGetter( intValue = -817957995 ) - @Export("__an_ra") static int __an_ra; @ObfuscatedName("m") @ObfuscatedSignature( @@ -28,14 +27,14 @@ public final class KeyHandler implements KeyListener, FocusListener { @ObfuscatedSignature( signature = "[Llq;" ) - @Export("__an_x") - static IndexedSprite[] __an_x; + @Export("title_muteSprite") + static IndexedSprite[] title_muteSprite; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Llq;" ) - @Export("__an_i") - static IndexedSprite __an_i; + @Export("options_buttons_6Sprite") + static IndexedSprite options_buttons_6Sprite; @ObfuscatedName("bk") @ObfuscatedSignature( signature = "Llx;" @@ -46,52 +45,42 @@ public final class KeyHandler implements KeyListener, FocusListener { @Export("KeyHandler_pressedKeys") public static boolean[] KeyHandler_pressedKeys; @ObfuscatedName("cq") - @Export("__an_cq") static int[] __an_cq; @ObfuscatedName("ch") @ObfuscatedGetter( intValue = 1112094745 ) - @Export("__an_ch") static int __an_ch; @ObfuscatedName("cw") @ObfuscatedGetter( intValue = -1208053825 ) - @Export("__an_cw") static int __an_cw; @ObfuscatedName("cg") - @Export("__an_cg") static char[] __an_cg; @ObfuscatedName("cf") - @Export("__an_cf") static int[] __an_cf; @ObfuscatedName("cp") - @Export("__an_cp") public static int[] __an_cp; @ObfuscatedName("cl") @ObfuscatedGetter( intValue = -674534717 ) - @Export("__an_cl") public static int __an_cl; @ObfuscatedName("ct") @ObfuscatedGetter( intValue = -93280591 ) - @Export("__an_ct") static int __an_ct; @ObfuscatedName("cz") @ObfuscatedGetter( intValue = 2066759739 ) - @Export("__an_cz") static int __an_cz; @ObfuscatedName("cc") @ObfuscatedGetter( intValue = -1942898885 ) - @Export("__an_cc") static int __an_cc; @ObfuscatedName("ci") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/KitDefinition.java b/runescape-client/src/main/java/KitDefinition.java similarity index 97% rename from rs-client/src/main/java/KitDefinition.java rename to runescape-client/src/main/java/KitDefinition.java index b6311ca8de..bb2b7caf1e 100644 --- a/rs-client/src/main/java/KitDefinition.java +++ b/runescape-client/src/main/java/KitDefinition.java @@ -17,13 +17,11 @@ public class KitDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__im_f") public static AbstractIndexCache __im_f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 235389995 ) - @Export("__im_q") public static int __im_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -35,10 +33,8 @@ public class KitDefinition extends DualNode { @ObfuscatedGetter( intValue = 1619779051 ) - @Export("__o") public int __o; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") @Export("recolorFrom") @@ -56,7 +52,6 @@ public class KitDefinition extends DualNode { @Export("archives") int[] archives; @ObfuscatedName("k") - @Export("__k") public boolean __k; static { @@ -137,7 +132,6 @@ public class KitDefinition extends DualNode { signature = "(I)Z", garbageValue = "-1250940659" ) - @Export("__w_413") public boolean __w_413() { if(this.__u == null) { return true; @@ -159,7 +153,6 @@ public class KitDefinition extends DualNode { signature = "(B)Ldw;", garbageValue = "0" ) - @Export("__o_414") public ModelData __o_414() { if(this.__u == null) { return null; @@ -199,7 +192,6 @@ public class KitDefinition extends DualNode { signature = "(I)Z", garbageValue = "742548471" ) - @Export("__u_415") public boolean __u_415() { boolean var1 = true; @@ -217,7 +209,6 @@ public class KitDefinition extends DualNode { signature = "(B)Ldw;", garbageValue = "-56" ) - @Export("__g_416") public ModelData __g_416() { ModelData[] var1 = new ModelData[5]; int var2 = 0; diff --git a/rs-client/src/main/java/Link.java b/runescape-client/src/main/java/Link.java similarity index 94% rename from rs-client/src/main/java/Link.java rename to runescape-client/src/main/java/Link.java index 45229494f1..b8722c44a4 100644 --- a/rs-client/src/main/java/Link.java +++ b/runescape-client/src/main/java/Link.java @@ -10,13 +10,11 @@ public class Link { @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__m") public Link __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__f") public Link __f; @ObfuscatedName("m") diff --git a/rs-client/src/main/java/LinkDeque.java b/runescape-client/src/main/java/LinkDeque.java similarity index 93% rename from rs-client/src/main/java/LinkDeque.java rename to runescape-client/src/main/java/LinkDeque.java index 844a1ba5cb..c74ef769cc 100644 --- a/rs-client/src/main/java/LinkDeque.java +++ b/runescape-client/src/main/java/LinkDeque.java @@ -10,13 +10,11 @@ public class LinkDeque { @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__m") Link __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__f") Link __f; public LinkDeque() { @@ -29,7 +27,6 @@ public class LinkDeque { @ObfuscatedSignature( signature = "(Lgh;)V" ) - @Export("__m_437") public void __m_437(Link var1) { if(var1.__f != null) { var1.remove(); @@ -45,7 +42,6 @@ public class LinkDeque { @ObfuscatedSignature( signature = "()Lgh;" ) - @Export("__f_438") public Link __f_438() { Link var1 = this.__m.__m; if(var1 == this.__m) { @@ -61,7 +57,6 @@ public class LinkDeque { @ObfuscatedSignature( signature = "()Lgh;" ) - @Export("__q_439") public Link __q_439() { Link var1 = this.__f; if(var1 == this.__m) { diff --git a/rs-client/src/main/java/Login.java b/runescape-client/src/main/java/Login.java similarity index 86% rename from rs-client/src/main/java/Login.java rename to runescape-client/src/main/java/Login.java index 0a0af83959..82123fb5af 100644 --- a/rs-client/src/main/java/Login.java +++ b/runescape-client/src/main/java/Login.java @@ -9,26 +9,25 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Login") public class Login { @ObfuscatedName("f") - @Export("__cu_f") static boolean __cu_f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 1606541885 ) - @Export("__cu_q") - static int __cu_q; + @Export("xPadding") + static int xPadding; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Llq;" ) - @Export("__cu_o") - static IndexedSprite __cu_o; + @Export("titleboxSprite") + static IndexedSprite titleboxSprite; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lln;" ) - @Export("__cu_g") - static Sprite __cu_g; + @Export("leftTitleSprite") + static Sprite leftTitleSprite; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -184301597 @@ -39,14 +38,14 @@ public class Login { @ObfuscatedSignature( signature = "Llq;" ) - @Export("__cu_d") - static IndexedSprite __cu_d; + @Export("options_buttons_0Sprite") + static IndexedSprite options_buttons_0Sprite; @ObfuscatedName("y") @ObfuscatedGetter( intValue = 932541923 ) - @Export("__cu_y") - static int __cu_y; + @Export("loginBoxX") + static int loginBoxX; @ObfuscatedName("b") @ObfuscatedGetter( intValue = -504870061 @@ -60,20 +59,18 @@ public class Login { @ObfuscatedGetter( intValue = 1077910071 ) - @Export("__cu_aj") static int __cu_aj; @ObfuscatedName("ac") @ObfuscatedGetter( intValue = 1677133239 ) - @Export("__cu_ac") static int __cu_ac; @ObfuscatedName("aw") @ObfuscatedGetter( intValue = 1861681835 ) - @Export("__cu_aw") - static int __cu_aw; + @Export("loginIndex") + static int loginIndex; @ObfuscatedName("al") @Export("Login_response0") static String Login_response0; @@ -93,16 +90,13 @@ public class Login { @Export("Login_password") static String Login_password; @ObfuscatedName("aa") - @Export("__cu_aa") static boolean __cu_aa; @ObfuscatedName("ax") - @Export("__cu_ax") static boolean __cu_ax; @ObfuscatedName("ai") - @Export("__cu_ai") - static String __cu_ai; + @Export("otp") + static String otp; @ObfuscatedName("ba") - @Export("__cu_ba") static boolean __cu_ba; @ObfuscatedName("bb") @ObfuscatedGetter( @@ -111,37 +105,35 @@ public class Login { @Export("currentLoginField") static int currentLoginField; @ObfuscatedName("bk") - @Export("__cu_bk") - static boolean __cu_bk; + @Export("worldSelectOpen") + static boolean worldSelectOpen; @ObfuscatedName("bl") @ObfuscatedGetter( intValue = 1431381579 ) - @Export("__cu_bl") - static int __cu_bl; + @Export("hoveredWorldIndex") + static int hoveredWorldIndex; @ObfuscatedName("br") @ObfuscatedGetter( intValue = -376233039 ) - @Export("__cu_br") - static int __cu_br; + @Export("worldSelectPage") + static int worldSelectPage; @ObfuscatedName("bj") @ObfuscatedGetter( intValue = 1548722671 ) - @Export("__cu_bj") - static int __cu_bj; + @Export("worldSelectPagesCount") + static int worldSelectPagesCount; @ObfuscatedName("bi") @ObfuscatedGetter( longValue = 803647694904294325L ) - @Export("__cu_bi") static long __cu_bi; @ObfuscatedName("bz") @ObfuscatedGetter( longValue = -3234258972092460093L ) - @Export("__cu_bz") static long __cu_bz; @ObfuscatedName("do") @ObfuscatedSignature( @@ -151,13 +143,13 @@ public class Login { static IndexCache indexCache11; static { - __cu_q = 0; - __cu_y = __cu_q + 202; + xPadding = 0; + loginBoxX = xPadding + 202; Login_loadingPercent = 10; Login_loadingText = ""; __cu_aj = -1; __cu_ac = 1; - __cu_aw = 0; + loginIndex = 0; Login_response0 = ""; Login_response1 = ""; Login_response2 = ""; @@ -168,10 +160,10 @@ public class Login { __cu_ax = false; __cu_ba = true; currentLoginField = 0; - __cu_bk = false; - __cu_bl = -1; - __cu_br = 0; - __cu_bj = 0; + worldSelectOpen = false; + hoveredWorldIndex = -1; + worldSelectPage = 0; + worldSelectPagesCount = 0; new DecimalFormat("##0.00"); new class161(); __cu_bi = -1L; diff --git a/rs-client/src/main/java/LoginPacket.java b/runescape-client/src/main/java/LoginPacket.java similarity index 95% rename from rs-client/src/main/java/LoginPacket.java rename to runescape-client/src/main/java/LoginPacket.java index 3239d905c3..d3f674d1d9 100644 --- a/rs-client/src/main/java/LoginPacket.java +++ b/runescape-client/src/main/java/LoginPacket.java @@ -13,37 +13,31 @@ public class LoginPacket implements ClientPacketMarker { @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_m") public static final LoginPacket __gl_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_f") static final LoginPacket __gl_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_q") public static final LoginPacket __gl_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_w") public static final LoginPacket __gl_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_o") static final LoginPacket __gl_o; @ObfuscatedName("g") @ObfuscatedSignature( signature = "[Lgl;" ) - @Export("__gl_g") static final LoginPacket[] __gl_g; @ObfuscatedName("u") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/class72.java b/runescape-client/src/main/java/LoginScreenAnimation.java similarity index 92% rename from rs-client/src/main/java/class72.java rename to runescape-client/src/main/java/LoginScreenAnimation.java index e93de12f7d..ddceffb8d9 100644 --- a/rs-client/src/main/java/class72.java +++ b/runescape-client/src/main/java/LoginScreenAnimation.java @@ -9,12 +9,14 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("bp") -public class class72 { +public class LoginScreenAnimation +{ @ObfuscatedName("m") @ObfuscatedSignature( signature = "[Llq;" ) - IndexedSprite[] field998; + @Export("sprites") + IndexedSprite[] sprites; @ObfuscatedName("g") int[] field1015; @ObfuscatedName("l") @@ -67,7 +69,7 @@ public class class72 { @ObfuscatedSignature( signature = "([Llq;)V" ) - class72(IndexedSprite[] var1) { + LoginScreenAnimation(IndexedSprite[] var1) { this.field1015 = new int[256]; this.field1008 = 0; this.field1009 = 0; @@ -75,7 +77,7 @@ public class class72 { this.field1010 = 0; this.field1016 = 0; this.field1017 = 0; - this.field998 = var1; + this.sprites = var1; this.method1772(); } @@ -89,55 +91,55 @@ public class class72 { int var1; for(var1 = 0; var1 < 64; ++var1) { - this.field1006[var1] = var1 * 262144; + this.field1006[var1] = var1 * 0x40000; } for(var1 = 0; var1 < 64; ++var1) { - this.field1006[var1 + 64] = var1 * 1024 + 16711680; + this.field1006[var1 + 64] = var1 * 0x400 + 0xff0000; } for(var1 = 0; var1 < 64; ++var1) { - this.field1006[var1 + 128] = var1 * 4 + 16776960; + this.field1006[var1 + 128] = var1 * 0x4 + 0xffff00; } for(var1 = 0; var1 < 64; ++var1) { - this.field1006[var1 + 192] = 16777215; + this.field1006[var1 + 192] = 0xffffff; } this.field1007 = new int[256]; for(var1 = 0; var1 < 64; ++var1) { - this.field1007[var1] = var1 * 1024; + this.field1007[var1] = var1 * 0x400; } for(var1 = 0; var1 < 64; ++var1) { - this.field1007[var1 + 64] = var1 * 4 + 65280; + this.field1007[var1 + 64] = var1 * 0x4 + 0xff00; } for(var1 = 0; var1 < 64; ++var1) { - this.field1007[var1 + 128] = var1 * 262144 + 65535; + this.field1007[var1 + 128] = var1 * 0x40000 + 0xffff; } for(var1 = 0; var1 < 64; ++var1) { - this.field1007[var1 + 192] = 16777215; + this.field1007[var1 + 192] = 0xffffff; } this.field1014 = new int[256]; for(var1 = 0; var1 < 64; ++var1) { - this.field1014[var1] = var1 * 4; + this.field1014[var1] = var1 * 0x4; } for(var1 = 0; var1 < 64; ++var1) { - this.field1014[var1 + 64] = var1 * 262144 + 255; + this.field1014[var1 + 64] = var1 * 0x40000 + 0xff; } for(var1 = 0; var1 < 64; ++var1) { - this.field1014[var1 + 128] = var1 * 1024 + 16711935; + this.field1014[var1 + 128] = var1 * 0x400 + 0xff00ff; } for(var1 = 0; var1 < 64; ++var1) { - this.field1014[var1 + 192] = 16777215; + this.field1014[var1 + 192] = 0xffffff; } this.field1013 = new int[256]; @@ -172,26 +174,26 @@ public class class72 { signature = "(III)V", garbageValue = "-1684910110" ) - void method1782(int var1, int var2) { + void method1782(int x, int cycle) { if(this.field1011 == null) { this.method1772(); } if(this.field1017 == 0) { - this.field1017 = var2; + this.field1017 = cycle; } - int var3 = var2 - this.field1017; + int var3 = cycle - this.field1017; if(var3 >= 256) { var3 = 0; } - this.field1017 = var2; + this.field1017 = cycle; if(var3 > 0) { this.method1791(var3); } - this.method1787(var1); + this.method1787(x); } @ObfuscatedName("w") @@ -205,7 +207,7 @@ public class class72 { if(this.field1010 > this.field1004.length) { this.field1010 -= this.field1004.length; var2 = (int)(Math.random() * 12.0D); - this.method1779(this.field998[var2]); + this.method1779(this.sprites[var2]); } var2 = 0; @@ -335,7 +337,7 @@ public class class72 { ) final int method1765(int var1, int var2, int var3) { int var4 = 256 - var3; - return (var4 * (var1 & 65280) + var3 * (var2 & 65280) & 16711680) + (var4 * (var1 & 16711935) + var3 * (var2 & 16711935) & -16711936) >> 8; + return (var4 * (var1 & 0xff00) + var3 * (var2 & 0xff00) & 0xff0000) + (var4 * (var1 & 0xff00ff) + var3 * (var2 & 0xff00ff) & 0xff00ff00) >> 8; } @ObfuscatedName("u") @@ -411,7 +413,7 @@ public class class72 { int var13 = 256 - var10; var10 = this.field1013[var10]; int var14 = class197.rasterProvider.pixels[var8]; - class197.rasterProvider.pixels[var8++] = -16777216 | ((var10 & 16711935) * var12 + (var14 & 16711935) * var13 & -16711936) + (var12 * (var10 & 65280) + var13 * (var14 & 65280) & 16711680) >> 8; + class197.rasterProvider.pixels[var8++] = 0xff000000 | ((var10 & 0xff00ff) * var12 + (var14 & 0xff00ff) * var13 & 0xff00ff00) + (var12 * (var10 & 0xff00) + var13 * (var14 & 0xff00) & 0xff0000) >> 8; } else { ++var8; } diff --git a/rs-client/src/main/java/LoginType.java b/runescape-client/src/main/java/LoginType.java similarity index 90% rename from rs-client/src/main/java/LoginType.java rename to runescape-client/src/main/java/LoginType.java index 3f3dc2163a..91705d5b3d 100644 --- a/rs-client/src/main/java/LoginType.java +++ b/runescape-client/src/main/java/LoginType.java @@ -11,64 +11,53 @@ public class LoginType { @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_m") public static final LoginType __lx_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_f") static final LoginType __lx_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_q") static final LoginType __lx_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_w") static final LoginType __lx_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_o") static final LoginType __lx_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_u") static final LoginType __lx_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_g") static final LoginType __lx_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_l") static final LoginType __lx_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_e") public static final LoginType __lx_e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1916729379 ) - @Export("__x") public final int __x; @ObfuscatedName("d") - @Export("__d") final String __d; static { @@ -96,7 +85,6 @@ public class LoginType { this.__d = var4; } - @Export("__toString_546") @ObfuscatedName("toString") public String __toString_546() { return this.__d; diff --git a/rs-client/src/main/java/MenuAction.java b/runescape-client/src/main/java/MenuAction.java similarity index 91% rename from rs-client/src/main/java/MenuAction.java rename to runescape-client/src/main/java/MenuAction.java index 8ac8a24a9d..1e3b209c99 100644 --- a/rs-client/src/main/java/MenuAction.java +++ b/runescape-client/src/main/java/MenuAction.java @@ -46,14 +46,15 @@ public class MenuAction { signature = "(Lir;Ljava/lang/String;Ljava/lang/String;B)Llq;", garbageValue = "0" ) - public static IndexedSprite method2025(AbstractIndexCache var0, String var1, String var2) { + @Export("loadIndexedSpriteByName") + public static IndexedSprite loadIndexedSpriteByName(AbstractIndexCache var0, String var1, String var2) { int var3 = var0.getArchiveId(var1); int var4 = var0.getRecordId(var3, var2); IndexedSprite var5; - if(!SpriteMask.method4392(var0, var3, var4)) { + if(!SpriteMask.loadSprite(var0, var3, var4)) { var5 = null; } else { - var5 = ServerPacket.method3663(); + var5 = ServerPacket.createIndexedSprite(); } return var5; @@ -70,7 +71,7 @@ public class MenuAction { int var3 = (int)var0.key; var0.remove(); if(var1) { - AbstractByteArrayCopier.method4023(var2); + AbstractByteArrayCopier.unloadWidgetGroup(var2); } for(IntegerNode var4 = (IntegerNode)Client.widgetClickMasks.first(); var4 != null; var4 = (IntegerNode)Client.widgetClickMasks.next()) { @@ -87,7 +88,7 @@ public class MenuAction { int var5; int var6; for(var5 = 0; var5 < Client.menuOptionsCount; ++var5) { - if(WorldMapManager.method672(Client.menuOpcodes[var5])) { + if(WorldMapManager.isWidgetMenuOpcode(Client.menuOpcodes[var5])) { if(var5 < Client.menuOptionsCount - 1) { for(var6 = var5; var6 < Client.menuOptionsCount - 1; ++var6) { Client.menuActions[var6] = Client.menuActions[var6 + 1]; diff --git a/rs-client/src/main/java/Message.java b/runescape-client/src/main/java/Message.java similarity index 99% rename from rs-client/src/main/java/Message.java rename to runescape-client/src/main/java/Message.java index 5b875921da..570ff3192f 100644 --- a/rs-client/src/main/java/Message.java +++ b/runescape-client/src/main/java/Message.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Message") public class Message extends DualNode { @ObfuscatedName("i") - @Export("__bm_i") static int[] __bm_i; @ObfuscatedName("m") @ObfuscatedGetter( @@ -219,7 +218,7 @@ public class Message extends DualNode { boolean var8; if(Character.isISOControl(var7)) { var8 = false; - } else if(VarcInt.method4807(var7)) { + } else if(VarcInt.isAlphaNumeric(var7)) { var8 = true; } else { char[] var13 = class305.__kb_q; diff --git a/rs-client/src/main/java/Messages.java b/runescape-client/src/main/java/Messages.java similarity index 100% rename from rs-client/src/main/java/Messages.java rename to runescape-client/src/main/java/Messages.java diff --git a/rs-client/src/main/java/MidiFileReader.java b/runescape-client/src/main/java/MidiFileReader.java similarity index 98% rename from rs-client/src/main/java/MidiFileReader.java rename to runescape-client/src/main/java/MidiFileReader.java index d48f4363d2..7425856d16 100644 --- a/rs-client/src/main/java/MidiFileReader.java +++ b/runescape-client/src/main/java/MidiFileReader.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("MidiFileReader") public class MidiFileReader { @ObfuscatedName("x") - @Export("__hs_x") static final byte[] __hs_x; @ObfuscatedName("m") @ObfuscatedSignature( @@ -28,13 +27,10 @@ public class MidiFileReader { @Export("trackLengths") int[] trackLengths; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") - @Export("__g") int __g; @ObfuscatedName("e") - @Export("__e") long __e; static { @@ -168,7 +164,6 @@ public class MidiFileReader { } @ObfuscatedName("d") - @Export("__d_371") int __d_371(int var1, int var2) { int var4; if(var2 == 255) { @@ -205,7 +200,6 @@ public class MidiFileReader { } @ObfuscatedName("a") - @Export("__a_372") long __a_372(int var1) { return this.__e + (long)var1 * (long)this.__g; } diff --git a/rs-client/src/main/java/MidiPcmStream.java b/runescape-client/src/main/java/MidiPcmStream.java similarity index 96% rename from rs-client/src/main/java/MidiPcmStream.java rename to runescape-client/src/main/java/MidiPcmStream.java index bdee97d7e1..800b277560 100644 --- a/rs-client/src/main/java/MidiPcmStream.java +++ b/runescape-client/src/main/java/MidiPcmStream.java @@ -17,70 +17,51 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedGetter( intValue = 335918727 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 2095480747 ) - @Export("__q") int __q; @ObfuscatedName("o") - @Export("__o") int[] __o; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") - @Export("__g") int[] __g; @ObfuscatedName("l") - @Export("__l") int[] __l; @ObfuscatedName("e") - @Export("__e") int[] __e; @ObfuscatedName("x") - @Export("__x") int[] __x; @ObfuscatedName("d") - @Export("__d") int[] __d; @ObfuscatedName("k") - @Export("__k") int[] __k; @ObfuscatedName("n") - @Export("surfaceOffsetY") int[] __n; @ObfuscatedName("y") - @Export("__y") int[] __y; @ObfuscatedName("h") - @Export("__h") int[] __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") - @Export("__c") int[] __c; @ObfuscatedName("r") - @Export("__r") int[] __r; @ObfuscatedName("p") - @Export("__p") int[] __p; @ObfuscatedName("v") @ObfuscatedSignature( signature = "[[Lha;" ) - @Export("__v") MusicPatchNode[][] __v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "[[Lha;" ) - @Export("__ag") MusicPatchNode[][] __ag; @ObfuscatedName("aq") @ObfuscatedSignature( @@ -89,7 +70,6 @@ public class MidiPcmStream extends PcmStream { @Export("midiFile") MidiFileReader midiFile; @ObfuscatedName("aj") - @Export("__aj") boolean __aj; @ObfuscatedName("av") @ObfuscatedGetter( @@ -107,13 +87,11 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedGetter( longValue = -7547625335559871937L ) - @Export("__ac") long __ac; @ObfuscatedName("ay") @ObfuscatedGetter( longValue = 3736036110499628937L ) - @Export("__ay") long __ay; @ObfuscatedName("ah") @ObfuscatedSignature( @@ -153,7 +131,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IB)V", garbageValue = "92" ) - @Export("__m_340") public synchronized void __m_340(int var1) { this.__f = var1; } @@ -163,7 +140,6 @@ public class MidiPcmStream extends PcmStream { signature = "(I)I", garbageValue = "2067929289" ) - @Export("__f_341") public int __f_341() { return this.__f; } @@ -237,6 +213,7 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected synchronized PcmStream firstSubStream() { return this.patchStream; } @@ -245,6 +222,7 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected synchronized PcmStream nextSubStream() { return null; } @@ -351,7 +329,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "789206119" ) - @Export("__j_342") public synchronized void __j_342(int var1, int var2) { this.__s_343(var1, var2); } @@ -361,7 +338,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "-1475022240" ) - @Export("__s_343") void __s_343(int var1, int var2) { this.__l[var1] = var2; this.__x[var1] = var2 & -128; @@ -373,7 +349,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "-213159072" ) - @Export("__t_344") void __t_344(int var1, int var2) { if(var2 != this.__e[var1]) { this.__e[var1] = var2; @@ -390,7 +365,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIIB)V", garbageValue = "15" ) - @Export("__y_345") void __y_345(int var1, int var2, int var3) { this.__b_347(var1, var2, 64); if((this.__y[var1] & 2) != 0) { @@ -435,7 +409,7 @@ public class MidiPcmStream extends PcmStream { } if(var9.__q[var2] < 0) { - var6.stream.__x_181(-1); + var6.stream.setNumLoops(-1); } if(var6.__o >= 0) { @@ -459,7 +433,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;ZI)V", garbageValue = "-1455849160" ) - @Export("__h_346") void __h_346(MusicPatchNode var1, boolean var2) { int var3 = var1.rawSound.samples.length; int var4; @@ -483,7 +456,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIII)V", garbageValue = "-1244653525" ) - @Export("__b_347") void __b_347(int var1, int var2, int var3) { MusicPatchNode var4 = this.__v[var1][var2]; if(var4 != null) { @@ -507,7 +479,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIII)V", garbageValue = "1055105177" ) - @Export("__c_348") void __c_348(int var1, int var2, int var3) { } @@ -516,7 +487,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIB)V", garbageValue = "-43" ) - @Export("__p_349") void __p_349(int var1, int var2) { } @@ -525,7 +495,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIB)V", garbageValue = "-1" ) - @Export("__v_350") void __v_350(int var1, int var2) { this.__d[var1] = var2; } @@ -535,7 +504,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "137929054" ) - @Export("__ah_351") void __ah_351(int var1) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { if(var1 < 0 || var2.__m == var1) { @@ -563,7 +531,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-59494316" ) - @Export("__ab_352") void __ab_352(int var1) { if(var1 >= 0) { this.__o[var1] = 12800; @@ -592,7 +559,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "1458917637" ) - @Export("__ae_353") void __ae_353(int var1) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { if((var1 < 0 || var2.__m == var1) && var2.__a < 0) { @@ -608,7 +574,6 @@ public class MidiPcmStream extends PcmStream { signature = "(I)V", garbageValue = "808372536" ) - @Export("__at_354") void __at_354() { this.__ah_351(-1); this.__ab_352(-1); @@ -629,7 +594,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-1934460661" ) - @Export("__ad_355") void __ad_355(int var1) { if((this.__y[var1] & 2) != 0) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { @@ -646,7 +610,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-1305073262" ) - @Export("__ap_356") void __ap_356(int var1) { if((this.__y[var1] & 4) != 0) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { @@ -663,7 +626,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "1168111396" ) - @Export("__au_357") void __au_357(int var1) { int var2 = var1 & 240; int var3; @@ -851,7 +813,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "1380282032" ) - @Export("__ao_358") void __ao_358(int var1, int var2) { this.__r[var1] = var2; this.__p[var1] = (int)(2097152.0D * Math.pow(2.0D, 5.4931640625E-4D * (double)var2) + 0.5D); @@ -862,7 +823,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)I", garbageValue = "-1821299983" ) - @Export("__aa_359") int __aa_359(MusicPatchNode var1) { int var2 = (var1.__d * var1.__x >> 12) + var1.__e; var2 += (this.__d[var1.__m] - 8192) * this.__b[var1.__m] >> 12; @@ -889,7 +849,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)I", garbageValue = "24812899" ) - @Export("__ax_360") int __ax_360(MusicPatchNode var1) { MusicPatchNode2 var2 = var1.__w; int var3 = this.__o[var1.__m] * this.__g[var1.__m] + 4096 >> 13; @@ -936,7 +895,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)I", garbageValue = "360643400" ) - @Export("__af_361") int __af_361(MusicPatchNode var1) { int var2 = this.__u[var1.__m]; return var2 < 8192?var2 * var1.__l + 32 >> 6:16384 - ((128 - var1.__l) * (16384 - var2) + 32 >> 6); @@ -947,7 +905,6 @@ public class MidiPcmStream extends PcmStream { signature = "(B)V", garbageValue = "30" ) - @Export("__ai_367") void __ai_367() { int var1 = this.track; int var2 = this.trackLength; @@ -994,7 +951,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)Z", garbageValue = "1820762013" ) - @Export("__ba_368") boolean __ba_368(MusicPatchNode var1) { if(var1.stream == null) { if(var1.__a >= 0) { @@ -1015,7 +971,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;[IIII)Z", garbageValue = "-1605961549" ) - @Export("__bb_369") boolean __bb_369(MusicPatchNode var1, int[] var2, int var3, int var4) { var1.__y = class309.PcmPlayer_sampleRate / 100; if(var1.__a < 0 || var1.stream != null && !var1.stream.__ae_195()) { diff --git a/rs-client/src/main/java/MilliClock.java b/runescape-client/src/main/java/MilliClock.java similarity index 94% rename from rs-client/src/main/java/MilliClock.java rename to runescape-client/src/main/java/MilliClock.java index 146e626362..14f7d02a67 100644 --- a/rs-client/src/main/java/MilliClock.java +++ b/runescape-client/src/main/java/MilliClock.java @@ -14,37 +14,31 @@ public class MilliClock extends Clock { @Export("decimator") static Decimator decimator; @ObfuscatedName("m") - @Export("__m") long[] __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1940981129 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 1217137493 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( longValue = -8372744267470318611L ) - @Export("__w") long __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 250272357 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 576555527 ) - @Export("__u") int __u; public MilliClock() { @@ -65,6 +59,7 @@ public class MilliClock extends Clock { signature = "(B)V", garbageValue = "61" ) + @Export("mark") public void mark() { for(int var1 = 0; var1 < 10; ++var1) { this.__m[var1] = 0L; @@ -77,6 +72,7 @@ public class MilliClock extends Clock { signature = "(III)I", garbageValue = "-126803683" ) + @Export("wait") public int wait(int var1, int var2) { int var3 = this.__f; int var4 = this.__q; @@ -166,8 +162,8 @@ public class MilliClock extends Clock { var12 = 2001; } } else if(var3[var10] == 3) { - var11 = var0[var6].__e_144()?1:0; - var12 = var8.__e_144()?1:0; + var11 = var0[var6].isMembersOnly()?1:0; + var12 = var8.isMembersOnly()?1:0; } else { var11 = var0[var6].id; var12 = var8.id; @@ -206,8 +202,8 @@ public class MilliClock extends Clock { var12 = 2001; } } else if(var3[var10] == 3) { - var11 = var0[var5].__e_144()?1:0; - var12 = var8.__e_144()?1:0; + var11 = var0[var5].isMembersOnly()?1:0; + var12 = var8.isMembersOnly()?1:0; } else { var11 = var0[var5].id; var12 = var8.id; diff --git a/rs-client/src/main/java/Model.java b/runescape-client/src/main/java/Model.java similarity index 98% rename from rs-client/src/main/java/Model.java rename to runescape-client/src/main/java/Model.java index 8ed74b9e96..bd90fa306f 100644 --- a/rs-client/src/main/java/Model.java +++ b/runescape-client/src/main/java/Model.java @@ -25,10 +25,8 @@ public class Model extends Entity { @Export("Model_sharedSpotAnimationModelFaceAlphas") static byte[] Model_sharedSpotAnimationModelFaceAlphas; @ObfuscatedName("at") - @Export("__du_at") static boolean[] __du_at; @ObfuscatedName("ad") - @Export("__du_ad") static boolean[] __du_ad; @ObfuscatedName("ap") @Export("modelViewportXs") @@ -37,46 +35,32 @@ public class Model extends Entity { @Export("modelViewportYs") static int[] modelViewportYs; @ObfuscatedName("am") - @Export("__du_am") static int[] __du_am; @ObfuscatedName("an") - @Export("__du_an") static int[] __du_an; @ObfuscatedName("az") - @Export("__du_az") static int[] __du_az; @ObfuscatedName("au") - @Export("__du_au") static int[] __du_au; @ObfuscatedName("aa") - @Export("__du_aa") static int[] __du_aa; @ObfuscatedName("ax") - @Export("__du_ax") static int[][] __du_ax; @ObfuscatedName("af") - @Export("__du_af") static int[] __du_af; @ObfuscatedName("ai") - @Export("__du_ai") static int[][] __du_ai; @ObfuscatedName("ba") - @Export("__du_ba") static int[] __du_ba; @ObfuscatedName("bb") - @Export("__du_bb") static int[] __du_bb; @ObfuscatedName("bs") - @Export("__du_bs") static int[] __du_bs; @ObfuscatedName("bq") - @Export("__du_bq") static int[] __du_bq; @ObfuscatedName("bn") - @Export("__du_bn") static int[] __du_bn; @ObfuscatedName("bk") - @Export("__du_bk") static int[] __du_bk; @ObfuscatedName("bd") @Export("Model_transformTempX") @@ -88,7 +72,6 @@ public class Model extends Entity { @Export("Model_transformTempZ") static int Model_transformTempZ; @ObfuscatedName("bx") - @Export("__du_bx") static boolean __du_bx; @ObfuscatedName("bm") @Export("Model_sine") @@ -97,10 +80,8 @@ public class Model extends Entity { @Export("Model_cosine") static int[] Model_cosine; @ObfuscatedName("br") - @Export("__du_br") static int[] __du_br; @ObfuscatedName("bj") - @Export("__du_bj") static int[] __du_bj; @ObfuscatedName("o") @Export("verticesCount") @@ -142,25 +123,19 @@ public class Model extends Entity { @Export("faceAlphas") byte[] faceAlphas; @ObfuscatedName("s") - @Export("__s") byte[] __s; @ObfuscatedName("t") @Export("faceTextures") short[] faceTextures; @ObfuscatedName("y") - @Export("__y") byte __y; @ObfuscatedName("h") - @Export("__h") int __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") - @Export("__c") int[] __c; @ObfuscatedName("r") - @Export("__r") int[] __r; @ObfuscatedName("p") @Export("vertexLabels") @@ -667,7 +642,6 @@ public class Model extends Entity { } @ObfuscatedName("g") - @Export("__g_232") void __g_232() { if(this.boundsType != 2) { this.boundsType = 2; @@ -690,7 +664,6 @@ public class Model extends Entity { } @ObfuscatedName("l") - @Export("__l_233") public int __l_233() { this.calculateBoundsCylinder(); return this.xzRadius; @@ -1008,7 +981,6 @@ public class Model extends Entity { } @ObfuscatedName("c") - @Export("__c_234") public final void __c_234(int var1, int var2, int var3, int var4, int var5, int var6, int var7) { __du_aa[0] = -1; if(this.boundsType != 2 && this.boundsType != 1) { @@ -1074,7 +1046,6 @@ public class Model extends Entity { } @ObfuscatedName("p") - @Export("__p_235") public final void __p_235(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { __du_aa[0] = -1; if(this.boundsType != 2 && this.boundsType != 1) { @@ -1364,7 +1335,6 @@ public class Model extends Entity { } @ObfuscatedName("ag") - @Export("__ag_236") final void __ag_236(int var1) { if(__du_ad[var1]) { this.__aq_237(var1); @@ -1409,7 +1379,6 @@ public class Model extends Entity { } @ObfuscatedName("aq") - @Export("__aq_237") final void __aq_237(int var1) { int var2 = Rasterizer3D.Rasterizer3D_clipMidX; int var3 = Rasterizer3D.Rasterizer3D_clipMidY; @@ -1577,6 +1546,7 @@ public class Model extends Entity { } @ObfuscatedName("cy") + @Export("renderDraw") void renderDraw(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, long var9) { __du_aa[0] = -1; if(this.boundsType != 1) { diff --git a/rs-client/src/main/java/ModelData.java b/runescape-client/src/main/java/ModelData.java similarity index 98% rename from rs-client/src/main/java/ModelData.java rename to runescape-client/src/main/java/ModelData.java index 22bf1387c8..a0ce7dd443 100644 --- a/rs-client/src/main/java/ModelData.java +++ b/runescape-client/src/main/java/ModelData.java @@ -7,13 +7,10 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("ModelData") public class ModelData extends Entity { @ObfuscatedName("aw") - @Export("__dw_aw") static int[] __dw_aw; @ObfuscatedName("al") - @Export("__dw_al") static int[] __dw_al; @ObfuscatedName("ab") - @Export("__dw_ab") static int __dw_ab; @ObfuscatedName("ae") @Export("ModelData_sine") @@ -46,10 +43,8 @@ public class ModelData extends Entity { @Export("indices3") int[] indices3; @ObfuscatedName("e") - @Export("__e") byte[] __e; @ObfuscatedName("x") - @Export("__x") byte[] __x; @ObfuscatedName("d") @Export("faceAlphas") @@ -64,10 +59,8 @@ public class ModelData extends Entity { @Export("faceTextures") short[] faceTextures; @ObfuscatedName("a") - @Export("__a") byte __a; @ObfuscatedName("z") - @Export("__z") int __z; @ObfuscatedName("j") @Export("textureRenderTypes") @@ -82,10 +75,8 @@ public class ModelData extends Entity { @Export("texTriangleZ") short[] texTriangleZ; @ObfuscatedName("h") - @Export("__h") int[] __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") @Export("vertexLabels") @@ -103,37 +94,28 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "[Ldq;" ) - @Export("__v") VertexNormal[] __v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "[Ldq;" ) - @Export("__ag") VertexNormal[] __ag; @ObfuscatedName("aq") - @Export("__aq") public short __aq; @ObfuscatedName("aj") - @Export("__aj") public short __aj; @ObfuscatedName("av") @Export("isBoundsCalculated") boolean isBoundsCalculated; @ObfuscatedName("ar") - @Export("__ar") int __ar; @ObfuscatedName("ac") - @Export("__ac") int __ac; @ObfuscatedName("ay") - @Export("__ay") int __ay; @ObfuscatedName("ah") - @Export("__ah") int __ah; @ObfuscatedName("ak") - @Export("__ak") int __ak; static { @@ -390,7 +372,6 @@ public class ModelData extends Entity { } @ObfuscatedName("f") - @Export("__f_215") void __f_215(byte[] var1) { Buffer var2 = new Buffer(var1); Buffer var3 = new Buffer(var1); @@ -697,7 +678,6 @@ public class ModelData extends Entity { } @ObfuscatedName("q") - @Export("__q_216") void __q_216(byte[] var1) { boolean var2 = false; boolean var3 = false; @@ -978,7 +958,6 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "(Ldw;I)I" ) - @Export("__w_217") final int __w_217(ModelData var1, int var2) { int var3 = -1; int var4 = var1.verticesX[var2]; @@ -1010,7 +989,6 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "()Ldw;" ) - @Export("__o_218") public ModelData __o_218() { ModelData var1 = new ModelData(); if(this.__e != null) { @@ -1055,7 +1033,6 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "([[IIIIZI)Ldw;" ) - @Export("__u_219") public ModelData __u_219(int[][] var1, int var2, int var3, int var4, boolean var5, int var6) { this.__c_229(); int var7 = var2 + this.__ac; @@ -1147,7 +1124,6 @@ public class ModelData extends Entity { } @ObfuscatedName("g") - @Export("__g_220") void __g_220() { int[] var1; int var2; @@ -1208,7 +1184,6 @@ public class ModelData extends Entity { } @ObfuscatedName("l") - @Export("__l_221") public void __l_221() { for(int var1 = 0; var1 < this.verticesCount; ++var1) { int var2 = this.verticesX[var1]; @@ -1220,7 +1195,6 @@ public class ModelData extends Entity { } @ObfuscatedName("x") - @Export("__x_222") public void __x_222() { for(int var1 = 0; var1 < this.verticesCount; ++var1) { this.verticesX[var1] = -this.verticesX[var1]; @@ -1231,7 +1205,6 @@ public class ModelData extends Entity { } @ObfuscatedName("d") - @Export("__d_223") public void __d_223() { for(int var1 = 0; var1 < this.verticesCount; ++var1) { int var2 = this.verticesZ[var1]; @@ -1243,7 +1216,6 @@ public class ModelData extends Entity { } @ObfuscatedName("a") - @Export("__a_224") public void __a_224(int var1) { int var2 = ModelData_sine[var1]; int var3 = ModelData_cosine[var1]; @@ -1258,7 +1230,6 @@ public class ModelData extends Entity { } @ObfuscatedName("z") - @Export("__z_225") public void __z_225(int var1, int var2, int var3) { for(int var4 = 0; var4 < this.verticesCount; ++var4) { this.verticesX[var4] += var1; @@ -1294,7 +1265,6 @@ public class ModelData extends Entity { } @ObfuscatedName("t") - @Export("__t_226") public void __t_226() { int var1; for(var1 = 0; var1 < this.verticesCount; ++var1) { @@ -1311,7 +1281,6 @@ public class ModelData extends Entity { } @ObfuscatedName("y") - @Export("__y_227") public void __y_227(int var1, int var2, int var3) { for(int var4 = 0; var4 < this.verticesCount; ++var4) { this.verticesX[var4] = this.verticesX[var4] * var1 / 128; @@ -1323,7 +1292,6 @@ public class ModelData extends Entity { } @ObfuscatedName("h") - @Export("__h_228") public void __h_228() { if(this.__v == null) { this.__v = new VertexNormal[this.verticesCount]; @@ -1408,7 +1376,6 @@ public class ModelData extends Entity { } @ObfuscatedName("c") - @Export("__c_229") void __c_229() { if(!this.isBoundsCalculated) { super.height = 0; diff --git a/rs-client/src/main/java/ModelData0.java b/runescape-client/src/main/java/ModelData0.java similarity index 100% rename from rs-client/src/main/java/ModelData0.java rename to runescape-client/src/main/java/ModelData0.java diff --git a/rs-client/src/main/java/MouseHandler.java b/runescape-client/src/main/java/MouseHandler.java similarity index 99% rename from rs-client/src/main/java/MouseHandler.java rename to runescape-client/src/main/java/MouseHandler.java index 549ad14fbe..e43304e3e5 100644 --- a/rs-client/src/main/java/MouseHandler.java +++ b/runescape-client/src/main/java/MouseHandler.java @@ -282,7 +282,7 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi Login.Login_response1 = ""; Login.Login_response2 = "Enter your username/email & password."; Login.Login_response3 = ""; - Login.__cu_aw = 2; + Login.loginIndex = 2; if(var0) { Login.Login_password = ""; } diff --git a/rs-client/src/main/java/MouseRecorder.java b/runescape-client/src/main/java/MouseRecorder.java similarity index 97% rename from rs-client/src/main/java/MouseRecorder.java rename to runescape-client/src/main/java/MouseRecorder.java index 9833fbf167..22f81c03b4 100644 --- a/rs-client/src/main/java/MouseRecorder.java +++ b/runescape-client/src/main/java/MouseRecorder.java @@ -17,7 +17,6 @@ public class MouseRecorder implements Runnable { @ObfuscatedGetter( intValue = 1075569245 ) - @Export("__bu_hy") static int __bu_hy; @ObfuscatedName("m") @Export("isRunning") @@ -105,7 +104,7 @@ public class MouseRecorder implements Runnable { if(var16 != null) { int var17 = (var15.sizeX * 4 - var16.subWidth) / 2; int var18 = (var15.sizeY * 4 - var16.subHeight) / 2; - var16.__q_496(var1 * 4 + var17 + 48, (104 - var2 - var15.sizeY) * 4 + var18 + 48); + var16.drawAt(var1 * 4 + var17 + 48, (104 - var2 - var15.sizeY) * 4 + var18 + 48); } } else { if(var9 == 0 || var9 == 2) { @@ -182,7 +181,7 @@ public class MouseRecorder implements Runnable { if(var28 != null) { var26 = (var20.sizeX * 4 - var28.subWidth) / 2; var14 = (var20.sizeY * 4 - var28.subHeight) / 2; - var28.__q_496(var26 + var1 * 4 + 48, (104 - var2 - var20.sizeY) * 4 + var14 + 48); + var28.drawAt(var26 + var1 * 4 + 48, (104 - var2 - var20.sizeY) * 4 + var14 + 48); } } else if(var9 == 9) { int var25 = 15658734; @@ -221,7 +220,7 @@ public class MouseRecorder implements Runnable { if(var22 != null) { var10 = (var21.sizeX * 4 - var22.subWidth) / 2; int var11 = (var21.sizeY * 4 - var22.subHeight) / 2; - var22.__q_496(var10 + var1 * 4 + 48, var11 + (104 - var2 - var21.sizeY) * 4 + 48); + var22.drawAt(var10 + var1 * 4 + 48, var11 + (104 - var2 - var21.sizeY) * 4 + 48); } } } @@ -265,7 +264,7 @@ public class MouseRecorder implements Runnable { garbageValue = "-335916694" ) static final void method1189(Widget var0, int var1, int var2, int var3) { - class13.method163(); + class13.playPcmPlayers(); SpriteMask var4 = var0.getSpriteMask(false); if(var4 != null) { Rasterizer2D.Rasterizer2D_setClip(var1, var2, var4.width + var1, var2 + var4.height); diff --git a/rs-client/src/main/java/MouseWheel.java b/runescape-client/src/main/java/MouseWheel.java similarity index 100% rename from rs-client/src/main/java/MouseWheel.java rename to runescape-client/src/main/java/MouseWheel.java diff --git a/rs-client/src/main/java/MouseWheelHandler.java b/runescape-client/src/main/java/MouseWheelHandler.java similarity index 98% rename from rs-client/src/main/java/MouseWheelHandler.java rename to runescape-client/src/main/java/MouseWheelHandler.java index 6cca354e21..62907185a1 100644 --- a/rs-client/src/main/java/MouseWheelHandler.java +++ b/runescape-client/src/main/java/MouseWheelHandler.java @@ -46,6 +46,7 @@ public final class MouseWheelHandler implements MouseWheel, MouseWheelListener { signature = "(I)I", garbageValue = "1293035280" ) + @Export("useRotation") public synchronized int useRotation() { int var1 = this.rotation; this.rotation = 0; diff --git a/rs-client/src/main/java/MusicPatch.java b/runescape-client/src/main/java/MusicPatch.java similarity index 98% rename from rs-client/src/main/java/MusicPatch.java rename to runescape-client/src/main/java/MusicPatch.java index d91cca4a74..a51914bfd3 100644 --- a/rs-client/src/main/java/MusicPatch.java +++ b/runescape-client/src/main/java/MusicPatch.java @@ -11,7 +11,6 @@ public class MusicPatch extends Node { @ObfuscatedGetter( intValue = 574200865 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedSignature( @@ -20,25 +19,19 @@ public class MusicPatch extends Node { @Export("rawSounds") RawSound[] rawSounds; @ObfuscatedName("q") - @Export("__q") short[] __q; @ObfuscatedName("w") - @Export("__w") byte[] __w; @ObfuscatedName("o") - @Export("__o") byte[] __o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "[Lhd;" ) - @Export("__u") MusicPatchNode2[] __u; @ObfuscatedName("g") - @Export("__g") byte[] __g; @ObfuscatedName("l") - @Export("__l") int[] __l; MusicPatch(byte[] var1) { @@ -497,7 +490,6 @@ public class MusicPatch extends Node { signature = "(Ldt;[B[II)Z", garbageValue = "1828768318" ) - @Export("__f_373") boolean __f_373(SoundCache var1, byte[] var2, int[] var3) { boolean var4 = true; int var5 = 0; diff --git a/rs-client/src/main/java/MusicPatchNode.java b/runescape-client/src/main/java/MusicPatchNode.java similarity index 88% rename from rs-client/src/main/java/MusicPatchNode.java rename to runescape-client/src/main/java/MusicPatchNode.java index c03f0a99ed..66f778d7ee 100644 --- a/rs-client/src/main/java/MusicPatchNode.java +++ b/runescape-client/src/main/java/MusicPatchNode.java @@ -17,7 +17,6 @@ public class MusicPatchNode extends Node { @ObfuscatedGetter( intValue = 801157533 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedSignature( @@ -35,91 +34,76 @@ public class MusicPatchNode extends Node { @ObfuscatedSignature( signature = "Lhd;" ) - @Export("__w") MusicPatchNode2 __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -2058553171 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 62958303 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -836502917 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -308599455 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -471899285 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1520706641 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = -852988281 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -439388365 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 476852577 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = -2136855685 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -2083252379 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = 1605236771 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 173672931 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 219840779 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedSignature( @@ -131,13 +115,11 @@ public class MusicPatchNode extends Node { @ObfuscatedGetter( intValue = -666877449 ) - @Export("__y") int __y; @ObfuscatedName("b") @ObfuscatedGetter( intValue = 1359854411 ) - @Export("__b") int __b; @ObfuscatedName("m") @@ -145,7 +127,6 @@ public class MusicPatchNode extends Node { signature = "(B)V", garbageValue = "39" ) - @Export("__m_370") void __m_370() { this.patch = null; this.rawSound = null; diff --git a/rs-client/src/main/java/MusicPatchNode2.java b/runescape-client/src/main/java/MusicPatchNode2.java similarity index 85% rename from rs-client/src/main/java/MusicPatchNode2.java rename to runescape-client/src/main/java/MusicPatchNode2.java index f98ddc01f9..71625b12cc 100644 --- a/rs-client/src/main/java/MusicPatchNode2.java +++ b/runescape-client/src/main/java/MusicPatchNode2.java @@ -10,54 +10,44 @@ public class MusicPatchNode2 { @ObfuscatedGetter( longValue = -6780258776884306463L ) - @Export("__hd_fc") static long __hd_fc; @ObfuscatedName("m") - @Export("__m") byte[] __m; @ObfuscatedName("f") - @Export("__f") byte[] __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 140046797 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -249046051 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -1455145595 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 1577527995 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 391670135 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 320761691 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 1984131473 ) - @Export("__e") int __e; } diff --git a/rs-client/src/main/java/MusicPatchPcmStream.java b/runescape-client/src/main/java/MusicPatchPcmStream.java similarity index 97% rename from rs-client/src/main/java/MusicPatchPcmStream.java rename to runescape-client/src/main/java/MusicPatchPcmStream.java index 25a7e0c8fa..664d11868d 100644 --- a/rs-client/src/main/java/MusicPatchPcmStream.java +++ b/runescape-client/src/main/java/MusicPatchPcmStream.java @@ -11,7 +11,6 @@ public class MusicPatchPcmStream extends PcmStream { @ObfuscatedGetter( intValue = -1367955455 ) - @Export("__hq_qg") static int __hq_qg; @ObfuscatedName("m") @ObfuscatedSignature( @@ -46,7 +45,6 @@ public class MusicPatchPcmStream extends PcmStream { signature = "(Lha;[IIIII)V", garbageValue = "1988628167" ) - @Export("__m_379") void __m_379(MusicPatchNode var1, int[] var2, int var3, int var4, int var5) { if((this.superStream.__y[var1.__m] & 4) != 0 && var1.__a < 0) { int var6 = this.superStream.__p[var1.__m] / class309.PcmPlayer_sampleRate; @@ -78,7 +76,7 @@ public class MusicPatchPcmStream extends PcmStream { } if(var1.patch.__q[var1.__u] < 0) { - var1.stream.__x_181(-1); + var1.stream.setNumLoops(-1); } var10.__v_192(var8); @@ -97,7 +95,6 @@ public class MusicPatchPcmStream extends PcmStream { signature = "(Lha;II)V", garbageValue = "1882591412" ) - @Export("__f_380") void __f_380(MusicPatchNode var1, int var2) { if((this.superStream.__y[var1.__m] & 4) != 0 && var1.__a < 0) { int var3 = this.superStream.__p[var1.__m] / class309.PcmPlayer_sampleRate; @@ -112,7 +109,7 @@ public class MusicPatchPcmStream extends PcmStream { } if(var1.patch.__q[var1.__u] < 0) { - var1.stream.__x_181(-1); + var1.stream.setNumLoops(-1); } var2 = var1.__b / var3; @@ -126,6 +123,7 @@ public class MusicPatchPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected PcmStream firstSubStream() { MusicPatchNode var1 = (MusicPatchNode)this.queue.last(); return (PcmStream)(var1 == null?null:(var1.stream != null?var1.stream:this.nextSubStream())); @@ -135,6 +133,7 @@ public class MusicPatchPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected PcmStream nextSubStream() { MusicPatchNode var1; do { diff --git a/rs-client/src/main/java/MusicSample.java b/runescape-client/src/main/java/MusicSample.java similarity index 97% rename from rs-client/src/main/java/MusicSample.java rename to runescape-client/src/main/java/MusicSample.java index d3f9c83d47..7c5cb71a6a 100644 --- a/rs-client/src/main/java/MusicSample.java +++ b/runescape-client/src/main/java/MusicSample.java @@ -7,19 +7,14 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("MusicSample") public class MusicSample extends Node { @ObfuscatedName("g") - @Export("__cd_g") static byte[] __cd_g; @ObfuscatedName("l") - @Export("__cd_l") static int __cd_l; @ObfuscatedName("e") - @Export("__cd_e") static int __cd_e; @ObfuscatedName("x") - @Export("__cd_x") static int __cd_x; @ObfuscatedName("d") - @Export("__cd_d") static int __cd_d; @ObfuscatedName("k") @ObfuscatedSignature( @@ -42,43 +37,30 @@ public class MusicSample extends Node { ) static class114[] field1326; @ObfuscatedName("z") - @Export("__cd_z") static boolean[] __cd_z; @ObfuscatedName("j") - @Export("__cd_j") static int[] __cd_j; @ObfuscatedName("s") - @Export("__cd_s") static boolean __cd_s; @ObfuscatedName("c") - @Export("__cd_c") static float[] __cd_c; @ObfuscatedName("r") - @Export("__cd_r") static float[] __cd_r; @ObfuscatedName("p") - @Export("__cd_p") static float[] __cd_p; @ObfuscatedName("v") - @Export("__cd_v") static float[] __cd_v; @ObfuscatedName("ag") - @Export("__cd_ag") static float[] __cd_ag; @ObfuscatedName("aq") - @Export("__cd_aq") static float[] __cd_aq; @ObfuscatedName("aj") - @Export("__cd_aj") static float[] __cd_aj; @ObfuscatedName("av") - @Export("__cd_av") static int[] __cd_av; @ObfuscatedName("ar") - @Export("__cd_ar") static int[] __cd_ar; @ObfuscatedName("m") - @Export("__m") byte[][] __m; @ObfuscatedName("f") @Export("sampleRate") @@ -93,28 +75,21 @@ public class MusicSample extends Node { @Export("end") int end; @ObfuscatedName("u") - @Export("__u") boolean __u; @ObfuscatedName("t") - @Export("__t") float[] __t; @ObfuscatedName("y") - @Export("__y") int __y; @ObfuscatedName("h") - @Export("__h") int __h; @ObfuscatedName("b") - @Export("__b") boolean __b; @ObfuscatedName("ac") @Export("samples") byte[] samples; @ObfuscatedName("ay") - @Export("__ay") int __ay; @ObfuscatedName("ah") - @Export("__ah") int __ah; static { @@ -158,7 +133,6 @@ public class MusicSample extends Node { } @ObfuscatedName("g") - @Export("__g_175") float[] __g_175(int var1) { method2337(this.__m[var1], 0); method2338(); diff --git a/rs-client/src/main/java/MusicTrack.java b/runescape-client/src/main/java/MusicTrack.java similarity index 99% rename from rs-client/src/main/java/MusicTrack.java rename to runescape-client/src/main/java/MusicTrack.java index 6f340aae23..bd207d4761 100644 --- a/rs-client/src/main/java/MusicTrack.java +++ b/runescape-client/src/main/java/MusicTrack.java @@ -336,7 +336,6 @@ public class MusicTrack extends Node { } @ObfuscatedName("f") - @Export("__f_381") void __f_381() { if(this.table == null) { this.table = new NodeHashTable(16); diff --git a/rs-client/src/main/java/NanoClock.java b/runescape-client/src/main/java/NanoClock.java similarity index 97% rename from rs-client/src/main/java/NanoClock.java rename to runescape-client/src/main/java/NanoClock.java index 5abf46daf5..22fb3b32eb 100644 --- a/rs-client/src/main/java/NanoClock.java +++ b/runescape-client/src/main/java/NanoClock.java @@ -23,6 +23,7 @@ public class NanoClock extends Clock { signature = "(B)V", garbageValue = "61" ) + @Export("mark") public void mark() { this.lastTimeNano = System.nanoTime(); } @@ -32,6 +33,7 @@ public class NanoClock extends Clock { signature = "(III)I", garbageValue = "-126803683" ) + @Export("wait") public int wait(int var1, int var2) { long var3 = 1000000L * (long)var2; long var5 = this.lastTimeNano - System.nanoTime(); diff --git a/rs-client/src/main/java/NetCache.java b/runescape-client/src/main/java/NetCache.java similarity index 98% rename from rs-client/src/main/java/NetCache.java rename to runescape-client/src/main/java/NetCache.java index 94aac85c0a..660896990b 100644 --- a/rs-client/src/main/java/NetCache.java +++ b/runescape-client/src/main/java/NetCache.java @@ -18,13 +18,11 @@ public class NetCache { @ObfuscatedGetter( intValue = 948359621 ) - @Export("__iq_f") public static int __iq_f; @ObfuscatedName("q") @ObfuscatedGetter( longValue = -4580427166942649525L ) - @Export("__iq_q") public static long __iq_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -90,7 +88,6 @@ public class NetCache { @ObfuscatedGetter( intValue = 840549915 ) - @Export("__iq_j") public static int __iq_j; @ObfuscatedName("t") @Export("NetCache_crc") @@ -102,7 +99,6 @@ public class NetCache { @Export("NetCache_indexCaches") public static IndexCache[] NetCache_indexCaches; @ObfuscatedName("b") - @Export("__iq_b") public static byte __iq_b; @ObfuscatedName("c") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/NetFileRequest.java b/runescape-client/src/main/java/NetFileRequest.java similarity index 98% rename from rs-client/src/main/java/NetFileRequest.java rename to runescape-client/src/main/java/NetFileRequest.java index afd1e99e19..7420f200e2 100644 --- a/rs-client/src/main/java/NetFileRequest.java +++ b/runescape-client/src/main/java/NetFileRequest.java @@ -106,7 +106,7 @@ public class NetFileRequest extends DualNode { if(var7 > 2500) { var4.__ac_512(var10 + var5.width / 2 - var4.width / 2, var5.height / 2 - var11 - var4.height / 2, var0, var1, var5.width, var5.height, var5.xStarts, var5.xWidths); } else { - var4.__a_505(var0 + var10 + var5.width / 2 - var4.width / 2, var5.height / 2 + var1 - var11 - var4.height / 2); + var4.drawAt2(var0 + var10 + var5.width / 2 - var4.width / 2, var5.height / 2 + var1 - var11 - var4.height / 2); } } diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java new file mode 100644 index 0000000000..f01da8362d --- /dev/null +++ b/runescape-client/src/main/java/NetSocket.java @@ -0,0 +1,547 @@ +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import net.runelite.mapping.Export; +import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("fb") +@Implements("NetSocket") +public final class NetSocket extends AbstractSocket implements Runnable { + @ObfuscatedName("bm") + @ObfuscatedSignature( + signature = "Llq;" + ) + @Export("worldSelectRightSprite") + static IndexedSprite worldSelectRightSprite; + @ObfuscatedName("m") + @Export("inputStream") + InputStream inputStream; + @ObfuscatedName("f") + @Export("outputStream") + OutputStream outputStream; + @ObfuscatedName("q") + @Export("socket") + Socket socket; + @ObfuscatedName("w") + @Export("isClosed") + boolean isClosed; + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "Lfz;" + ) + @Export("taskHandler") + TaskHandler taskHandler; + @ObfuscatedName("u") + @ObfuscatedSignature( + signature = "Lfm;" + ) + @Export("task") + Task task; + @ObfuscatedName("g") + @Export("array") + byte[] array; + @ObfuscatedName("l") + @ObfuscatedGetter( + intValue = -738185459 + ) + int __l; + @ObfuscatedName("e") + @ObfuscatedGetter( + intValue = 2057244853 + ) + int __e; + @ObfuscatedName("x") + @Export("exceptionWriting") + boolean exceptionWriting; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = -1644762957 + ) + final int __d; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = -782964015 + ) + final int __k; + + @ObfuscatedSignature( + signature = "(Ljava/net/Socket;Lfz;I)V" + ) + public NetSocket(Socket var1, TaskHandler var2, int var3) throws IOException { + this.isClosed = false; + this.__l = 0; + this.__e = 0; + this.exceptionWriting = false; + this.taskHandler = var2; + this.socket = var1; + this.__d = var3; + this.__k = var3 - 100; + this.socket.setSoTimeout(30000); + this.socket.setTcpNoDelay(true); + this.socket.setReceiveBufferSize(65536); + this.socket.setSendBufferSize(65536); + this.inputStream = this.socket.getInputStream(); + this.outputStream = this.socket.getOutputStream(); + } + + @ObfuscatedName("f") + @ObfuscatedSignature( + signature = "(II)Z", + garbageValue = "1765046516" + ) + @Export("isAvailable") + public boolean isAvailable(int var1) throws IOException { + return this.isClosed?false:this.inputStream.available() >= var1; + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(I)I", + garbageValue = "-1078471130" + ) + @Export("available") + public int available() throws IOException { + return this.isClosed?0:this.inputStream.available(); + } + + @ObfuscatedName("w") + @ObfuscatedSignature( + signature = "(I)I", + garbageValue = "516705222" + ) + @Export("readUnsignedByte") + public int readUnsignedByte() throws IOException { + return this.isClosed?0:this.inputStream.read(); + } + + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "([BIII)I", + garbageValue = "-1089665746" + ) + @Export("read") + public int read(byte[] var1, int var2, int var3) throws IOException { + if(this.isClosed) { + return 0; + } else { + int var4; + int var5; + for(var4 = var3; var3 > 0; var3 -= var5) { + var5 = this.inputStream.read(var1, var2, var3); + if(var5 <= 0) { + throw new EOFException(); + } + + var2 += var5; + } + + return var4; + } + } + + @ObfuscatedName("u") + @ObfuscatedSignature( + signature = "([BIIB)V", + garbageValue = "-86" + ) + @Export("write") + public void write(byte[] var1, int var2, int var3) throws IOException { + this.write0(var1, var2, var3); + } + + @ObfuscatedName("g") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-1252618448" + ) + @Export("close") + public void close() { + if(!this.isClosed) { + synchronized(this) { + this.isClosed = true; + this.notifyAll(); + } + + if(this.task != null) { + while(this.task.status == 0) { + class203.method4010(1L); + } + + if(this.task.status == 1) { + try { + ((Thread)this.task.result).join(); + } catch (InterruptedException var3) { + ; + } + } + } + + this.task = null; + } + } + + @ObfuscatedName("ay") + @ObfuscatedSignature( + signature = "([BIIB)V", + garbageValue = "-77" + ) + @Export("write0") + void write0(byte[] var1, int var2, int var3) throws IOException { + if(!this.isClosed) { + if(this.exceptionWriting) { + this.exceptionWriting = false; + throw new IOException(); + } else { + if(this.array == null) { + this.array = new byte[this.__d]; + } + + synchronized(this) { + for(int var5 = 0; var5 < var3; ++var5) { + this.array[this.__e] = var1[var5 + var2]; + this.__e = (this.__e + 1) % this.__d; + if((this.__k + this.__l) % this.__d == this.__e) { + throw new IOException(); + } + } + + if(this.task == null) { + this.task = this.taskHandler.newThreadTask(this, 3); + } + + this.notifyAll(); + } + } + } + } + + @Export("run") + @ObfuscatedName("run") + public void run() { + try { + while(true) { + label84: { + int var1; + int var2; + synchronized(this) { + if(this.__e == this.__l) { + if(this.isClosed) { + break label84; + } + + try { + this.wait(); + } catch (InterruptedException var10) { + ; + } + } + + var2 = this.__l; + if(this.__e >= this.__l) { + var1 = this.__e - this.__l; + } else { + var1 = this.__d - this.__l; + } + } + + if(var1 <= 0) { + continue; + } + + try { + this.outputStream.write(this.array, var2, var1); + } catch (IOException var9) { + this.exceptionWriting = true; + } + + this.__l = (var1 + this.__l) % this.__d; + + try { + if(this.__e == this.__l) { + this.outputStream.flush(); + } + } catch (IOException var8) { + this.exceptionWriting = true; + } + continue; + } + + try { + if(this.inputStream != null) { + this.inputStream.close(); + } + + if(this.outputStream != null) { + this.outputStream.close(); + } + + if(this.socket != null) { + this.socket.close(); + } + } catch (IOException var7) { + ; + } + + this.array = null; + break; + } + } catch (Exception var12) { + NpcDefinition.sendStackTrace((String)null, var12); + } + + } + + @Export("finalize") + @ObfuscatedName("finalize") + protected void finalize() { + this.close(); + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(IIILfe;Lfy;Z[I[IB)I", + garbageValue = "-98" + ) + @Export("calculateRoute") + public static int calculateRoute(int srcX, int srcY, int srcSize, RouteStrategy strategy, CollisionMap collisionMap, boolean var5, int[] bufferX, int[] bufferY) { + int graphBaseX; + for(int var8 = 0; var8 < 128; ++var8) { + for(graphBaseX = 0; graphBaseX < 128; ++graphBaseX) { + class178.directions[var8][graphBaseX] = 0; + class178.distances[var8][graphBaseX] = 99999999; + } + } + + int graphBaseY; + int endX; + byte var13; + int lowestDistance; + int var15; + int approxDestY; + int approxDestSizeY; + int checkX; + int checkY; + boolean found; + int endY; + int lowestCost; + int approxDestX; + if(srcSize == 1) { + graphBaseY = srcX; + endX = srcY; + byte var12 = 64; + var13 = 64; + lowestDistance = srcX - var12; + var15 = srcY - var13; + class178.directions[var12][var13] = 99; + class178.distances[var12][var13] = 0; + byte var16 = 0; + approxDestY = 0; + class178.bufferX[var16] = srcX; + approxDestX = var16 + 1; + class178.bufferY[var16] = srcY; + int[][] var18 = collisionMap.flags; + + boolean var29; + while(true) { + if(approxDestX == approxDestY) { + WidgetGroupParent.__bx_o = graphBaseY; + UrlRequester.__eo_u = endX; + var29 = false; + break; + } + + graphBaseY = class178.bufferX[approxDestY]; + endX = class178.bufferY[approxDestY]; + approxDestY = approxDestY + 1 & 4095; + endY = graphBaseY - lowestDistance; + lowestCost = endX - var15; + approxDestSizeY = graphBaseY - collisionMap.xInset; + checkX = endX - collisionMap.yInset; + if(strategy.vmethod3644(1, graphBaseY, endX, collisionMap)) { + WidgetGroupParent.__bx_o = graphBaseY; + UrlRequester.__eo_u = endX; + var29 = true; + break; + } + + checkY = class178.distances[endY][lowestCost] + 1; + if(endY > 0 && class178.directions[endY - 1][lowestCost] == 0 && (var18[approxDestSizeY - 1][checkX] & 19136776) == 0) { + class178.bufferX[approxDestX] = graphBaseY - 1; + class178.bufferY[approxDestX] = endX; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY - 1][lowestCost] = 2; + class178.distances[endY - 1][lowestCost] = checkY; + } + + if(endY < 127 && class178.directions[endY + 1][lowestCost] == 0 && (var18[approxDestSizeY + 1][checkX] & 19136896) == 0) { + class178.bufferX[approxDestX] = graphBaseY + 1; + class178.bufferY[approxDestX] = endX; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY + 1][lowestCost] = 8; + class178.distances[endY + 1][lowestCost] = checkY; + } + + if(lowestCost > 0 && class178.directions[endY][lowestCost - 1] == 0 && (var18[approxDestSizeY][checkX - 1] & 19136770) == 0) { + class178.bufferX[approxDestX] = graphBaseY; + class178.bufferY[approxDestX] = endX - 1; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY][lowestCost - 1] = 1; + class178.distances[endY][lowestCost - 1] = checkY; + } + + if(lowestCost < 127 && class178.directions[endY][lowestCost + 1] == 0 && (var18[approxDestSizeY][checkX + 1] & 19136800) == 0) { + class178.bufferX[approxDestX] = graphBaseY; + class178.bufferY[approxDestX] = endX + 1; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY][lowestCost + 1] = 4; + class178.distances[endY][lowestCost + 1] = checkY; + } + + if(endY > 0 && lowestCost > 0 && class178.directions[endY - 1][lowestCost - 1] == 0 && (var18[approxDestSizeY - 1][checkX - 1] & 19136782) == 0 && (var18[approxDestSizeY - 1][checkX] & 19136776) == 0 && (var18[approxDestSizeY][checkX - 1] & 19136770) == 0) { + class178.bufferX[approxDestX] = graphBaseY - 1; + class178.bufferY[approxDestX] = endX - 1; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY - 1][lowestCost - 1] = 3; + class178.distances[endY - 1][lowestCost - 1] = checkY; + } + + if(endY < 127 && lowestCost > 0 && class178.directions[endY + 1][lowestCost - 1] == 0 && (var18[approxDestSizeY + 1][checkX - 1] & 19136899) == 0 && (var18[approxDestSizeY + 1][checkX] & 19136896) == 0 && (var18[approxDestSizeY][checkX - 1] & 19136770) == 0) { + class178.bufferX[approxDestX] = graphBaseY + 1; + class178.bufferY[approxDestX] = endX - 1; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY + 1][lowestCost - 1] = 9; + class178.distances[endY + 1][lowestCost - 1] = checkY; + } + + if(endY > 0 && lowestCost < 127 && class178.directions[endY - 1][lowestCost + 1] == 0 && (var18[approxDestSizeY - 1][checkX + 1] & 19136824) == 0 && (var18[approxDestSizeY - 1][checkX] & 19136776) == 0 && (var18[approxDestSizeY][checkX + 1] & 19136800) == 0) { + class178.bufferX[approxDestX] = graphBaseY - 1; + class178.bufferY[approxDestX] = endX + 1; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY - 1][lowestCost + 1] = 6; + class178.distances[endY - 1][lowestCost + 1] = checkY; + } + + if(endY < 127 && lowestCost < 127 && class178.directions[endY + 1][lowestCost + 1] == 0 && (var18[approxDestSizeY + 1][checkX + 1] & 19136992) == 0 && (var18[approxDestSizeY + 1][checkX] & 19136896) == 0 && (var18[approxDestSizeY][checkX + 1] & 19136800) == 0) { + class178.bufferX[approxDestX] = graphBaseY + 1; + class178.bufferY[approxDestX] = endX + 1; + approxDestX = approxDestX + 1 & 4095; + class178.directions[endY + 1][lowestCost + 1] = 12; + class178.distances[endY + 1][lowestCost + 1] = checkY; + } + } + + found = var29; // Vars are weird above here cause that's an inlined method + } else if(srcSize == 2) { + found = WorldMapSection2.method593(srcX, srcY, strategy, collisionMap); + } else { + found = IndexStore.method3585(srcX, srcY, srcSize, strategy, collisionMap); + } + + graphBaseX = srcX - 64; + graphBaseY = srcY - 64; + endX = WidgetGroupParent.__bx_o; + endY = UrlRequester.__eo_u; + if(!found) { + lowestCost = Integer.MAX_VALUE; + lowestDistance = Integer.MAX_VALUE; + byte alternativeRouteRange = 10; + approxDestX = strategy.approxDestinationX; + approxDestY = strategy.approxDestinationY; + int approxDestSizeX = strategy.approxDestinationSizeX; + approxDestSizeY = strategy.approxDestinationSizeY; + + for(checkX = approxDestX - alternativeRouteRange; checkX <= alternativeRouteRange + approxDestX; ++checkX) { + for(checkY = approxDestY - alternativeRouteRange; checkY <= approxDestY + alternativeRouteRange; ++checkY) { + int graphX = checkX - graphBaseX; + int graphY = checkY - graphBaseY; + if(graphX >= 0 && graphY >= 0 && graphX < 128 && graphY < 128 && class178.distances[graphX][graphY] < 100) { + int deltaX = 0; + if(checkX < approxDestX) { + deltaX = approxDestX - checkX; + } else if(checkX > approxDestSizeX + approxDestX - 1) { + deltaX = checkX - (approxDestSizeX + approxDestX - 1); + } + + int deltaY = 0; + if(checkY < approxDestY) { + deltaY = approxDestY - checkY; + } else if(checkY > approxDestSizeY + approxDestY - 1) { + deltaY = checkY - (approxDestSizeY + approxDestY - 1); + } + + int cost = deltaY * deltaY + deltaX * deltaX; + if(cost < lowestCost || cost == lowestCost && class178.distances[graphX][graphY] < lowestDistance) { + lowestCost = cost; + lowestDistance = class178.distances[graphX][graphY]; + endX = checkX; + endY = checkY; + } + } + } + } + + if(lowestCost == Integer.MAX_VALUE) { + return -1; + } + } + + if(srcX == endX && endY == srcY) { + return 0; + } else { // Inlined again after this I think + var13 = 0; + class178.bufferX[var13] = endX; + lowestCost = var13 + 1; + class178.bufferY[var13] = endY; + + for(lowestDistance = var15 = class178.directions[endX - graphBaseX][endY - graphBaseY]; srcX != endX || endY != srcY; lowestDistance = class178.directions[endX - graphBaseX][endY - graphBaseY]) { + if(lowestDistance != var15) { + var15 = lowestDistance; + class178.bufferX[lowestCost] = endX; + class178.bufferY[lowestCost++] = endY; + } + + if((lowestDistance & 2) != 0) { + ++endX; + } else if((lowestDistance & 8) != 0) { + --endX; + } + + if((lowestDistance & 1) != 0) { + ++endY; + } else if((lowestDistance & 4) != 0) { + --endY; + } + } + + approxDestX = 0; + + while(lowestCost-- > 0) { + bufferX[approxDestX] = class178.bufferX[lowestCost]; + bufferY[approxDestX++] = class178.bufferY[lowestCost]; + if(approxDestX >= bufferX.length) { + break; + } + } + + return approxDestX; + } + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(Lir;Lir;Lir;Lhm;I)Z", + garbageValue = "-590103687" + ) + public static boolean method3537(AbstractIndexCache var0, AbstractIndexCache var1, AbstractIndexCache var2, MidiPcmStream var3) { + class1.__f_m = var0; + class214.__hf_f = var1; + class214.__hf_q = var2; + class214.midiPcmStream = var3; + return true; + } +} diff --git a/rs-client/src/main/java/Node.java b/runescape-client/src/main/java/Node.java similarity index 100% rename from rs-client/src/main/java/Node.java rename to runescape-client/src/main/java/Node.java diff --git a/rs-client/src/main/java/NodeDeque.java b/runescape-client/src/main/java/NodeDeque.java similarity index 100% rename from rs-client/src/main/java/NodeDeque.java rename to runescape-client/src/main/java/NodeDeque.java diff --git a/rs-client/src/main/java/NodeHashTable.java b/runescape-client/src/main/java/NodeHashTable.java similarity index 100% rename from rs-client/src/main/java/NodeHashTable.java rename to runescape-client/src/main/java/NodeHashTable.java diff --git a/rs-client/src/main/java/Npc.java b/runescape-client/src/main/java/Npc.java similarity index 99% rename from rs-client/src/main/java/Npc.java rename to runescape-client/src/main/java/Npc.java index 8d0db12d02..eb11180d3b 100644 --- a/rs-client/src/main/java/Npc.java +++ b/runescape-client/src/main/java/Npc.java @@ -18,7 +18,6 @@ public final class Npc extends Actor { signature = "(IBI)V", garbageValue = "306250019" ) - @Export("__m_162") final void __m_162(int var1, byte var2) { int var3 = super.pathX[0]; int var4 = super.pathY[0]; @@ -82,7 +81,6 @@ public final class Npc extends Actor { signature = "(IIZI)V", garbageValue = "-1647134110" ) - @Export("__f_163") final void __f_163(int var1, int var2, boolean var3) { if(super.sequence != -1 && WorldMapAreaData.getSequenceDefinition(super.sequence).__s == 1) { super.sequence = -1; @@ -159,6 +157,7 @@ public final class Npc extends Actor { signature = "(B)Z", garbageValue = "1" ) + @Export("isVisible") final boolean isVisible() { return this.definition != null; } diff --git a/rs-client/src/main/java/NpcDefinition.java b/runescape-client/src/main/java/NpcDefinition.java similarity index 99% rename from rs-client/src/main/java/NpcDefinition.java rename to runescape-client/src/main/java/NpcDefinition.java index c46fbb587d..8161c2cc1e 100644 --- a/rs-client/src/main/java/NpcDefinition.java +++ b/runescape-client/src/main/java/NpcDefinition.java @@ -55,7 +55,6 @@ public class NpcDefinition extends DualNode { @Export("archives") int[] archives; @ObfuscatedName("e") - @Export("__e") int[] __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -142,13 +141,11 @@ public class NpcDefinition extends DualNode { @ObfuscatedGetter( intValue = -1235927151 ) - @Export("__ag") int __ag; @ObfuscatedName("aq") @ObfuscatedGetter( intValue = 1962875903 ) - @Export("__aq") int __aq; @ObfuscatedName("aj") @ObfuscatedGetter( @@ -160,7 +157,6 @@ public class NpcDefinition extends DualNode { @ObfuscatedGetter( intValue = -506638747 ) - @Export("__av") public int __av; @ObfuscatedName("ar") @Export("transforms") @@ -534,7 +530,6 @@ public class NpcDefinition extends DualNode { signature = "(I)Z", garbageValue = "853540088" ) - @Export("__e_435") public boolean __e_435() { if(this.transforms == null) { return true; @@ -699,13 +694,13 @@ public class NpcDefinition extends DualNode { if(var1 == 0L) { var0 = 5; } else { - var0 = class72.method1778(var1, Login.Login_username); + var0 = LoginScreenAnimation.method1778(var1, Login.Login_username); } switch(var0) { case 2: class54.method1089(Strings.__id_jr, Strings.__id_jv, Strings.__id_ju); - Login.__cu_aw = 6; + Login.loginIndex = 6; break; case 3: class54.method1089("", "Error connecting to server.", ""); diff --git a/rs-client/src/main/java/ObjectDefinition.java b/runescape-client/src/main/java/ObjectDefinition.java similarity index 99% rename from rs-client/src/main/java/ObjectDefinition.java rename to runescape-client/src/main/java/ObjectDefinition.java index c4ec49ab44..0599790b68 100644 --- a/rs-client/src/main/java/ObjectDefinition.java +++ b/runescape-client/src/main/java/ObjectDefinition.java @@ -20,7 +20,6 @@ public class ObjectDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jr_q") static AbstractIndexCache __jr_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -32,13 +31,11 @@ public class ObjectDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jr_o") public static EvictingDualNodeHashTable __jr_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jr_u") static EvictingDualNodeHashTable __jr_u; @ObfuscatedName("g") @ObfuscatedSignature( @@ -50,7 +47,6 @@ public class ObjectDefinition extends DualNode { @ObfuscatedSignature( signature = "[Ldw;" ) - @Export("__jr_l") static ModelData[] __jr_l; @ObfuscatedName("e") @ObfuscatedGetter( @@ -59,10 +55,8 @@ public class ObjectDefinition extends DualNode { @Export("id") public int id; @ObfuscatedName("x") - @Export("__x") int[] __x; @ObfuscatedName("d") - @Export("__d") int[] __d; @ObfuscatedName("k") @Export("name") @@ -251,7 +245,6 @@ public class ObjectDefinition extends DualNode { @Export("int6") public int int6; @ObfuscatedName("ax") - @Export("__ax") public int[] __ax; @ObfuscatedName("af") @ObfuscatedSignature( @@ -527,7 +520,6 @@ public class ObjectDefinition extends DualNode { signature = "(II)Z", garbageValue = "1880172029" ) - @Export("__u_421") public final boolean __u_421(int var1) { if(this.__d != null) { for(int var4 = 0; var4 < this.__d.length; ++var4) { @@ -557,7 +549,6 @@ public class ObjectDefinition extends DualNode { signature = "(I)Z", garbageValue = "-666846742" ) - @Export("__g_422") public final boolean __g_422() { if(this.__x == null) { return true; @@ -577,7 +568,6 @@ public class ObjectDefinition extends DualNode { signature = "(II[[IIIIS)Lex;", garbageValue = "-27831" ) - @Export("__l_423") public final Entity __l_423(int var1, int var2, int[][] var3, int var4, int var5, int var6) { long var7; if(this.__d == null) { @@ -897,7 +887,6 @@ public class ObjectDefinition extends DualNode { signature = "(I)Z", garbageValue = "8470625" ) - @Export("__t_424") public boolean __t_424() { if(this.transforms == null) { return this.ambientSoundId != -1 || this.__ax != null; diff --git a/rs-client/src/main/java/ObjectNode.java b/runescape-client/src/main/java/ObjectNode.java similarity index 100% rename from rs-client/src/main/java/ObjectNode.java rename to runescape-client/src/main/java/ObjectNode.java diff --git a/rs-client/src/main/java/ObjectSound.java b/runescape-client/src/main/java/ObjectSound.java similarity index 94% rename from rs-client/src/main/java/ObjectSound.java rename to runescape-client/src/main/java/ObjectSound.java index ba344aa439..773f32dc91 100644 --- a/rs-client/src/main/java/ObjectSound.java +++ b/runescape-client/src/main/java/ObjectSound.java @@ -23,37 +23,31 @@ public final class ObjectSound extends Node { @ObfuscatedGetter( intValue = 647270745 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -800464493 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -85911525 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -211591209 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 512258949 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 1344558633 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( @@ -71,13 +65,11 @@ public final class ObjectSound extends Node { @ObfuscatedGetter( intValue = -1608400407 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 1748890449 ) - @Export("__d") int __d; @ObfuscatedName("k") @Export("soundEffectIds") @@ -86,7 +78,6 @@ public final class ObjectSound extends Node { @ObfuscatedGetter( intValue = -1041508847 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedSignature( diff --git a/rs-client/src/main/java/Occluder.java b/runescape-client/src/main/java/Occluder.java similarity index 97% rename from rs-client/src/main/java/Occluder.java rename to runescape-client/src/main/java/Occluder.java index 84e8db0e18..ba1f42329d 100644 --- a/rs-client/src/main/java/Occluder.java +++ b/runescape-client/src/main/java/Occluder.java @@ -77,43 +77,36 @@ public final class Occluder { @ObfuscatedGetter( intValue = 826041747 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = -407777817 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = 1324959981 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -1527021367 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -570391007 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = -373839103 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = -1334433969 ) - @Export("__s") int __s; @ObfuscatedName("f") diff --git a/rs-client/src/main/java/OverlayDefinition.java b/runescape-client/src/main/java/OverlayDefinition.java similarity index 99% rename from rs-client/src/main/java/OverlayDefinition.java rename to runescape-client/src/main/java/OverlayDefinition.java index 001869f336..89a966d8dc 100644 --- a/rs-client/src/main/java/OverlayDefinition.java +++ b/runescape-client/src/main/java/OverlayDefinition.java @@ -11,13 +11,11 @@ public class OverlayDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jf_m") public static AbstractIndexCache __jf_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jf_f") public static EvictingDualNodeHashTable __jf_f; @ObfuscatedName("q") @ObfuscatedGetter( @@ -32,7 +30,6 @@ public class OverlayDefinition extends DualNode { @Export("texture") public int texture; @ObfuscatedName("o") - @Export("__o") public boolean __o; @ObfuscatedName("u") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/OwnWorldComparator.java b/runescape-client/src/main/java/OwnWorldComparator.java similarity index 71% rename from rs-client/src/main/java/OwnWorldComparator.java rename to runescape-client/src/main/java/OwnWorldComparator.java index 4be097ab28..0c81a18929 100644 --- a/rs-client/src/main/java/OwnWorldComparator.java +++ b/runescape-client/src/main/java/OwnWorldComparator.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("OwnWorldComparator") public class OwnWorldComparator implements Comparator { @ObfuscatedName("m") - @Export("__m") boolean __m; @ObfuscatedName("m") @@ -16,7 +15,6 @@ public class OwnWorldComparator implements Comparator { signature = "(Ll;Ll;B)I", garbageValue = "21" ) - @Export("__m_132") int __m_132(GrandExchangeEvent var1, GrandExchangeEvent var2) { if(var2.world == var1.world) { return 0; @@ -35,7 +33,6 @@ public class OwnWorldComparator implements Comparator { } } - @Export("__equals_134") @ObfuscatedName("equals") public boolean __equals_134(Object var1) { return super.equals(var1); @@ -55,9 +52,9 @@ public class OwnWorldComparator implements Comparator { static int method1285(int var0, Script var1, boolean var2) { int var3; if(var0 == 5504) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - int var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + int var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; if(!Client.isCameraLocked) { Client.cameraPitchTarget = var3; Client.minimapOrientation = var4; @@ -65,21 +62,21 @@ public class OwnWorldComparator implements Comparator { return 1; } else if(var0 == 5505) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.cameraPitchTarget; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.cameraPitchTarget; return 1; } else if(var0 == 5506) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.minimapOrientation; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.minimapOrientation; return 1; } else if(var0 == 5530) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var3 < 0) { var3 = 0; } - Client.__client_ho = var3; + Client.cameraFollowHeight = var3; return 1; } else if(var0 == 5531) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.__client_ho; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.cameraFollowHeight; return 1; } else { return 2; diff --git a/rs-client/src/main/java/PacketBuffer.java b/runescape-client/src/main/java/PacketBuffer.java similarity index 99% rename from rs-client/src/main/java/PacketBuffer.java rename to runescape-client/src/main/java/PacketBuffer.java index 8198487a11..308a9d2a77 100644 --- a/rs-client/src/main/java/PacketBuffer.java +++ b/runescape-client/src/main/java/PacketBuffer.java @@ -14,7 +14,6 @@ public final class PacketBuffer extends Buffer { @ObfuscatedGetter( intValue = 701739159 ) - @Export("__hx_z") public static int __hx_z; @ObfuscatedName("e") @ObfuscatedSignature( @@ -82,7 +81,6 @@ public final class PacketBuffer extends Buffer { signature = "(B)Z", garbageValue = "101" ) - @Export("__ig_334") public boolean __ig_334() { int var1 = super.array[super.index] - this.isaacCipher0.__f_337() & 255; return var1 >= 128; @@ -104,7 +102,6 @@ public final class PacketBuffer extends Buffer { signature = "([BIII)V", garbageValue = "-1168019189" ) - @Export("__jb_335") public void __jb_335(byte[] var1, int var2, int var3) { for(int var4 = 0; var4 < var3; ++var4) { var1[var4 + var2] = (byte)(super.array[++super.index - 1] - this.isaacCipher0.__m_336()); diff --git a/rs-client/src/main/java/PacketBufferNode.java b/runescape-client/src/main/java/PacketBufferNode.java similarity index 94% rename from rs-client/src/main/java/PacketBufferNode.java rename to runescape-client/src/main/java/PacketBufferNode.java index 15514416c1..4db93c1b8c 100644 --- a/rs-client/src/main/java/PacketBufferNode.java +++ b/runescape-client/src/main/java/PacketBufferNode.java @@ -17,19 +17,16 @@ public class PacketBufferNode extends Node { @ObfuscatedGetter( intValue = -1583654139 ) - @Export("__gg_u") public static int __gg_u; @ObfuscatedName("m") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__m") public ClientPacket __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1433542775 ) - @Export("__f") public int __f; @ObfuscatedName("q") @ObfuscatedSignature( @@ -41,7 +38,6 @@ public class PacketBufferNode extends Node { @ObfuscatedGetter( intValue = -2051819203 ) - @Export("__w") public int __w; static { @@ -54,7 +50,6 @@ public class PacketBufferNode extends Node { signature = "(I)V", garbageValue = "-1987685511" ) - @Export("__f_292") public void __f_292() { if(__gg_u < packetBufferNodes.length) { packetBufferNodes[++__gg_u - 1] = this; diff --git a/rs-client/src/main/java/PacketWriter.java b/runescape-client/src/main/java/PacketWriter.java similarity index 95% rename from rs-client/src/main/java/PacketWriter.java rename to runescape-client/src/main/java/PacketWriter.java index 2f2d8a1ffd..d01f2bce26 100644 --- a/rs-client/src/main/java/PacketWriter.java +++ b/runescape-client/src/main/java/PacketWriter.java @@ -30,7 +30,6 @@ public class PacketWriter { @ObfuscatedGetter( intValue = -1028046199 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -63,37 +62,31 @@ public class PacketWriter { @Export("serverPacket0Length") int serverPacket0Length; @ObfuscatedName("e") - @Export("__e") boolean __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = 120570975 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 1672229609 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__k") ServerPacket __k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lge;" ) - @Export("surfaceOffsetY") ServerPacket __n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__i") ServerPacket __i; PacketWriter() { @@ -113,7 +106,6 @@ public class PacketWriter { signature = "(I)V", garbageValue = "1561094077" ) - @Export("__m_165") final void __m_165() { this.packetBufferNodes.clear(); this.__q = 0; @@ -124,7 +116,6 @@ public class PacketWriter { signature = "(I)V", garbageValue = "-1839929685" ) - @Export("__f_166") final void __f_166() throws IOException { if(this.socket0 != null && this.__q > 0) { this.buffer.index = 0; @@ -152,7 +143,6 @@ public class PacketWriter { signature = "(Lgg;I)V", garbageValue = "599379248" ) - @Export("__q_167") public final void __q_167(PacketBufferNode var1) { this.packetBufferNodes.addFirst(var1); var1.__w = var1.packetBuffer.index; diff --git a/rs-client/src/main/java/ParamKeyDefinition.java b/runescape-client/src/main/java/ParamKeyDefinition.java similarity index 99% rename from rs-client/src/main/java/ParamKeyDefinition.java rename to runescape-client/src/main/java/ParamKeyDefinition.java index eb4b7f01a1..c5b54db627 100644 --- a/rs-client/src/main/java/ParamKeyDefinition.java +++ b/runescape-client/src/main/java/ParamKeyDefinition.java @@ -11,7 +11,6 @@ public class ParamKeyDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jb_m") public static AbstractIndexCache __jb_m; @ObfuscatedName("f") @ObfuscatedSignature( diff --git a/rs-client/src/main/java/PcmPlayer.java b/runescape-client/src/main/java/PcmPlayer.java similarity index 98% rename from rs-client/src/main/java/PcmPlayer.java rename to runescape-client/src/main/java/PcmPlayer.java index 14f603392f..296ae184e5 100644 --- a/rs-client/src/main/java/PcmPlayer.java +++ b/runescape-client/src/main/java/PcmPlayer.java @@ -23,7 +23,6 @@ public class PcmPlayer { @ObfuscatedGetter( intValue = 1125788887 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( @@ -47,7 +46,6 @@ public class PcmPlayer { @ObfuscatedGetter( intValue = 1907203055 ) - @Export("__y") int __y; @ObfuscatedName("h") @ObfuscatedGetter( @@ -59,13 +57,11 @@ public class PcmPlayer { @ObfuscatedGetter( intValue = 48658021 ) - @Export("__b") int __b; @ObfuscatedName("c") @ObfuscatedGetter( intValue = 1624619697 ) - @Export("__c") int __c; @ObfuscatedName("r") @ObfuscatedGetter( @@ -77,28 +73,23 @@ public class PcmPlayer { @ObfuscatedGetter( longValue = -8188447292076890879L ) - @Export("__p") long __p; @ObfuscatedName("v") - @Export("__v") boolean __v; @ObfuscatedName("ac") @ObfuscatedGetter( intValue = -645495803 ) - @Export("__ac") int __ac; @ObfuscatedName("ay") @ObfuscatedSignature( signature = "[Ldc;" ) - @Export("__ay") PcmStream[] __ay; @ObfuscatedName("ah") @ObfuscatedSignature( signature = "[Ldc;" ) - @Export("__ah") PcmStream[] __ah; protected PcmPlayer() { @@ -120,6 +111,7 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "949670609" ) + @Export("init") protected void init() throws Exception { } @@ -128,6 +120,7 @@ public class PcmPlayer { signature = "(II)V", garbageValue = "-1738349775" ) + @Export("open") protected void open(int var1) throws Exception { } @@ -136,11 +129,13 @@ public class PcmPlayer { signature = "(B)I", garbageValue = "0" ) + @Export("position") protected int position() throws Exception { return this.capacity; } @ObfuscatedName("w") + @Export("write") protected void write() throws Exception { } @@ -149,6 +144,7 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "244995961" ) + @Export("close") protected void close() { } @@ -157,6 +153,7 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "-191421600" ) + @Export("discard") protected void discard() throws Exception { } @@ -268,7 +265,6 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "-922069005" ) - @Export("__ac_176") public final void __ac_176() { this.__v = true; } @@ -459,7 +455,6 @@ public class PcmPlayer { signature = "(Ldc;II)V", garbageValue = "-1884182540" ) - @Export("__ab_177") final void __ab_177(PcmStream var1, int var2) { int var3 = var2 >> 5; PcmStream var4 = this.__ah[var3]; diff --git a/rs-client/src/main/java/PcmPlayerProvider.java b/runescape-client/src/main/java/PcmPlayerProvider.java similarity index 100% rename from rs-client/src/main/java/PcmPlayerProvider.java rename to runescape-client/src/main/java/PcmPlayerProvider.java diff --git a/rs-client/src/main/java/PcmStream.java b/runescape-client/src/main/java/PcmStream.java similarity index 96% rename from rs-client/src/main/java/PcmStream.java rename to runescape-client/src/main/java/PcmStream.java index 5f8a04d8d4..0518a56eee 100644 --- a/rs-client/src/main/java/PcmStream.java +++ b/runescape-client/src/main/java/PcmStream.java @@ -16,7 +16,6 @@ public abstract class PcmStream extends Node { @Export("after") PcmStream after; @ObfuscatedName("s") - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedSignature( @@ -33,12 +32,14 @@ public abstract class PcmStream extends Node { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected abstract PcmStream firstSubStream(); @ObfuscatedName("g") @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected abstract PcmStream nextSubStream(); @ObfuscatedName("l") diff --git a/rs-client/src/main/java/PcmStreamMixer.java b/runescape-client/src/main/java/PcmStreamMixer.java similarity index 96% rename from rs-client/src/main/java/PcmStreamMixer.java rename to runescape-client/src/main/java/PcmStreamMixer.java index 0eeb230c0d..205d7ca61f 100644 --- a/rs-client/src/main/java/PcmStreamMixer.java +++ b/runescape-client/src/main/java/PcmStreamMixer.java @@ -16,13 +16,10 @@ public class PcmStreamMixer extends PcmStream { @ObfuscatedSignature( signature = "Lje;" ) - @Export("__f") NodeDeque __f; @ObfuscatedName("q") - @Export("__q") int __q; @ObfuscatedName("o") - @Export("__o") int __o; public PcmStreamMixer() { @@ -51,7 +48,6 @@ public class PcmStreamMixer extends PcmStream { } @ObfuscatedName("q") - @Export("__q_168") void __q_168() { if(this.__q > 0) { for(PcmStreamMixerListener var1 = (PcmStreamMixerListener)this.__f.last(); var1 != null; var1 = (PcmStreamMixerListener)this.__f.previous()) { @@ -68,7 +64,6 @@ public class PcmStreamMixer extends PcmStream { @ObfuscatedSignature( signature = "(Lgw;Ldf;)V" ) - @Export("__w_169") void __w_169(Node var1, PcmStreamMixerListener var2) { while(this.__f.sentinel != var1 && ((PcmStreamMixerListener)var1).__m <= var2.__m) { var1 = var1.previous; @@ -82,7 +77,6 @@ public class PcmStreamMixer extends PcmStream { @ObfuscatedSignature( signature = "(Ldf;)V" ) - @Export("__o_170") void __o_170(PcmStreamMixerListener var1) { var1.remove(); var1.remove2(); @@ -114,13 +108,11 @@ public class PcmStreamMixer extends PcmStream { } @ObfuscatedName("l") - @Export("__l_171") protected int __l_171() { return 0; } @ObfuscatedName("e") - @Export("__e_172") public final synchronized void __e_172(int[] var1, int var2, int var3) { do { if(this.__o < 0) { @@ -165,7 +157,6 @@ public class PcmStreamMixer extends PcmStream { } @ObfuscatedName("d") - @Export("__d_173") public final synchronized void __d_173(int var1) { do { if(this.__o < 0) { diff --git a/rs-client/src/main/java/PcmStreamMixerListener.java b/runescape-client/src/main/java/PcmStreamMixerListener.java similarity index 96% rename from rs-client/src/main/java/PcmStreamMixerListener.java rename to runescape-client/src/main/java/PcmStreamMixerListener.java index a87a239cc6..4e696ca7c1 100644 --- a/rs-client/src/main/java/PcmStreamMixerListener.java +++ b/runescape-client/src/main/java/PcmStreamMixerListener.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("PcmStreamMixerListener") public abstract class PcmStreamMixerListener extends Node { @ObfuscatedName("m") - @Export("__m") int __m; @ObfuscatedName("m") diff --git a/rs-client/src/main/java/PlatformInfo.java b/runescape-client/src/main/java/PlatformInfo.java similarity index 91% rename from rs-client/src/main/java/PlatformInfo.java rename to runescape-client/src/main/java/PlatformInfo.java index a94c76d1e9..6a8fa2e1dd 100644 --- a/rs-client/src/main/java/PlatformInfo.java +++ b/runescape-client/src/main/java/PlatformInfo.java @@ -11,121 +11,96 @@ public class PlatformInfo extends Node { @ObfuscatedGetter( intValue = 1318366785 ) - @Export("__ay") int __ay; @ObfuscatedName("ah") - @Export("__ah") boolean __ah; @ObfuscatedName("ak") @ObfuscatedGetter( intValue = 703904161 ) - @Export("__ak") int __ak; @ObfuscatedName("aw") @ObfuscatedGetter( intValue = 467004305 ) - @Export("__aw") int __aw; @ObfuscatedName("al") @ObfuscatedGetter( intValue = 2097018521 ) - @Export("__al") int __al; @ObfuscatedName("ab") @ObfuscatedGetter( intValue = -1667177301 ) - @Export("__ab") int __ab; @ObfuscatedName("ae") @ObfuscatedGetter( intValue = 385109109 ) - @Export("__ae") int __ae; @ObfuscatedName("at") - @Export("__at") boolean __at; @ObfuscatedName("ad") @ObfuscatedGetter( intValue = -1765017 ) - @Export("__ad") int __ad; @ObfuscatedName("ap") @ObfuscatedGetter( intValue = -817941105 ) - @Export("__ap") int __ap; @ObfuscatedName("am") @ObfuscatedGetter( intValue = 30207059 ) - @Export("__am") int __am; @ObfuscatedName("an") @ObfuscatedGetter( intValue = 890109053 ) - @Export("__an") int __an; @ObfuscatedName("az") - @Export("__az") String __az; @ObfuscatedName("au") - @Export("__au") String __au; @ObfuscatedName("ao") - @Export("__ao") String __ao; @ObfuscatedName("aa") - @Export("__aa") String __aa; @ObfuscatedName("ax") @ObfuscatedGetter( intValue = 871094255 ) - @Export("__ax") int __ax; @ObfuscatedName("af") @ObfuscatedGetter( intValue = 1955966365 ) - @Export("__af") int __af; @ObfuscatedName("ai") @ObfuscatedGetter( intValue = 1196598207 ) - @Export("__ai") int __ai; @ObfuscatedName("ba") @ObfuscatedGetter( intValue = -170839105 ) - @Export("__ba") int __ba; @ObfuscatedName("bb") - @Export("__bb") String __bb; @ObfuscatedName("bs") - @Export("__bs") String __bs; @ObfuscatedName("bq") - @Export("__bq") int[] __bq; @ObfuscatedName("bn") @ObfuscatedGetter( intValue = 1466207635 ) - @Export("__bn") int __bn; @ObfuscatedName("bk") - @Export("__bk") String __bk; PlatformInfo(int var1, boolean var2, int var3, int var4, int var5, int var6, int var7, boolean var8, int var9, int var10, int var11, int var12, String var13, String var14, String var15, String var16, int var17, int var18, int var19, int var20, String var21, String var22, int[] var23, int var24, String var25) { diff --git a/rs-client/src/main/java/PlatformInfoProvider.java b/runescape-client/src/main/java/PlatformInfoProvider.java similarity index 100% rename from rs-client/src/main/java/PlatformInfoProvider.java rename to runescape-client/src/main/java/PlatformInfoProvider.java diff --git a/rs-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java similarity index 96% rename from rs-client/src/main/java/Player.java rename to runescape-client/src/main/java/Player.java index bbd168853c..54cb0e8f4d 100644 --- a/rs-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -74,7 +74,6 @@ public final class Player extends Actor { @ObfuscatedGetter( intValue = 665272587 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( @@ -86,7 +85,6 @@ public final class Player extends Actor { @ObfuscatedGetter( intValue = -1771431457 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedSignature( @@ -98,25 +96,21 @@ public final class Player extends Actor { @ObfuscatedGetter( intValue = 1610462047 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 224552403 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 305969541 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = 892671055 ) - @Export("__t") int __t; @ObfuscatedName("y") @Export("isUnanimated") @@ -155,7 +149,6 @@ public final class Player extends Actor { @Export("isInClanChat") TriBool isInClanChat; @ObfuscatedName("ag") - @Export("__ag") boolean __ag; @ObfuscatedName("aq") @ObfuscatedGetter( @@ -277,8 +270,8 @@ public final class Player extends Actor { } this.username = new Username(var1.readStringCp1252NullTerminated(), KeyHandler.loginType); - this.__q_125(); - this.__u_128(); + this.clearIsFriend(); + this.clearIsInClanChat(); if(this == Canvas.localPlayer) { RunException.localPlayerName = this.username.getName(); } @@ -305,7 +298,7 @@ public final class Player extends Actor { @Export("isFriend") boolean isFriend() { if(this.isFriendTriBool == TriBool.TriBool_unknown) { - this.__w_126(); + this.checkIsFriend(); } return this.isFriendTriBool == TriBool.TriBool_true; @@ -316,8 +309,8 @@ public final class Player extends Actor { signature = "(I)V", garbageValue = "-2059706128" ) - @Export("__q_125") - void __q_125() { + @Export("clearIsFriend") + void clearIsFriend() { this.isFriendTriBool = TriBool.TriBool_unknown; } @@ -326,9 +319,9 @@ public final class Player extends Actor { signature = "(I)V", garbageValue = "2126310249" ) - @Export("__w_126") - void __w_126() { - this.isFriendTriBool = WorldMapArea.friendSystem.__t_161(this.username)?TriBool.TriBool_true:TriBool.TriBool_false; + @Export("checkIsFriend") + void checkIsFriend() { + this.isFriendTriBool = WorldMapArea.friendSystem.isFriendAndHasWorld(this.username)?TriBool.TriBool_true:TriBool.TriBool_false; } @ObfuscatedName("o") @@ -339,7 +332,7 @@ public final class Player extends Actor { @Export("isClanMember") boolean isClanMember() { if(this.isInClanChat == TriBool.TriBool_unknown) { - this.__g_129(); + this.updateIsInClanChat(); } return this.isInClanChat == TriBool.TriBool_true; @@ -350,8 +343,8 @@ public final class Player extends Actor { signature = "(I)V", garbageValue = "1982407728" ) - @Export("__u_128") - void __u_128() { + @Export("clearIsInClanChat") + void clearIsInClanChat() { this.isInClanChat = TriBool.TriBool_unknown; } @@ -360,8 +353,8 @@ public final class Player extends Actor { signature = "(I)V", garbageValue = "833825629" ) - @Export("__g_129") - void __g_129() { + @Export("updateIsInClanChat") + void updateIsInClanChat() { this.isInClanChat = PacketWriter.clanChat != null && PacketWriter.clanChat.contains(this.username)?TriBool.TriBool_true:TriBool.TriBool_false; } @@ -451,7 +444,6 @@ public final class Player extends Actor { signature = "(IIBI)V", garbageValue = "-2066158770" ) - @Export("__x_130") final void __x_130(int var1, int var2, byte var3) { if(super.sequence != -1 && WorldMapAreaData.getSequenceDefinition(super.sequence).__s == 1) { super.sequence = -1; @@ -496,7 +488,6 @@ public final class Player extends Actor { signature = "(IIBI)V", garbageValue = "-1280043751" ) - @Export("__a_131") final void __a_131(int var1, int var2, byte var3) { if(super.pathLength < 9) { ++super.pathLength; diff --git a/rs-client/src/main/java/PlayerAppearance.java b/runescape-client/src/main/java/PlayerAppearance.java similarity index 98% rename from rs-client/src/main/java/PlayerAppearance.java rename to runescape-client/src/main/java/PlayerAppearance.java index 378fa71777..4a360ac4ce 100644 --- a/rs-client/src/main/java/PlayerAppearance.java +++ b/runescape-client/src/main/java/PlayerAppearance.java @@ -8,10 +8,8 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("PlayerAppearance") public class PlayerAppearance { @ObfuscatedName("g") - @Export("__hi_g") public static short[] __hi_g; @ObfuscatedName("d") - @Export("__hi_d") static final int[] __hi_d; @ObfuscatedName("k") @ObfuscatedSignature( @@ -38,13 +36,11 @@ public class PlayerAppearance { @ObfuscatedGetter( longValue = -3506189412688081513L ) - @Export("__o") long __o; @ObfuscatedName("u") @ObfuscatedGetter( longValue = 8217880921734028425L ) - @Export("__u") long __u; static { @@ -57,7 +53,6 @@ public class PlayerAppearance { signature = "([I[IZII)V", garbageValue = "727056871" ) - @Export("__m_385") public void __m_385(int[] var1, int[] var2, boolean var3, int var4) { if(var1 == null) { var1 = new int[12]; @@ -85,7 +80,6 @@ public class PlayerAppearance { signature = "(IZI)V", garbageValue = "-581016899" ) - @Export("__f_386") public void __f_386(int var1, boolean var2) { if(var1 != 1 || !this.isFemale) { int var3 = this.equipment[__hi_d[var1]]; @@ -120,7 +114,6 @@ public class PlayerAppearance { signature = "(IZI)V", garbageValue = "1416503110" ) - @Export("__q_387") public void __q_387(int var1, boolean var2) { int var3 = this.bodyColors[var1]; if(!var2) { @@ -148,7 +141,6 @@ public class PlayerAppearance { signature = "(ZB)V", garbageValue = "-90" ) - @Export("__w_388") public void __w_388(boolean var1) { if(this.isFemale != var1) { this.__m_385((int[])null, this.bodyColors, var1, -1); @@ -160,7 +152,6 @@ public class PlayerAppearance { signature = "(Lgr;I)V", garbageValue = "779254645" ) - @Export("__o_389") public void __o_389(Buffer var1) { var1.writeByte(this.isFemale?1:0); diff --git a/rs-client/src/main/java/PlayerType.java b/runescape-client/src/main/java/PlayerType.java similarity index 96% rename from rs-client/src/main/java/PlayerType.java rename to runescape-client/src/main/java/PlayerType.java index 93f6790cab..8d3c185b3e 100644 --- a/rs-client/src/main/java/PlayerType.java +++ b/runescape-client/src/main/java/PlayerType.java @@ -45,7 +45,6 @@ public enum PlayerType implements Enumerated { @Export("PlayerType_hardcoreIronman") PlayerType_hardcoreIronman(5, 10, false, false, true); @ObfuscatedName("ak") - @Export("__ij_ak") static Image __ij_ak; @ObfuscatedName("g") @ObfuscatedGetter( @@ -78,6 +77,7 @@ public enum PlayerType implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } @@ -87,7 +87,8 @@ public enum PlayerType implements Enumerated { signature = "(II)V", garbageValue = "300731074" ) - static void method4547(int var0) { + @Export("clearItemContainer") + static void clearItemContainer(int var0) { ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); if(var1 != null) { for(int var2 = 0; var2 < var1.ids.length; ++var2) { diff --git a/rs-client/src/main/java/Players.java b/runescape-client/src/main/java/Players.java similarity index 97% rename from rs-client/src/main/java/Players.java rename to runescape-client/src/main/java/Players.java index 0b8eca1f88..5a6fc3c3c4 100644 --- a/rs-client/src/main/java/Players.java +++ b/runescape-client/src/main/java/Players.java @@ -10,16 +10,13 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Players") public class Players { @ObfuscatedName("q") - @Export("__cq_q") static byte[] __cq_q; @ObfuscatedName("w") - @Export("__cq_w") static byte[] __cq_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "[Lgr;" ) - @Export("__cq_o") static Buffer[] __cq_o; @ObfuscatedName("u") @ObfuscatedGetter( @@ -34,10 +31,8 @@ public class Players { @ObfuscatedGetter( intValue = 945250525 ) - @Export("__cq_l") static int __cq_l; @ObfuscatedName("e") - @Export("__cq_e") static int[] __cq_e; @ObfuscatedName("x") @Export("Players_regions") @@ -52,16 +47,13 @@ public class Players { @ObfuscatedGetter( intValue = -22568397 ) - @Export("__cq_n") static int __cq_n; @ObfuscatedName("i") - @Export("__cq_i") static int[] __cq_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lgr;" ) - @Export("__cq_a") static Buffer __cq_a; @ObfuscatedName("y") @ObfuscatedSignature( diff --git a/rs-client/src/main/java/Projectile.java b/runescape-client/src/main/java/Projectile.java similarity index 99% rename from rs-client/src/main/java/Projectile.java rename to runescape-client/src/main/java/Projectile.java index 8d6e496e77..e3e2945ea1 100644 --- a/rs-client/src/main/java/Projectile.java +++ b/runescape-client/src/main/java/Projectile.java @@ -231,6 +231,7 @@ public final class Projectile extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { SpotAnimationDefinition var1 = class50.getSpotAnimationDefinition(this.id); Model var2 = var1.getModel(this.frame); diff --git a/rs-client/src/main/java/RasterProvider.java b/runescape-client/src/main/java/RasterProvider.java similarity index 98% rename from rs-client/src/main/java/RasterProvider.java rename to runescape-client/src/main/java/RasterProvider.java index 4961433783..1de95514a1 100644 --- a/rs-client/src/main/java/RasterProvider.java +++ b/runescape-client/src/main/java/RasterProvider.java @@ -51,6 +51,7 @@ public final class RasterProvider extends AbstractRasterProvider { signature = "(III)V", garbageValue = "-430495007" ) + @Export("drawFull") public final void drawFull(int var1, int var2) { this.drawFull0(this.component0.getGraphics(), var1, var2); } @@ -60,6 +61,7 @@ public final class RasterProvider extends AbstractRasterProvider { signature = "(IIIIB)V", garbageValue = "18" ) + @Export("draw") public final void draw(int var1, int var2, int var3, int var4) { this.draw0(this.component0.getGraphics(), var1, var2, var3, var4); } diff --git a/rs-client/src/main/java/Rasterizer2D.java b/runescape-client/src/main/java/Rasterizer2D.java similarity index 99% rename from rs-client/src/main/java/Rasterizer2D.java rename to runescape-client/src/main/java/Rasterizer2D.java index ca4f71584b..477a8d02cc 100644 --- a/rs-client/src/main/java/Rasterizer2D.java +++ b/runescape-client/src/main/java/Rasterizer2D.java @@ -348,8 +348,8 @@ public class Rasterizer2D extends DualNode { } @ObfuscatedName("dl") - @Export("Rasterizer2D_moreAlpha") - public static void Rasterizer2D_moreAlpha(int var0, int var1, int var2, int var3, int var4, int var5) { + @Export("Rasterizer2D_fillRectangleAlpha") + public static void Rasterizer2D_fillRectangleAlpha(int var0, int var1, int var2, int var3, int var4, int var5) { if(var0 < Rasterizer2D_xClipStart) { var2 -= Rasterizer2D_xClipStart - var0; var0 = Rasterizer2D_xClipStart; diff --git a/rs-client/src/main/java/Rasterizer3D.java b/runescape-client/src/main/java/Rasterizer3D.java similarity index 99% rename from rs-client/src/main/java/Rasterizer3D.java rename to runescape-client/src/main/java/Rasterizer3D.java index bde438c83e..b242467b4e 100644 --- a/rs-client/src/main/java/Rasterizer3D.java +++ b/runescape-client/src/main/java/Rasterizer3D.java @@ -7,16 +7,13 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Rasterizer3D") public class Rasterizer3D extends Rasterizer2D { @ObfuscatedName("m") - @Export("__et_m") static boolean __et_m; @ObfuscatedName("f") - @Export("__et_f") static boolean __et_f; @ObfuscatedName("q") @Export("Rasterizer3D_isLowDetailTexture") static boolean Rasterizer3D_isLowDetailTexture; @ObfuscatedName("w") - @Export("__et_w") public static boolean __et_w; @ObfuscatedName("o") @Export("Rasterizer3D_alpha") @@ -61,10 +58,8 @@ public class Rasterizer3D extends Rasterizer2D { @Export("Rasterizer3D_textureLoader") public static TextureLoader Rasterizer3D_textureLoader; @ObfuscatedName("r") - @Export("__et_r") static int[] __et_r; @ObfuscatedName("p") - @Export("__et_p") static int[] __et_p; @ObfuscatedName("v") @Export("Rasterizer3D_sine") @@ -3428,22 +3423,26 @@ public class Rasterizer3D extends Rasterizer2D { } @ObfuscatedName("p") - static final int method3005(int var0, int var1, int var2, int var3) { + @Export("rot3") + static final int rot3(int var0, int var1, int var2, int var3) { return var0 * var2 - var3 * var1 >> 16; } @ObfuscatedName("v") - static final int method3006(int var0, int var1, int var2, int var3) { + @Export("rot4") + static final int rot4(int var0, int var1, int var2, int var3) { return var3 * var0 + var2 * var1 >> 16; } @ObfuscatedName("ag") - static final int method3007(int var0, int var1, int var2, int var3) { + @Export("rot1") + static final int rot1(int var0, int var1, int var2, int var3) { return var0 * var2 + var3 * var1 >> 16; } @ObfuscatedName("aq") - static final int method3008(int var0, int var1, int var2, int var3) { + @Export("rot2") + static final int rot2(int var0, int var1, int var2, int var3) { return var2 * var1 - var3 * var0 >> 16; } } diff --git a/rs-client/src/main/java/RawPcmStream.java b/runescape-client/src/main/java/RawPcmStream.java similarity index 95% rename from rs-client/src/main/java/RawPcmStream.java rename to runescape-client/src/main/java/RawPcmStream.java index 5f2fda9c74..2bc138ada2 100644 --- a/rs-client/src/main/java/RawPcmStream.java +++ b/runescape-client/src/main/java/RawPcmStream.java @@ -7,29 +7,22 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("RawPcmStream") public class RawPcmStream extends PcmStream { @ObfuscatedName("m") - @Export("__m") int __m; @ObfuscatedName("f") - @Export("__f") int __f; @ObfuscatedName("q") - @Export("__q") int __q; @ObfuscatedName("o") - @Export("__o") int __o; @ObfuscatedName("u") - @Export("__u") int __u; @ObfuscatedName("g") - @Export("__g") int __g; @ObfuscatedName("l") - @Export("__l") int __l; @ObfuscatedName("e") - @Export("__e") - int __e; + @Export("numLoops") + int numLoops; @ObfuscatedName("x") @Export("start") int start; @@ -37,19 +30,14 @@ public class RawPcmStream extends PcmStream { @Export("end") int end; @ObfuscatedName("k") - @Export("__k") boolean __k; @ObfuscatedName("n") - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") - @Export("__i") int __i; @ObfuscatedName("a") - @Export("__a") int __a; @ObfuscatedName("z") - @Export("__z") int __z; @ObfuscatedSignature( @@ -83,7 +71,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("o") - @Export("__o_180") void __o_180() { this.__u = this.__q; this.__g = method2603(this.__q, this.__o); @@ -94,6 +81,7 @@ public class RawPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected PcmStream firstSubStream() { return null; } @@ -102,6 +90,7 @@ public class RawPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected PcmStream nextSubStream() { return null; } @@ -122,7 +111,7 @@ public class RawPcmStream extends PcmStream { int var7 = var4.samples.length << 8; int var8 = var6 - var5; if(var8 <= 0) { - this.__e = 0; + this.numLoops = 0; } int var9 = var2; @@ -147,7 +136,7 @@ public class RawPcmStream extends PcmStream { this.__m = var7 - 1; } - if(this.__e < 0) { + if(this.numLoops < 0) { if(this.__k) { if(this.__f < 0) { var9 = this.__ap_203(var1, var2, var5, var3, var4.samples[this.start]); @@ -195,7 +184,7 @@ public class RawPcmStream extends PcmStream { } } } else { - if(this.__e > 0) { + if(this.numLoops > 0) { if(this.__k) { label140: { if(this.__f < 0) { @@ -206,7 +195,7 @@ public class RawPcmStream extends PcmStream { this.__m = var5 + var5 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break label140; } } @@ -219,7 +208,7 @@ public class RawPcmStream extends PcmStream { this.__m = var6 + var6 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break; } @@ -230,7 +219,7 @@ public class RawPcmStream extends PcmStream { this.__m = var5 + var5 - 1 - this.__m; this.__f = -this.__f; - } while(--this.__e != 0); + } while(--this.numLoops != 0); } } else { int var10; @@ -242,14 +231,14 @@ public class RawPcmStream extends PcmStream { } var10 = (var6 - 1 - this.__m) / var8; - if(var10 >= this.__e) { - this.__m += var8 * this.__e; - this.__e = 0; + if(var10 >= this.numLoops) { + this.__m += var8 * this.numLoops; + this.numLoops = 0; break; } this.__m += var8 * var10; - this.__e -= var10; + this.numLoops -= var10; } } else { while(true) { @@ -259,14 +248,14 @@ public class RawPcmStream extends PcmStream { } var10 = (this.__m - var5) / var8; - if(var10 >= this.__e) { - this.__m -= var8 * this.__e; - this.__e = 0; + if(var10 >= this.numLoops) { + this.__m -= var8 * this.numLoops; + this.numLoops = 0; break; } this.__m -= var8 * var10; - this.__e -= var10; + this.numLoops -= var10; } } } @@ -293,9 +282,9 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("x") - @Export("__x_181") - public synchronized void __x_181(int var1) { - this.__e = var1; + @Export("setNumLoops") + public synchronized void setNumLoops(int var1) { + this.numLoops = var1; } @ObfuscatedName("d") @@ -327,7 +316,7 @@ public class RawPcmStream extends PcmStream { int var5 = var2.samples.length << 8; int var6 = var4 - var3; if(var6 <= 0) { - this.__e = 0; + this.numLoops = 0; } if(this.__m < 0) { @@ -351,7 +340,7 @@ public class RawPcmStream extends PcmStream { } this.__m += this.__f * var1; - if(this.__e < 0) { + if(this.numLoops < 0) { if(!this.__k) { if(this.__f < 0) { if(this.__m >= var3) { @@ -390,7 +379,7 @@ public class RawPcmStream extends PcmStream { } } else { - if(this.__e > 0) { + if(this.numLoops > 0) { if(this.__k) { label123: { if(this.__f < 0) { @@ -400,7 +389,7 @@ public class RawPcmStream extends PcmStream { this.__m = var3 + var3 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break label123; } } @@ -412,7 +401,7 @@ public class RawPcmStream extends PcmStream { this.__m = var4 + var4 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break; } @@ -422,7 +411,7 @@ public class RawPcmStream extends PcmStream { this.__m = var3 + var3 - 1 - this.__m; this.__f = -this.__f; - } while(--this.__e != 0); + } while(--this.numLoops != 0); } } else { int var7; @@ -432,28 +421,28 @@ public class RawPcmStream extends PcmStream { } var7 = (var4 - 1 - this.__m) / var6; - if(var7 < this.__e) { + if(var7 < this.numLoops) { this.__m += var6 * var7; - this.__e -= var7; + this.numLoops -= var7; return; } - this.__m += var6 * this.__e; - this.__e = 0; + this.__m += var6 * this.numLoops; + this.numLoops = 0; } else { if(this.__m < var4) { return; } var7 = (this.__m - var3) / var6; - if(var7 < this.__e) { + if(var7 < this.numLoops) { this.__m -= var6 * var7; - this.__e -= var7; + this.numLoops -= var7; return; } - this.__m -= var6 * this.__e; - this.__e = 0; + this.__m -= var6 * this.numLoops; + this.numLoops = 0; } } } @@ -474,19 +463,16 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("a") - @Export("__a_182") public synchronized void __a_182(int var1) { this.__j_184(var1 << 6, this.__t_186()); } @ObfuscatedName("z") - @Export("__z_183") synchronized void __z_183(int var1) { this.__j_184(var1, this.__t_186()); } @ObfuscatedName("j") - @Export("__j_184") synchronized void __j_184(int var1, int var2) { this.__q = var1; this.__o = var2; @@ -495,19 +481,16 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("s") - @Export("__s_185") public synchronized int __s_185() { return this.__q == Integer.MIN_VALUE?0:this.__q; } @ObfuscatedName("t") - @Export("__t_186") public synchronized int __t_186() { return this.__o < 0?-1:this.__o; } @ObfuscatedName("y") - @Export("__y_187") public synchronized void __y_187(int var1) { int var2 = ((RawSound)super.sound).samples.length << 8; if(var1 < -1) { @@ -526,14 +509,12 @@ public class RawPcmStream extends PcmStream { signature = "(Z)V", garbageValue = "1" ) - @Export("__h_188") public synchronized void __h_188() { this.__f = (this.__f ^ this.__f >> 31) + (this.__f >>> 31); this.__f = -this.__f; } @ObfuscatedName("b") - @Export("__b_189") void __b_189() { if(this.__n != 0) { if(this.__q == Integer.MIN_VALUE) { @@ -547,13 +528,11 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("c") - @Export("__c_190") public synchronized void __c_190(int var1, int var2) { this.__p_191(var1, var2, this.__t_186()); } @ObfuscatedName("p") - @Export("__p_191") public synchronized void __p_191(int var1, int var2, int var3) { if(var1 == 0) { this.__j_184(var2, var3); @@ -599,7 +578,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("v") - @Export("__v_192") public synchronized void __v_192(int var1) { if(var1 == 0) { this.__z_183(0); @@ -644,7 +622,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("ah") - @Export("__ah_193") public synchronized void __ah_193(int var1) { if(this.__f < 0) { this.__f = -var1; @@ -655,25 +632,21 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("ab") - @Export("__ab_194") public synchronized int __ab_194() { return this.__f < 0?-this.__f:this.__f; } @ObfuscatedName("ae") - @Export("__ae_195") public boolean __ae_195() { return this.__m < 0 || this.__m >= ((RawSound)super.sound).samples.length << 8; } @ObfuscatedName("at") - @Export("__at_196") public boolean __at_196() { return this.__n != 0; } @ObfuscatedName("ad") - @Export("__ad_202") int __ad_202(int[] var1, int var2, int var3, int var4, int var5) { while(true) { if(this.__n > 0) { @@ -724,7 +697,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("ap") - @Export("__ap_203") int __ap_203(int[] var1, int var2, int var3, int var4, int var5) { while(true) { if(this.__n > 0) { @@ -775,13 +747,12 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("az") - @Export("__az_179") int __az_179() { int var1 = this.__u * 3 >> 6; var1 = (var1 ^ var1 >> 31) + (var1 >>> 31); - if(this.__e == 0) { + if(this.numLoops == 0) { var1 -= var1 * this.__m / (((RawSound)super.sound).samples.length << 8); - } else if(this.__e >= 0) { + } else if(this.numLoops >= 0) { var1 -= var1 * this.start / ((RawSound)super.sound).samples.length; } @@ -789,7 +760,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("au") - @Export("__au_204") boolean __au_204() { int var1 = this.__q; int var2; @@ -872,7 +842,8 @@ public class RawPcmStream extends PcmStream { @ObfuscatedSignature( signature = "(Lcx;II)Lds;" ) - public static RawPcmStream method2497(RawSound var0, int var1, int var2) { + @Export("createRawPcmStream") + public static RawPcmStream createRawPcmStream(RawSound var0, int var1, int var2) { return var0.samples != null && var0.samples.length != 0?new RawPcmStream(var0, (int)((long)var0.sampleRate * 256L * (long)var1 / (long)(class309.PcmPlayer_sampleRate * 100)), var2 << 6):null; } diff --git a/rs-client/src/main/java/RawSound.java b/runescape-client/src/main/java/RawSound.java similarity index 98% rename from rs-client/src/main/java/RawSound.java rename to runescape-client/src/main/java/RawSound.java index b9d8fd8a14..e746b0a448 100644 --- a/rs-client/src/main/java/RawSound.java +++ b/runescape-client/src/main/java/RawSound.java @@ -19,7 +19,6 @@ public class RawSound extends AbstractSound { @Export("end") int end; @ObfuscatedName("o") - @Export("__o") public boolean __o; RawSound(int var1, byte[] var2, int var3, int var4) { diff --git a/rs-client/src/main/java/RectangleMode.java b/runescape-client/src/main/java/RectangleMode.java similarity index 96% rename from rs-client/src/main/java/RectangleMode.java rename to runescape-client/src/main/java/RectangleMode.java index 4a6349f170..006557d5f8 100644 --- a/rs-client/src/main/java/RectangleMode.java +++ b/runescape-client/src/main/java/RectangleMode.java @@ -11,19 +11,16 @@ public enum RectangleMode implements Enumerated { @ObfuscatedSignature( signature = "Llj;" ) - @Export("__lj_m") __lj_m(0, 0), @ObfuscatedName("f") @ObfuscatedSignature( signature = "Llj;" ) - @Export("__lj_f") __lj_f(1, 1), @ObfuscatedName("q") @ObfuscatedSignature( signature = "Llj;" ) - @Export("__lj_q") __lj_q(2, 2); @ObfuscatedName("d") @Export("musicTrackBoolean") @@ -51,6 +48,7 @@ public enum RectangleMode implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id2; } diff --git a/rs-client/src/main/java/ReflectionCheck.java b/runescape-client/src/main/java/ReflectionCheck.java similarity index 100% rename from rs-client/src/main/java/ReflectionCheck.java rename to runescape-client/src/main/java/ReflectionCheck.java diff --git a/rs-client/src/main/java/class179.java b/runescape-client/src/main/java/RouteStrategy.java similarity index 80% rename from rs-client/src/main/java/class179.java rename to runescape-client/src/main/java/RouteStrategy.java index 5b0bec30cc..47bf872c16 100644 --- a/rs-client/src/main/java/class179.java +++ b/runescape-client/src/main/java/RouteStrategy.java @@ -4,7 +4,8 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("fe") -public abstract class class179 { +public abstract class RouteStrategy +{ @ObfuscatedName("l") @ObfuscatedGetter( intValue = -1237576843 @@ -12,28 +13,31 @@ public abstract class class179 { @Export("Interpreter_intStackSize") static int Interpreter_intStackSize; @ObfuscatedName("e") - @Export("__fe_e") static byte[][][] __fe_e; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 123677543 ) - public int field2120; + @Export("approxDestinationX") + public int approxDestinationX; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -2126454535 ) - public int field2121; + @Export("approxDestinationY") + public int approxDestinationY; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -1566880917 ) - public int field2122; + @Export("approxDestinationSizeX") + public int approxDestinationSizeX; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -2126101601 ) - public int field2123; + @Export("approxDestinationSizeY") + public int approxDestinationSizeY; @ObfuscatedName("m") @ObfuscatedSignature( @@ -69,7 +73,8 @@ public abstract class class179 { signature = "(Lir;II)Z", garbageValue = "-602741260" ) - static boolean method3643(AbstractIndexCache var0, int var1) { + @Export("loadSpriteFlat") + static boolean loadSpriteFlat(AbstractIndexCache var0, int var1) { byte[] var2 = var0.takeRecordFlat(var1); if(var2 == null) { return false; diff --git a/rs-client/src/main/java/RunException.java b/runescape-client/src/main/java/RunException.java similarity index 98% rename from rs-client/src/main/java/RunException.java rename to runescape-client/src/main/java/RunException.java index 1f11fe607a..75df0eac82 100644 --- a/rs-client/src/main/java/RunException.java +++ b/runescape-client/src/main/java/RunException.java @@ -24,7 +24,6 @@ public class RunException extends RuntimeException { @ObfuscatedGetter( intValue = 121013503 ) - @Export("__fx_w") public static int __fx_w; @ObfuscatedName("o") @Export("string") diff --git a/rs-client/src/main/java/Scene.java b/runescape-client/src/main/java/Scene.java similarity index 98% rename from rs-client/src/main/java/Scene.java rename to runescape-client/src/main/java/Scene.java index c69f8c4a90..85a75d1337 100644 --- a/rs-client/src/main/java/Scene.java +++ b/runescape-client/src/main/java/Scene.java @@ -82,11 +82,11 @@ public class Scene { @Export("Scene_selectedY") public static int Scene_selectedY; @ObfuscatedName("ab") - @Export("__em_ab") - static boolean __em_ab; + @Export("viewportWalking") + static boolean viewportWalking; @ObfuscatedName("ad") - @Export("__em_ad") - static int __em_ad; + @Export("Scene_planesCount") + static int Scene_planesCount; @ObfuscatedName("ap") @Export("Scene_planeOccluderCounts") static int[] Scene_planeOccluderCounts; @@ -112,25 +112,18 @@ public class Scene { @Export("Scene_tilesDeque") static NodeDeque Scene_tilesDeque; @ObfuscatedName("au") - @Export("__em_au") static final int[] __em_au; @ObfuscatedName("ao") - @Export("__em_ao") static final int[] __em_ao; @ObfuscatedName("aa") - @Export("__em_aa") static final int[] __em_aa; @ObfuscatedName("ax") - @Export("__em_ax") static final int[] __em_ax; @ObfuscatedName("af") - @Export("__em_af") static final int[] __em_af; @ObfuscatedName("ai") - @Export("__em_ai") static final int[] __em_ai; @ObfuscatedName("ba") - @Export("__em_ba") static final int[] __em_ba; @ObfuscatedName("bc") @Export("visibilityMap") @@ -187,13 +180,10 @@ public class Scene { @Export("tempGameObjects") GameObject[] tempGameObjects; @ObfuscatedName("x") - @Export("__x") int[][][] __x; @ObfuscatedName("bk") - @Export("__bk") int[][] __bk; @ObfuscatedName("bd") - @Export("__bd") int[][] __bd; static { @@ -207,10 +197,10 @@ public class Scene { Scene_selectedScreenY = 0; Scene_selectedX = -1; Scene_selectedY = -1; - __em_ab = false; - __em_ad = 4; - Scene_planeOccluderCounts = new int[__em_ad]; - Scene_planeOccluders = new Occluder[__em_ad][500]; + viewportWalking = false; + Scene_planesCount = 4; + Scene_planeOccluderCounts = new int[Scene_planesCount]; + Scene_planeOccluders = new Occluder[Scene_planesCount][500]; Scene_currentOccludersCount = 0; Scene_currentOccluders = new Occluder[500]; Scene_tilesDeque = new NodeDeque(); @@ -252,7 +242,7 @@ public class Scene { } } - for(var1 = 0; var1 < __em_ad; ++var1) { + for(var1 = 0; var1 < Scene_planesCount; ++var1) { for(var2 = 0; var2 < Scene_planeOccluderCounts[var1]; ++var2) { Scene_planeOccluders[var1][var2] = null; } @@ -466,7 +456,7 @@ public class Scene { var14.entity1 = var5; var14.entity2 = var6; var14.orientation = var7; - var14.int7 = var8; + var14.orientation2 = var8; var14.xOffset = var9; var14.yOffset = var10; @@ -484,7 +474,6 @@ public class Scene { @ObfuscatedSignature( signature = "(IIIIIILex;IJI)Z" ) - @Export("__d_238") public boolean __d_238(int var1, int var2, int var3, int var4, int var5, int var6, Entity var7, int var8, long var9, int var11) { if(var7 == null) { return true; @@ -499,7 +488,6 @@ public class Scene { @ObfuscatedSignature( signature = "(IIIIILex;IJZ)Z" ) - @Export("__a_239") public boolean __a_239(int var1, int var2, int var3, int var4, int var5, Entity var6, int var7, long var8, boolean var10) { if(var6 == null) { return true; @@ -538,7 +526,6 @@ public class Scene { @ObfuscatedSignature( signature = "(IIIIILex;IJIIII)Z" ) - @Export("__z_240") public boolean __z_240(int var1, int var2, int var3, int var4, int var5, Entity var6, int var7, long var8, int var10, int var11, int var12, int var13) { return var6 == null?true:this.newGameObject(var1, var10, var11, var12 - var10 + 1, var13 - var11 + 1, var2, var3, var4, var6, var7, true, var8, 0); } @@ -666,7 +653,6 @@ public class Scene { } @ObfuscatedName("y") - @Export("__y_241") public void __y_241(int var1, int var2, int var3, int var4) { Tile var5 = this.tiles[var1][var2][var3]; if(var5 != null) { @@ -697,7 +683,6 @@ public class Scene { } @ObfuscatedName("c") - @Export("__c_242") public void __c_242(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if(var4 != null) { @@ -757,7 +742,6 @@ public class Scene { @ObfuscatedSignature( signature = "(III)Leh;" ) - @Export("__aj_243") public GameObject __aj_243(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if(var4 == null) { @@ -788,21 +772,18 @@ public class Scene { } @ObfuscatedName("ar") - @Export("__ar_244") public long __ar_244(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 != null && var4.boundaryObject != null?var4.boundaryObject.tag:0L; } @ObfuscatedName("ac") - @Export("__ac_245") public long __ac_245(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 != null && var4.wallDecoration != null?var4.wallDecoration.tag:0L; } @ObfuscatedName("ay") - @Export("__ay_246") public long __ay_246(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if(var4 == null) { @@ -853,7 +834,6 @@ public class Scene { } @ObfuscatedName("aw") - @Export("__aw_247") public void __aw_247(int var1, int var2, int var3) { for(int var4 = 0; var4 < this.planes; ++var4) { for(int var5 = 0; var5 < this.xSize; ++var5) { @@ -901,7 +881,6 @@ public class Scene { @ObfuscatedSignature( signature = "(Ldw;III)V" ) - @Export("__al_248") void __al_248(ModelData var1, int var2, int var3, int var4) { Tile var5; ModelData var6; @@ -943,7 +922,6 @@ public class Scene { @ObfuscatedSignature( signature = "(Ldw;IIIII)V" ) - @Export("__ab_249") void __ab_249(ModelData var1, int var2, int var3, int var4, int var5, int var6) { boolean var7 = true; int var8 = var3; @@ -1066,7 +1044,7 @@ public class Scene { public void menuOpen(int var1, int var2, int var3, boolean var4) { if(!method3187() || var4) { checkClick = true; - __em_ab = var4; + viewportWalking = var4; Scene_selectedPlane = var1; Scene_selectedScreenX = var2; Scene_selectedScreenY = var3; @@ -1076,9 +1054,8 @@ public class Scene { } @ObfuscatedName("as") - @Export("__as_250") public void __as_250() { - __em_ab = true; + viewportWalking = true; } @ObfuscatedName("az") @@ -1467,7 +1444,7 @@ public class Scene { var14 = var13.x - Scene_cameraX; var15 = var13.tileHeight - Scene_cameraY; var16 = var13.y - Scene_cameraZ; - var17 = var13.int7; + var17 = var13.orientation2; if(var17 != 1 && var17 != 2) { var18 = var14; } else { @@ -1737,7 +1714,7 @@ public class Scene { var11 = var29.x - Scene_cameraX; var25 = var29.tileHeight - Scene_cameraY; var24 = var29.y - Scene_cameraZ; - var14 = var29.int7; + var14 = var29.orientation2; if(var14 != 1 && var14 != 2) { var15 = var11; } else { @@ -2148,7 +2125,6 @@ public class Scene { } @ObfuscatedName("ba") - @Export("__ba_253") boolean __ba_253(int var1, int var2, int var3) { int var4 = this.__x[var1][var2][var3]; if(var4 == -Scene_drawnCount) { @@ -2169,7 +2145,6 @@ public class Scene { } @ObfuscatedName("bb") - @Export("__bb_254") boolean __bb_254(int var1, int var2, int var3, int var4) { if(!this.__ba_253(var1, var2, var3)) { return false; @@ -2315,7 +2290,6 @@ public class Scene { } @ObfuscatedName("bs") - @Export("__bs_255") boolean __bs_255(int var1, int var2, int var3, int var4) { if(!this.__ba_253(var1, var2, var3)) { return false; @@ -2327,7 +2301,6 @@ public class Scene { } @ObfuscatedName("bq") - @Export("__bq_256") boolean __bq_256(int var1, int var2, int var3, int var4, int var5, int var6) { int var7; int var8; @@ -2372,7 +2345,6 @@ public class Scene { } @ObfuscatedName("bn") - @Export("__bn_257") boolean __bn_257(int var1, int var2, int var3) { for(int var4 = 0; var4 < Scene_currentOccludersCount; ++var4) { Occluder var5 = Scene_currentOccluders[var4]; @@ -2561,13 +2533,13 @@ public class Scene { @ObfuscatedName("am") public static boolean method3187() { - return __em_ab && Scene_selectedX != -1; + return viewportWalking && Scene_selectedX != -1; } @ObfuscatedName("an") public static void method3103() { Scene_selectedX = -1; - __em_ab = false; + viewportWalking = false; } @ObfuscatedName("ax") diff --git a/rs-client/src/main/java/Script.java b/runescape-client/src/main/java/Script.java similarity index 97% rename from rs-client/src/main/java/Script.java rename to runescape-client/src/main/java/Script.java index 068866a0a1..585a8793b2 100644 --- a/rs-client/src/main/java/Script.java +++ b/runescape-client/src/main/java/Script.java @@ -62,7 +62,6 @@ public class Script extends DualNode { signature = "(II)[Llh;", garbageValue = "-729647116" ) - @Export("__o_164") IterableNodeHashTable[] __o_164(int var1) { return new IterableNodeHashTable[var1]; } @@ -124,7 +123,7 @@ public class Script extends DualNode { int var6 = var4 >> 4 & 7; int var7 = var4 & 15; Client.soundEffectIds[Client.soundEffectCount] = var5; - Client.unknownSoundValues1[Client.soundEffectCount] = var6; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var6; Client.queuedSoundEffectDelays[Client.soundEffectCount] = 0; Client.soundEffects[Client.soundEffectCount] = null; int var8 = (var2 - 64) / 128; diff --git a/runescape-client/src/main/java/ScriptEvent.java b/runescape-client/src/main/java/ScriptEvent.java new file mode 100644 index 0000000000..a772be2e8d --- /dev/null +++ b/runescape-client/src/main/java/ScriptEvent.java @@ -0,0 +1,354 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("by") +@Implements("ScriptEvent") +public class ScriptEvent extends Node { + @ObfuscatedName("fv") + @ObfuscatedSignature( + signature = "Lkk;" + ) + @Export("fontPlain11") + static Font fontPlain11; + @ObfuscatedName("hb") + @ObfuscatedGetter( + intValue = -1218466245 + ) + @Export("oculusOrbFocalPointY") + static int oculusOrbFocalPointY; + @ObfuscatedName("m") + @Export("args0") + Object[] args0; + @ObfuscatedName("f") + @Export("boolean1") + boolean boolean1; + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "Lho;" + ) + @Export("widget") + Widget widget; + @ObfuscatedName("w") + @ObfuscatedGetter( + intValue = 488198377 + ) + @Export("mouseX") + int mouseX; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = 95719815 + ) + @Export("mouseY") + int mouseY; + @ObfuscatedName("u") + @ObfuscatedGetter( + intValue = -1089993721 + ) + @Export("opIndex") + int opIndex; + @ObfuscatedName("g") + @ObfuscatedSignature( + signature = "Lho;" + ) + @Export("dragTarget") + Widget dragTarget; + @ObfuscatedName("l") + @ObfuscatedGetter( + intValue = -1330602393 + ) + @Export("keyTyped") + int keyTyped; + @ObfuscatedName("e") + @ObfuscatedGetter( + intValue = 327085889 + ) + @Export("keyPressed") + int keyPressed; + @ObfuscatedName("x") + @Export("targetName") + String targetName; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = -2138736593 + ) + int __d; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = -161292529 + ) + @Export("type0") + int type0; + + public ScriptEvent() { + this.type0 = 76; + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "([Ljava/lang/Object;I)V", + garbageValue = "723852511" + ) + @Export("setArgs") + public void setArgs(Object[] var1) { + this.args0 = var1; + } + + @ObfuscatedName("f") + @ObfuscatedSignature( + signature = "(IB)V", + garbageValue = "-110" + ) + @Export("setType") + public void setType(int var1) { + this.type0 = var1; + } + + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "(ILcg;ZB)I", + garbageValue = "0" + ) + static int method1185(int var0, Script var1, boolean var2) { + Widget var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; + if(var0 == 1600) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollX; + return 1; + } else if(var0 == 1601) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollY; + return 1; + } else if(var0 == 1602) { + Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.text; + return 1; + } else if(var0 == 1603) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollWidth; + return 1; + } else if(var0 == 1604) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.scrollHeight; + return 1; + } else if(var0 == 1605) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelZoom; + return 1; + } else if(var0 == 1606) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelAngleX; + return 1; + } else if(var0 == 1607) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelAngleZ; + return 1; + } else if(var0 == 1608) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.modelAngleY; + return 1; + } else if(var0 == 1609) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.transparency; + return 1; + } else if(var0 == 1610) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.__af; + return 1; + } else if(var0 == 1611) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.color; + return 1; + } else if(var0 == 1612) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.color2; + return 1; + } else if(var0 == 1613) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.rectangleMode.rsOrdinal(); + return 1; + } else if(var0 == 1614) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.__bv?1:0; + return 1; + } else { + return 2; + } + } + + @ObfuscatedName("aq") + @ObfuscatedSignature( + signature = "(ILcg;ZI)I", + garbageValue = "1256509027" + ) + static int method1187(int var0, Script var1, boolean var2) { + if(var0 == 3300) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.cycle; + return 1; + } else { + int var3; + int var4; + if(var0 == 3301) { + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class83.method2027(var3, var4); + return 1; + } else if(var0 == 3302) { + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapLabel.method442(var3, var4); + return 1; + } else if(var0 == 3303) { + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class1.method18(var3, var4); + return 1; + } else if(var0 == 3304) { + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class231.method4523(var3).size; + return 1; + } else if(var0 == 3305) { + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.currentLevels[var3]; + return 1; + } else if(var0 == 3306) { + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.levels[var3]; + return 1; + } else if(var0 == 3307) { + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.experience[var3]; + return 1; + } else { + int var5; + if(var0 == 3308) { + var3 = SoundSystem.plane; + var4 = (Canvas.localPlayer.x >> 7) + class50.baseX; + var5 = (Canvas.localPlayer.y >> 7) + GraphicsObject.baseY; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (var4 << 14) + var5 + (var3 << 28); + return 1; + } else if(var0 == 3309) { + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 >> 14 & 16383; + return 1; + } else if(var0 == 3310) { + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 >> 28; + return 1; + } else if(var0 == 3311) { + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 & 16383; + return 1; + } else if(var0 == 3312) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.isMembersWorld?1:0; + return 1; + } else if(var0 == 3313) { + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] + 32768; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class83.method2027(var3, var4); + return 1; + } else if(var0 == 3314) { + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] + 32768; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapLabel.method442(var3, var4); + return 1; + } else if(var0 == 3315) { + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] + 32768; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class1.method18(var3, var4); + return 1; + } else if(var0 == 3316) { + if(Client.rights >= 2) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.rights; + } else { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if(var0 == 3317) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.rebootTimer; + return 1; + } else if(var0 == 3318) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.worldId; + return 1; + } else if(var0 == 3321) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.runEnergy; + return 1; + } else if(var0 == 3322) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.weight; + return 1; + } else if(var0 == 3323) { + if(Client.__client_mn) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; + } else { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if(var0 == 3324) { + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.worldProperties; + return 1; + } else if(var0 == 3325) { + RouteStrategy.Interpreter_intStackSize -= 4; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + int var6 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3]; + var3 += var4 << 14; + var3 += var5 << 28; + var3 += var6; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3; + return 1; + } else { + return 2; + } + } + } + } + + @ObfuscatedName("ep") + @ObfuscatedSignature( + signature = "(IIB)V", + garbageValue = "-52" + ) + static void method1183(int var0, int var1) { + int[] var2 = new int[9]; + + for(int var3 = 0; var3 < var2.length; ++var3) { + int var4 = var3 * 32 + 15 + 128; + int var5 = var4 * 3 + 600; + int var7 = Rasterizer3D.Rasterizer3D_sine[var4]; + int var6 = method1176(var5, var1); + var2[var3] = var6 * var7 >> 16; + } + + Scene.Scene_buildVisiblityMap(var2, 500, 800, var0 * 334 / var1, 334); + } + + @ObfuscatedName("gj") + @ObfuscatedSignature( + signature = "(III)I", + garbageValue = "-914543563" + ) + static int method1176(int var0, int var1) { + int var2 = var1 - 334; + if(var2 < 0) { + var2 = 0; + } else if(var2 > 100) { + var2 = 100; + } + + int var3 = (Client.__client_rb - Client.__client_re) * var2 / 100 + Client.__client_re; + return var0 * var3 / 256; + } + + @ObfuscatedName("hf") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "35" + ) + static final void method1179() { + for(class68 var0 = (class68)Client.__client_kh.last(); var0 != null; var0 = (class68)Client.__client_kh.previous()) { + if(var0.field910 == -1) { + var0.field909 = 0; + class13.method165(var0); + } else { + var0.remove(); + } + } + + } +} diff --git a/rs-client/src/main/java/ScriptFrame.java b/runescape-client/src/main/java/ScriptFrame.java similarity index 100% rename from rs-client/src/main/java/ScriptFrame.java rename to runescape-client/src/main/java/ScriptFrame.java diff --git a/rs-client/src/main/java/SecureRandomCallable.java b/runescape-client/src/main/java/SecureRandomCallable.java similarity index 96% rename from rs-client/src/main/java/SecureRandomCallable.java rename to runescape-client/src/main/java/SecureRandomCallable.java index f81565e721..fcfe23f2ec 100644 --- a/rs-client/src/main/java/SecureRandomCallable.java +++ b/runescape-client/src/main/java/SecureRandomCallable.java @@ -23,7 +23,7 @@ public class SecureRandomCallable implements Callable { garbageValue = "64" ) static class27 method1145(byte[] var0) { - return var0 == null?new class27():new class27(class27.method438(var0).pixels); + return var0 == null?new class27():new class27(class27.convertJpgToSprite(var0).pixels); } @ObfuscatedName("m") @@ -68,7 +68,7 @@ public class SecureRandomCallable implements Callable { int var5; int var6; for(var5 = 0; var5 < Client.menuOptionsCount; ++var5) { - if(WorldMapManager.method672(Client.menuOpcodes[var5])) { + if(WorldMapManager.isWidgetMenuOpcode(Client.menuOpcodes[var5])) { if(var5 < Client.menuOptionsCount - 1) { for(var6 = var5; var6 < Client.menuOptionsCount - 1; ++var6) { Client.menuActions[var6] = Client.menuActions[var6 + 1]; diff --git a/rs-client/src/main/java/SecureRandomFuture.java b/runescape-client/src/main/java/SecureRandomFuture.java similarity index 96% rename from rs-client/src/main/java/SecureRandomFuture.java rename to runescape-client/src/main/java/SecureRandomFuture.java index 3f526b4e34..d9cf7aab24 100644 --- a/rs-client/src/main/java/SecureRandomFuture.java +++ b/runescape-client/src/main/java/SecureRandomFuture.java @@ -15,8 +15,8 @@ public class SecureRandomFuture { @ObfuscatedSignature( signature = "Llq;" ) - @Export("__cn_bu") - static IndexedSprite __cn_bu; + @Export("worldSelectLeftSprite") + static IndexedSprite worldSelectLeftSprite; @ObfuscatedName("dy") @ObfuscatedSignature( signature = "Lit;" diff --git a/rs-client/src/main/java/SequenceDefinition.java b/runescape-client/src/main/java/SequenceDefinition.java similarity index 97% rename from rs-client/src/main/java/SequenceDefinition.java rename to runescape-client/src/main/java/SequenceDefinition.java index 2e3d8fb8bd..0223305001 100644 --- a/rs-client/src/main/java/SequenceDefinition.java +++ b/runescape-client/src/main/java/SequenceDefinition.java @@ -17,13 +17,11 @@ public class SequenceDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jh_f") public static AbstractIndexCache __jh_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jh_q") public static AbstractIndexCache __jh_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -35,7 +33,6 @@ public class SequenceDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jh_o") public static EvictingDualNodeHashTable __jh_o; @ObfuscatedName("u") @Export("frameIds") @@ -47,7 +44,6 @@ public class SequenceDefinition extends DualNode { @Export("frameLengths") public int[] frameLengths; @ObfuscatedName("e") - @Export("__e") public int[] __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -56,16 +52,13 @@ public class SequenceDefinition extends DualNode { @Export("frameCount") public int frameCount; @ObfuscatedName("d") - @Export("__d") int[] __d; @ObfuscatedName("k") - @Export("__k") public boolean __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 1309695045 ) - @Export("__n") public int __n; @ObfuscatedName("i") @ObfuscatedGetter( @@ -83,25 +76,21 @@ public class SequenceDefinition extends DualNode { @ObfuscatedGetter( intValue = -28345361 ) - @Export("__z") public int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 1339014215 ) - @Export("__j") public int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 2012242069 ) - @Export("__s") public int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = 1147391369 ) - @Export("__t") public int __t; static { diff --git a/rs-client/src/main/java/ServerBuild.java b/runescape-client/src/main/java/ServerBuild.java similarity index 93% rename from rs-client/src/main/java/ServerBuild.java rename to runescape-client/src/main/java/ServerBuild.java index 30b828ab0f..cf133ba7c4 100644 --- a/rs-client/src/main/java/ServerBuild.java +++ b/runescape-client/src/main/java/ServerBuild.java @@ -11,25 +11,21 @@ public class ServerBuild { @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_m") public static final ServerBuild __iy_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_f") public static final ServerBuild __iy_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_q") public static final ServerBuild __iy_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_w") public static final ServerBuild __iy_w; @ObfuscatedName("bx") @Export("worldsUrl") @@ -38,7 +34,6 @@ public class ServerBuild { @ObfuscatedGetter( intValue = -365366303 ) - @Export("__iy_lo") static int __iy_lo; @ObfuscatedName("o") @Export("name") diff --git a/rs-client/src/main/java/ServerPacket.java b/runescape-client/src/main/java/ServerPacket.java similarity index 90% rename from rs-client/src/main/java/ServerPacket.java rename to runescape-client/src/main/java/ServerPacket.java index ec2fe9dc64..c0df9ef55c 100644 --- a/rs-client/src/main/java/ServerPacket.java +++ b/runescape-client/src/main/java/ServerPacket.java @@ -11,511 +11,426 @@ public class ServerPacket { @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_m") public static final ServerPacket __ge_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_f") public static final ServerPacket __ge_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_q") public static final ServerPacket __ge_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_w") public static final ServerPacket __ge_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_o") public static final ServerPacket __ge_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_u") public static final ServerPacket __ge_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_g") public static final ServerPacket __ge_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_l") public static final ServerPacket __ge_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_e") public static final ServerPacket __ge_e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_x") public static final ServerPacket __ge_x; @ObfuscatedName("d") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_d") public static final ServerPacket __ge_d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_k") public static final ServerPacket __ge_k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_n") public static final ServerPacket __ge_n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_i") public static final ServerPacket __ge_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_a") public static final ServerPacket __ge_a; @ObfuscatedName("z") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_z") public static final ServerPacket __ge_z; @ObfuscatedName("j") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_j") public static final ServerPacket __ge_j; @ObfuscatedName("s") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_s") public static final ServerPacket __ge_s; @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_t") public static final ServerPacket __ge_t; @ObfuscatedName("y") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_y") public static final ServerPacket __ge_y; @ObfuscatedName("h") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_h") public static final ServerPacket __ge_h; @ObfuscatedName("b") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_b") public static final ServerPacket __ge_b; @ObfuscatedName("c") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_c") public static final ServerPacket __ge_c; @ObfuscatedName("r") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_r") public static final ServerPacket __ge_r; @ObfuscatedName("p") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_p") public static final ServerPacket __ge_p; @ObfuscatedName("v") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_v") public static final ServerPacket __ge_v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ag") public static final ServerPacket __ge_ag; @ObfuscatedName("aq") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aq") public static final ServerPacket __ge_aq; @ObfuscatedName("aj") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aj") public static final ServerPacket __ge_aj; @ObfuscatedName("av") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_av") public static final ServerPacket __ge_av; @ObfuscatedName("ar") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ar") public static final ServerPacket __ge_ar; @ObfuscatedName("ac") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ac") public static final ServerPacket __ge_ac; @ObfuscatedName("ay") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ay") public static final ServerPacket __ge_ay; @ObfuscatedName("ah") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ah") public static final ServerPacket __ge_ah; @ObfuscatedName("ak") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ak") public static final ServerPacket __ge_ak; @ObfuscatedName("aw") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aw") public static final ServerPacket __ge_aw; @ObfuscatedName("al") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_al") public static final ServerPacket __ge_al; @ObfuscatedName("ab") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ab") public static final ServerPacket __ge_ab; @ObfuscatedName("ae") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ae") public static final ServerPacket __ge_ae; @ObfuscatedName("at") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_at") public static final ServerPacket __ge_at; @ObfuscatedName("ad") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ad") public static final ServerPacket __ge_ad; @ObfuscatedName("ap") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ap") public static final ServerPacket __ge_ap; @ObfuscatedName("as") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_as") public static final ServerPacket __ge_as; @ObfuscatedName("am") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_am") public static final ServerPacket __ge_am; @ObfuscatedName("an") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_an") public static final ServerPacket __ge_an; @ObfuscatedName("az") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_az") public static final ServerPacket __ge_az; @ObfuscatedName("au") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_au") public static final ServerPacket __ge_au; @ObfuscatedName("ao") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ao") public static final ServerPacket __ge_ao; @ObfuscatedName("aa") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aa") public static final ServerPacket __ge_aa; @ObfuscatedName("ax") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ax") public static final ServerPacket __ge_ax; @ObfuscatedName("af") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_af") public static final ServerPacket __ge_af; @ObfuscatedName("ai") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ai") public static final ServerPacket __ge_ai; @ObfuscatedName("ba") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ba") public static final ServerPacket __ge_ba; @ObfuscatedName("bb") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bb") public static final ServerPacket __ge_bb; @ObfuscatedName("bs") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bs") public static final ServerPacket __ge_bs; @ObfuscatedName("bq") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bq") public static final ServerPacket __ge_bq; @ObfuscatedName("bn") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bn") public static final ServerPacket __ge_bn; @ObfuscatedName("bk") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bk") public static final ServerPacket __ge_bk; @ObfuscatedName("bd") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bd") public static final ServerPacket __ge_bd; @ObfuscatedName("bc") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bc") public static final ServerPacket __ge_bc; @ObfuscatedName("bo") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bo") public static final ServerPacket __ge_bo; @ObfuscatedName("bx") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bx") public static final ServerPacket __ge_bx; @ObfuscatedName("by") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_by") public static final ServerPacket __ge_by; @ObfuscatedName("bu") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bu") public static final ServerPacket __ge_bu; @ObfuscatedName("bm") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bm") public static final ServerPacket __ge_bm; @ObfuscatedName("bl") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bl") public static final ServerPacket __ge_bl; @ObfuscatedName("br") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_br") public static final ServerPacket __ge_br; @ObfuscatedName("bj") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bj") public static final ServerPacket __ge_bj; @ObfuscatedName("bi") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bi") public static final ServerPacket __ge_bi; @ObfuscatedName("bz") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bz") public static final ServerPacket __ge_bz; @ObfuscatedName("bg") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bg") public static final ServerPacket __ge_bg; @ObfuscatedName("bt") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bt") public static final ServerPacket __ge_bt; @ObfuscatedName("bp") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bp") public static final ServerPacket __ge_bp; @ObfuscatedName("bf") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bf") public static final ServerPacket __ge_bf; @ObfuscatedName("bh") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bh") public static final ServerPacket __ge_bh; @ObfuscatedName("be") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_be") public static final ServerPacket __ge_be; @ObfuscatedName("bv") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bv") public static final ServerPacket __ge_bv; @ObfuscatedName("bw") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bw") public static final ServerPacket __ge_bw; @ObfuscatedName("cr") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cr") public static final ServerPacket __ge_cr; @ObfuscatedName("cv") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cv") public static final ServerPacket __ge_cv; @ObfuscatedName("ce") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ce") public static final ServerPacket __ge_ce; @ObfuscatedName("cy") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cy") public static final ServerPacket __ge_cy; @ObfuscatedName("cs") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cs") public static final ServerPacket __ge_cs; @ObfuscatedName("cm") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cm") public static final ServerPacket __ge_cm; @ObfuscatedName("cj") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cj") public static final ServerPacket __ge_cj; @ObfuscatedName("ix") @ObfuscatedGetter( @@ -634,7 +549,8 @@ public class ServerPacket { signature = "(I)Llq;", garbageValue = "2048918805" ) - static IndexedSprite method3663() { + @Export("createIndexedSprite") + static IndexedSprite createIndexedSprite() { IndexedSprite var0 = new IndexedSprite(); var0.width = class328.indexedSpriteWidth; var0.height = class328.indexedSpriteHeight; diff --git a/rs-client/src/main/java/Skeleton.java b/runescape-client/src/main/java/Skeleton.java similarity index 99% rename from rs-client/src/main/java/Skeleton.java rename to runescape-client/src/main/java/Skeleton.java index eb49ea8c5a..5fc72906be 100644 --- a/rs-client/src/main/java/Skeleton.java +++ b/runescape-client/src/main/java/Skeleton.java @@ -11,7 +11,6 @@ public class Skeleton extends Node { @ObfuscatedGetter( intValue = 2096389021 ) - @Export("__ek_x") static int __ek_x; @ObfuscatedName("dc") @ObfuscatedSignature( diff --git a/rs-client/src/main/java/Skills.java b/runescape-client/src/main/java/Skills.java similarity index 97% rename from rs-client/src/main/java/Skills.java rename to runescape-client/src/main/java/Skills.java index 3482eb1f36..ae1e7c6b0a 100644 --- a/rs-client/src/main/java/Skills.java +++ b/runescape-client/src/main/java/Skills.java @@ -13,7 +13,6 @@ public class Skills { @Export("Skills_experienceTable") public static int[] Skills_experienceTable; @ObfuscatedName("ef") - @Export("__hc_ef") static int[] __hc_ef; static { @@ -61,7 +60,7 @@ public class Skills { var1.__g_428(getItemDefinition(var1.placeholderTemplate), getItemDefinition(var1.placeholder)); } - if(!class30.__ar_l && var1.isMembersOnly) { + if(!class30.inMembersWorld && var1.isMembersOnly) { var1.name = "Members object"; var1.isTradable = false; var1.groundActions = null; diff --git a/rs-client/src/main/java/SoftWrapper.java b/runescape-client/src/main/java/SoftWrapper.java similarity index 93% rename from rs-client/src/main/java/SoftWrapper.java rename to runescape-client/src/main/java/SoftWrapper.java index ce8bf940a1..5c1c0cc0ed 100644 --- a/rs-client/src/main/java/SoftWrapper.java +++ b/runescape-client/src/main/java/SoftWrapper.java @@ -16,11 +16,13 @@ public class SoftWrapper extends Wrapper { } @ObfuscatedName("m") + @Export("get") Object get() { return this.ref.get(); } @ObfuscatedName("f") + @Export("isSoft") boolean isSoft() { return true; } diff --git a/rs-client/src/main/java/SoundCache.java b/runescape-client/src/main/java/SoundCache.java similarity index 100% rename from rs-client/src/main/java/SoundCache.java rename to runescape-client/src/main/java/SoundCache.java diff --git a/rs-client/src/main/java/SoundEffect.java b/runescape-client/src/main/java/SoundEffect.java similarity index 99% rename from rs-client/src/main/java/SoundEffect.java rename to runescape-client/src/main/java/SoundEffect.java index 79e06ab3c7..f443c3306f 100644 --- a/rs-client/src/main/java/SoundEffect.java +++ b/runescape-client/src/main/java/SoundEffect.java @@ -49,7 +49,6 @@ public class SoundEffect { } @ObfuscatedName("q") - @Export("__q_174") public final int __q_174() { int var1 = 9999999; diff --git a/rs-client/src/main/java/SoundEnvelope.java b/runescape-client/src/main/java/SoundEnvelope.java similarity index 100% rename from rs-client/src/main/java/SoundEnvelope.java rename to runescape-client/src/main/java/SoundEnvelope.java diff --git a/rs-client/src/main/java/SoundSystem.java b/runescape-client/src/main/java/SoundSystem.java similarity index 100% rename from rs-client/src/main/java/SoundSystem.java rename to runescape-client/src/main/java/SoundSystem.java diff --git a/rs-client/src/main/java/SpotAnimationDefinition.java b/runescape-client/src/main/java/SpotAnimationDefinition.java similarity index 99% rename from rs-client/src/main/java/SpotAnimationDefinition.java rename to runescape-client/src/main/java/SpotAnimationDefinition.java index b690fbb072..84807ce61c 100644 --- a/rs-client/src/main/java/SpotAnimationDefinition.java +++ b/runescape-client/src/main/java/SpotAnimationDefinition.java @@ -83,13 +83,11 @@ public class SpotAnimationDefinition extends DualNode { @ObfuscatedGetter( intValue = -20619847 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = 1866148625 ) - @Export("__z") int __z; static { diff --git a/rs-client/src/main/java/Sprite.java b/runescape-client/src/main/java/Sprite.java similarity index 98% rename from rs-client/src/main/java/Sprite.java rename to runescape-client/src/main/java/Sprite.java index c833d79b09..d56f907f4a 100644 --- a/rs-client/src/main/java/Sprite.java +++ b/runescape-client/src/main/java/Sprite.java @@ -108,7 +108,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("o") - @Export("__o_499") public void __o_499(int var1) { if(this.subWidth != this.width || this.subHeight != this.height) { int var2 = var1; @@ -150,7 +149,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("u") - @Export("__u_500") public void __u_500() { int[] var1 = new int[this.subWidth * this.subHeight]; int var2 = 0; @@ -166,7 +164,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("g") - @Export("__g_501") public void __g_501() { int[] var1 = new int[this.subWidth * this.subHeight]; int var2 = 0; @@ -182,7 +179,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("l") - @Export("__l_502") public void __l_502(int var1) { int[] var2 = new int[this.subWidth * this.subHeight]; int var3 = 0; @@ -210,7 +206,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("e") - @Export("__e_503") public void __e_503(int var1) { for(int var2 = this.subHeight - 1; var2 > 0; --var2) { int var3 = var2 * this.subWidth; @@ -271,8 +266,8 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("a") - @Export("__a_505") - public void __a_505(int var1, int var2) { + @Export("drawAt2") + public void drawAt2(int var1, int var2) { var1 += this.yOffset; var2 += this.xOffset; int var3 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; @@ -317,7 +312,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("j") - @Export("__j_506") public void __j_506(int var1, int var2, int var3, int var4) { if(var3 > 0 && var4 > 0) { int var5 = this.subWidth; @@ -382,10 +376,10 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("t") - @Export("__t_507") - public void __t_507(int var1, int var2, int var3, int var4) { + @Export("drawAtTransOverlay") + public void drawAtTransOverlay(int var1, int var2, int var3, int var4) { if(var3 == 256) { - this.__a_505(var1, var2); + this.drawAt2(var1, var2); } else { var1 += this.yOffset; var2 += this.xOffset; @@ -432,7 +426,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("h") - @Export("__h_508") public void __h_508(int var1, int var2, int var3) { var1 += this.yOffset; var2 += this.xOffset; @@ -473,12 +466,11 @@ public final class Sprite extends Rasterizer2D { } if(var7 > 0 && var6 > 0) { - method6070(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var5, var4, var7, var6, var8, var9, var3); + Sprite_alpha1(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var5, var4, var7, var6, var8, var9, var3); } } @ObfuscatedName("c") - @Export("__c_509") public void __c_509(int var1, int var2, int var3, int var4, int var5) { if(var3 > 0 && var4 > 0) { int var6 = this.subWidth; @@ -538,12 +530,11 @@ public final class Sprite extends Rasterizer2D { var15 += var16; } - method6072(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var8, var9, var14, var15, var3, var4, var12, var13, var6, var5); + Sprite_alpha2(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var8, var9, var14, var15, var3, var4, var12, var13, var6, var5); } } @ObfuscatedName("v") - @Export("__v_510") public void __v_510(int var1, int var2, int var3) { var1 += this.yOffset; var2 += this.xOffset; @@ -594,7 +585,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("aj") - @Export("__aj_511") public void __aj_511(int var1, int var2, int var3, int var4, int var5) { if(var3 > 0 && var4 > 0) { int var6 = this.subWidth; @@ -664,7 +654,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ac") - @Export("__ac_512") public void __ac_512(int var1, int var2, int var3, int var4, int var5, int var6, int[] var7, int[] var8) { int var9 = var2 < 0?-var2:0; int var10 = var2 + this.subHeight <= var6?this.subHeight:var6 - var2; @@ -713,7 +702,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ay") - @Export("__ay_513") public void __ay_513(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int[] var9, int[] var10) { try { int var11 = -var3 / 2; @@ -749,7 +737,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ah") - @Export("__ah_514") public void __ah_514(int var1, int var2, int var3, int var4, int var5, int var6, double var7, int var9) { try { int var10 = -var3 / 2; @@ -790,13 +777,11 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ak") - @Export("__ak_515") public void __ak_515(int var1, int var2, int var3, int var4) { this.__aw_516(this.width << 3, this.height << 3, var1 << 4, var2 << 4, var3, var4); } @ObfuscatedName("aw") - @Export("__aw_516") void __aw_516(int var1, int var2, int var3, int var4, int var5, int var6) { if(var6 != 0) { var1 -= this.yOffset << 4; @@ -1266,7 +1251,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("al") - @Export("__al_517") public void __al_517(int var1, int var2, int var3, int var4) { if(var3 <= this.width && var4 <= this.height) { int var5 = var3 * this.yOffset / this.width + var1; @@ -1515,7 +1499,8 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("b") - static void method6070(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9) { + @Export("Sprite_alpha1") + static void Sprite_alpha1(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9) { int var10 = 256 - var9; for(int var11 = -var6; var11 < 0; ++var11) { @@ -1536,7 +1521,8 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("p") - static void method6072(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12) { + @Export("Sprite_alpha2") + static void Sprite_alpha2(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12) { int var13 = 256 - var12; int var14 = var3; diff --git a/rs-client/src/main/java/SpriteIds.java b/runescape-client/src/main/java/SpriteIds.java similarity index 98% rename from rs-client/src/main/java/SpriteIds.java rename to runescape-client/src/main/java/SpriteIds.java index e621c81af8..e0db3df86e 100644 --- a/rs-client/src/main/java/SpriteIds.java +++ b/runescape-client/src/main/java/SpriteIds.java @@ -11,13 +11,11 @@ public class SpriteIds { @ObfuscatedGetter( intValue = 1673796151 ) - @Export("__m") public int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 159591367 ) - @Export("__f") public int __f; @ObfuscatedName("q") @ObfuscatedGetter( @@ -130,7 +128,7 @@ public class SpriteIds { garbageValue = "195396240" ) public static Font method5823(AbstractIndexCache var0, AbstractIndexCache var1, int var2, int var3) { - if(!SpriteMask.method4392(var0, var2, var3)) { + if(!SpriteMask.loadSprite(var0, var2, var3)) { return null; } else { byte[] var5 = var1.takeRecord(var2, var3); diff --git a/rs-client/src/main/java/SpriteMask.java b/runescape-client/src/main/java/SpriteMask.java similarity index 96% rename from rs-client/src/main/java/SpriteMask.java rename to runescape-client/src/main/java/SpriteMask.java index 856c8ea133..abcc91283c 100644 --- a/rs-client/src/main/java/SpriteMask.java +++ b/runescape-client/src/main/java/SpriteMask.java @@ -95,7 +95,8 @@ public class SpriteMask extends DualNode { signature = "(Lir;IIB)Z", garbageValue = "1" ) - public static boolean method4392(AbstractIndexCache var0, int var1, int var2) { + @Export("loadSprite") + public static boolean loadSprite(AbstractIndexCache var0, int var1, int var2) { byte[] var3 = var0.takeRecord(var1, var2); if(var3 == null) { return false; diff --git a/rs-client/src/main/java/Strings.java b/runescape-client/src/main/java/Strings.java similarity index 94% rename from rs-client/src/main/java/Strings.java rename to runescape-client/src/main/java/Strings.java index 25f84bfa89..a0c5f48aac 100644 --- a/rs-client/src/main/java/Strings.java +++ b/runescape-client/src/main/java/Strings.java @@ -7,19 +7,14 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Strings") public class Strings { @ObfuscatedName("bq") - @Export("__id_bq") public static String __id_bq; @ObfuscatedName("cp") - @Export("__id_cp") public static String __id_cp; @ObfuscatedName("jr") - @Export("__id_jr") public static String __id_jr; @ObfuscatedName("jv") - @Export("__id_jv") public static String __id_jv; @ObfuscatedName("ju") - @Export("__id_ju") public static String __id_ju; static { diff --git a/rs-client/src/main/java/StructDefinition.java b/runescape-client/src/main/java/StructDefinition.java similarity index 69% rename from rs-client/src/main/java/StructDefinition.java rename to runescape-client/src/main/java/StructDefinition.java index 57bbe957ab..898e0a5a9c 100644 --- a/rs-client/src/main/java/StructDefinition.java +++ b/runescape-client/src/main/java/StructDefinition.java @@ -10,13 +10,11 @@ public class StructDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jq_m") public static AbstractIndexCache __jq_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jq_f") public static EvictingDualNodeHashTable __jq_f; @ObfuscatedName("q") @ObfuscatedSignature( @@ -111,15 +109,15 @@ public class StructDefinition extends DualNode { Widget var3; if(var0 >= 2000) { var0 -= 1000; - var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var3 = Huffman.getWidget(var4); } else { var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; } if(var0 == 1100) { - class179.Interpreter_intStackSize -= 2; - var3.scrollX = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3.scrollX = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; if(var3.scrollX > var3.scrollWidth - var3.width) { var3.scrollX = var3.scrollWidth - var3.width; } @@ -128,7 +126,7 @@ public class StructDefinition extends DualNode { var3.scrollX = 0; } - var3.scrollY = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + var3.scrollY = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; if(var3.scrollY > var3.scrollHeight - var3.height) { var3.scrollY = var3.scrollHeight - var3.height; } @@ -140,52 +138,52 @@ public class StructDefinition extends DualNode { class22.method295(var3); return 1; } else if(var0 == 1101) { - var3.color = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.color = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1102) { - var3.fill = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var3.fill = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; class22.method295(var3); return 1; } else if(var0 == 1103) { - var3.transparency = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.transparency = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1104) { - var3.lineWid = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.lineWid = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1105) { - var3.spriteId2 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.spriteId2 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1106) { - var3.spriteAngle = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.spriteAngle = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1107) { - var3.spriteTiling = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var3.spriteTiling = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; class22.method295(var3); return 1; } else if(var0 == 1108) { var3.modelType = 1; - var3.modelId = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.modelId = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1109) { - class179.Interpreter_intStackSize -= 6; - var3.modelOffsetX = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var3.modelOffsetY = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - var3.modelAngleX = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - var3.modelAngleY = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3]; - var3.modelAngleZ = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 4]; - var3.modelZoom = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 5]; + RouteStrategy.Interpreter_intStackSize -= 6; + var3.modelOffsetX = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var3.modelOffsetY = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + var3.modelAngleX = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + var3.modelAngleY = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3]; + var3.modelAngleZ = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 4]; + var3.modelZoom = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 5]; class22.method295(var3); return 1; } else { int var8; if(var0 == 1110) { - var8 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var8 != var3.sequenceId) { var3.sequenceId = var8; var3.modelFrame = 0; @@ -195,7 +193,7 @@ public class StructDefinition extends DualNode { return 1; } else if(var0 == 1111) { - var3.modelOrthog = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var3.modelOrthog = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; class22.method295(var3); return 1; } else if(var0 == 1112) { @@ -207,40 +205,40 @@ public class StructDefinition extends DualNode { return 1; } else if(var0 == 1113) { - var3.fontId = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.fontId = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1114) { - class179.Interpreter_intStackSize -= 3; - var3.textXAlignment = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var3.textYAlignment = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - var3.textLineHeight = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; + RouteStrategy.Interpreter_intStackSize -= 3; + var3.textXAlignment = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var3.textYAlignment = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + var3.textLineHeight = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; class22.method295(var3); return 1; } else if(var0 == 1115) { - var3.textShadowed = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var3.textShadowed = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; class22.method295(var3); return 1; } else if(var0 == 1116) { - var3.outline = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.outline = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1117) { - var3.spriteShadow = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.spriteShadow = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1118) { - var3.spriteFlipV = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var3.spriteFlipV = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; class22.method295(var3); return 1; } else if(var0 == 1119) { - var3.spriteFlipH = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var3.spriteFlipH = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; class22.method295(var3); return 1; } else if(var0 == 1120) { - class179.Interpreter_intStackSize -= 2; - var3.scrollWidth = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var3.scrollHeight = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3.scrollWidth = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var3.scrollHeight = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; class22.method295(var3); if(var4 != -1 && var3.type == 0) { class39.revalidateWidgetScroll(Widget.widgets[var4 >> 16], var3, false); @@ -253,19 +251,19 @@ public class StructDefinition extends DualNode { class22.method295(var3); return 1; } else if(var0 == 1122) { - var3.spriteId = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.spriteId = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1123) { - var3.color2 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.color2 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1124) { - var3.__af = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.__af = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class22.method295(var3); return 1; } else if(var0 == 1125) { - var8 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; RectangleMode var6 = (RectangleMode)ScriptFrame.findEnumerated(class311.method5822(), var8); if(var6 != null) { var3.rectangleMode = var6; @@ -276,11 +274,11 @@ public class StructDefinition extends DualNode { } else { boolean var5; if(var0 == 1126) { - var5 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var5 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; var3.__ba = var5; return 1; } else if(var0 == 1127) { - var5 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var5 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; var3.__bv = var5; return 1; } else { diff --git a/rs-client/src/main/java/StudioGame.java b/runescape-client/src/main/java/StudioGame.java similarity index 93% rename from rs-client/src/main/java/StudioGame.java rename to runescape-client/src/main/java/StudioGame.java index 6f03e0a231..4e175febd8 100644 --- a/rs-client/src/main/java/StudioGame.java +++ b/runescape-client/src/main/java/StudioGame.java @@ -11,37 +11,31 @@ public enum StudioGame implements Enumerated { @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_m") __is_m("runescape", "RuneScape", 0), @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_f") __is_f("stellardawn", "Stellar Dawn", 1), @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_q") __is_q("game3", "Game 3", 2), @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_w") __is_w("game4", "Game 4", 3), @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_o") __is_o("game5", "Game 5", 4), @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_u") __is_u("oldscape", "RuneScape 2007", 5); @ObfuscatedName("g") @@ -64,7 +58,7 @@ public enum StudioGame implements Enumerated { signature = "(B)I", garbageValue = "83" ) - @Export("ordinal") + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } diff --git a/rs-client/src/main/java/Task.java b/runescape-client/src/main/java/Task.java similarity index 100% rename from rs-client/src/main/java/Task.java rename to runescape-client/src/main/java/Task.java diff --git a/rs-client/src/main/java/TaskHandler.java b/runescape-client/src/main/java/TaskHandler.java similarity index 100% rename from rs-client/src/main/java/TaskHandler.java rename to runescape-client/src/main/java/TaskHandler.java diff --git a/rs-client/src/main/java/Texture.java b/runescape-client/src/main/java/Texture.java similarity index 98% rename from rs-client/src/main/java/Texture.java rename to runescape-client/src/main/java/Texture.java index ee59d8609c..b17f92e690 100644 --- a/rs-client/src/main/java/Texture.java +++ b/runescape-client/src/main/java/Texture.java @@ -13,19 +13,15 @@ public class Texture extends Node { @Export("int1") int int1; @ObfuscatedName("u") - @Export("__u") boolean __u; @ObfuscatedName("g") @Export("records") int[] records; @ObfuscatedName("l") - @Export("__l") int[] __l; @ObfuscatedName("e") - @Export("__e") int[] __e; @ObfuscatedName("x") - @Export("__x") int[] __x; @ObfuscatedName("d") @Export("animationDirection") @@ -90,7 +86,6 @@ public class Texture extends Node { @ObfuscatedSignature( signature = "(DILir;)Z" ) - @Export("__m_230") boolean __m_230(double var1, int var3, AbstractIndexCache var4) { int var5; for(var5 = 0; var5 < this.records.length; ++var5) { diff --git a/rs-client/src/main/java/TextureLoader.java b/runescape-client/src/main/java/TextureLoader.java similarity index 90% rename from rs-client/src/main/java/TextureLoader.java rename to runescape-client/src/main/java/TextureLoader.java index 7f200191c0..7656d33409 100644 --- a/rs-client/src/main/java/TextureLoader.java +++ b/runescape-client/src/main/java/TextureLoader.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -10,6 +11,7 @@ public interface TextureLoader { signature = "(II)[I", garbageValue = "-905309626" ) + @Export("load") int[] load(int var1); @ObfuscatedName("w") @@ -31,5 +33,6 @@ public interface TextureLoader { signature = "(II)Z", garbageValue = "-1427873761" ) + @Export("isLowDetail") boolean isLowDetail(int var1); } diff --git a/rs-client/src/main/java/TextureProvider.java b/runescape-client/src/main/java/TextureProvider.java similarity index 59% rename from rs-client/src/main/java/TextureProvider.java rename to runescape-client/src/main/java/TextureProvider.java index 07bb12eef5..da771e9d17 100644 --- a/rs-client/src/main/java/TextureProvider.java +++ b/runescape-client/src/main/java/TextureProvider.java @@ -82,7 +82,6 @@ public class TextureProvider implements TextureLoader { signature = "(I)I", garbageValue = "-1996487053" ) - @Export("__m_212") public int __m_212() { int var1 = 0; int var2 = 0; @@ -155,7 +154,6 @@ public class TextureProvider implements TextureLoader { signature = "(II)I", garbageValue = "-1641984961" ) - @Export("__w_213") public int __w_213(int var1) { return this.textures[var1] != null?this.textures[var1].int1:0; } @@ -165,7 +163,6 @@ public class TextureProvider implements TextureLoader { signature = "(IB)Z", garbageValue = "14" ) - @Export("__o_214") public boolean __o_214(int var1) { return this.textures[var1].__u; } @@ -321,135 +318,135 @@ public class TextureProvider implements TextureLoader { int var3; int var4; if(var0 == 4000) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 + var4; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 + var4; return 1; } else if(var0 == 4001) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 - var4; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 - var4; return 1; } else if(var0 == 4002) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4 * var3; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4 * var3; return 1; } else if(var0 == 4003) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 / var4; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 / var4; return 1; } else if(var0 == 4004) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)var3); + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)var3); return 1; } else if(var0 == 4005) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)(var3 + 1)); + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)(var3 + 1)); return 1; } else if(var0 == 4006) { - class179.Interpreter_intStackSize -= 5; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - int var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - int var6 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3]; - int var7 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 4]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 + (var7 - var5) * (var4 - var3) / (var6 - var5); + RouteStrategy.Interpreter_intStackSize -= 5; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + int var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + int var6 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3]; + int var7 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 4]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 + (var7 - var5) * (var4 - var3) / (var6 - var5); return 1; } else if(var0 == 4007) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 + var3 * var4 / 100; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 + var3 * var4 / 100; return 1; } else if(var0 == 4008) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 | 1 << var4; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 | 1 << var4; return 1; } else if(var0 == 4009) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 & -1 - (1 << var4); + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 & -1 - (1 << var4); return 1; } else if(var0 == 4010) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (var3 & 1 << var4) != 0?1:0; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (var3 & 1 << var4) != 0?1:0; return 1; } else if(var0 == 4011) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 % var4; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 % var4; return 1; } else if(var0 == 4012) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; if(var3 == 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, (double)var4); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, (double)var4); } return 1; } else if(var0 == 4013) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; if(var3 == 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; return 1; } else { switch(var4) { case 0: - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Integer.MAX_VALUE; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Integer.MAX_VALUE; break; case 1: - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3; break; case 2: - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)Math.sqrt((double)var3); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)Math.sqrt((double)var3); break; case 3: - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)Math.cbrt((double)var3); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)Math.cbrt((double)var3); break; case 4: - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)Math.sqrt(Math.sqrt((double)var3)); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)Math.sqrt(Math.sqrt((double)var3)); break; default: - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, 1.0D / (double)var4); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, 1.0D / (double)var4); } return 1; } } else if(var0 == 4014) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 & var4; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 & var4; return 1; } else if(var0 == 4015) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3 | var4; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3 | var4; return 1; } else if(var0 == 4018) { - class179.Interpreter_intStackSize -= 3; - long var9 = (long)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - long var11 = (long)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - long var13 = (long)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (int)(var13 * var9 / var11); + RouteStrategy.Interpreter_intStackSize -= 3; + long var9 = (long)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + long var11 = (long)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + long var13 = (long)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (int)(var13 * var9 / var11); return 1; } else { return 2; diff --git a/rs-client/src/main/java/Tile.java b/runescape-client/src/main/java/Tile.java similarity index 90% rename from rs-client/src/main/java/Tile.java rename to runescape-client/src/main/java/Tile.java index f4bff62ad3..8a2336572e 100644 --- a/rs-client/src/main/java/Tile.java +++ b/runescape-client/src/main/java/Tile.java @@ -113,19 +113,16 @@ public final class Tile extends Node { @ObfuscatedGetter( intValue = 1724493981 ) - @Export("__y") int __y; @ObfuscatedName("h") @ObfuscatedGetter( intValue = -172066661 ) - @Export("__h") int __h; @ObfuscatedName("b") @ObfuscatedGetter( intValue = 2030010491 ) - @Export("__b") int __b; @ObfuscatedName("c") @ObfuscatedSignature( @@ -199,14 +196,14 @@ public final class Tile extends Node { } if(var0.isFollower && Client.followerOpsLowPriority) { - Tiles.method1106("Examine", BufferedFile.colorStartTag(16776960) + var4, 1003, var1, var2, var3); + Tiles.insertMenuItemNoShift("Examine", BufferedFile.colorStartTag(16776960) + var4, 1003, var1, var2, var3); } if(Client.isItemSelected == 1) { - Tiles.method1106("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16776960) + var4, 7, var1, var2, var3); + Tiles.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16776960) + var4, 7, var1, var2, var3); } else if(Client.isSpellSelected) { if((FloorDecoration.selectedSpellFlags & 2) == 2) { - Tiles.method1106(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16776960) + var4, 8, var1, var2, var3); + Tiles.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16776960) + var4, 8, var1, var2, var3); } } else { int var10 = var0.isFollower && Client.followerOpsLowPriority?2000:0; @@ -235,7 +232,7 @@ public final class Tile extends Node { var8 = var10 + 13; } - Tiles.method1106(var11[var7], BufferedFile.colorStartTag(16776960) + var4, var8, var1, var2, var3); + Tiles.insertMenuItemNoShift(var11[var7], BufferedFile.colorStartTag(16776960) + var4, var8, var1, var2, var3); } } } @@ -270,14 +267,14 @@ public final class Tile extends Node { var8 = var12 + 13; } - Tiles.method1106(var11[var7], BufferedFile.colorStartTag(16776960) + var4, var8, var1, var2, var3); + Tiles.insertMenuItemNoShift(var11[var7], BufferedFile.colorStartTag(16776960) + var4, var8, var1, var2, var3); } } } } if(!var0.isFollower || !Client.followerOpsLowPriority) { - Tiles.method1106("Examine", BufferedFile.colorStartTag(16776960) + var4, 1003, var1, var2, var3); + Tiles.insertMenuItemNoShift("Examine", BufferedFile.colorStartTag(16776960) + var4, 1003, var1, var2, var3); } } diff --git a/rs-client/src/main/java/TileLocation.java b/runescape-client/src/main/java/TileLocation.java similarity index 96% rename from rs-client/src/main/java/TileLocation.java rename to runescape-client/src/main/java/TileLocation.java index acb6f0c94a..35e6007294 100644 --- a/rs-client/src/main/java/TileLocation.java +++ b/runescape-client/src/main/java/TileLocation.java @@ -82,19 +82,16 @@ public class TileLocation { return this.plane + var1 + (this.x >> 6) + var1 + (this.y >> 6) + var1 + (this.x & 63) + var1 + (this.y & 63); } - @Export("__equals_382") @ObfuscatedName("equals") public boolean __equals_382(Object var1) { return this == var1?true:(!(var1 instanceof TileLocation)?false:this.equals0((TileLocation)var1)); } - @Export("__hashCode_383") @ObfuscatedName("hashCode") public int __hashCode_383() { return this.packed(); } - @Export("__toString_384") @ObfuscatedName("toString") public String __toString_384() { return this.toString0(","); diff --git a/rs-client/src/main/java/TileModel.java b/runescape-client/src/main/java/TileModel.java similarity index 98% rename from rs-client/src/main/java/TileModel.java rename to runescape-client/src/main/java/TileModel.java index 5f6589ce02..43694cdb9b 100644 --- a/rs-client/src/main/java/TileModel.java +++ b/runescape-client/src/main/java/TileModel.java @@ -6,25 +6,18 @@ import net.runelite.mapping.ObfuscatedName; @Implements("TileModel") public final class TileModel { @ObfuscatedName("z") - @Export("__dv_z") static int[] __dv_z; @ObfuscatedName("j") - @Export("__dv_j") static int[] __dv_j; @ObfuscatedName("s") - @Export("__dv_s") static int[] __dv_s; @ObfuscatedName("t") - @Export("__dv_t") static int[] __dv_t; @ObfuscatedName("y") - @Export("__dv_y") static int[] __dv_y; @ObfuscatedName("h") - @Export("__dv_h") static final int[][] __dv_h; @ObfuscatedName("b") - @Export("__dv_b") static final int[][] __dv_b; @ObfuscatedName("m") @Export("vertexX") diff --git a/rs-client/src/main/java/TilePaint.java b/runescape-client/src/main/java/TilePaint.java similarity index 99% rename from rs-client/src/main/java/TilePaint.java rename to runescape-client/src/main/java/TilePaint.java index 0a2baa9bb2..e63ed8340a 100644 --- a/rs-client/src/main/java/TilePaint.java +++ b/runescape-client/src/main/java/TilePaint.java @@ -11,7 +11,6 @@ public final class TilePaint { @ObfuscatedSignature( signature = "Lla;" ) - @Export("__eb_ah") static Bounds __eb_ah; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/Tiles.java b/runescape-client/src/main/java/Tiles.java similarity index 87% rename from rs-client/src/main/java/Tiles.java rename to runescape-client/src/main/java/Tiles.java index cd80b832f6..2c80cd3d1a 100644 --- a/rs-client/src/main/java/Tiles.java +++ b/runescape-client/src/main/java/Tiles.java @@ -20,43 +20,32 @@ public final class Tiles { @Export("Tiles_minPlane") static int Tiles_minPlane; @ObfuscatedName("w") - @Export("__bq_w") static byte[][][] __bq_w; @ObfuscatedName("l") - @Export("__bq_l") static byte[][][] __bq_l; @ObfuscatedName("a") - @Export("__bq_a") static int[][][] __bq_a; @ObfuscatedName("t") - @Export("__bq_t") static final int[] __bq_t; @ObfuscatedName("y") - @Export("__bq_y") static final int[] __bq_y; @ObfuscatedName("h") - @Export("__bq_h") static final int[] __bq_h; @ObfuscatedName("b") - @Export("__bq_b") static final int[] __bq_b; @ObfuscatedName("c") - @Export("__bq_c") static final int[] __bq_c; @ObfuscatedName("r") - @Export("__bq_r") static final int[] __bq_r; @ObfuscatedName("p") @ObfuscatedGetter( intValue = -2142579405 ) - @Export("__bq_p") static int __bq_p; @ObfuscatedName("v") @ObfuscatedGetter( intValue = 834543729 ) - @Export("__bq_v") static int __bq_v; static { @@ -93,7 +82,8 @@ public final class Tiles { signature = "(Ljava/lang/String;Ljava/lang/String;IIIII)V", garbageValue = "-1525245246" ) - public static final void method1106(String var0, String var1, int var2, int var3, int var4, int var5) { + @Export("insertMenuItemNoShift") + public static final void insertMenuItemNoShift(String var0, String var1, int var2, int var3, int var4, int var5) { class16.insertMenuItem(var0, var1, var2, var3, var4, var5, false); } } diff --git a/rs-client/src/main/java/Timer.java b/runescape-client/src/main/java/Timer.java similarity index 92% rename from rs-client/src/main/java/Timer.java rename to runescape-client/src/main/java/Timer.java index 31fecfa510..97088532cc 100644 --- a/rs-client/src/main/java/Timer.java +++ b/runescape-client/src/main/java/Timer.java @@ -11,58 +11,48 @@ public class Timer { @ObfuscatedGetter( longValue = 6181704275746246665L ) - @Export("__m") long __m; @ObfuscatedName("f") @ObfuscatedGetter( longValue = -8166664055136527097L ) - @Export("__f") long __f; @ObfuscatedName("q") - @Export("__q") public boolean __q; @ObfuscatedName("w") @ObfuscatedGetter( longValue = -6206176920376957899L ) - @Export("__w") long __w; @ObfuscatedName("o") @ObfuscatedGetter( longValue = -5820022560321695785L ) - @Export("__o") long __o; @ObfuscatedName("u") @ObfuscatedGetter( longValue = -7044840680232740733L ) - @Export("__u") long __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -500639955 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 2043109577 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 978183419 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = 1684916659 ) - @Export("__x") int __x; public Timer() { @@ -83,7 +73,6 @@ public class Timer { signature = "(I)V", garbageValue = "2027048361" ) - @Export("__m_453") public void __m_453() { this.__m = class203.currentTimeMs(); } @@ -93,7 +82,6 @@ public class Timer { signature = "(B)V", garbageValue = "3" ) - @Export("__f_454") public void __f_454() { if(-1L != this.__m) { this.__o = class203.currentTimeMs() - this.__m; @@ -107,7 +95,6 @@ public class Timer { signature = "(II)V", garbageValue = "-1162738177" ) - @Export("__q_455") public void __q_455(int var1) { this.__f = class203.currentTimeMs(); this.__g = var1; @@ -118,7 +105,6 @@ public class Timer { signature = "(I)V", garbageValue = "-1855026926" ) - @Export("__w_456") public void __w_456() { if(this.__f != -1L) { this.__w = class203.currentTimeMs() - this.__f; @@ -134,7 +120,6 @@ public class Timer { signature = "(S)V", garbageValue = "-30171" ) - @Export("__o_457") public void __o_457() { this.__q = false; this.__l = 0; @@ -145,7 +130,6 @@ public class Timer { signature = "(I)V", garbageValue = "-812012402" ) - @Export("__u_458") public void __u_458() { this.__w_456(); } diff --git a/rs-client/src/main/java/TotalQuantityComparator.java b/runescape-client/src/main/java/TotalQuantityComparator.java similarity index 93% rename from rs-client/src/main/java/TotalQuantityComparator.java rename to runescape-client/src/main/java/TotalQuantityComparator.java index 5043399310..14da8aef2c 100644 --- a/rs-client/src/main/java/TotalQuantityComparator.java +++ b/runescape-client/src/main/java/TotalQuantityComparator.java @@ -12,7 +12,6 @@ final class TotalQuantityComparator implements Comparator { signature = "(Ll;Ll;I)I", garbageValue = "-573736433" ) - @Export("__m_5") int __m_5(GrandExchangeEvent var1, GrandExchangeEvent var2) { return var1.grandExchangeOffer.totalQuantity < var2.grandExchangeOffer.totalQuantity?-1:(var2.grandExchangeOffer.totalQuantity == var1.grandExchangeOffer.totalQuantity?0:1); } @@ -23,7 +22,6 @@ final class TotalQuantityComparator implements Comparator { return this.__m_5((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @Export("__equals_7") @ObfuscatedName("equals") public boolean __equals_7(Object var1) { return super.equals(var1); @@ -164,10 +162,10 @@ final class TotalQuantityComparator implements Comparator { int var10; if(Client.isItemSelected == 1) { - Tiles.method1106("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16777215) + var4, 14, var1, var2, var3); + Tiles.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16777215) + var4, 14, var1, var2, var3); } else if(Client.isSpellSelected) { if((FloorDecoration.selectedSpellFlags & 8) == 8) { - Tiles.method1106(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16777215) + var4, 15, var1, var2, var3); + Tiles.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16777215) + var4, 15, var1, var2, var3); } } else { for(var10 = 7; var10 >= 0; --var10) { @@ -195,7 +193,7 @@ final class TotalQuantityComparator implements Comparator { boolean var12 = false; var7 = Client.playerMenuOpcodes[var10] + var11; - Tiles.method1106(Client.playerMenuActions[var10], BufferedFile.colorStartTag(16777215) + var4, var7, var1, var2, var3); + Tiles.insertMenuItemNoShift(Client.playerMenuActions[var10], BufferedFile.colorStartTag(16777215) + var4, var7, var1, var2, var3); } } } diff --git a/rs-client/src/main/java/TriBool.java b/runescape-client/src/main/java/TriBool.java similarity index 100% rename from rs-client/src/main/java/TriBool.java rename to runescape-client/src/main/java/TriBool.java diff --git a/rs-client/src/main/java/UnderlayDefinition.java b/runescape-client/src/main/java/UnderlayDefinition.java similarity index 100% rename from rs-client/src/main/java/UnderlayDefinition.java rename to runescape-client/src/main/java/UnderlayDefinition.java diff --git a/rs-client/src/main/java/UnitPriceComparator.java b/runescape-client/src/main/java/UnitPriceComparator.java similarity index 98% rename from rs-client/src/main/java/UnitPriceComparator.java rename to runescape-client/src/main/java/UnitPriceComparator.java index 8e047d794a..57e4706f23 100644 --- a/rs-client/src/main/java/UnitPriceComparator.java +++ b/runescape-client/src/main/java/UnitPriceComparator.java @@ -25,7 +25,6 @@ final class UnitPriceComparator implements Comparator { signature = "(Ll;Ll;I)I", garbageValue = "-120071238" ) - @Export("__m_11") int __m_11(GrandExchangeEvent var1, GrandExchangeEvent var2) { return var1.grandExchangeOffer.unitPrice < var2.grandExchangeOffer.unitPrice?-1:(var2.grandExchangeOffer.unitPrice == var1.grandExchangeOffer.unitPrice?0:1); } @@ -36,7 +35,6 @@ final class UnitPriceComparator implements Comparator { return this.__m_11((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @Export("__equals_13") @ObfuscatedName("equals") public boolean __equals_13(Object var1) { return super.equals(var1); @@ -198,7 +196,7 @@ final class UnitPriceComparator implements Comparator { if(Client.hintArrowType == 2) { WorldMapLabel.worldToScreen((Client.hintArrowX - class50.baseX << 7) + Client.hintArrowSubX, (Client.hintArrowY - GraphicsObject.baseY << 7) + Client.hintArrowSubY, Client.hintArrowHeight * 2); if(Client.viewportTempX > -1 && Client.cycle % 20 < 10) { - Player.headIconHintSprites[0].__a_505(var0 + Client.viewportTempX - 12, Client.viewportTempY + var1 - 28); + Player.headIconHintSprites[0].drawAt2(var0 + Client.viewportTempX - 12, Client.viewportTempY + var1 - 28); } } diff --git a/rs-client/src/main/java/UrlRequest.java b/runescape-client/src/main/java/UrlRequest.java similarity index 94% rename from rs-client/src/main/java/UrlRequest.java rename to runescape-client/src/main/java/UrlRequest.java index 9244a34c4f..c911d6c9be 100644 --- a/rs-client/src/main/java/UrlRequest.java +++ b/runescape-client/src/main/java/UrlRequest.java @@ -11,8 +11,8 @@ public class UrlRequest { @ObfuscatedSignature( signature = "[Llq;" ) - @Export("__ey_bx") - static IndexedSprite[] __ey_bx; + @Export("worldSelectStars") + static IndexedSprite[] worldSelectStars; @ObfuscatedName("m") @Export("url") final URL url; diff --git a/rs-client/src/main/java/UrlRequester.java b/runescape-client/src/main/java/UrlRequester.java similarity index 99% rename from rs-client/src/main/java/UrlRequester.java rename to runescape-client/src/main/java/UrlRequester.java index 0c8feaf05e..f34eb61bc9 100644 --- a/rs-client/src/main/java/UrlRequester.java +++ b/runescape-client/src/main/java/UrlRequester.java @@ -18,13 +18,11 @@ public class UrlRequester implements Runnable { @ObfuscatedGetter( intValue = -883931753 ) - @Export("__eo_u") static int __eo_u; @ObfuscatedName("ak") @ObfuscatedSignature( signature = "Lla;" ) - @Export("__eo_ak") static Bounds __eo_ak; @ObfuscatedName("m") @Export("thread") diff --git a/rs-client/src/main/java/User.java b/runescape-client/src/main/java/User.java similarity index 100% rename from rs-client/src/main/java/User.java rename to runescape-client/src/main/java/User.java diff --git a/rs-client/src/main/java/UserComparator1.java b/runescape-client/src/main/java/UserComparator1.java similarity index 93% rename from rs-client/src/main/java/UserComparator1.java rename to runescape-client/src/main/java/UserComparator1.java index f7cbf2af65..a289a2a733 100644 --- a/rs-client/src/main/java/UserComparator1.java +++ b/runescape-client/src/main/java/UserComparator1.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator1") public class UserComparator1 implements Comparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator1(boolean var1) { @@ -20,7 +19,6 @@ public class UserComparator1 implements Comparator { signature = "(Ljs;Ljs;B)I", garbageValue = "68" ) - @Export("__m_476") int __m_476(User var1, User var2) { return this.__m?var1.compareTo0(var2):var2.compareTo0(var1); } @@ -31,7 +29,6 @@ public class UserComparator1 implements Comparator { return this.__m_476((User)var1, (User)var2); } - @Export("__equals_478") @ObfuscatedName("equals") public boolean __equals_478(Object var1) { return super.equals(var1); diff --git a/rs-client/src/main/java/UserComparator10.java b/runescape-client/src/main/java/UserComparator10.java similarity index 96% rename from rs-client/src/main/java/UserComparator10.java rename to runescape-client/src/main/java/UserComparator10.java index 332af67291..693298d8ab 100644 --- a/rs-client/src/main/java/UserComparator10.java +++ b/runescape-client/src/main/java/UserComparator10.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator10") public class UserComparator10 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator10(boolean var1) { @@ -20,7 +19,6 @@ public class UserComparator10 extends AbstractUserComparator { signature = "(Lke;Lke;B)I", garbageValue = "-15" ) - @Export("__m_268") int __m_268(Buddy var1, Buddy var2) { return Client.worldId == var1.world0 && var2.world0 == Client.worldId?(this.__m?var1.int2 - var2.int2:var2.int2 - var1.int2):this.__x_461(var1, var2); } @@ -37,7 +35,7 @@ public class UserComparator10 extends AbstractUserComparator { garbageValue = "653874364" ) static final void method3352(boolean var0) { - class13.method163(); + class13.playPcmPlayers(); ++Client.packetWriter.__d; if(Client.packetWriter.__d >= 50 || var0) { Client.packetWriter.__d = 0; diff --git a/rs-client/src/main/java/UserComparator2.java b/runescape-client/src/main/java/UserComparator2.java similarity index 93% rename from rs-client/src/main/java/UserComparator2.java rename to runescape-client/src/main/java/UserComparator2.java index dd5f73e97d..cf58e0cd5c 100644 --- a/rs-client/src/main/java/UserComparator2.java +++ b/runescape-client/src/main/java/UserComparator2.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator2") public class UserComparator2 implements Comparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator2(boolean var1) { @@ -20,12 +19,10 @@ public class UserComparator2 implements Comparator { signature = "(Ljs;Ljs;I)I", garbageValue = "-2069683911" ) - @Export("__m_479") int __m_479(User var1, User var2) { return this.__m?var1.username().compareTo0(var2.username()):var2.username().compareTo0(var1.username()); } - @Export("__equals_481") @ObfuscatedName("equals") public boolean __equals_481(Object var1) { return super.equals(var1); diff --git a/rs-client/src/main/java/UserComparator3.java b/runescape-client/src/main/java/UserComparator3.java similarity index 97% rename from rs-client/src/main/java/UserComparator3.java rename to runescape-client/src/main/java/UserComparator3.java index a965353599..f6e38ee6bf 100644 --- a/rs-client/src/main/java/UserComparator3.java +++ b/runescape-client/src/main/java/UserComparator3.java @@ -19,7 +19,6 @@ public class UserComparator3 extends AbstractUserComparator { @Export("socketTask") static Task socketTask; @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator3(boolean var1) { @@ -31,7 +30,6 @@ public class UserComparator3 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "-1157645406" ) - @Export("__m_274") int __m_274(Buddy var1, Buddy var2) { return var2.world0 != var1.world0?(this.__m?var1.world0 - var2.world0:var2.world0 - var1.world0):this.__x_461(var1, var2); } diff --git a/rs-client/src/main/java/UserComparator4.java b/runescape-client/src/main/java/UserComparator4.java similarity index 78% rename from rs-client/src/main/java/UserComparator4.java rename to runescape-client/src/main/java/UserComparator4.java index 7384424adb..b6b05a509f 100644 --- a/rs-client/src/main/java/UserComparator4.java +++ b/runescape-client/src/main/java/UserComparator4.java @@ -15,7 +15,6 @@ public class UserComparator4 implements Comparator { @Export("WorldMapElement_count") public static int WorldMapElement_count; @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator4(boolean var1) { @@ -27,12 +26,10 @@ public class UserComparator4 implements Comparator { signature = "(Lke;Lke;I)I", garbageValue = "950234237" ) - @Export("__m_261") int __m_261(Buddy var1, Buddy var2) { return this.__m?var1.int2 - var2.int2:var2.int2 - var1.int2; } - @Export("__equals_263") @ObfuscatedName("equals") public boolean __equals_263(Object var1) { return super.equals(var1); @@ -60,32 +57,32 @@ public class UserComparator4 implements Comparator { ) static int method3335(int var0, Script var1, boolean var2) { if(var0 == 5306) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = SpotAnimationDefinition.method4822(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = SpotAnimationDefinition.method4822(); return 1; } else { int var3; if(var0 == 5307) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var3 == 1 || var3 == 2) { GroundItem.method2095(var3); } return 1; } else if(var0 == 5308) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.windowMode; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.windowMode; return 1; } else if(var0 != 5309) { if(var0 == 5310) { - --class179.Interpreter_intStackSize; + --RouteStrategy.Interpreter_intStackSize; return 1; } else { return 2; } } else { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var3 == 1 || var3 == 2) { ReflectionCheck.clientPreferences.windowMode = var3; - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); } return 1; diff --git a/rs-client/src/main/java/UserComparator5.java b/runescape-client/src/main/java/UserComparator5.java similarity index 98% rename from rs-client/src/main/java/UserComparator5.java rename to runescape-client/src/main/java/UserComparator5.java index 5a90abe58e..0ee89e85f2 100644 --- a/rs-client/src/main/java/UserComparator5.java +++ b/runescape-client/src/main/java/UserComparator5.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator5") public class UserComparator5 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator5(boolean var1) { @@ -19,7 +18,6 @@ public class UserComparator5 extends AbstractUserComparator { signature = "(Lke;Lke;B)I", garbageValue = "-22" ) - @Export("__m_272") int __m_272(Buddy var1, Buddy var2) { if(var1.world0 != 0) { if(var2.world0 == 0) { diff --git a/rs-client/src/main/java/UserComparator6.java b/runescape-client/src/main/java/UserComparator6.java similarity index 97% rename from rs-client/src/main/java/UserComparator6.java rename to runescape-client/src/main/java/UserComparator6.java index 7f362451fc..90761a877b 100644 --- a/rs-client/src/main/java/UserComparator6.java +++ b/runescape-client/src/main/java/UserComparator6.java @@ -16,10 +16,8 @@ public class UserComparator6 extends AbstractUserComparator { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__fg_jh") static Widget __fg_jh; @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator6(boolean var1) { @@ -31,7 +29,6 @@ public class UserComparator6 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "750521759" ) - @Export("__m_276") int __m_276(Buddy var1, Buddy var2) { return var1.world0 != 0 && var2.world0 != 0?(this.__m?var1.username().compareTo0(var2.username()):var2.username().compareTo0(var1.username())):this.__x_461(var1, var2); } diff --git a/rs-client/src/main/java/UserComparator7.java b/runescape-client/src/main/java/UserComparator7.java similarity index 99% rename from rs-client/src/main/java/UserComparator7.java rename to runescape-client/src/main/java/UserComparator7.java index fb9a9a7e5f..f5387fbc87 100644 --- a/rs-client/src/main/java/UserComparator7.java +++ b/runescape-client/src/main/java/UserComparator7.java @@ -10,7 +10,6 @@ import net.runelite.rs.Reflection; @Implements("UserComparator7") public class UserComparator7 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator7(boolean var1) { @@ -22,7 +21,6 @@ public class UserComparator7 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "-9252550" ) - @Export("__m_270") int __m_270(Buddy var1, Buddy var2) { return var1.world0 != 0 && var2.world0 != 0?(this.__m?var1.int2 - var2.int2:var2.int2 - var1.int2):this.__x_461(var1, var2); } diff --git a/rs-client/src/main/java/UserComparator8.java b/runescape-client/src/main/java/UserComparator8.java similarity index 96% rename from rs-client/src/main/java/UserComparator8.java rename to runescape-client/src/main/java/UserComparator8.java index 439854532e..ae6288a967 100644 --- a/rs-client/src/main/java/UserComparator8.java +++ b/runescape-client/src/main/java/UserComparator8.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator8") public class UserComparator8 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator8(boolean var1) { @@ -19,7 +18,6 @@ public class UserComparator8 extends AbstractUserComparator { signature = "(Lke;Lke;B)I", garbageValue = "0" ) - @Export("__m_266") int __m_266(Buddy var1, Buddy var2) { if(Client.worldId == var1.world0) { if(var2.world0 != Client.worldId) { diff --git a/rs-client/src/main/java/UserComparator9.java b/runescape-client/src/main/java/UserComparator9.java similarity index 97% rename from rs-client/src/main/java/UserComparator9.java rename to runescape-client/src/main/java/UserComparator9.java index 561e9e45aa..b44d9086e3 100644 --- a/rs-client/src/main/java/UserComparator9.java +++ b/runescape-client/src/main/java/UserComparator9.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator9") public class UserComparator9 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator9(boolean var1) { @@ -20,7 +19,6 @@ public class UserComparator9 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "1966780392" ) - @Export("__m_264") int __m_264(Buddy var1, Buddy var2) { return Client.worldId == var1.world0 && var2.world0 == Client.worldId?(this.__m?var1.username().compareTo0(var2.username()):var2.username().compareTo0(var1.username())):this.__x_461(var1, var2); } @@ -62,7 +60,8 @@ public class UserComparator9 extends AbstractUserComparator { signature = "(I)[Lln;", garbageValue = "-1724028611" ) - public static Sprite[] method3344() { + @Export("createSpriteArray") + public static Sprite[] createSpriteArray() { Sprite[] var0 = new Sprite[class328.indexedSpriteCount]; for(int var1 = 0; var1 < class328.indexedSpriteCount; ++var1) { diff --git a/rs-client/src/main/java/UserList.java b/runescape-client/src/main/java/UserList.java similarity index 100% rename from rs-client/src/main/java/UserList.java rename to runescape-client/src/main/java/UserList.java diff --git a/rs-client/src/main/java/Username.java b/runescape-client/src/main/java/Username.java similarity index 94% rename from rs-client/src/main/java/Username.java rename to runescape-client/src/main/java/Username.java index 190036bd6c..bbcdaf3dee 100644 --- a/rs-client/src/main/java/Username.java +++ b/runescape-client/src/main/java/Username.java @@ -54,9 +54,9 @@ public class Username implements Comparable { return this.cleanName == null?(var1.cleanName == null?0:1):(var1.cleanName == null?-1:this.cleanName.compareTo(var1.cleanName)); } - @Export("__equals_466") + @Export("equals") @ObfuscatedName("equals") - public boolean __equals_466(Object var1) { + public boolean equals(Object var1) { if(var1 instanceof Username) { Username var2 = (Username)var1; if (this.cleanName == null) @@ -72,13 +72,11 @@ public class Username implements Comparable { } } - @Export("__hashCode_467") @ObfuscatedName("hashCode") public int __hashCode_467() { return this.cleanName == null?0:this.cleanName.hashCode(); } - @Export("__toString_468") @ObfuscatedName("toString") public String __toString_468() { return this.getName(); diff --git a/rs-client/src/main/java/Usernamed.java b/runescape-client/src/main/java/Usernamed.java similarity index 100% rename from rs-client/src/main/java/Usernamed.java rename to runescape-client/src/main/java/Usernamed.java diff --git a/rs-client/src/main/java/VarbitDefinition.java b/runescape-client/src/main/java/VarbitDefinition.java similarity index 100% rename from rs-client/src/main/java/VarbitDefinition.java rename to runescape-client/src/main/java/VarbitDefinition.java diff --git a/rs-client/src/main/java/VarcInt.java b/runescape-client/src/main/java/VarcInt.java similarity index 89% rename from rs-client/src/main/java/VarcInt.java rename to runescape-client/src/main/java/VarcInt.java index aa107f00f7..4734f53ee8 100644 --- a/rs-client/src/main/java/VarcInt.java +++ b/runescape-client/src/main/java/VarcInt.java @@ -11,20 +11,19 @@ public class VarcInt extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__iw_m") static AbstractIndexCache __iw_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Ler;" ) - @Export("__iw_f") - static EvictingDualNodeHashTable __iw_f; + @Export("cachedVarcInts") + static EvictingDualNodeHashTable cachedVarcInts; @ObfuscatedName("q") @Export("persist") public boolean persist; static { - __iw_f = new EvictingDualNodeHashTable(64); + cachedVarcInts = new EvictingDualNodeHashTable(64); } VarcInt() { @@ -36,7 +35,6 @@ public class VarcInt extends DualNode { signature = "(Lgr;I)V", garbageValue = "1023420886" ) - @Export("__q_411") void __q_411(Buffer var1) { while(true) { int var2 = var1.readUnsignedByte(); @@ -53,7 +51,6 @@ public class VarcInt extends DualNode { signature = "(Lgr;II)V", garbageValue = "-202810982" ) - @Export("__w_412") void __w_412(Buffer var1, int var2) { if(var2 == 2) { this.persist = true; @@ -76,7 +73,8 @@ public class VarcInt extends DualNode { signature = "(CI)Z", garbageValue = "1367119425" ) - public static boolean method4807(char var0) { + @Export("isAlphaNumeric") + public static boolean isAlphaNumeric(char var0) { return var0 >= '0' && var0 <= '9' || var0 >= 'A' && var0 <= 'Z' || var0 >= 'a' && var0 <= 'z'; } } diff --git a/rs-client/src/main/java/Varcs.java b/runescape-client/src/main/java/Varcs.java similarity index 99% rename from rs-client/src/main/java/Varcs.java rename to runescape-client/src/main/java/Varcs.java index c9a3e7e62e..8efa66c2e2 100644 --- a/rs-client/src/main/java/Varcs.java +++ b/runescape-client/src/main/java/Varcs.java @@ -39,7 +39,7 @@ public class Varcs { int var2; for(var2 = 0; var2 < var1; ++var2) { - VarcInt var3 = AbstractByteArrayCopier.method4021(var2); + VarcInt var3 = AbstractByteArrayCopier.getVarcInt(var2); this.intsPersistence[var2] = var3.persist; } @@ -219,7 +219,7 @@ public class Varcs { ++var12; } - var32.writeByte(var9.field17); + var32.writeByte(var9.id); Class var34 = var8.getClass(); class3[] var15 = class3.method34(); int var16 = 0; diff --git a/rs-client/src/main/java/VarpDefinition.java b/runescape-client/src/main/java/VarpDefinition.java similarity index 97% rename from rs-client/src/main/java/VarpDefinition.java rename to runescape-client/src/main/java/VarpDefinition.java index f313cd4d68..1fb5900843 100644 --- a/rs-client/src/main/java/VarpDefinition.java +++ b/runescape-client/src/main/java/VarpDefinition.java @@ -11,13 +11,11 @@ public class VarpDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ix_m") public static AbstractIndexCache __ix_m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 510774535 ) - @Export("__ix_f") public static int __ix_f; @ObfuscatedName("q") @ObfuscatedSignature( diff --git a/rs-client/src/main/java/Varps.java b/runescape-client/src/main/java/Varps.java similarity index 96% rename from rs-client/src/main/java/Varps.java rename to runescape-client/src/main/java/Varps.java index 44e172eeb8..9e064f5004 100644 --- a/rs-client/src/main/java/Varps.java +++ b/runescape-client/src/main/java/Varps.java @@ -20,8 +20,8 @@ public class Varps { @ObfuscatedGetter( intValue = 120772859 ) - @Export("__hv_h") - static int __hv_h; + @Export("loginBoxCenter") + static int loginBoxCenter; static { Varps_masks = new int[32]; diff --git a/rs-client/src/main/java/VertexNormal.java b/runescape-client/src/main/java/VertexNormal.java similarity index 86% rename from rs-client/src/main/java/VertexNormal.java rename to runescape-client/src/main/java/VertexNormal.java index 96659bd75e..05c9b9616c 100644 --- a/rs-client/src/main/java/VertexNormal.java +++ b/runescape-client/src/main/java/VertexNormal.java @@ -8,37 +8,31 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("VertexNormal") public class VertexNormal { @ObfuscatedName("pe") - @Export("__dq_pe") static boolean __dq_pe; @ObfuscatedName("rq") @ObfuscatedGetter( intValue = 1351620693 ) - @Export("__dq_rq") static int __dq_rq; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 1414310131 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1493845293 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 1575149515 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -487323631 ) - @Export("__w") int __w; VertexNormal() { @@ -67,10 +61,10 @@ public class VertexNormal { } else if(var0.length == 30000 && ByteArrayPool.ByteArrayPool_largeCount < 50) { ByteArrayPool.ByteArrayPool_large[++ByteArrayPool.ByteArrayPool_largeCount - 1] = var0; } else { - if(class179.__fe_e != null) { + if(RouteStrategy.__fe_e != null) { for(int var1 = 0; var1 < ByteArrayPool.__gi_g.length; ++var1) { - if(var0.length == ByteArrayPool.__gi_g[var1] && WorldMapSection2.__ah_l[var1] < class179.__fe_e[var1].length) { - class179.__fe_e[var1][WorldMapSection2.__ah_l[var1]++] = var0; + if(var0.length == ByteArrayPool.__gi_g[var1] && WorldMapSection2.__ah_l[var1] < RouteStrategy.__fe_e[var1].length) { + RouteStrategy.__fe_e[var1][WorldMapSection2.__ah_l[var1]++] = var0; return; } } diff --git a/rs-client/src/main/java/ViewportMouse.java b/runescape-client/src/main/java/ViewportMouse.java similarity index 84% rename from rs-client/src/main/java/ViewportMouse.java rename to runescape-client/src/main/java/ViewportMouse.java index 5bd207bddf..c1ff7b8b25 100644 --- a/rs-client/src/main/java/ViewportMouse.java +++ b/runescape-client/src/main/java/ViewportMouse.java @@ -29,25 +29,21 @@ public class ViewportMouse { @ObfuscatedGetter( intValue = 1135175963 ) - @Export("__dm_u") static int __dm_u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 262104267 ) - @Export("__dm_g") static int __dm_g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -2071972829 ) - @Export("__dm_l") static int __dm_l; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -852671813 ) - @Export("__dm_k") static int __dm_k; @ObfuscatedName("i") @ObfuscatedGetter( @@ -84,24 +80,24 @@ public class ViewportMouse { garbageValue = "2128573585" ) static int method2983(int var0, Script var1, boolean var2) { - Widget var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + Widget var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); if(var0 == 2500) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.x; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.x; return 1; } else if(var0 == 2501) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.y; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.y; return 1; } else if(var0 == 2502) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.width; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.width; return 1; } else if(var0 == 2503) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.height; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.height; return 1; } else if(var0 == 2504) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.isHidden?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.isHidden?1:0; return 1; } else if(var0 == 2505) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.parentId; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.parentId; return 1; } else { return 2; diff --git a/rs-client/src/main/java/WallDecoration.java b/runescape-client/src/main/java/WallDecoration.java similarity index 97% rename from rs-client/src/main/java/WallDecoration.java rename to runescape-client/src/main/java/WallDecoration.java index 3220722c25..b472fef687 100644 --- a/rs-client/src/main/java/WallDecoration.java +++ b/runescape-client/src/main/java/WallDecoration.java @@ -35,8 +35,8 @@ public final class WallDecoration { @ObfuscatedGetter( intValue = -303827911 ) - @Export("int7") - int int7; + @Export("orientation2") + int orientation2; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 1927462659 diff --git a/rs-client/src/main/java/Widget.java b/runescape-client/src/main/java/Widget.java similarity index 98% rename from rs-client/src/main/java/Widget.java rename to runescape-client/src/main/java/Widget.java index 0fa2775b3e..afda76d29b 100644 --- a/rs-client/src/main/java/Widget.java +++ b/runescape-client/src/main/java/Widget.java @@ -32,7 +32,6 @@ public class Widget extends Node { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ho_d") public static AbstractIndexCache __ho_d; @ObfuscatedName("n") @ObfuscatedSignature( @@ -56,10 +55,8 @@ public class Widget extends Node { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__ho_z") static EvictingDualNodeHashTable __ho_z; @ObfuscatedName("j") - @Export("__ho_j") public static boolean __ho_j; @ObfuscatedName("s") @Export("isIf3") @@ -170,13 +167,11 @@ public class Widget extends Node { @ObfuscatedGetter( intValue = 206556853 ) - @Export("__aw") public int __aw; @ObfuscatedName("al") @ObfuscatedGetter( intValue = -1047989223 ) - @Export("__al") public int __al; @ObfuscatedName("ab") @ObfuscatedGetter( @@ -254,7 +249,6 @@ public class Widget extends Node { @ObfuscatedGetter( intValue = -1853255291 ) - @Export("__af") public int __af; @ObfuscatedName("ai") @ObfuscatedGetter( @@ -263,7 +257,6 @@ public class Widget extends Node { @Export("lineWid") public int lineWid; @ObfuscatedName("ba") - @Export("__ba") public boolean __ba; @ObfuscatedName("bb") @ObfuscatedGetter( @@ -380,19 +373,16 @@ public class Widget extends Node { @ObfuscatedGetter( intValue = -1692331135 ) - @Export("__bf") public int __bf; @ObfuscatedName("bh") @ObfuscatedGetter( intValue = 727421593 ) - @Export("__bh") public int __bh; @ObfuscatedName("be") @Export("modelOrthog") public boolean modelOrthog; @ObfuscatedName("bv") - @Export("__bv") public boolean __bv; @ObfuscatedName("bw") @ObfuscatedGetter( @@ -464,19 +454,14 @@ public class Widget extends Node { @Export("clickMask") public int clickMask; @ObfuscatedName("cg") - @Export("__cg") public boolean __cg; @ObfuscatedName("cf") - @Export("__cf") public byte[][] __cf; @ObfuscatedName("cp") - @Export("__cp") public byte[][] __cp; @ObfuscatedName("cc") - @Export("__cc") public int[] __cc; @ObfuscatedName("ci") - @Export("__ci") public int[] __ci; @ObfuscatedName("de") @Export("dataText") @@ -575,34 +560,26 @@ public class Widget extends Node { @Export("onScroll") public Object[] onScroll; @ObfuscatedName("em") - @Export("__em") public Object[] __em; @ObfuscatedName("ed") @Export("onKeyListener") public Object[] onKeyListener; @ObfuscatedName("ex") - @Export("__ex") public Object[] __ex; @ObfuscatedName("ej") - @Export("__ej") public Object[] __ej; @ObfuscatedName("el") - @Export("__el") public Object[] __el; @ObfuscatedName("en") @Export("onDialogAbortListener") public Object[] onDialogAbortListener; @ObfuscatedName("ei") - @Export("__ei") public Object[] __ei; @ObfuscatedName("ee") - @Export("__ee") public Object[] __ee; @ObfuscatedName("eq") - @Export("__eq") public Object[] __eq; @ObfuscatedName("eh") - @Export("__eh") public Object[] __eh; @ObfuscatedName("eo") @Export("cs1Instructions") @@ -662,34 +639,28 @@ public class Widget extends Node { @Export("children") public Widget[] children; @ObfuscatedName("fq") - @Export("__fq") public boolean __fq; @ObfuscatedName("fw") - @Export("__fw") public boolean __fw; @ObfuscatedName("fg") @ObfuscatedGetter( intValue = -1520351537 ) - @Export("__fg") public int __fg; @ObfuscatedName("fc") @ObfuscatedGetter( intValue = 209458049 ) - @Export("__fc") public int __fc; @ObfuscatedName("fl") @ObfuscatedGetter( intValue = -672198209 ) - @Export("__fl") public int __fl; @ObfuscatedName("fj") @ObfuscatedGetter( intValue = 876695207 ) - @Export("__fj") public int __fj; @ObfuscatedName("fp") @ObfuscatedGetter( @@ -704,7 +675,6 @@ public class Widget extends Node { @Export("cycle") public int cycle; @ObfuscatedName("fh") - @Export("__fh") public int[] __fh; @ObfuscatedName("fx") @Export("noClickThrough") @@ -713,7 +683,6 @@ public class Widget extends Node { @Export("noScrollThrough") public boolean noScrollThrough; @ObfuscatedName("fz") - @Export("__fz") public boolean __fz; static { diff --git a/rs-client/src/main/java/WidgetGroupParent.java b/runescape-client/src/main/java/WidgetGroupParent.java similarity index 99% rename from rs-client/src/main/java/WidgetGroupParent.java rename to runescape-client/src/main/java/WidgetGroupParent.java index 0039676529..491c7b8343 100644 --- a/rs-client/src/main/java/WidgetGroupParent.java +++ b/runescape-client/src/main/java/WidgetGroupParent.java @@ -17,7 +17,6 @@ public class WidgetGroupParent extends Node { @ObfuscatedGetter( intValue = -992379173 ) - @Export("__bx_o") static int __bx_o; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/World.java b/runescape-client/src/main/java/World.java similarity index 83% rename from rs-client/src/main/java/World.java rename to runescape-client/src/main/java/World.java index 9035ee1dac..17297fb7e8 100644 --- a/rs-client/src/main/java/World.java +++ b/runescape-client/src/main/java/World.java @@ -17,14 +17,13 @@ public class World { @ObfuscatedGetter( intValue = 1143875805 ) - @Export("__bt_g") static int __bt_g; @ObfuscatedName("l") - @Export("__bt_l") - static int[] __bt_l; + @Export("sortOption2") + static int[] sortOption2; @ObfuscatedName("e") - @Export("__bt_e") - static int[] __bt_e; + @Export("sortOption1") + static int[] sortOption1; @ObfuscatedName("d") @ObfuscatedGetter( intValue = -144265493 @@ -65,8 +64,8 @@ public class World { static { worldsCount = 0; __bt_g = 0; - __bt_l = new int[]{1, 1, 1, 1}; - __bt_e = new int[]{0, 1, 2, 3}; + sortOption2 = new int[]{1, 1, 1, 1}; + sortOption1 = new int[]{0, 1, 2, 3}; } @ObfuscatedName("e") @@ -74,8 +73,8 @@ public class World { signature = "(I)Z", garbageValue = "-1059414592" ) - @Export("__e_144") - boolean __e_144() { + @Export("isMembersOnly") + boolean isMembersOnly() { return (1 & this.properties) != 0; } @@ -84,7 +83,6 @@ public class World { signature = "(B)Z", garbageValue = "0" ) - @Export("__x_145") boolean __x_145() { return (2 & this.properties) != 0; } @@ -94,8 +92,8 @@ public class World { signature = "(I)Z", garbageValue = "-354931924" ) - @Export("__d_146") - boolean __d_146() { + @Export("isPvp") + boolean isPvp() { return (4 & this.properties) != 0; } @@ -104,7 +102,6 @@ public class World { signature = "(I)Z", garbageValue = "-1662622660" ) - @Export("__a_147") boolean __a_147() { return (8 & this.properties) != 0; } @@ -114,9 +111,9 @@ public class World { signature = "(B)Z", garbageValue = "-1" ) - @Export("__z_148") - boolean __z_148() { - return (536870912 & this.properties) != 0; + @Export("isDeadman") + boolean isDeadman() { + return (0x20000000 & this.properties) != 0; // 1 << 29 } @ObfuscatedName("j") @@ -124,9 +121,9 @@ public class World { signature = "(I)Z", garbageValue = "2033779841" ) - @Export("__j_149") - boolean __j_149() { - return (33554432 & this.properties) != 0; + @Export("isBeta") + boolean isBeta() { + return (0x2000000 & this.properties) != 0; // 1 << 25 } @ObfuscatedName("f") diff --git a/rs-client/src/main/java/WorldComparator.java b/runescape-client/src/main/java/WorldComparator.java similarity index 92% rename from rs-client/src/main/java/WorldComparator.java rename to runescape-client/src/main/java/WorldComparator.java index e1c685e25d..1f284bc1a2 100644 --- a/rs-client/src/main/java/WorldComparator.java +++ b/runescape-client/src/main/java/WorldComparator.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("WorldComparator") final class WorldComparator implements Comparator { @ObfuscatedName("n") - @Export("__u_n") public static boolean __u_n; @ObfuscatedName("m") @@ -16,7 +15,6 @@ final class WorldComparator implements Comparator { signature = "(Ll;Ll;I)I", garbageValue = "707844889" ) - @Export("__m_0") int __m_0(GrandExchangeEvent var1, GrandExchangeEvent var2) { return var1.world < var2.world?-1:(var2.world == var1.world?0:1); } @@ -27,7 +25,6 @@ final class WorldComparator implements Comparator { return this.__m_0((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @Export("__equals_2") @ObfuscatedName("equals") public boolean __equals_2(Object var1) { return super.equals(var1); @@ -49,15 +46,15 @@ final class WorldComparator implements Comparator { ) static int method68(int var0, Script var1, boolean var2) { if(var0 == 3200) { - class179.Interpreter_intStackSize -= 3; - Ignored.queueSoundEffect(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize], Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1], Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]); + RouteStrategy.Interpreter_intStackSize -= 3; + Ignored.queueSoundEffect(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize], Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1], Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]); return 1; } else if(var0 == 3201) { - AbstractUserComparator.method5437(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + AbstractUserComparator.method5437(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); return 1; } else if(var0 == 3202) { - class179.Interpreter_intStackSize -= 2; - HealthBar.method1994(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize], Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + RouteStrategy.Interpreter_intStackSize -= 2; + HealthBar.method1994(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize], Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); return 1; } else { return 2; diff --git a/rs-client/src/main/java/WorldMap.java b/runescape-client/src/main/java/WorldMap.java similarity index 94% rename from rs-client/src/main/java/WorldMap.java rename to runescape-client/src/main/java/WorldMap.java index 8cff71c5bb..13b495ddb3 100644 --- a/rs-client/src/main/java/WorldMap.java +++ b/runescape-client/src/main/java/WorldMap.java @@ -35,19 +35,16 @@ public class WorldMap { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__g") AbstractIndexCache __g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__l") AbstractIndexCache __l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__e") AbstractIndexCache __e; @ObfuscatedName("n") @ObfuscatedSignature( @@ -83,7 +80,6 @@ public class WorldMap { @ObfuscatedSignature( signature = "Lag;" ) - @Export("__t") WorldMapArea __t; @ObfuscatedName("y") @ObfuscatedSignature( @@ -131,37 +127,35 @@ public class WorldMap { @ObfuscatedGetter( intValue = -1469654441 ) - @Export("__aq") - int __aq; + @Export("worldMapDisplayWidth") + int worldMapDisplayWidth; @ObfuscatedName("aj") @ObfuscatedGetter( intValue = -1140942239 ) - @Export("__aj") - int __aj; + @Export("worldMapDisplayHeight") + int worldMapDisplayHeight; @ObfuscatedName("av") @ObfuscatedGetter( intValue = -1301477687 ) - @Export("__av") - int __av; + @Export("worldMapDisplayX") + int worldMapDisplayX; @ObfuscatedName("ar") @ObfuscatedGetter( intValue = -298919797 ) - @Export("__ar") - int __ar; + @Export("worldMapDisplayY") + int worldMapDisplayY; @ObfuscatedName("ac") @ObfuscatedGetter( intValue = -1653084915 ) - @Export("__ac") int __ac; @ObfuscatedName("ay") @ObfuscatedGetter( intValue = 1664740569 ) - @Export("__ay") int __ay; @ObfuscatedName("ah") @Export("perpetualFlash0") @@ -173,58 +167,48 @@ public class WorldMap { @ObfuscatedGetter( intValue = -1683910031 ) - @Export("__aw") int __aw; @ObfuscatedName("al") @ObfuscatedGetter( intValue = 2064651113 ) - @Export("__al") int __al; @ObfuscatedName("ab") @ObfuscatedGetter( intValue = -1979665983 ) - @Export("__ab") int __ab; @ObfuscatedName("ae") @ObfuscatedGetter( intValue = 547126547 ) - @Export("__ae") int __ae; @ObfuscatedName("at") @ObfuscatedGetter( intValue = -815748997 ) - @Export("__at") int __at; @ObfuscatedName("ad") @ObfuscatedGetter( intValue = -988933407 ) - @Export("__ad") int __ad; @ObfuscatedName("ap") @ObfuscatedGetter( longValue = -4747643242047040283L ) - @Export("__ap") long __ap; @ObfuscatedName("as") @ObfuscatedGetter( intValue = -969094439 ) - @Export("__as") int __as; @ObfuscatedName("am") @ObfuscatedGetter( intValue = -869889187 ) - @Export("__am") int __am; @ObfuscatedName("an") - @Export("__an") boolean __an; @ObfuscatedName("ao") @Export("enabledElements") @@ -233,10 +217,8 @@ public class WorldMap { @Export("enabledCategories") HashSet enabledCategories; @ObfuscatedName("ax") - @Export("__ax") HashSet __ax; @ObfuscatedName("af") - @Export("__af") HashSet __af; @ObfuscatedName("ai") @Export("elementsDisabled") @@ -245,19 +227,15 @@ public class WorldMap { @ObfuscatedGetter( intValue = -237734529 ) - @Export("__ba") int __ba; @ObfuscatedName("bs") - @Export("__bs") final int[] __bs; @ObfuscatedName("bq") - @Export("__bq") List __bq; @ObfuscatedName("bn") @Export("iconIterator") Iterator iconIterator; @ObfuscatedName("bk") - @Export("__bk") HashSet __bk; @ObfuscatedName("bd") @ObfuscatedSignature( @@ -266,8 +244,8 @@ public class WorldMap { @Export("mouseCoord") TileLocation mouseCoord; @ObfuscatedName("bc") - @Export("__bc") - public boolean __bc; + @Export("showCoord") + public boolean showCoord; @ObfuscatedName("bo") @ObfuscatedSignature( signature = "Lln;" @@ -278,25 +256,21 @@ public class WorldMap { @ObfuscatedGetter( intValue = 2031417343 ) - @Export("__bx") int __bx; @ObfuscatedName("by") @ObfuscatedGetter( intValue = 754899959 ) - @Export("__by") int __by; @ObfuscatedName("bu") @ObfuscatedGetter( intValue = 2064728623 ) - @Export("__bu") int __bu; @ObfuscatedName("bm") @ObfuscatedGetter( intValue = -1774424249 ) - @Export("__bm") int __bm; static { @@ -308,10 +282,10 @@ public class WorldMap { public WorldMap() { this.worldMapTargetX = -1; this.worldMapTargetY = -1; - this.__aq = -1; - this.__aj = -1; - this.__av = -1; - this.__ar = -1; + this.worldMapDisplayWidth = -1; + this.worldMapDisplayHeight = -1; + this.worldMapDisplayX = -1; + this.worldMapDisplayY = -1; this.__ac = 3; this.__ay = 50; this.perpetualFlash0 = false; @@ -332,7 +306,7 @@ public class WorldMap { this.__bs = new int[]{1008, 1009, 1010, 1011, 1012}; this.__bk = new HashSet(); this.mouseCoord = null; - this.__bc = false; + this.showCoord = false; this.__by = -1; this.__bu = -1; this.__bm = -1; @@ -378,7 +352,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "-1144390092" ) - @Export("__f_518") public void __f_518() { WorldMapRegion.__av_o.demote(5); } @@ -439,7 +412,6 @@ public class WorldMap { signature = "(IIZZS)V", garbageValue = "18431" ) - @Export("__w_519") public void __w_519(int var1, int var2, boolean var3, boolean var4) { long var5 = class203.currentTimeMs(); this.__o_520(var1, var2, var4, var5); @@ -469,16 +441,15 @@ public class WorldMap { } @ObfuscatedName("o") - @Export("__o_520") void __o_520(int var1, int var2, boolean var3, long var4) { if(this.currentMapArea0 != null) { - int var6 = (int)((float)this.worldMapX + ((float)(var1 - this.__av) - (float)this.__ap_537() * this.zoom / 2.0F) / this.zoom); - int var7 = (int)((float)this.worldMapY - ((float)(var2 - this.__ar) - (float)this.__as_538() * this.zoom / 2.0F) / this.zoom); + int var6 = (int)((float)this.worldMapX + ((float)(var1 - this.worldMapDisplayX) - (float)this.__ap_537() * this.zoom / 2.0F) / this.zoom); + int var7 = (int)((float)this.worldMapY - ((float)(var2 - this.worldMapDisplayY) - (float)this.__as_538() * this.zoom / 2.0F) / this.zoom); this.mouseCoord = this.currentMapArea0.coord(var6 + this.currentMapArea0.minX() * 64, var7 + this.currentMapArea0.minY() * 64); if(this.mouseCoord != null && var3) { int var9; int var10; - if(FriendSystem.method1868() && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81]) { + if(FriendSystem.jmodCheck() && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81]) { int var13 = this.mouseCoord.x; var9 = this.mouseCoord.y; var10 = this.mouseCoord.plane; @@ -538,7 +509,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "2075446341" ) - @Export("__g_521") void __g_521() { if(this.__x_524()) { int var1 = this.worldMapTargetX - this.worldMapX; @@ -581,7 +551,6 @@ public class WorldMap { signature = "(B)V", garbageValue = "35" ) - @Export("__e_523") final void __e_523() { this.__ad = -1; this.__at = -1; @@ -594,7 +563,6 @@ public class WorldMap { signature = "(I)Z", garbageValue = "1444745621" ) - @Export("__x_524") boolean __x_524() { return this.worldMapTargetX != -1 && this.worldMapTargetY != -1; } @@ -625,7 +593,6 @@ public class WorldMap { signature = "(IIIZI)V", garbageValue = "469045892" ) - @Export("__a_525") public void __a_525(int var1, int var2, int var3, boolean var4) { WorldMapArea var5 = this.mapAreaAtCoord(var1, var2, var3); if(var5 == null) { @@ -713,7 +680,6 @@ public class WorldMap { signature = "(Lag;Lhu;Lhu;ZI)V", garbageValue = "-1430939646" ) - @Export("__h_526") public void __h_526(WorldMapArea var1, TileLocation var2, TileLocation var3, boolean var4) { if(var1 != null) { if(this.currentMapArea0 == null || var1 != this.currentMapArea0) { @@ -801,14 +767,14 @@ public class WorldMap { } this.__v_528(var1, var2, var3, var4, var8, var9); - if(FriendSystem.method1868() && this.__bc && this.mouseCoord != null) { + if(FriendSystem.jmodCheck() && this.showCoord && this.mouseCoord != null) { this.font.draw("Coord: " + this.mouseCoord, Rasterizer2D.Rasterizer2D_xClipStart + 10, Rasterizer2D.Rasterizer2D_yClipStart + 20, 16776960, -1); } - this.__aq = var8; - this.__aj = var9; - this.__av = var1; - this.__ar = var2; + this.worldMapDisplayWidth = var8; + this.worldMapDisplayHeight = var9; + this.worldMapDisplayX = var1; + this.worldMapDisplayY = var2; Rasterizer2D.Rasterizer2D_setClipArray(var6); } } @@ -818,7 +784,6 @@ public class WorldMap { signature = "(IIIIIII)Z", garbageValue = "-1561237851" ) - @Export("__p_527") boolean __p_527(int var1, int var2, int var3, int var4, int var5, int var6) { return this.sprite == null?true:(this.sprite.subWidth == var1 && this.sprite.subHeight == var2?(this.worldMapManager.__z != this.__bx?true:(this.__bm != Client.__client_ss?true:(var3 <= 0 && var4 <= 0?var3 + var1 < var5 || var2 + var4 < var6:true))):true); } @@ -828,7 +793,6 @@ public class WorldMap { signature = "(IIIIIII)V", garbageValue = "-2090965249" ) - @Export("__v_528") void __v_528(int var1, int var2, int var3, int var4, int var5, int var6) { if(ClientParameter.field3645 != null) { int var7 = 512 / (this.worldMapManager.__z * 2); @@ -857,7 +821,7 @@ public class WorldMap { var14 = var2 - this.worldMapManager.__z * (var7 - (var12 - this.__bu)); } - Rasterizer2D.Rasterizer2D_moreAlpha(var1, var2, var3, var4, 0, 128); + Rasterizer2D.Rasterizer2D_fillRectangleAlpha(var1, var2, var3, var4, 0, 128); if(1.0F == var10) { this.sprite.__v_510(var13, var14, 192); } else { @@ -917,7 +881,6 @@ public class WorldMap { signature = "(IB)F", garbageValue = "56" ) - @Export("__av_529") float __av_529(int var1) { return var1 == 25?1.0F:(var1 == 37?1.5F:(var1 == 50?2.0F:(var1 == 75?3.0F:(var1 == 100?4.0F:8.0F)))); } @@ -991,7 +954,6 @@ public class WorldMap { signature = "(III)V", garbageValue = "-2147142500" ) - @Export("__aw_531") public void __aw_531(int var1, int var2) { if(this.currentMapArea0 != null) { this.setWorldMapPosition(var1 - this.currentMapArea0.minX() * 64, var2 - this.currentMapArea0.minY() * 64, true); @@ -1005,7 +967,6 @@ public class WorldMap { signature = "(IIIB)V", garbageValue = "-40" ) - @Export("__al_532") public void __al_532(int var1, int var2, int var3) { if(this.currentMapArea0 != null) { int[] var4 = this.currentMapArea0.position(var1, var2, var3); @@ -1021,7 +982,6 @@ public class WorldMap { signature = "(IIII)V", garbageValue = "1808854561" ) - @Export("__ab_533") public void __ab_533(int var1, int var2, int var3) { if(this.currentMapArea0 != null) { int[] var4 = this.currentMapArea0.position(var1, var2, var3); @@ -1037,7 +997,6 @@ public class WorldMap { signature = "(I)I", garbageValue = "-659556919" ) - @Export("__ae_534") public int __ae_534() { return this.currentMapArea0 == null?-1:this.worldMapX + this.currentMapArea0.minX() * 64; } @@ -1047,7 +1006,6 @@ public class WorldMap { signature = "(I)I", garbageValue = "1893257871" ) - @Export("__at_535") public int __at_535() { return this.currentMapArea0 == null?-1:this.worldMapY + this.currentMapArea0.minY() * 64; } @@ -1057,7 +1015,6 @@ public class WorldMap { signature = "(I)Lhu;", garbageValue = "-2005824064" ) - @Export("__ad_536") public TileLocation __ad_536() { return this.currentMapArea0 == null?null:this.currentMapArea0.coord(this.__ae_534(), this.__at_535()); } @@ -1067,9 +1024,8 @@ public class WorldMap { signature = "(I)I", garbageValue = "442119278" ) - @Export("__ap_537") public int __ap_537() { - return this.__aq; + return this.worldMapDisplayWidth; } @ObfuscatedName("as") @@ -1077,9 +1033,8 @@ public class WorldMap { signature = "(I)I", garbageValue = "-2065910749" ) - @Export("__as_538") public int __as_538() { - return this.__aj; + return this.worldMapDisplayHeight; } @ObfuscatedName("am") @@ -1087,7 +1042,6 @@ public class WorldMap { signature = "(II)V", garbageValue = "2017050927" ) - @Export("__am_539") public void __am_539(int var1) { if(var1 >= 1) { this.__ac = var1; @@ -1100,7 +1054,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "-1568631080" ) - @Export("__an_540") public void __an_540() { this.__ac = 3; } @@ -1110,7 +1063,6 @@ public class WorldMap { signature = "(II)V", garbageValue = "107295139" ) - @Export("__az_541") public void __az_541(int var1) { if(var1 >= 1) { this.__ay = var1; @@ -1123,7 +1075,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "2023118274" ) - @Export("__au_542") public void __au_542() { this.__ay = 50; } @@ -1268,7 +1219,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "758731634" ) - @Export("__bk_543") void __bk_543() { this.__af.clear(); this.__af.addAll(this.enabledElements); @@ -1280,7 +1230,6 @@ public class WorldMap { signature = "(IIIIIIB)V", garbageValue = "-73" ) - @Export("__bd_544") public void __bd_544(int var1, int var2, int var3, int var4, int var5, int var6) { if(this.cacheLoader.isLoaded()) { int var7 = (int)Math.ceil((double)((float)var3 / this.zoom)); @@ -1301,7 +1250,7 @@ public class WorldMap { for(int var14 = this.__bs.length - 1; var14 >= 0; --var14) { if(var12.strings[var14] != null) { - Tiles.method1106(var12.strings[var14], var12.string1, this.__bs[var14], var11.__m_15(), var11.coord1.packed(), var11.coord2.packed()); + Tiles.insertMenuItemNoShift(var12.strings[var14], var12.string1, this.__bs[var14], var11.__m_15(), var11.coord1.packed(), var11.coord2.packed()); var13 = true; } } @@ -1316,7 +1265,6 @@ public class WorldMap { signature = "(ILhu;I)Lhu;", garbageValue = "333454230" ) - @Export("__bc_545") public TileLocation __bc_545(int var1, TileLocation var2) { if(!this.cacheLoader.isLoaded()) { return null; diff --git a/rs-client/src/main/java/WorldMapArea.java b/runescape-client/src/main/java/WorldMapArea.java similarity index 99% rename from rs-client/src/main/java/WorldMapArea.java rename to runescape-client/src/main/java/WorldMapArea.java index afbfcdb8e0..2a3d27d961 100644 --- a/rs-client/src/main/java/WorldMapArea.java +++ b/runescape-client/src/main/java/WorldMapArea.java @@ -37,7 +37,6 @@ public class WorldMapArea { @ObfuscatedGetter( intValue = 986239133 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( @@ -306,7 +305,6 @@ public class WorldMapArea { signature = "(I)I", garbageValue = "-1657905623" ) - @Export("__a_39") int __a_39() { return this.__w; } diff --git a/rs-client/src/main/java/WorldMapAreaData.java b/runescape-client/src/main/java/WorldMapAreaData.java similarity index 79% rename from rs-client/src/main/java/WorldMapAreaData.java rename to runescape-client/src/main/java/WorldMapAreaData.java index fbec90b7d0..eeacab73f6 100644 --- a/rs-client/src/main/java/WorldMapAreaData.java +++ b/runescape-client/src/main/java/WorldMapAreaData.java @@ -10,13 +10,10 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("WorldMapAreaData") public class WorldMapAreaData extends WorldMapArea { @ObfuscatedName("n") - @Export("surfaceOffsetY") HashSet __n; @ObfuscatedName("i") - @Export("__i") HashSet __i; @ObfuscatedName("a") - @Export("__a") List __a; @ObfuscatedName("ce") @@ -24,7 +21,6 @@ public class WorldMapAreaData extends WorldMapArea { signature = "(Lgr;Lgr;IZI)V", garbageValue = "-1999841505" ) - @Export("__ce_76") void __ce_76(Buffer var1, Buffer var2, int var3, boolean var4) { this.read(var1, var3); int var5 = var2.__ag_302(); @@ -66,7 +62,6 @@ public class WorldMapAreaData extends WorldMapArea { signature = "(Lgr;ZB)V", garbageValue = "48" ) - @Export("__cy_77") void __cy_77(Buffer var1, boolean var2) { this.__a = new LinkedList(); int var3 = var1.__ag_302(); @@ -133,7 +128,7 @@ public class WorldMapAreaData extends WorldMapArea { Widget var4; if(var0 >= 2000) { var0 -= 1000; - var4 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var4 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); var3 = false; } else { var4 = var2?WorldMapIcon1.__t_i:class12.__n_n; @@ -141,7 +136,7 @@ public class WorldMapAreaData extends WorldMapArea { int var11; if(var0 == 1300) { - var11 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] - 1; + var11 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] - 1; if(var11 >= 0 && var11 <= 9) { var4.setAction(var11, Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]); return 1; @@ -152,19 +147,19 @@ public class WorldMapAreaData extends WorldMapArea { } else { int var6; if(var0 == 1301) { - class179.Interpreter_intStackSize -= 2; - var11 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var6 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var11 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var6 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var4.parent = class204.getWidgetChild(var11, var6); return 1; } else if(var0 == 1302) { - var4.isScrollBar = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var4.isScrollBar = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 1303) { - var4.dragZoneSize = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4.dragZoneSize = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; return 1; } else if(var0 == 1304) { - var4.dragThreshold = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4.dragThreshold = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; return 1; } else if(var0 == 1305) { var4.dataText = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; @@ -176,7 +171,7 @@ public class WorldMapAreaData extends WorldMapArea { var4.actions = null; return 1; } else if(var0 == 1308) { - var4.__fz = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var4.__fz = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else { int var7; @@ -184,17 +179,17 @@ public class WorldMapAreaData extends WorldMapArea { if(var0 != 1350) { byte var5; if(var0 == 1351) { - class179.Interpreter_intStackSize -= 2; + RouteStrategy.Interpreter_intStackSize -= 2; var5 = 10; - var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]}; - byte[] var10 = new byte[]{(byte)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]}; + var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]}; + byte[] var10 = new byte[]{(byte)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]}; BufferedSink.method3595(var4, var5, var9, var10); return 1; } else if(var0 == 1352) { - class179.Interpreter_intStackSize -= 3; - var11 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] - 1; - var6 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - var7 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; + RouteStrategy.Interpreter_intStackSize -= 3; + var11 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] - 1; + var6 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + var7 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; if(var11 >= 0 && var11 <= 9) { Varcs.method2168(var4, var11, var6, var7); return 1; @@ -203,13 +198,13 @@ public class WorldMapAreaData extends WorldMapArea { } } else if(var0 == 1353) { var5 = 10; - var6 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var6 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Varcs.method2168(var4, var5, var6, var7); return 1; } else if(var0 == 1354) { - --class179.Interpreter_intStackSize; - var11 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] - 1; + --RouteStrategy.Interpreter_intStackSize; + var11 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] - 1; if(var11 >= 0 && var11 <= 9) { WorldMapSection3.method345(var4, var11); return 1; @@ -227,9 +222,9 @@ public class WorldMapAreaData extends WorldMapArea { byte[] var8 = null; var9 = null; if(var3) { - class179.Interpreter_intStackSize -= 10; + RouteStrategy.Interpreter_intStackSize -= 10; - for(var7 = 0; var7 < 10 && Interpreter.Interpreter_intStack[var7 + class179.Interpreter_intStackSize] >= 0; var7 += 2) { + for(var7 = 0; var7 < 10 && Interpreter.Interpreter_intStack[var7 + RouteStrategy.Interpreter_intStackSize] >= 0; var7 += 2) { ; } @@ -238,17 +233,17 @@ public class WorldMapAreaData extends WorldMapArea { var9 = new byte[var7 / 2]; for(var7 -= 2; var7 >= 0; var7 -= 2) { - var8[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + class179.Interpreter_intStackSize]; - var9[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + class179.Interpreter_intStackSize + 1]; + var8[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + RouteStrategy.Interpreter_intStackSize]; + var9[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + RouteStrategy.Interpreter_intStackSize + 1]; } } } else { - class179.Interpreter_intStackSize -= 2; - var8 = new byte[]{(byte)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]}; - var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]}; + RouteStrategy.Interpreter_intStackSize -= 2; + var8 = new byte[]{(byte)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]}; + var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]}; } - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] - 1; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] - 1; if(var7 >= 0 && var7 <= 9) { BufferedSink.method3595(var4, var7, var8, var9); return 1; diff --git a/rs-client/src/main/java/WorldMapCacheName.java b/runescape-client/src/main/java/WorldMapCacheName.java similarity index 97% rename from rs-client/src/main/java/WorldMapCacheName.java rename to runescape-client/src/main/java/WorldMapCacheName.java index 8a0dfcdb3d..705477fe2c 100644 --- a/rs-client/src/main/java/WorldMapCacheName.java +++ b/runescape-client/src/main/java/WorldMapCacheName.java @@ -70,16 +70,16 @@ public class WorldMapCacheName { if(var0 != null && var1 != null) { ByteArrayPool.__gi_g = var0; WorldMapSection2.__ah_l = new int[var0.length]; - class179.__fe_e = new byte[var0.length][][]; + RouteStrategy.__fe_e = new byte[var0.length][][]; for(int var2 = 0; var2 < ByteArrayPool.__gi_g.length; ++var2) { - class179.__fe_e[var2] = new byte[var1[var2]][]; + RouteStrategy.__fe_e[var2] = new byte[var1[var2]][]; } } else { ByteArrayPool.__gi_g = null; WorldMapSection2.__ah_l = null; - class179.__fe_e = null; + RouteStrategy.__fe_e = null; } } diff --git a/rs-client/src/main/java/WorldMapElement.java b/runescape-client/src/main/java/WorldMapElement.java similarity index 97% rename from rs-client/src/main/java/WorldMapElement.java rename to runescape-client/src/main/java/WorldMapElement.java index 906ec39875..04d541e9df 100644 --- a/rs-client/src/main/java/WorldMapElement.java +++ b/runescape-client/src/main/java/WorldMapElement.java @@ -11,7 +11,6 @@ public class WorldMapElement extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ic_m") public static AbstractIndexCache __ic_m; @ObfuscatedName("w") @ObfuscatedSignature( @@ -29,7 +28,6 @@ public class WorldMapElement extends DualNode { @ObfuscatedGetter( intValue = -1579051565 ) - @Export("__o") public final int __o; @ObfuscatedName("u") @ObfuscatedGetter( @@ -44,13 +42,11 @@ public class WorldMapElement extends DualNode { @Export("sprite2") int sprite2; @ObfuscatedName("l") - @Export("__l") public String __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -231067 ) - @Export("__e") public int __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -65,31 +61,26 @@ public class WorldMapElement extends DualNode { @Export("string1") public String string1; @ObfuscatedName("i") - @Export("__i") int[] __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = 1336803515 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1825795359 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = -1007121521 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = -1209054101 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedSignature( @@ -102,10 +93,8 @@ public class WorldMapElement extends DualNode { ) public class249 field3301; @ObfuscatedName("h") - @Export("__h") int[] __h; @ObfuscatedName("b") - @Export("__b") byte[] __b; @ObfuscatedName("c") @ObfuscatedGetter( @@ -245,7 +234,6 @@ public class WorldMapElement extends DualNode { signature = "(I)V", garbageValue = "1799485224" ) - @Export("__w_409") public void __w_409() { if(this.__i != null) { for(int var1 = 0; var1 < this.__i.length; var1 += 2) { @@ -305,7 +293,6 @@ public class WorldMapElement extends DualNode { signature = "(I)I", garbageValue = "821701099" ) - @Export("__g_410") public int __g_410() { return this.__o; } diff --git a/rs-client/src/main/java/WorldMapEvent.java b/runescape-client/src/main/java/WorldMapEvent.java similarity index 84% rename from rs-client/src/main/java/WorldMapEvent.java rename to runescape-client/src/main/java/WorldMapEvent.java index e264324840..258935c48c 100644 --- a/rs-client/src/main/java/WorldMapEvent.java +++ b/runescape-client/src/main/java/WorldMapEvent.java @@ -11,8 +11,8 @@ public class WorldMapEvent { @ObfuscatedSignature( signature = "[Llq;" ) - @Export("__ap_w") - static IndexedSprite[] __ap_w; + @Export("runesSprite") + static IndexedSprite[] runesSprite; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 264384233 @@ -57,7 +57,7 @@ public class WorldMapEvent { ) static final void method781(int var0, int var1, int var2, int var3) { if(Client.isItemSelected == 0 && !Client.isSpellSelected) { - Tiles.method1106("Walk here", "", 23, 0, var0 - var2, var1 - var3); + Tiles.insertMenuItemNoShift("Walk here", "", 23, 0, var0 - var2, var1 - var3); } long var4 = -1L; @@ -98,10 +98,10 @@ public class WorldMapEvent { } if(Client.isItemSelected == 1) { - Tiles.method1106("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(65535) + var20.name, 1, var19, var15, var17); + Tiles.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(65535) + var20.name, 1, var19, var15, var17); } else if(Client.isSpellSelected) { if((FloorDecoration.selectedSpellFlags & 4) == 4) { - Tiles.method1106(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(65535) + var20.name, 2, var19, var15, var17); + Tiles.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(65535) + var20.name, 2, var19, var15, var17); } } else { String[] var29 = var20.actions; @@ -129,12 +129,12 @@ public class WorldMapEvent { var23 = 1001; } - Tiles.method1106(var29[var30], BufferedFile.colorStartTag(65535) + var20.name, var23, var19, var15, var17); + Tiles.insertMenuItemNoShift(var29[var30], BufferedFile.colorStartTag(65535) + var20.name, var23, var19, var15, var17); } } } - Tiles.method1106("Examine", BufferedFile.colorStartTag(65535) + var20.name, 1002, var20.id, var15, var17); + Tiles.insertMenuItemNoShift("Examine", BufferedFile.colorStartTag(65535) + var20.name, 1002, var20.id, var15, var17); } } @@ -209,10 +209,10 @@ public class WorldMapEvent { for(GroundItem var39 = (GroundItem)var35.first(); var39 != null; var39 = (GroundItem)var35.next()) { ItemDefinition var37 = Skills.getItemDefinition(var39.id); if(Client.isItemSelected == 1) { - Tiles.method1106("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var37.name, 16, var39.id, var15, var17); + Tiles.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var37.name, 16, var39.id, var15, var17); } else if(Client.isSpellSelected) { if((FloorDecoration.selectedSpellFlags & 1) == 1) { - Tiles.method1106(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var37.name, 17, var39.id, var15, var17); + Tiles.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + BufferedFile.colorStartTag(16748608) + var37.name, 17, var39.id, var15, var17); } } else { String[] var31 = var37.groundActions; @@ -240,13 +240,13 @@ public class WorldMapEvent { var25 = 22; } - Tiles.method1106(var31[var32], BufferedFile.colorStartTag(16748608) + var37.name, var25, var39.id, var15, var17); + Tiles.insertMenuItemNoShift(var31[var32], BufferedFile.colorStartTag(16748608) + var37.name, var25, var39.id, var15, var17); } else if(var32 == 2) { - Tiles.method1106("Take", BufferedFile.colorStartTag(16748608) + var37.name, 20, var39.id, var15, var17); + Tiles.insertMenuItemNoShift("Take", BufferedFile.colorStartTag(16748608) + var37.name, 20, var39.id, var15, var17); } } - Tiles.method1106("Examine", BufferedFile.colorStartTag(16748608) + var37.name, 1004, var39.id, var15, var17); + Tiles.insertMenuItemNoShift("Examine", BufferedFile.colorStartTag(16748608) + var37.name, 1004, var39.id, var15, var17); } } } diff --git a/rs-client/src/main/java/WorldMapIcon1.java b/runescape-client/src/main/java/WorldMapIcon1.java similarity index 92% rename from rs-client/src/main/java/WorldMapIcon1.java rename to runescape-client/src/main/java/WorldMapIcon1.java index 6d3253c553..0e1f232744 100644 --- a/rs-client/src/main/java/WorldMapIcon1.java +++ b/runescape-client/src/main/java/WorldMapIcon1.java @@ -12,7 +12,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__t_i") static Widget __t_i; @ObfuscatedName("db") @ObfuscatedSignature( @@ -33,7 +32,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -1722323621 ) - @Export("__m") final int __m; @ObfuscatedName("f") @ObfuscatedSignature( @@ -45,13 +43,11 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = 364253793 ) - @Export("__q") final int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -362031241 ) - @Export("__w") final int __w; @ObfuscatedSignature( @@ -78,7 +74,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(I)I", garbageValue = "1990181988" ) - @Export("__m_15") public int __m_15() { return this.__m; } @@ -88,7 +83,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(I)Laj;", garbageValue = "1159446036" ) - @Export("__f_16") WorldMapLabel __f_16() { return this.label0; } @@ -98,7 +92,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(B)I", garbageValue = "75" ) - @Export("__q_17") int __q_17() { return this.__q; } @@ -108,7 +101,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(I)I", garbageValue = "-1558233611" ) - @Export("__w_18") int __w_18() { return this.__w; } @@ -171,13 +163,13 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { var2 = (var3 - var8) * Client.__client_qc / var3; } else { - var2 = Client.__client_qp; + var2 = Client.soundEffectVolume; } if(var2 > 0) { RawSound var10 = var9.toRawSound().resample(MilliClock.decimator); - RawPcmStream var11 = RawPcmStream.method2497(var10, 100, var2); - var11.__x_181(Client.unknownSoundValues1[var0] - 1); + RawPcmStream var11 = RawPcmStream.createRawPcmStream(var10, 100, var2); + var11.setNumLoops(Client.queuedSoundEffectLoops[var0] - 1); TaskHandler.pcmStreamMixer.addSubStream(var11); } @@ -189,7 +181,7 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { for(int var1 = var0; var1 < Client.soundEffectCount; ++var1) { Client.soundEffectIds[var1] = Client.soundEffectIds[var1 + 1]; Client.soundEffects[var1] = Client.soundEffects[var1 + 1]; - Client.unknownSoundValues1[var1] = Client.unknownSoundValues1[var1 + 1]; + Client.queuedSoundEffectLoops[var1] = Client.queuedSoundEffectLoops[var1 + 1]; Client.queuedSoundEffectDelays[var1] = Client.queuedSoundEffectDelays[var1 + 1]; Client.soundLocations[var1] = Client.soundLocations[var1 + 1]; } diff --git a/rs-client/src/main/java/WorldMapIcon2.java b/runescape-client/src/main/java/WorldMapIcon2.java similarity index 91% rename from rs-client/src/main/java/WorldMapIcon2.java rename to runescape-client/src/main/java/WorldMapIcon2.java index 46ab9b277f..4ed41ff111 100644 --- a/rs-client/src/main/java/WorldMapIcon2.java +++ b/runescape-client/src/main/java/WorldMapIcon2.java @@ -13,19 +13,16 @@ public class WorldMapIcon2 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -985436813 ) - @Export("__m") final int __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lav;" ) - @Export("__f") final WorldMapRegion __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -25914375 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -37,13 +34,11 @@ public class WorldMapIcon2 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = 927871683 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1431936619 ) - @Export("__u") int __u; @ObfuscatedSignature( @@ -97,7 +92,6 @@ public class WorldMapIcon2 extends AbstractWorldMapIcon { signature = "(I)V", garbageValue = "-806344204" ) - @Export("__z_27") void __z_27() { this.__q = class50.getObjectDefinition(this.__m).transform().mapIconId; this.label0 = this.__f.__ab_56(ViewportMouse.getWorldMapElement(this.__q)); @@ -180,12 +174,12 @@ public class WorldMapIcon2 extends AbstractWorldMapIcon { if(var4 >= var6 && var4 < 104 - var6 && var5 >= var6 && var5 < 104 - var6) { if(var1 >= var6 && var1 < 104 - var6 && var2 >= var6 && var2 < 104 - var6) { int var9 = var0.transformedSize(); - Client.field895.field2120 = var1; - Client.field895.field2121 = var2; - Client.field895.field2122 = 1; - Client.field895.field2123 = 1; + Client.field895.approxDestinationX = var1; + Client.field895.approxDestinationY = var2; + Client.field895.approxDestinationSizeX = 1; + Client.field895.approxDestinationSizeY = 1; class65 var10 = Client.field895; - int var11 = NetSocket.method3571(var4, var5, var9, var10, Client.collisionMaps[var0.plane], true, Client.__client_tp, Client.__client_th); + int var11 = NetSocket.calculateRoute(var4, var5, var9, var10, Client.collisionMaps[var0.plane], true, Client.__client_tp, Client.__client_th); if(var11 >= 1) { for(int var12 = 0; var12 < var11 - 1; ++var12) { var0.__a_131(Client.__client_tp[var12], Client.__client_th[var12], var3); diff --git a/rs-client/src/main/java/WorldMapIndexCacheLoader.java b/runescape-client/src/main/java/WorldMapIndexCacheLoader.java similarity index 100% rename from rs-client/src/main/java/WorldMapIndexCacheLoader.java rename to runescape-client/src/main/java/WorldMapIndexCacheLoader.java diff --git a/rs-client/src/main/java/WorldMapLabel.java b/runescape-client/src/main/java/WorldMapLabel.java similarity index 96% rename from rs-client/src/main/java/WorldMapLabel.java rename to runescape-client/src/main/java/WorldMapLabel.java index f73b839a03..2aa8c12cc7 100644 --- a/rs-client/src/main/java/WorldMapLabel.java +++ b/runescape-client/src/main/java/WorldMapLabel.java @@ -21,7 +21,6 @@ public class WorldMapLabel { @ObfuscatedGetter( intValue = -1536028937 ) - @Export("__aj_e") public static int __aj_e; @ObfuscatedName("m") @Export("text") @@ -169,7 +168,8 @@ public class WorldMapLabel { signature = "(I)[Llq;", garbageValue = "-1374541046" ) - public static IndexedSprite[] method444() { + @Export("createIndexedSpriteArray") + public static IndexedSprite[] createIndexedSpriteArray() { IndexedSprite[] var0 = new IndexedSprite[class328.indexedSpriteCount]; for(int var1 = 0; var1 < class328.indexedSpriteCount; ++var1) { @@ -215,7 +215,7 @@ public class WorldMapLabel { return var4 - var5; } else { - return var2 == 2?var0.location - var1.location:(var2 == 3?(var0.activity.equals("-")?(var1.activity.equals("-")?0:(var3?-1:1)):(var1.activity.equals("-")?(var3?1:-1):var0.activity.compareTo(var1.activity))):(var2 == 4?(var0.__a_147()?(var1.__a_147()?0:1):(var1.__a_147()?-1:0)):(var2 == 5?(var0.__x_145()?(var1.__x_145()?0:1):(var1.__x_145()?-1:0)):(var2 == 6?(var0.__d_146()?(var1.__d_146()?0:1):(var1.__d_146()?-1:0)):(var2 == 7?(var0.__e_144()?(var1.__e_144()?0:1):(var1.__e_144()?-1:0)):var0.id - var1.id))))); + return var2 == 2?var0.location - var1.location:(var2 == 3?(var0.activity.equals("-")?(var1.activity.equals("-")?0:(var3?-1:1)):(var1.activity.equals("-")?(var3?1:-1):var0.activity.compareTo(var1.activity))):(var2 == 4?(var0.__a_147()?(var1.__a_147()?0:1):(var1.__a_147()?-1:0)):(var2 == 5?(var0.__x_145()?(var1.__x_145()?0:1):(var1.__x_145()?-1:0)):(var2 == 6?(var0.isPvp()?(var1.isPvp()?0:1):(var1.isPvp()?-1:0)):(var2 == 7?(var0.isMembersOnly()?(var1.isMembersOnly()?0:1):(var1.isMembersOnly()?-1:0)):var0.id - var1.id))))); } } diff --git a/rs-client/src/main/java/WorldMapLabelSize.java b/runescape-client/src/main/java/WorldMapLabelSize.java similarity index 96% rename from rs-client/src/main/java/WorldMapLabelSize.java rename to runescape-client/src/main/java/WorldMapLabelSize.java index 43ffdb668a..3730917588 100644 --- a/rs-client/src/main/java/WorldMapLabelSize.java +++ b/runescape-client/src/main/java/WorldMapLabelSize.java @@ -35,31 +35,26 @@ public class WorldMapLabelSize { @ObfuscatedSignature( signature = "Lit;" ) - @Export("__s_dq") static IndexCache __s_dq; @ObfuscatedName("fi") @ObfuscatedGetter( intValue = 1577759565 ) - @Export("__s_fi") static int __s_fi; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 1252293513 ) - @Export("__w") final int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 707828941 ) - @Export("__o") final int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -422937451 ) - @Export("__u") final int __u; static { @@ -79,7 +74,6 @@ public class WorldMapLabelSize { signature = "(FI)Z", garbageValue = "2107231705" ) - @Export("__f_14") boolean __f_14(float var1) { return var1 >= (float)this.__u; } diff --git a/rs-client/src/main/java/WorldMapManager.java b/runescape-client/src/main/java/WorldMapManager.java similarity index 98% rename from rs-client/src/main/java/WorldMapManager.java rename to runescape-client/src/main/java/WorldMapManager.java index ea2c6a1ec9..7388645bbb 100644 --- a/rs-client/src/main/java/WorldMapManager.java +++ b/runescape-client/src/main/java/WorldMapManager.java @@ -40,7 +40,6 @@ public final class WorldMapManager { @Export("regions") WorldMapRegion[][] regions; @ObfuscatedName("g") - @Export("__g") HashMap __g; @ObfuscatedName("l") @ObfuscatedSignature( @@ -52,13 +51,11 @@ public final class WorldMapManager { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__e") final AbstractIndexCache __e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__x") final AbstractIndexCache __x; @ObfuscatedName("d") @Export("fonts") @@ -79,19 +76,16 @@ public final class WorldMapManager { @ObfuscatedGetter( intValue = 1729323633 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -395718741 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = 1085359673 ) - @Export("__z") public int __z; @ObfuscatedSignature( @@ -171,7 +165,7 @@ public final class WorldMapManager { System.nanoTime(); if(var1.__ag_401(WorldMapCacheName.WorldMapCacheName_compositeTexture.name, var2)) { byte[] var20 = var1.takeRecordByNames(WorldMapCacheName.WorldMapCacheName_compositeTexture.name, var2); - this.overviewSprite = class27.method438(var20); + this.overviewSprite = class27.convertJpgToSprite(var20); } System.nanoTime(); @@ -196,7 +190,6 @@ public final class WorldMapManager { signature = "(IIIIIIIII)V", garbageValue = "1619301748" ) - @Export("__q_72") public final void __q_72(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { int[] var9 = Rasterizer2D.Rasterizer2D_pixels; int var10 = Rasterizer2D.Rasterizer2D_width; @@ -243,7 +236,6 @@ public final class WorldMapManager { signature = "(IIIIIIIILjava/util/HashSet;Ljava/util/HashSet;IIZB)V", garbageValue = "-71" ) - @Export("__w_73") public final void __w_73(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, HashSet var9, HashSet var10, int var11, int var12, boolean var13) { class22 var14 = this.method643(var1, var2, var3, var4); float var15 = this.getPixelsPerTile(var7 - var5, var3 - var1); @@ -318,7 +310,6 @@ public final class WorldMapManager { signature = "(IIIIIIIIIII)Ljava/util/List;", garbageValue = "1185703832" ) - @Export("__u_74") public List __u_74(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) { LinkedList var11 = new LinkedList(); if(!this.isLoaded0) { @@ -514,7 +505,8 @@ public final class WorldMapManager { signature = "(II)Z", garbageValue = "-1344882321" ) - static boolean method672(int var0) { + @Export("isWidgetMenuOpcode") + static boolean isWidgetMenuOpcode(int var0) { return var0 == 57 || var0 == 58 || var0 == 1007 || var0 == 25 || var0 == 30; } diff --git a/rs-client/src/main/java/WorldMapRegion.java b/runescape-client/src/main/java/WorldMapRegion.java similarity index 98% rename from rs-client/src/main/java/WorldMapRegion.java rename to runescape-client/src/main/java/WorldMapRegion.java index 817482722f..9df1dc4a80 100644 --- a/rs-client/src/main/java/WorldMapRegion.java +++ b/runescape-client/src/main/java/WorldMapRegion.java @@ -17,7 +17,6 @@ public class WorldMapRegion { @ObfuscatedSignature( signature = "Lec;" ) - @Export("__av_o") public static DemotingHashTable __av_o; @ObfuscatedName("u") @ObfuscatedGetter( @@ -37,19 +36,16 @@ public class WorldMapRegion { ) class15 field239; @ObfuscatedName("e") - @Export("__e") LinkedList __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -120515153 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 415972873 ) - @Export("__d") int __d; @ObfuscatedName("k") @Export("iconsList") @@ -80,7 +76,6 @@ public class WorldMapRegion { signature = "(IIIB)V", garbageValue = "-87" ) - @Export("__w_40") void __w_40(int var1, int var2, int var3) { Sprite var4 = class13.method164(this.x, this.y, this.__d); if(var4 != null) { @@ -109,7 +104,6 @@ public class WorldMapRegion { signature = "(Ljava/util/HashSet;Ljava/util/List;B)V", garbageValue = "-47" ) - @Export("__u_41") void __u_41(HashSet var1, List var2) { this.iconsMap.clear(); Iterator var3 = var1.iterator(); @@ -208,7 +202,6 @@ public class WorldMapRegion { signature = "(B)V", garbageValue = "5" ) - @Export("__e_42") void __e_42() { Iterator var1 = this.iconsMap.values().iterator(); @@ -226,7 +219,6 @@ public class WorldMapRegion { signature = "(Ljava/util/List;I)V", garbageValue = "128876606" ) - @Export("__x_43") void __x_43(List var1) { Iterator var2 = var1.iterator(); @@ -245,7 +237,6 @@ public class WorldMapRegion { signature = "(I)V", garbageValue = "1543354181" ) - @Export("__d_44") void __d_44() { if(this.field239 != null) { this.field239.method282(); @@ -265,7 +256,6 @@ public class WorldMapRegion { signature = "(Lir;B)Z", garbageValue = "2" ) - @Export("__a_45") boolean __a_45(AbstractIndexCache var1) { if(this.field239 != null) { this.field239.method263(var1); @@ -343,7 +333,6 @@ public class WorldMapRegion { signature = "(IIILjava/util/HashSet;I)V", garbageValue = "893970699" ) - @Export("__j_46") void __j_46(int var1, int var2, int var3, HashSet var4) { if(var4 == null) { var4 = new HashSet(); @@ -358,7 +347,6 @@ public class WorldMapRegion { signature = "(Ljava/util/HashSet;IIB)V", garbageValue = "-70" ) - @Export("__s_47") void __s_47(HashSet var1, int var2, int var3) { Iterator var4 = this.iconsMap.values().iterator(); @@ -757,7 +745,6 @@ public class WorldMapRegion { signature = "(IILjava/util/HashSet;IB)V", garbageValue = "0" ) - @Export("__aq_48") void __aq_48(int var1, int var2, HashSet var3, int var4) { float var5 = (float)var4 / 64.0F; float var6 = var5 / 2.0F; @@ -786,7 +773,6 @@ public class WorldMapRegion { signature = "(Ljava/util/HashSet;III)V", garbageValue = "781854370" ) - @Export("__aj_49") void __aj_49(HashSet var1, int var2, int var3) { Iterator var4 = this.iconsList.iterator(); @@ -807,11 +793,10 @@ public class WorldMapRegion { signature = "(Lic;IIIIB)V", garbageValue = "92" ) - @Export("__av_50") void __av_50(WorldMapElement var1, int var2, int var3, int var4, int var5) { Sprite var6 = var1.getSprite(false); if(var6 != null) { - var6.__a_505(var2 - var6.subWidth / 2, var3 - var6.subHeight / 2); + var6.drawAt2(var2 - var6.subWidth / 2, var3 - var6.subHeight / 2); if(var4 % var5 < var5 / 2) { Rasterizer2D.Rasterizer2D_drawCircleAlpha(var2, var3, 15, 16776960, 128); Rasterizer2D.Rasterizer2D_drawCircleAlpha(var2, var3, 7, 16777215, 256); @@ -825,7 +810,6 @@ public class WorldMapRegion { signature = "(Lak;IIFI)V", garbageValue = "-1283733783" ) - @Export("__ar_51") void __ar_51(AbstractWorldMapIcon var1, int var2, int var3, float var4) { WorldMapElement var5 = ViewportMouse.getWorldMapElement(var1.__m_15()); this.__ac_52(var5, var2, var3); @@ -837,13 +821,12 @@ public class WorldMapRegion { signature = "(Lic;III)V", garbageValue = "423173487" ) - @Export("__ac_52") void __ac_52(WorldMapElement var1, int var2, int var3) { Sprite var4 = var1.getSprite(false); if(var4 != null) { int var5 = this.method473(var4, var1.field3287); int var6 = this.method474(var4, var1.field3301); - var4.__a_505(var5 + var2, var3 + var6); + var4.drawAt2(var5 + var2, var3 + var6); } } @@ -853,7 +836,6 @@ public class WorldMapRegion { signature = "(Lak;Lic;IIFI)V", garbageValue = "-1237576843" ) - @Export("__ay_53") void __ay_53(AbstractWorldMapIcon var1, WorldMapElement var2, int var3, int var4, float var5) { WorldMapLabel var6 = var1.__f_16(); if(var6 != null) { @@ -869,7 +851,6 @@ public class WorldMapRegion { signature = "(IILjava/util/HashSet;IB)V", garbageValue = "-17" ) - @Export("__ah_54") void __ah_54(int var1, int var2, HashSet var3, int var4) { float var5 = (float)var4 / 64.0F; Iterator var6 = this.iconsList.iterator(); @@ -926,7 +907,6 @@ public class WorldMapRegion { signature = "(II)Laj;", garbageValue = "598030754" ) - @Export("__al_55") WorldMapLabel __al_55(int var1) { WorldMapElement var2 = ViewportMouse.getWorldMapElement(var1); return this.__ab_56(var2); @@ -937,7 +917,6 @@ public class WorldMapRegion { signature = "(Lic;B)Laj;", garbageValue = "59" ) - @Export("__ab_56") WorldMapLabel __ab_56(WorldMapElement var1) { if(var1.__l != null && this.fonts != null && this.fonts.get(WorldMapLabelSize.WorldMapLabelSize_small) != null) { WorldMapLabelSize var2 = WorldMapLabelSize.method195(var1.textSize); @@ -976,7 +955,6 @@ public class WorldMapRegion { signature = "(IIIIII)Ljava/util/List;", garbageValue = "-1237576843" ) - @Export("__ae_57") List __ae_57(int var1, int var2, int var3, int var4, int var5) { LinkedList var6 = new LinkedList(); if(var4 >= var1 && var5 >= var2) { @@ -1027,7 +1005,6 @@ public class WorldMapRegion { signature = "(IIIII)V", garbageValue = "-1516512827" ) - @Export("__ad_58") void __ad_58(int var1, int var2, int var3, int var4) { var3 %= 4; if(var3 == 0) { @@ -1073,7 +1050,7 @@ public class WorldMapRegion { ) static final void method567(Widget var0, int var1, int var2) { if(Client.minimapState == 0 || Client.minimapState == 3) { - if(!Client.isMenuOpen && (MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.__lp_ca && MouseHandler.MouseHandler_lastButton == 4)) { + if(!Client.isMenuOpen && (MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.mouseCam && MouseHandler.MouseHandler_lastButton == 4)) { SpriteMask var3 = var0.getSpriteMask(true); if(var3 == null) { return; diff --git a/rs-client/src/main/java/WorldMapSection.java b/runescape-client/src/main/java/WorldMapSection.java similarity index 100% rename from rs-client/src/main/java/WorldMapSection.java rename to runescape-client/src/main/java/WorldMapSection.java diff --git a/rs-client/src/main/java/WorldMapSection0.java b/runescape-client/src/main/java/WorldMapSection0.java similarity index 94% rename from rs-client/src/main/java/WorldMapSection0.java rename to runescape-client/src/main/java/WorldMapSection0.java index 1d42429f3e..6f10a54e08 100644 --- a/rs-client/src/main/java/WorldMapSection0.java +++ b/runescape-client/src/main/java/WorldMapSection0.java @@ -11,94 +11,78 @@ public class WorldMapSection0 implements WorldMapSection { @ObfuscatedGetter( intValue = -1946112139 ) - @Export("__y_sn") static int __y_sn; @ObfuscatedName("p") - @Export("__y_p") static int[] __y_p; @ObfuscatedName("m") @ObfuscatedGetter( intValue = -2011838881 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1299225715 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 82600709 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -477370575 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -671345527 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 529427495 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -150870205 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 1009718107 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1022177315 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1397517463 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = -799353317 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -1388959491 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = -1657956317 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = 1345061881 ) - @Export("__i") int __i; @ObfuscatedName("m") @@ -106,6 +90,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__o) { var1.minX0 = this.__o; @@ -130,6 +115,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >= (this.__q << 6) + (this.__g << 3) && var2 <= (this.__q << 6) + (this.__e << 3) + 7 && var3 >= (this.__w << 6) + (this.__l << 3) && var3 <= (this.__w << 6) + (this.__x << 3) + 7:false; } @@ -139,6 +125,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >= (this.__o << 6) + (this.__d << 3) && var1 <= (this.__o << 6) + (this.__n << 3) + 7 && var2 >= (this.__u << 6) + (this.__k << 3) && var2 <= (this.__u << 6) + (this.__i << 3) + 7; } @@ -148,6 +135,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -162,6 +150,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -177,6 +166,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -200,7 +190,6 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(I)V", garbageValue = "1967186894" ) - @Export("__g_25") void __g_25() { } @@ -209,7 +198,8 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(I)V", garbageValue = "-2102591569" ) - static void method247() { + @Export("savePreferences") + static void savePreferences() { AccessFile var0 = null; try { @@ -261,7 +251,7 @@ public class WorldMapSection0 implements WorldMapSection { Client.__client_hh = false; int var7; - if(MouseHandler.MouseHandler_currentButton == 1 || !AbstractRasterProvider.__lp_ca && MouseHandler.MouseHandler_currentButton == 4) { + if(MouseHandler.MouseHandler_currentButton == 1 || !AbstractRasterProvider.mouseCam && MouseHandler.MouseHandler_currentButton == 4) { if(var5 >= var1 && var5 < var1 + 16 && var6 >= var2 && var6 < var2 + 16) { var0.scrollY -= 4; class22.method295(var0); diff --git a/rs-client/src/main/java/WorldMapSection1.java b/runescape-client/src/main/java/WorldMapSection1.java similarity index 96% rename from rs-client/src/main/java/WorldMapSection1.java rename to runescape-client/src/main/java/WorldMapSection1.java index 6cab7970dc..8661c099e2 100644 --- a/rs-client/src/main/java/WorldMapSection1.java +++ b/runescape-client/src/main/java/WorldMapSection1.java @@ -20,7 +20,6 @@ public class WorldMapSection1 implements WorldMapSection { @ObfuscatedGetter( intValue = -1516124929 ) - @Export("__as_ey") static int __as_ey; @ObfuscatedName("ha") @ObfuscatedGetter( @@ -32,61 +31,51 @@ public class WorldMapSection1 implements WorldMapSection { @ObfuscatedGetter( intValue = -1971304641 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1483447179 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -1875803617 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 284566685 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -1513010233 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1383826035 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 1526007343 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -890169045 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1797724181 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = 325777555 ) - @Export("__x") int __x; @ObfuscatedName("m") @@ -94,6 +83,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__o) { var1.minX0 = this.__o; @@ -118,6 +108,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >= (this.__q << 6) + (this.__g << 3) && var2 <= (this.__q << 6) + (this.__g << 3) + 7 && var3 >= (this.__w << 6) + (this.__l << 3) && var3 <= (this.__w << 6) + (this.__l << 3) + 7:false; } @@ -127,6 +118,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >= (this.__o << 6) + (this.__e << 3) && var1 <= (this.__o << 6) + (this.__e << 3) + 7 && var2 >= (this.__u << 6) + (this.__x << 3) && var2 <= (this.__u << 6) + (this.__x << 3) + 7; } @@ -136,6 +128,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -150,6 +143,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -165,6 +159,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -184,7 +179,6 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(I)V", garbageValue = "2026323437" ) - @Export("__g_84") void __g_84() { } @@ -292,7 +286,7 @@ public class WorldMapSection1 implements WorldMapSection { class196.varcs.clearTransient(); Client.followerIndex = -1; if(Client.rootWidgetGroup != -1) { - AbstractByteArrayCopier.method4023(Client.rootWidgetGroup); + AbstractByteArrayCopier.unloadWidgetGroup(Client.rootWidgetGroup); } for(WidgetGroupParent var4 = (WidgetGroupParent)Client.widgetGroupParents.first(); var4 != null; var4 = (WidgetGroupParent)Client.widgetGroupParents.next()) { diff --git a/rs-client/src/main/java/WorldMapSection2.java b/runescape-client/src/main/java/WorldMapSection2.java similarity index 60% rename from rs-client/src/main/java/WorldMapSection2.java rename to runescape-client/src/main/java/WorldMapSection2.java index 759a22446e..ce26f97738 100644 --- a/rs-client/src/main/java/WorldMapSection2.java +++ b/runescape-client/src/main/java/WorldMapSection2.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("WorldMapSection2") public class WorldMapSection2 implements WorldMapSection { @ObfuscatedName("l") - @Export("__ah_l") static int[] __ah_l; @ObfuscatedName("j") @Export("cacheDirectoryLocations") @@ -17,37 +16,31 @@ public class WorldMapSection2 implements WorldMapSection { @ObfuscatedGetter( intValue = -1561552223 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -245382089 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -1024859679 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 40495485 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 982234927 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1272330125 ) - @Export("__u") int __u; @ObfuscatedName("m") @@ -55,6 +48,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__o) { var1.minX0 = this.__o; @@ -79,6 +73,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >> 6 == this.__q && var3 >> 6 == this.__w:false; } @@ -88,6 +83,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >> 6 == this.__o && var2 >> 6 == this.__u; } @@ -97,6 +93,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -111,6 +108,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -126,6 +124,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -141,7 +140,6 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(I)V", garbageValue = "-1602858772" ) - @Export("__g_65") void __g_65() { } @@ -165,100 +163,100 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(IILfe;Lfy;I)Z", garbageValue = "-2025028346" ) - static final boolean method593(int var0, int var1, class179 var2, CollisionMap var3) { - int var4 = var0; - int var5 = var1; + static final boolean method593(int srcX, int srcY, RouteStrategy strategy, CollisionMap collisionMap) { + int var4 = srcX; + int var5 = srcY; byte var6 = 64; byte var7 = 64; - int var8 = var0 - var6; - int var9 = var1 - var7; - class178.__fi_q[var6][var7] = 99; - class178.__fi_w[var6][var7] = 0; + int graphBaseX = srcX - var6; + int graphBaseY = srcY - var7; + class178.directions[var6][var7] = 99; + class178.distances[var6][var7] = 0; byte var10 = 0; int var11 = 0; - class178.__fi_l[var10] = var0; + class178.bufferX[var10] = srcX; byte var10001 = var10; int var18 = var10 + 1; - class178.__fi_e[var10001] = var1; - int[][] var12 = var3.flags; + class178.bufferY[var10001] = srcY; + int[][] var12 = collisionMap.flags; while(var18 != var11) { - var4 = class178.__fi_l[var11]; - var5 = class178.__fi_e[var11]; + var4 = class178.bufferX[var11]; + var5 = class178.bufferY[var11]; var11 = var11 + 1 & 4095; - int var16 = var4 - var8; - int var17 = var5 - var9; - int var13 = var4 - var3.xInset; - int var14 = var5 - var3.yInset; - if(var2.vmethod3644(2, var4, var5, var3)) { + int var16 = var4 - graphBaseX; + int var17 = var5 - graphBaseY; + int var13 = var4 - collisionMap.xInset; + int var14 = var5 - collisionMap.yInset; + if(strategy.vmethod3644(2, var4, var5, collisionMap)) { WidgetGroupParent.__bx_o = var4; UrlRequester.__eo_u = var5; return true; } - int var15 = class178.__fi_w[var16][var17] + 1; - if(var16 > 0 && class178.__fi_q[var16 - 1][var17] == 0 && (var12[var13 - 1][var14] & 19136782) == 0 && (var12[var13 - 1][var14 + 1] & 19136824) == 0) { - class178.__fi_l[var18] = var4 - 1; - class178.__fi_e[var18] = var5; + int var15 = class178.distances[var16][var17] + 1; + if(var16 > 0 && class178.directions[var16 - 1][var17] == 0 && (var12[var13 - 1][var14] & 19136782) == 0 && (var12[var13 - 1][var14 + 1] & 19136824) == 0) { + class178.bufferX[var18] = var4 - 1; + class178.bufferY[var18] = var5; var18 = var18 + 1 & 4095; - class178.__fi_q[var16 - 1][var17] = 2; - class178.__fi_w[var16 - 1][var17] = var15; + class178.directions[var16 - 1][var17] = 2; + class178.distances[var16 - 1][var17] = var15; } - if(var16 < 126 && class178.__fi_q[var16 + 1][var17] == 0 && (var12[var13 + 2][var14] & 19136899) == 0 && (var12[var13 + 2][var14 + 1] & 19136992) == 0) { - class178.__fi_l[var18] = var4 + 1; - class178.__fi_e[var18] = var5; + if(var16 < 126 && class178.directions[var16 + 1][var17] == 0 && (var12[var13 + 2][var14] & 19136899) == 0 && (var12[var13 + 2][var14 + 1] & 19136992) == 0) { + class178.bufferX[var18] = var4 + 1; + class178.bufferY[var18] = var5; var18 = var18 + 1 & 4095; - class178.__fi_q[var16 + 1][var17] = 8; - class178.__fi_w[var16 + 1][var17] = var15; + class178.directions[var16 + 1][var17] = 8; + class178.distances[var16 + 1][var17] = var15; } - if(var17 > 0 && class178.__fi_q[var16][var17 - 1] == 0 && (var12[var13][var14 - 1] & 19136782) == 0 && (var12[var13 + 1][var14 - 1] & 19136899) == 0) { - class178.__fi_l[var18] = var4; - class178.__fi_e[var18] = var5 - 1; + if(var17 > 0 && class178.directions[var16][var17 - 1] == 0 && (var12[var13][var14 - 1] & 19136782) == 0 && (var12[var13 + 1][var14 - 1] & 19136899) == 0) { + class178.bufferX[var18] = var4; + class178.bufferY[var18] = var5 - 1; var18 = var18 + 1 & 4095; - class178.__fi_q[var16][var17 - 1] = 1; - class178.__fi_w[var16][var17 - 1] = var15; + class178.directions[var16][var17 - 1] = 1; + class178.distances[var16][var17 - 1] = var15; } - if(var17 < 126 && class178.__fi_q[var16][var17 + 1] == 0 && (var12[var13][var14 + 2] & 19136824) == 0 && (var12[var13 + 1][var14 + 2] & 19136992) == 0) { - class178.__fi_l[var18] = var4; - class178.__fi_e[var18] = var5 + 1; + if(var17 < 126 && class178.directions[var16][var17 + 1] == 0 && (var12[var13][var14 + 2] & 19136824) == 0 && (var12[var13 + 1][var14 + 2] & 19136992) == 0) { + class178.bufferX[var18] = var4; + class178.bufferY[var18] = var5 + 1; var18 = var18 + 1 & 4095; - class178.__fi_q[var16][var17 + 1] = 4; - class178.__fi_w[var16][var17 + 1] = var15; + class178.directions[var16][var17 + 1] = 4; + class178.distances[var16][var17 + 1] = var15; } - if(var16 > 0 && var17 > 0 && class178.__fi_q[var16 - 1][var17 - 1] == 0 && (var12[var13 - 1][var14] & 19136830) == 0 && (var12[var13 - 1][var14 - 1] & 19136782) == 0 && (var12[var13][var14 - 1] & 19136911) == 0) { - class178.__fi_l[var18] = var4 - 1; - class178.__fi_e[var18] = var5 - 1; + if(var16 > 0 && var17 > 0 && class178.directions[var16 - 1][var17 - 1] == 0 && (var12[var13 - 1][var14] & 19136830) == 0 && (var12[var13 - 1][var14 - 1] & 19136782) == 0 && (var12[var13][var14 - 1] & 19136911) == 0) { + class178.bufferX[var18] = var4 - 1; + class178.bufferY[var18] = var5 - 1; var18 = var18 + 1 & 4095; - class178.__fi_q[var16 - 1][var17 - 1] = 3; - class178.__fi_w[var16 - 1][var17 - 1] = var15; + class178.directions[var16 - 1][var17 - 1] = 3; + class178.distances[var16 - 1][var17 - 1] = var15; } - if(var16 < 126 && var17 > 0 && class178.__fi_q[var16 + 1][var17 - 1] == 0 && (var12[var13 + 1][var14 - 1] & 19136911) == 0 && (var12[var13 + 2][var14 - 1] & 19136899) == 0 && (var12[var13 + 2][var14] & 19136995) == 0) { - class178.__fi_l[var18] = var4 + 1; - class178.__fi_e[var18] = var5 - 1; + if(var16 < 126 && var17 > 0 && class178.directions[var16 + 1][var17 - 1] == 0 && (var12[var13 + 1][var14 - 1] & 19136911) == 0 && (var12[var13 + 2][var14 - 1] & 19136899) == 0 && (var12[var13 + 2][var14] & 19136995) == 0) { + class178.bufferX[var18] = var4 + 1; + class178.bufferY[var18] = var5 - 1; var18 = var18 + 1 & 4095; - class178.__fi_q[var16 + 1][var17 - 1] = 9; - class178.__fi_w[var16 + 1][var17 - 1] = var15; + class178.directions[var16 + 1][var17 - 1] = 9; + class178.distances[var16 + 1][var17 - 1] = var15; } - if(var16 > 0 && var17 < 126 && class178.__fi_q[var16 - 1][var17 + 1] == 0 && (var12[var13 - 1][var14 + 1] & 19136830) == 0 && (var12[var13 - 1][var14 + 2] & 19136824) == 0 && (var12[var13][var14 + 2] & 19137016) == 0) { - class178.__fi_l[var18] = var4 - 1; - class178.__fi_e[var18] = var5 + 1; + if(var16 > 0 && var17 < 126 && class178.directions[var16 - 1][var17 + 1] == 0 && (var12[var13 - 1][var14 + 1] & 19136830) == 0 && (var12[var13 - 1][var14 + 2] & 19136824) == 0 && (var12[var13][var14 + 2] & 19137016) == 0) { + class178.bufferX[var18] = var4 - 1; + class178.bufferY[var18] = var5 + 1; var18 = var18 + 1 & 4095; - class178.__fi_q[var16 - 1][var17 + 1] = 6; - class178.__fi_w[var16 - 1][var17 + 1] = var15; + class178.directions[var16 - 1][var17 + 1] = 6; + class178.distances[var16 - 1][var17 + 1] = var15; } - if(var16 < 126 && var17 < 126 && class178.__fi_q[var16 + 1][var17 + 1] == 0 && (var12[var13 + 1][var14 + 2] & 19137016) == 0 && (var12[var13 + 2][var14 + 2] & 19136992) == 0 && (var12[var13 + 2][var14 + 1] & 19136995) == 0) { - class178.__fi_l[var18] = var4 + 1; - class178.__fi_e[var18] = var5 + 1; + if(var16 < 126 && var17 < 126 && class178.directions[var16 + 1][var17 + 1] == 0 && (var12[var13 + 1][var14 + 2] & 19137016) == 0 && (var12[var13 + 2][var14 + 2] & 19136992) == 0 && (var12[var13 + 2][var14 + 1] & 19136995) == 0) { + class178.bufferX[var18] = var4 + 1; + class178.bufferY[var18] = var5 + 1; var18 = var18 + 1 & 4095; - class178.__fi_q[var16 + 1][var17 + 1] = 12; - class178.__fi_w[var16 + 1][var17 + 1] = var15; + class178.directions[var16 + 1][var17 + 1] = 12; + class178.distances[var16 + 1][var17 + 1] = var15; } } @@ -280,7 +278,7 @@ public class WorldMapSection2 implements WorldMapSection { for(int var6 = 0; var6 < var2; ++var6) { Player var7 = Client.players[var3[var6]]; - if(var7 != null && var7 != Canvas.localPlayer && var7.username != null && var7.username.__equals_466(var5)) { + if(var7 != null && var7 != Canvas.localPlayer && var7.username != null && var7.username.equals(var5)) { PacketBufferNode var8; if(var0 == 1) { var8 = Interpreter.method1915(ClientPacket.__gs_ao, Client.packetWriter.isaacCipher); diff --git a/rs-client/src/main/java/WorldMapSection3.java b/runescape-client/src/main/java/WorldMapSection3.java similarity index 96% rename from rs-client/src/main/java/WorldMapSection3.java rename to runescape-client/src/main/java/WorldMapSection3.java index 41bd777ed2..77c5862ad7 100644 --- a/rs-client/src/main/java/WorldMapSection3.java +++ b/runescape-client/src/main/java/WorldMapSection3.java @@ -20,67 +20,56 @@ public class WorldMapSection3 implements WorldMapSection { @ObfuscatedGetter( intValue = -948290091 ) - @Export("__p_go") static int __p_go; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 1389733201 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1622972483 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 702057599 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -1068088609 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 1257151629 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1351623663 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 1016557381 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 884736611 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 395786901 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -627081155 ) - @Export("__x") int __x; @ObfuscatedName("m") @@ -88,6 +77,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__g) { var1.minX0 = this.__g; @@ -112,6 +102,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >> 6 >= this.__q && var2 >> 6 <= this.__o && var3 >> 6 >= this.__w && var3 >> 6 <= this.__u:false; } @@ -121,6 +112,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >> 6 >= this.__g && var1 >> 6 <= this.__e && var2 >> 6 >= this.__l && var2 >> 6 <= this.__x; } @@ -130,6 +122,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -144,6 +137,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -159,6 +153,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -178,7 +173,6 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(B)V", garbageValue = "-126" ) - @Export("__g_38") void __g_38() { } diff --git a/rs-client/src/main/java/WorldMapSectionType.java b/runescape-client/src/main/java/WorldMapSectionType.java similarity index 82% rename from rs-client/src/main/java/WorldMapSectionType.java rename to runescape-client/src/main/java/WorldMapSectionType.java index 4c5e3bc70d..25bac17559 100644 --- a/rs-client/src/main/java/WorldMapSectionType.java +++ b/runescape-client/src/main/java/WorldMapSectionType.java @@ -12,34 +12,29 @@ public enum WorldMapSectionType implements Enumerated { @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_m") __h_m(1, (byte)0), @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_f") __h_f(0, (byte)1), @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_q") __h_q(3, (byte)2), @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_w") __h_w(2, (byte)3); @ObfuscatedName("e") @ObfuscatedSignature( signature = "Llq;" ) - @Export("__h_e") - static IndexedSprite __h_e; + @Export("logoSprite") + static IndexedSprite logoSprite; @ObfuscatedName("n") - @Export("__h_n") static int[] __h_n; @ObfuscatedName("gc") @ObfuscatedSignature( @@ -67,6 +62,7 @@ public enum WorldMapSectionType implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } @@ -104,22 +100,22 @@ public enum WorldMapSectionType implements Enumerated { static int method253(int var0, Script var1, boolean var2) { Widget var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; if(var0 == 1500) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.x; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.x; return 1; } else if(var0 == 1501) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.y; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.y; return 1; } else if(var0 == 1502) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.width; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.width; return 1; } else if(var0 == 1503) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.height; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.height; return 1; } else if(var0 == 1504) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.isHidden?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.isHidden?1:0; return 1; } else if(var0 == 1505) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.parentId; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.parentId; return 1; } else { return 2; diff --git a/rs-client/src/main/java/Wrapper.java b/runescape-client/src/main/java/Wrapper.java similarity index 100% rename from rs-client/src/main/java/Wrapper.java rename to runescape-client/src/main/java/Wrapper.java diff --git a/rs-client/src/main/java/class0.java b/runescape-client/src/main/java/class0.java similarity index 100% rename from rs-client/src/main/java/class0.java rename to runescape-client/src/main/java/class0.java diff --git a/rs-client/src/main/java/class1.java b/runescape-client/src/main/java/class1.java similarity index 63% rename from rs-client/src/main/java/class1.java rename to runescape-client/src/main/java/class1.java index 289c3ea18f..7e78c1a9c0 100644 --- a/rs-client/src/main/java/class1.java +++ b/runescape-client/src/main/java/class1.java @@ -8,7 +8,6 @@ final class class1 implements class0 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__f_m") public static AbstractIndexCache __f_m; @ObfuscatedName("m") @@ -81,18 +80,18 @@ final class class1 implements class0 { Widget var4; if(var0 >= 2000) { var0 -= 1000; - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var4 = Huffman.getWidget(var3); } else { var4 = var2?WorldMapIcon1.__t_i:class12.__n_n; } if(var0 == 1000) { - class179.Interpreter_intStackSize -= 4; - var4.rawX = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4.rawY = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - var4.xAlignment = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - var4.yAlignment = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3]; + RouteStrategy.Interpreter_intStackSize -= 4; + var4.rawX = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4.rawY = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + var4.xAlignment = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + var4.yAlignment = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3]; class22.method295(var4); TextureProvider.client.alignWidget(var4); if(var3 != -1 && var4.type == 0) { @@ -101,11 +100,11 @@ final class class1 implements class0 { return 1; } else if(var0 == 1001) { - class179.Interpreter_intStackSize -= 4; - var4.rawWidth = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4.rawHeight = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - var4.widthAlignment = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - var4.heightAlignment = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3]; + RouteStrategy.Interpreter_intStackSize -= 4; + var4.rawWidth = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4.rawHeight = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + var4.widthAlignment = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + var4.heightAlignment = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3]; class22.method295(var4); TextureProvider.client.alignWidget(var4); if(var3 != -1 && var4.type == 0) { @@ -114,7 +113,7 @@ final class class1 implements class0 { return 1; } else if(var0 == 1003) { - boolean var5 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + boolean var5 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(var5 != var4.isHidden) { var4.isHidden = var5; class22.method295(var4); @@ -122,10 +121,10 @@ final class class1 implements class0 { return 1; } else if(var0 == 1005) { - var4.noClickThrough = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var4.noClickThrough = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 1006) { - var4.noScrollThrough = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var4.noScrollThrough = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else { return 2; @@ -140,16 +139,16 @@ final class class1 implements class0 { static int method16(int var0, Script var1, boolean var2) { int var3; if(var0 == 4200) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Skills.getItemDefinition(var3).name; return 1; } else { int var4; ItemDefinition var5; if(var0 == 4201) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var5 = Skills.getItemDefinition(var3); if(var4 >= 1 && var4 <= 5 && var5.groundActions[var4 - 1] != null) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var5.groundActions[var4 - 1]; @@ -159,9 +158,9 @@ final class class1 implements class0 { return 1; } else if(var0 == 4202) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var5 = Skills.getItemDefinition(var3); if(var4 >= 1 && var4 <= 5 && var5.inventoryActions[var4 - 1] != null) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var5.inventoryActions[var4 - 1]; @@ -171,64 +170,64 @@ final class class1 implements class0 { return 1; } else if(var0 == 4203) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var3).price; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var3).price; return 1; } else if(var0 == 4204) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var3).isStackable == 1?1:0; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var3).isStackable == 1?1:0; return 1; } else { ItemDefinition var6; if(var0 == 4205) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = Skills.getItemDefinition(var3); if(var6.noteTemplate == -1 && var6.note >= 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6.note; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6.note; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3; } return 1; } else if(var0 == 4206) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = Skills.getItemDefinition(var3); if(var6.noteTemplate >= 0 && var6.note >= 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6.note; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6.note; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3; } return 1; } else if(var0 == 4207) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var3).isMembersOnly?1:0; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var3).isMembersOnly?1:0; return 1; } else if(var0 == 4208) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = Skills.getItemDefinition(var3); if(var6.placeholderTemplate == -1 && var6.placeholder >= 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6.placeholder; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6.placeholder; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3; } return 1; } else if(var0 == 4209) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = Skills.getItemDefinition(var3); if(var6.placeholderTemplate >= 0 && var6.placeholder >= 0) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6.placeholder; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6.placeholder; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3; } return 1; } else if(var0 == 4210) { String var7 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; class50.method900(var7, var4 == 1); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WorldMapSection0.__y_sn; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WorldMapSection0.__y_sn; return 1; } else if(var0 != 4211) { if(var0 == 4212) { @@ -239,9 +238,9 @@ final class class1 implements class0 { } } else { if(AttackOption.__cj_sp != null && class231.__hb_sg < WorldMapSection0.__y_sn) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = AttackOption.__cj_sp[++class231.__hb_sg - 1] & '\uffff'; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = AttackOption.__cj_sp[++class231.__hb_sg - 1] & '\uffff'; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } return 1; diff --git a/rs-client/src/main/java/class102.java b/runescape-client/src/main/java/class102.java similarity index 99% rename from rs-client/src/main/java/class102.java rename to runescape-client/src/main/java/class102.java index 0d10655c77..5099b3aa94 100644 --- a/rs-client/src/main/java/class102.java +++ b/runescape-client/src/main/java/class102.java @@ -4,19 +4,14 @@ import net.runelite.mapping.ObfuscatedName; @ObfuscatedName("ca") public class class102 { @ObfuscatedName("m") - @Export("__ca_m") static final int[] __ca_m; @ObfuscatedName("f") - @Export("__ca_f") static final float[] __ca_f; @ObfuscatedName("x") - @Export("__ca_x") static int[] __ca_x; @ObfuscatedName("d") - @Export("__ca_d") static int[] __ca_d; @ObfuscatedName("k") - @Export("__ca_k") static boolean[] __ca_k; @ObfuscatedName("q") int[] field1353; diff --git a/rs-client/src/main/java/class109.java b/runescape-client/src/main/java/class109.java similarity index 100% rename from rs-client/src/main/java/class109.java rename to runescape-client/src/main/java/class109.java diff --git a/rs-client/src/main/java/class11.java b/runescape-client/src/main/java/class11.java similarity index 86% rename from rs-client/src/main/java/class11.java rename to runescape-client/src/main/java/class11.java index a8a3033982..48df6ff7e3 100644 --- a/rs-client/src/main/java/class11.java +++ b/runescape-client/src/main/java/class11.java @@ -85,7 +85,7 @@ final class class11 implements Comparator { Widget var3; if(var0 >= 2000) { var0 -= 1000; - var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); } else { var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; } @@ -93,9 +93,9 @@ final class class11 implements Comparator { String var4 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; int[] var5 = null; if(var4.length() > 0 && var4.charAt(var4.length() - 1) == 'Y') { - int var6 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + int var6 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var6 > 0) { - for(var5 = new int[var6]; var6-- > 0; var5[var6] = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]) { + for(var5 = new int[var6]; var6-- > 0; var5[var6] = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]) { ; } } @@ -110,11 +110,11 @@ final class class11 implements Comparator { if(var4.charAt(var7 - 1) == 's') { var8[var7] = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; } else { - var8[var7] = new Integer(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var8[var7] = new Integer(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); } } - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var7 != -1) { var8[0] = new Integer(var7); } else { @@ -196,30 +196,30 @@ final class class11 implements Comparator { static int method146(int var0, Script var1, boolean var2) { Widget var3; if(var0 == 2700) { - var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.itemId; + var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.itemId; return 1; } else if(var0 == 2701) { - var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); if(var3.itemId != -1) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.itemQuantity; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.itemQuantity; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 2702) { - int var5 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + int var5 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; WidgetGroupParent var4 = (WidgetGroupParent)Client.widgetGroupParents.get((long)var5); if(var4 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 2706) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.rootWidgetGroup; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.rootWidgetGroup; return 1; } else { return 2; @@ -252,8 +252,8 @@ final class class11 implements Comparator { garbageValue = "-1292134247" ) static final void method148(int var0, int var1, int var2, int var3, int var4) { - class32.scrollBarSprites[0].__q_496(var0, var1); - class32.scrollBarSprites[1].__q_496(var0, var3 + var1 - 16); + class32.scrollBarSprites[0].drawAt(var0, var1); + class32.scrollBarSprites[1].drawAt(var0, var3 + var1 - 16); Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1 + 16, 16, var3 - 32, Client.__client_hx); int var5 = var3 * (var3 - 32) / var4; if(var5 < 8) { diff --git a/rs-client/src/main/java/class114.java b/runescape-client/src/main/java/class114.java similarity index 100% rename from rs-client/src/main/java/class114.java rename to runescape-client/src/main/java/class114.java diff --git a/rs-client/src/main/java/class12.java b/runescape-client/src/main/java/class12.java similarity index 99% rename from rs-client/src/main/java/class12.java rename to runescape-client/src/main/java/class12.java index 7447f2a24c..f3808368eb 100644 --- a/rs-client/src/main/java/class12.java +++ b/runescape-client/src/main/java/class12.java @@ -9,7 +9,6 @@ final class class12 implements Comparator { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__n_n") static Widget __n_n; @ObfuscatedName("m") diff --git a/rs-client/src/main/java/class13.java b/runescape-client/src/main/java/class13.java similarity index 95% rename from rs-client/src/main/java/class13.java rename to runescape-client/src/main/java/class13.java index bf78e4c305..bd6ef3a987 100644 --- a/rs-client/src/main/java/class13.java +++ b/runescape-client/src/main/java/class13.java @@ -6,7 +6,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("i") public class class13 { @ObfuscatedName("x") - @Export("__i_x") static int[] __i_x; @ObfuscatedName("k") @ObfuscatedSignature( @@ -18,8 +17,8 @@ public class class13 { @ObfuscatedGetter( intValue = -1810047523 ) - @Export("__i_af") - static int __i_af; + @Export("otpInt") + static int otpInt; @ObfuscatedName("f") @ObfuscatedSignature( @@ -35,7 +34,8 @@ public class class13 { signature = "(B)V", garbageValue = "63" ) - static final void method163() { + @Export("playPcmPlayers") + static final void playPcmPlayers() { if(AbstractIndexCache.pcmPlayer1 != null) { AbstractIndexCache.pcmPlayer1.run(); } diff --git a/rs-client/src/main/java/class14.java b/runescape-client/src/main/java/class14.java similarity index 100% rename from rs-client/src/main/java/class14.java rename to runescape-client/src/main/java/class14.java diff --git a/rs-client/src/main/java/class15.java b/runescape-client/src/main/java/class15.java similarity index 95% rename from rs-client/src/main/java/class15.java rename to runescape-client/src/main/java/class15.java index 6ef8c64f1f..0bcb48c166 100644 --- a/rs-client/src/main/java/class15.java +++ b/runescape-client/src/main/java/class15.java @@ -9,7 +9,6 @@ public class class15 extends class21 { @ObfuscatedGetter( longValue = 3423502126894795079L ) - @Export("__z_si") static long __z_si; @ObfuscatedName("j") @ObfuscatedSignature( @@ -121,9 +120,9 @@ public class class15 extends class21 { garbageValue = "2139921057" ) static int method182(int var0, Script var1, boolean var2) { - Widget var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + Widget var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); if(var0 == 2800) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class211.method4107(class1.getWidgetClickMask(var3)); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class211.method4107(class1.getWidgetClickMask(var3)); return 1; } else if(var0 != 2801) { if(var0 == 2802) { @@ -138,7 +137,7 @@ public class class15 extends class21 { return 2; } } else { - int var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + int var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; --var4; if(var3.actions != null && var4 < var3.actions.length && var3.actions[var4] != null) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.actions[var4]; diff --git a/rs-client/src/main/java/class157.java b/runescape-client/src/main/java/class157.java similarity index 98% rename from rs-client/src/main/java/class157.java rename to runescape-client/src/main/java/class157.java index c4948607bb..4f2d436c49 100644 --- a/rs-client/src/main/java/class157.java +++ b/runescape-client/src/main/java/class157.java @@ -9,7 +9,6 @@ public class class157 extends AbstractUserComparator { @ObfuscatedGetter( intValue = 1006519291 ) - @Export("__fw_nm") static int __fw_nm; @ObfuscatedName("m") final boolean field1969; diff --git a/rs-client/src/main/java/class159.java b/runescape-client/src/main/java/class159.java similarity index 95% rename from rs-client/src/main/java/class159.java rename to runescape-client/src/main/java/class159.java index 8018fc0c88..f38ef0ffc0 100644 --- a/rs-client/src/main/java/class159.java +++ b/runescape-client/src/main/java/class159.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -46,6 +47,7 @@ public enum class159 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field1981; } diff --git a/rs-client/src/main/java/class16.java b/runescape-client/src/main/java/class16.java similarity index 98% rename from rs-client/src/main/java/class16.java rename to runescape-client/src/main/java/class16.java index c9eeee21fa..ad03754107 100644 --- a/rs-client/src/main/java/class16.java +++ b/runescape-client/src/main/java/class16.java @@ -14,7 +14,8 @@ public class class16 { @ObfuscatedSignature( signature = "Lbp;" ) - static class72 field85; + @Export("loginScreenRunesAnimation") + static LoginScreenAnimation loginScreenRunesAnimation; @ObfuscatedName("dv") @ObfuscatedSignature( signature = "Lit;" @@ -62,7 +63,7 @@ public class class16 { static int method188(int var0, Script var1, boolean var2) { Widget var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; if(var0 == 1800) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class211.method4107(class1.getWidgetClickMask(var3)); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class211.method4107(class1.getWidgetClickMask(var3)); return 1; } else if(var0 != 1801) { if(var0 == 1802) { @@ -77,7 +78,7 @@ public class class16 { return 2; } } else { - int var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + int var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; --var4; if(var3.actions != null && var4 < var3.actions.length && var3.actions[var4] != null) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.actions[var4]; @@ -208,7 +209,7 @@ public class class16 { var10 = var7 + 1; if(Canvas.localPlayer.pathX[0] >= var3 - var10 && Canvas.localPlayer.pathX[0] <= var10 + var3 && Canvas.localPlayer.pathY[0] >= var38 - var10 && Canvas.localPlayer.pathY[0] <= var10 + var38 && Client.__client_qc != 0 && var8 > 0 && Client.soundEffectCount < 50) { Client.soundEffectIds[Client.soundEffectCount] = var9; - Client.unknownSoundValues1[Client.soundEffectCount] = var8; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var8; Client.queuedSoundEffectDelays[Client.soundEffectCount] = var5; Client.soundEffects[Client.soundEffectCount] = null; Client.soundLocations[Client.soundEffectCount] = var7 + (var38 << 8) + (var3 << 16); diff --git a/rs-client/src/main/java/class160.java b/runescape-client/src/main/java/class160.java similarity index 100% rename from rs-client/src/main/java/class160.java rename to runescape-client/src/main/java/class160.java diff --git a/rs-client/src/main/java/class161.java b/runescape-client/src/main/java/class161.java similarity index 100% rename from rs-client/src/main/java/class161.java rename to runescape-client/src/main/java/class161.java diff --git a/rs-client/src/main/java/class168.java b/runescape-client/src/main/java/class168.java similarity index 95% rename from rs-client/src/main/java/class168.java rename to runescape-client/src/main/java/class168.java index 6a3f422952..4b534460d2 100644 --- a/rs-client/src/main/java/class168.java +++ b/runescape-client/src/main/java/class168.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("fs") public class class168 { @ObfuscatedName("o") - @Export("__fs_o") public static File __fs_o; @ObfuscatedName("u") @ObfuscatedGetter( @@ -37,8 +36,8 @@ public class class168 { @ObfuscatedGetter( intValue = 1181569415 ) - @Export("__fs_au") - static int __fs_au; + @Export("optionButtonSpriteSubWidth") + static int optionButtonSpriteSubWidth; static { randomDat = null; diff --git a/rs-client/src/main/java/class171.java b/runescape-client/src/main/java/class171.java similarity index 88% rename from rs-client/src/main/java/class171.java rename to runescape-client/src/main/java/class171.java index c1e9afface..e097229418 100644 --- a/rs-client/src/main/java/class171.java +++ b/runescape-client/src/main/java/class171.java @@ -11,16 +11,12 @@ public class class171 { @ObfuscatedGetter( intValue = -852697585 ) - @Export("__fo_ro") static int __fo_ro; @ObfuscatedName("m") - @Export("__fo_m") public static boolean __fo_m; @ObfuscatedName("f") - @Export("__fo_f") public static File __fo_f; @ObfuscatedName("q") - @Export("__fo_q") static Hashtable __fo_q; static { @@ -251,7 +247,7 @@ public class class171 { Font var6 = ScriptEvent.fontPlain11; ItemDefinition.ItemDefinition_indexCache = var3; ItemDefinition.ItemDefinition_modelIndexCache = var4; - class30.__ar_l = var5; + class30.inMembersWorld = var5; class83.__cm_e = ItemDefinition.ItemDefinition_indexCache.__s_396(10); class204.__gx_n = var6; IndexCache var7 = ObjectSound.indexCache2; @@ -331,10 +327,10 @@ public class class171 { if(class192.mapSceneSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.mapScenes; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var27 = null; } else { - var27 = WorldMapLabel.method444(); + var27 = WorldMapLabel.createIndexedSpriteArray(); } class192.mapSceneSprites = var27; @@ -346,10 +342,10 @@ public class class171 { if(class15.headIconPkSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.headIconsPk; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var37 = null; } else { - var37 = UserComparator9.method3344(); + var37 = UserComparator9.createSpriteArray(); } class15.headIconPkSprites = var37; @@ -360,10 +356,10 @@ public class class171 { if(ClientPreferences.headIconPrayerSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.headIconsPrayer; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var37 = null; } else { - var37 = UserComparator9.method3344(); + var37 = UserComparator9.createSpriteArray(); } ClientPreferences.headIconPrayerSprites = var37; @@ -374,10 +370,10 @@ public class class171 { if(Player.headIconHintSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.headIconsHint; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var37 = null; } else { - var37 = UserComparator9.method3344(); + var37 = UserComparator9.createSpriteArray(); } Player.headIconHintSprites = var37; @@ -388,10 +384,10 @@ public class class171 { if(class16.mapMarkerSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.mapMarkers; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var37 = null; } else { - var37 = UserComparator9.method3344(); + var37 = UserComparator9.createSpriteArray(); } class16.mapMarkerSprites = var37; @@ -402,10 +398,10 @@ public class class171 { if(KeyHandler.crossSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.crosses; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var37 = null; } else { - var37 = UserComparator9.method3344(); + var37 = UserComparator9.createSpriteArray(); } KeyHandler.crossSprites = var37; @@ -416,10 +412,10 @@ public class class171 { if(class39.mapDotSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.mapDots; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var37 = null; } else { - var37 = UserComparator9.method3344(); + var37 = UserComparator9.createSpriteArray(); } class39.mapDotSprites = var37; @@ -430,10 +426,10 @@ public class class171 { if(class32.scrollBarSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.scrollBars; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var27 = null; } else { - var27 = WorldMapLabel.method444(); + var27 = WorldMapLabel.createIndexedSpriteArray(); } class32.scrollBarSprites = var27; @@ -444,10 +440,10 @@ public class class171 { if(WorldMapSectionType.modIconSprites == null) { var2 = WorldMapSection3.indexCache8; var28 = class211.spriteIds.modIcons; - if(!SpriteMask.method4392(var2, var28, 0)) { + if(!SpriteMask.loadSprite(var2, var28, 0)) { var27 = null; } else { - var27 = WorldMapLabel.method444(); + var27 = WorldMapLabel.createIndexedSpriteArray(); } WorldMapSectionType.modIconSprites = var27; @@ -547,14 +543,14 @@ public class class171 { signature = "(IIIILjava/lang/String;I)V", garbageValue = "49247882" ) - static void method3494(int var0, int var1, int var2, int var3, String var4) { - Widget var5 = class204.getWidgetChild(var1, var2); + static void method3494(int opIndex, int parentID, int childID, int itemID, String target) { + Widget var5 = class204.getWidgetChild(parentID, childID); if(var5 != null) { if(var5.onOp != null) { ScriptEvent var6 = new ScriptEvent(); var6.widget = var5; - var6.opIndex = var0; - var6.targetName = var4; + var6.opIndex = opIndex; + var6.targetName = target; var6.args0 = var5.onOp; AbstractIndexCache.runScript(var6); } @@ -566,87 +562,87 @@ public class class171 { if(var11) { int var8 = class1.getWidgetClickMask(var5); - int var9 = var0 - 1; + int var9 = opIndex - 1; boolean var7 = (var8 >> var9 + 1 & 1) != 0; if(var7) { PacketBufferNode var10; - if(var0 == 1) { + if(opIndex == 1) { var10 = Interpreter.method1915(ClientPacket.__gs_bi, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 2) { + if(opIndex == 2) { var10 = Interpreter.method1915(ClientPacket.__gs_b, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 3) { + if(opIndex == 3) { var10 = Interpreter.method1915(ClientPacket.__gs_aa, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 4) { + if(opIndex == 4) { var10 = Interpreter.method1915(ClientPacket.__gs_y, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 5) { + if(opIndex == 5) { var10 = Interpreter.method1915(ClientPacket.__gs_ad, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 6) { + if(opIndex == 6) { var10 = Interpreter.method1915(ClientPacket.__gs_br, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 7) { + if(opIndex == 7) { var10 = Interpreter.method1915(ClientPacket.__gs_cu, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 8) { + if(opIndex == 8) { var10 = Interpreter.method1915(ClientPacket.__gs_a, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 9) { + if(opIndex == 9) { var10 = Interpreter.method1915(ClientPacket.__gs_cj, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 10) { + if(opIndex == 10) { var10 = Interpreter.method1915(ClientPacket.__gs_m, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } diff --git a/runescape-client/src/main/java/class178.java b/runescape-client/src/main/java/class178.java new file mode 100644 index 0000000000..1079c412b8 --- /dev/null +++ b/runescape-client/src/main/java/class178.java @@ -0,0 +1,25 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedName; + +@ObfuscatedName("fi") +public class class178 { + @ObfuscatedName("q") + @Export("directions") + static int[][] directions; + @ObfuscatedName("w") + @Export("distances") + static int[][] distances; + @ObfuscatedName("l") + @Export("bufferX") + static int[] bufferX; + @ObfuscatedName("e") + @Export("bufferY") + static int[] bufferY; + + static { + directions = new int[128][128]; + distances = new int[128][128]; + bufferX = new int[4096]; + bufferY = new int[4096]; + } +} diff --git a/rs-client/src/main/java/class190.java b/runescape-client/src/main/java/class190.java similarity index 100% rename from rs-client/src/main/java/class190.java rename to runescape-client/src/main/java/class190.java diff --git a/rs-client/src/main/java/class192.java b/runescape-client/src/main/java/class192.java similarity index 100% rename from rs-client/src/main/java/class192.java rename to runescape-client/src/main/java/class192.java diff --git a/rs-client/src/main/java/class196.java b/runescape-client/src/main/java/class196.java similarity index 100% rename from rs-client/src/main/java/class196.java rename to runescape-client/src/main/java/class196.java diff --git a/rs-client/src/main/java/class197.java b/runescape-client/src/main/java/class197.java similarity index 100% rename from rs-client/src/main/java/class197.java rename to runescape-client/src/main/java/class197.java diff --git a/rs-client/src/main/java/class198.java b/runescape-client/src/main/java/class198.java similarity index 100% rename from rs-client/src/main/java/class198.java rename to runescape-client/src/main/java/class198.java diff --git a/rs-client/src/main/java/class2.java b/runescape-client/src/main/java/class2.java similarity index 56% rename from rs-client/src/main/java/class2.java rename to runescape-client/src/main/java/class2.java index 7cbac1fdf0..7c697769f4 100644 --- a/rs-client/src/main/java/class2.java +++ b/runescape-client/src/main/java/class2.java @@ -59,59 +59,59 @@ final class class2 implements class0 { static void method27(AbstractIndexCache var0, AbstractIndexCache var1, boolean var2, int var3) { if(Login.__cu_f) { if(var3 == 4) { - Login.__cu_aw = 4; + Login.loginIndex = 4; } } else { - Login.__cu_aw = var3; + Login.loginIndex = var3; Rasterizer2D.Rasterizer2D_clear(); byte[] var4 = var0.takeRecordByNames("title.jpg", ""); - Login.__cu_g = class27.method438(var4); - Fonts.__kz_l = Login.__cu_g.copy(); - if((Client.worldProperties & 536870912) != 0) { - WorldMapSectionType.__h_e = MenuAction.method2025(var1, "logo_deadman_mode", ""); + Login.leftTitleSprite = class27.convertJpgToSprite(var4); + Fonts.rightTitleSprite = Login.leftTitleSprite.copy(); + if((Client.worldProperties & 0x20000000) != 0) { + WorldMapSectionType.logoSprite = MenuAction.loadIndexedSpriteByName(var1, "logo_deadman_mode", ""); } else { - WorldMapSectionType.__h_e = MenuAction.method2025(var1, "logo", ""); + WorldMapSectionType.logoSprite = MenuAction.loadIndexedSpriteByName(var1, "logo", ""); } - Login.__cu_o = MenuAction.method2025(var1, "titlebox", ""); - IndexCacheLoader.__bd_u = MenuAction.method2025(var1, "titlebutton", ""); + Login.titleboxSprite = MenuAction.loadIndexedSpriteByName(var1, "titlebox", ""); + IndexCacheLoader.titlebuttonSprite = MenuAction.loadIndexedSpriteByName(var1, "titlebutton", ""); int var6 = var1.getArchiveId("runes"); int var7 = var1.getRecordId(var6, ""); IndexedSprite[] var8; - if(!SpriteMask.method4392(var1, var6, var7)) { + if(!SpriteMask.loadSprite(var1, var6, var7)) { var8 = null; } else { - var8 = WorldMapLabel.method444(); + var8 = WorldMapLabel.createIndexedSpriteArray(); } - WorldMapEvent.__ap_w = var8; + WorldMapEvent.runesSprite = var8; var7 = var1.getArchiveId("title_mute"); int var10 = var1.getRecordId(var7, ""); IndexedSprite[] var9; - if(!SpriteMask.method4392(var1, var7, var10)) { + if(!SpriteMask.loadSprite(var1, var7, var10)) { var9 = null; } else { - var9 = WorldMapLabel.method444(); + var9 = WorldMapLabel.createIndexedSpriteArray(); } - KeyHandler.__an_x = var9; - Login.__cu_d = MenuAction.method2025(var1, "options_radio_buttons,0", ""); - GraphicsObject.__bw_k = MenuAction.method2025(var1, "options_radio_buttons,4", ""); - class308.__kw_n = MenuAction.method2025(var1, "options_radio_buttons,2", ""); - KeyHandler.__an_i = MenuAction.method2025(var1, "options_radio_buttons,6", ""); - class168.__fs_au = Login.__cu_d.subWidth; - GroundItemPile.__dr_ao = Login.__cu_d.subHeight; - class16.field85 = new class72(WorldMapEvent.__ap_w); + KeyHandler.title_muteSprite = var9; + Login.options_buttons_0Sprite = MenuAction.loadIndexedSpriteByName(var1, "options_radio_buttons,0", ""); + GraphicsObject.options_buttons_4Sprite = MenuAction.loadIndexedSpriteByName(var1, "options_radio_buttons,4", ""); + class308.options_buttons_2Sprite = MenuAction.loadIndexedSpriteByName(var1, "options_radio_buttons,2", ""); + KeyHandler.options_buttons_6Sprite = MenuAction.loadIndexedSpriteByName(var1, "options_radio_buttons,6", ""); + class168.optionButtonSpriteSubWidth = Login.options_buttons_0Sprite.subWidth; + GroundItemPile.optionButtonSpriteSubHeight = Login.options_buttons_0Sprite.subHeight; + class16.loginScreenRunesAnimation = new LoginScreenAnimation(WorldMapEvent.runesSprite); if(var2) { Login.Login_username = ""; Login.Login_password = ""; } - class13.__i_af = 0; - Login.__cu_ai = ""; + class13.otpInt = 0; + Login.otp = ""; Login.__cu_ba = true; - Login.__cu_bk = false; + Login.worldSelectOpen = false; if(!ReflectionCheck.clientPreferences.titleMusicDisabled) { Canvas.method858(2, UserComparator3.indexCache6, "scape main", "", 255, false); } else { @@ -120,12 +120,12 @@ final class class2 implements class0 { UserComparator9.method3343(false); Login.__cu_f = true; - Login.__cu_q = (SoundCache.canvasWidth - 765) / 2; - Login.__cu_y = Login.__cu_q + 202; - Varps.__hv_h = Login.__cu_y + 180; - Login.__cu_g.drawAt(Login.__cu_q, 0); - Fonts.__kz_l.drawAt(Login.__cu_q + 382, 0); - WorldMapSectionType.__h_e.__q_496(Login.__cu_q + 382 - WorldMapSectionType.__h_e.subWidth / 2, 18); + Login.xPadding = (SoundCache.canvasWidth - 765) / 2; + Login.loginBoxX = Login.xPadding + 202; + Varps.loginBoxCenter = Login.loginBoxX + 180; + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + Fonts.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + WorldMapSectionType.logoSprite.drawAt(Login.xPadding + 382 - WorldMapSectionType.logoSprite.subWidth / 2, 18); } } @@ -138,10 +138,10 @@ final class class2 implements class0 { int var3 = var0.getArchiveId(var1); int var4 = var0.getRecordId(var3, var2); Sprite[] var5; - if(!SpriteMask.method4392(var0, var3, var4)) { + if(!SpriteMask.loadSprite(var0, var3, var4)) { var5 = null; } else { - var5 = UserComparator9.method3344(); + var5 = UserComparator9.createSpriteArray(); } return var5; diff --git a/rs-client/src/main/java/class203.java b/runescape-client/src/main/java/class203.java similarity index 100% rename from rs-client/src/main/java/class203.java rename to runescape-client/src/main/java/class203.java diff --git a/rs-client/src/main/java/class204.java b/runescape-client/src/main/java/class204.java similarity index 98% rename from rs-client/src/main/java/class204.java rename to runescape-client/src/main/java/class204.java index f648d1f2b2..191a9e79af 100644 --- a/rs-client/src/main/java/class204.java +++ b/runescape-client/src/main/java/class204.java @@ -5,16 +5,13 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("gx") public class class204 { @ObfuscatedName("x") - @Export("__gx_x") static final int[] __gx_x; @ObfuscatedName("d") - @Export("__gx_d") static final int[] __gx_d; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lkk;" ) - @Export("__gx_n") public static Font __gx_n; static { diff --git a/rs-client/src/main/java/class206.java b/runescape-client/src/main/java/class206.java similarity index 100% rename from rs-client/src/main/java/class206.java rename to runescape-client/src/main/java/class206.java diff --git a/rs-client/src/main/java/class21.java b/runescape-client/src/main/java/class21.java similarity index 99% rename from rs-client/src/main/java/class21.java rename to runescape-client/src/main/java/class21.java index 259d966766..6aa5d7d036 100644 --- a/rs-client/src/main/java/class21.java +++ b/runescape-client/src/main/java/class21.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("b") public abstract class class21 { @ObfuscatedName("by") - @Export("__b_by") static String __b_by; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/class210.java b/runescape-client/src/main/java/class210.java similarity index 100% rename from rs-client/src/main/java/class210.java rename to runescape-client/src/main/java/class210.java diff --git a/rs-client/src/main/java/class211.java b/runescape-client/src/main/java/class211.java similarity index 73% rename from rs-client/src/main/java/class211.java rename to runescape-client/src/main/java/class211.java index 14dd76547b..73bb469301 100644 --- a/rs-client/src/main/java/class211.java +++ b/runescape-client/src/main/java/class211.java @@ -8,13 +8,10 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hg") public class class211 { @ObfuscatedName("m") - @Export("__hg_m") static final String[][] __hg_m; @ObfuscatedName("f") - @Export("__hg_f") static final String[] __hg_f; @ObfuscatedName("q") - @Export("__hg_q") static Calendar __hg_q; @ObfuscatedName("em") @ObfuscatedSignature( @@ -49,7 +46,7 @@ public class class211 { int var4; if(var0 == 4100) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3 + var4; return 1; } else { @@ -62,7 +59,7 @@ public class class211 { return 1; } else if(var0 == 4102) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3 + ByteArrayPool.method4001(var4, true); return 1; } else if(var0 == 4103) { @@ -73,7 +70,7 @@ public class class211 { int var6; int var10; if(var0 == 4104) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; long var11 = ((long)var10 + 11745L) * 86400000L; Interpreter.Interpreter_calendar.setTime(new Date(var11)); var6 = Interpreter.Interpreter_calendar.get(5); @@ -83,12 +80,12 @@ public class class211 { return 1; } else if(var0 != 4105) { if(var0 == 4106) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Integer.toString(var10); return 1; } else if(var0 == 4107) { Interpreter.Interpreter_stringStackSize -= 2; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = WallDecoration.method3256(AttackOption.method2033(Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize], Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1], Client.language)); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = WallDecoration.method3256(AttackOption.method2033(Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize], Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1], Client.language)); return 1; } else { int var5; @@ -96,27 +93,27 @@ public class class211 { Font var14; if(var0 == 4108) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - class179.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var13 = ByteArrayPool.indexCache13.takeRecord(var5, 0); var14 = new Font(var13); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var14.lineCount(var3, var4); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var14.lineCount(var3, var4); return 1; } else if(var0 == 4109) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - class179.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var13 = ByteArrayPool.indexCache13.takeRecord(var5, 0); var14 = new Font(var13); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var14.lineWidth(var3, var4); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var14.lineWidth(var3, var4); return 1; } else if(var0 == 4110) { Interpreter.Interpreter_stringStackSize -= 2; var3 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; var9 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - if(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1) { + if(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3; } else { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var9; @@ -129,39 +126,39 @@ public class class211 { return 1; } else if(var0 == 4112) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3 + (char)var4; return 1; } else if(var0 == 4113) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ChatChannel.method2238((char)var10)?1:0; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ChatChannel.method2238((char)var10)?1:0; return 1; } else if(var0 == 4114) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = VarcInt.method4807((char)var10)?1:0; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = VarcInt.isAlphaNumeric((char)var10)?1:0; return 1; } else if(var0 == 4115) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = UrlRequest.method3271((char)var10)?1:0; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = UrlRequest.method3271((char)var10)?1:0; return 1; } else if(var0 == 4116) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class159.method3394((char)var10)?1:0; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class159.method3394((char)var10)?1:0; return 1; } else if(var0 == 4117) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; if(var3 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.length(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.length(); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } return 1; } else if(var0 == 4118) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - class179.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.substring(var4, var5); return 1; } else if(var0 == 4119) { @@ -184,15 +181,15 @@ public class class211 { return 1; } else if(var0 == 4120) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.indexOf(var4); + var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.indexOf(var4); return 1; } else if(var0 == 4121) { Interpreter.Interpreter_stringStackSize -= 2; var3 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; var9 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - var5 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.indexOf(var9, var5); + var5 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.indexOf(var9, var5); return 1; } else if(var0 == 4122) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; diff --git a/rs-client/src/main/java/class212.java b/runescape-client/src/main/java/class212.java similarity index 100% rename from rs-client/src/main/java/class212.java rename to runescape-client/src/main/java/class212.java diff --git a/rs-client/src/main/java/class214.java b/runescape-client/src/main/java/class214.java similarity index 96% rename from rs-client/src/main/java/class214.java rename to runescape-client/src/main/java/class214.java index fb35600fda..c5924e20a2 100644 --- a/rs-client/src/main/java/class214.java +++ b/runescape-client/src/main/java/class214.java @@ -9,13 +9,11 @@ public class class214 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__hf_f") public static AbstractIndexCache __hf_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__hf_q") public static AbstractIndexCache __hf_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -27,16 +25,13 @@ public class class214 { @ObfuscatedGetter( intValue = -848833001 ) - @Export("__hf_o") public static int __hf_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__hf_u") public static AbstractIndexCache __hf_u; @ObfuscatedName("k") - @Export("__hf_k") static int[] __hf_k; @ObfuscatedName("ko") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/class22.java b/runescape-client/src/main/java/class22.java similarity index 100% rename from rs-client/src/main/java/class22.java rename to runescape-client/src/main/java/class22.java diff --git a/rs-client/src/main/java/class226.java b/runescape-client/src/main/java/class226.java similarity index 97% rename from rs-client/src/main/java/class226.java rename to runescape-client/src/main/java/class226.java index 02d0ac741e..6ae0e4e5b4 100644 --- a/rs-client/src/main/java/class226.java +++ b/runescape-client/src/main/java/class226.java @@ -5,16 +5,12 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("ht") public class class226 { @ObfuscatedName("m") - @Export("__ht_m") public static final short[] __ht_m; @ObfuscatedName("f") - @Export("__ht_f") public static final short[][] __ht_f; @ObfuscatedName("q") - @Export("__ht_q") public static final short[] __ht_q; @ObfuscatedName("w") - @Export("__ht_w") public static final short[][] __ht_w; static { @@ -95,7 +91,7 @@ public class class226 { Rasterizer3D.method2989(16, 16); Rasterizer3D.__et_w = false; if(var9.placeholderTemplate != -1) { - var20.__a_505(0, 0); + var20.drawAt2(0, 0); } int var16 = var9.zoom2d; @@ -110,7 +106,7 @@ public class class226 { var19.calculateBoundsCylinder(); var19.__c_234(0, var9.yan2d, var9.zan2d, var9.xan2d, var9.offsetX2d, var19.height / 2 + var17 + var9.offsetY2d, var18 + var9.offsetY2d); if(var9.notedId != -1) { - var20.__a_505(0, 0); + var20.drawAt2(0, 0); } if(var2 >= 1) { @@ -127,7 +123,7 @@ public class class226 { Rasterizer2D.Rasterizer2D_replace(var8.pixels, 36, 32); if(var9.noteTemplate != -1) { - var20.__a_505(0, 0); + var20.drawAt2(0, 0); } if(var4 == 1 || var4 == 2 && var9.isStackable == 1) { diff --git a/rs-client/src/main/java/class227.java b/runescape-client/src/main/java/class227.java similarity index 99% rename from rs-client/src/main/java/class227.java rename to runescape-client/src/main/java/class227.java index 9b08e368b6..55b596870c 100644 --- a/rs-client/src/main/java/class227.java +++ b/runescape-client/src/main/java/class227.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hj") public class class227 { @ObfuscatedName("e") - @Export("__hj_e") public static short[] __hj_e; @ObfuscatedName("l") diff --git a/rs-client/src/main/java/class229.java b/runescape-client/src/main/java/class229.java similarity index 71% rename from rs-client/src/main/java/class229.java rename to runescape-client/src/main/java/class229.java index c7b24610fd..3ee3edf4e1 100644 --- a/rs-client/src/main/java/class229.java +++ b/runescape-client/src/main/java/class229.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hz") public class class229 { @ObfuscatedName("l") - @Export("__hz_l") public static short[][] __hz_l; @ObfuscatedName("m") @@ -38,51 +37,51 @@ public class class229 { ) static int method4513(int var0, Script var1, boolean var2) { if(var0 == 6200) { - class179.Interpreter_intStackSize -= 2; - Client.__client_rw = (short)class161.method3395(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]); + RouteStrategy.Interpreter_intStackSize -= 2; + Client.__client_rw = (short)class161.method3395(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]); if(Client.__client_rw <= 0) { Client.__client_rw = 256; } - Client.__client_rm = (short)class161.method3395(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + Client.__client_rm = (short)class161.method3395(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); if(Client.__client_rm <= 0) { Client.__client_rm = 256; } return 1; } else if(var0 == 6201) { - class179.Interpreter_intStackSize -= 2; - Client.__client_re = (short)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; + RouteStrategy.Interpreter_intStackSize -= 2; + Client.__client_re = (short)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; if(Client.__client_re <= 0) { Client.__client_re = 256; } - Client.__client_rb = (short)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + Client.__client_rb = (short)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; if(Client.__client_rb <= 0) { Client.__client_rb = 320; } return 1; } else if(var0 == 6202) { - class179.Interpreter_intStackSize -= 4; - Client.__client_rv = (short)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; + RouteStrategy.Interpreter_intStackSize -= 4; + Client.__client_rv = (short)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; if(Client.__client_rv <= 0) { Client.__client_rv = 1; } - Client.__client_ri = (short)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + Client.__client_ri = (short)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; if(Client.__client_ri <= 0) { Client.__client_ri = 32767; } else if(Client.__client_ri < Client.__client_rv) { Client.__client_ri = Client.__client_rv; } - Client.__client_rs = (short)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; + Client.__client_rs = (short)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; if(Client.__client_rs <= 0) { Client.__client_rs = 1; } - Client.__client_rp = (short)Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3]; + Client.__client_rp = (short)Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3]; if(Client.__client_rp <= 0) { Client.__client_rp = 32767; } else if(Client.__client_rp < Client.__client_rs) { @@ -93,21 +92,21 @@ public class class229 { } else if(var0 == 6203) { if(Client.viewportWidget != null) { FontName.setViewportShape(0, 0, Client.viewportWidget.width, Client.viewportWidget.height, false); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.viewportWidth; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.viewportHeight; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.viewportWidth; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.viewportHeight; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } return 1; } else if(var0 == 6204) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.__client_re; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.__client_rb; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.__client_re; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.__client_rb; return 1; } else if(var0 == 6205) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class30.method571(Client.__client_rw); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class30.method571(Client.__client_rm); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class30.method571(Client.__client_rw); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class30.method571(Client.__client_rm); return 1; } else { return 2; diff --git a/rs-client/src/main/java/class230.java b/runescape-client/src/main/java/class230.java similarity index 99% rename from rs-client/src/main/java/class230.java rename to runescape-client/src/main/java/class230.java index 45abced5f0..320164629a 100644 --- a/rs-client/src/main/java/class230.java +++ b/runescape-client/src/main/java/class230.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hy") public class class230 { @ObfuscatedName("az") - @Export("__hy_az") protected static boolean __hy_az; @ObfuscatedName("q") diff --git a/rs-client/src/main/java/class231.java b/runescape-client/src/main/java/class231.java similarity index 96% rename from rs-client/src/main/java/class231.java rename to runescape-client/src/main/java/class231.java index edbdbf067b..a448e63e70 100644 --- a/rs-client/src/main/java/class231.java +++ b/runescape-client/src/main/java/class231.java @@ -125,10 +125,8 @@ public enum class231 implements Enumerated { @ObfuscatedGetter( intValue = -745071109 ) - @Export("__hb_sg") static int __hb_sg; @ObfuscatedName("av") - @Export("__hb_av") static java.awt.Font __hb_av; @ObfuscatedName("r") @ObfuscatedGetter( @@ -149,6 +147,7 @@ public enum class231 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field2820; } @@ -179,7 +178,8 @@ public enum class231 implements Enumerated { signature = "(Lcs;IIB)V", garbageValue = "1" ) - static final void method4520(MenuAction var0, int var1, int var2) { + @Export("processTempMenuAction") + static final void processTempMenuAction(MenuAction var0, int var1, int var2) { Actor.menuAction(var0.argument1, var0.argument2, var0.opcode, var0.argument0, var0.action, var0.action, var1, var2); } diff --git a/rs-client/src/main/java/class233.java b/runescape-client/src/main/java/class233.java similarity index 100% rename from rs-client/src/main/java/class233.java rename to runescape-client/src/main/java/class233.java diff --git a/rs-client/src/main/java/class234.java b/runescape-client/src/main/java/class234.java similarity index 100% rename from rs-client/src/main/java/class234.java rename to runescape-client/src/main/java/class234.java diff --git a/rs-client/src/main/java/class236.java b/runescape-client/src/main/java/class236.java similarity index 100% rename from rs-client/src/main/java/class236.java rename to runescape-client/src/main/java/class236.java diff --git a/rs-client/src/main/java/class237.java b/runescape-client/src/main/java/class237.java similarity index 100% rename from rs-client/src/main/java/class237.java rename to runescape-client/src/main/java/class237.java diff --git a/rs-client/src/main/java/class238.java b/runescape-client/src/main/java/class238.java similarity index 98% rename from rs-client/src/main/java/class238.java rename to runescape-client/src/main/java/class238.java index a556c08699..aa5ea9e654 100644 --- a/rs-client/src/main/java/class238.java +++ b/runescape-client/src/main/java/class238.java @@ -153,7 +153,7 @@ public final class class238 { } if(!Client.isMenuOpen) { - class30.method569(); + class30.resetMenuEntries(); } } } else if(var9.noScrollThrough && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { @@ -268,12 +268,12 @@ public final class class238 { } boolean var34 = false; - if((MouseHandler.MouseHandler_currentButton == 1 || !AbstractRasterProvider.__lp_ca && MouseHandler.MouseHandler_currentButton == 4) && var33) { + if((MouseHandler.MouseHandler_currentButton == 1 || !AbstractRasterProvider.mouseCam && MouseHandler.MouseHandler_currentButton == 4) && var33) { var34 = true; } var21 = false; - if((MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.__lp_ca && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= var12 && MouseHandler.MouseHandler_lastPressedY >= var13 && MouseHandler.MouseHandler_lastPressedX < var14 && MouseHandler.MouseHandler_lastPressedY < var15) { + if((MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.mouseCam && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= var12 && MouseHandler.MouseHandler_lastPressedY >= var13 && MouseHandler.MouseHandler_lastPressedX < var14 && MouseHandler.MouseHandler_lastPressedY < var15) { var21 = true; } @@ -582,7 +582,7 @@ public final class class238 { } if(!Client.isMenuOpen) { - class30.method569(); + class30.resetMenuEntries(); } } diff --git a/rs-client/src/main/java/class248.java b/runescape-client/src/main/java/class248.java similarity index 69% rename from rs-client/src/main/java/class248.java rename to runescape-client/src/main/java/class248.java index 272be7ca32..7d529fbf77 100644 --- a/rs-client/src/main/java/class248.java +++ b/runescape-client/src/main/java/class248.java @@ -7,13 +7,11 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("iu") public class class248 { @ObfuscatedName("e") - @Export("__iu_e") static int[] __iu_e; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 662119345 ) - @Export("__iu_n") static int __iu_n; @ObfuscatedName("m") final HashMap field3267; @@ -193,71 +191,71 @@ public class class248 { static int method4741(int var0, Script var1, boolean var2) { int var3; if(var0 == 3903) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].type(); + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].type(); return 1; } else if(var0 == 3904) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].id; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].id; return 1; } else if(var0 == 3905) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].unitPrice; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].unitPrice; return 1; } else if(var0 == 3906) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].totalQuantity; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].totalQuantity; return 1; } else if(var0 == 3907) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentQuantity; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentQuantity; return 1; } else if(var0 == 3908) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentPrice; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentPrice; return 1; } else { int var12; if(var0 == 3910) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var12 == 0?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var12 == 0?1:0; return 1; } else if(var0 == 3911) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var12 == 2?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var12 == 2?1:0; return 1; } else if(var0 == 3912) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var12 == 5?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var12 == 5?1:0; return 1; } else if(var0 == 3913) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var12 == 1?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var12 == 1?1:0; return 1; } else { boolean var13; if(var0 == 3914) { - var13 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var13 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(FloorDecoration.grandExchangeEvents != null) { FloorDecoration.grandExchangeEvents.sort(GrandExchangeEvents.__g_w, var13); } return 1; } else if(var0 == 3915) { - var13 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var13 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(FloorDecoration.grandExchangeEvents != null) { FloorDecoration.grandExchangeEvents.sort(GrandExchangeEvents.__g_q, var13); } return 1; } else if(var0 == 3916) { - class179.Interpreter_intStackSize -= 2; - var13 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize] == 1; - boolean var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1] == 1; + RouteStrategy.Interpreter_intStackSize -= 2; + var13 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize] == 1; + boolean var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1] == 1; if(FloorDecoration.grandExchangeEvents != null) { Client.__client_sj.__m = var4; FloorDecoration.grandExchangeEvents.sort(Client.__client_sj, var13); @@ -265,41 +263,41 @@ public class class248 { return 1; } else if(var0 == 3917) { - var13 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var13 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(FloorDecoration.grandExchangeEvents != null) { FloorDecoration.grandExchangeEvents.sort(GrandExchangeEvents.__g_f, var13); } return 1; } else if(var0 == 3918) { - var13 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var13 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(FloorDecoration.grandExchangeEvents != null) { FloorDecoration.grandExchangeEvents.sort(GrandExchangeEvents.__g_o, var13); } return 1; } else if(var0 == 3919) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = FloorDecoration.grandExchangeEvents == null?0:FloorDecoration.grandExchangeEvents.events.size(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = FloorDecoration.grandExchangeEvents == null?0:FloorDecoration.grandExchangeEvents.events.size(); return 1; } else { GrandExchangeEvent var11; if(var0 == 3920) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var11 = (GrandExchangeEvent)FloorDecoration.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var11.world; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var11.world; return 1; } else if(var0 == 3921) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var11 = (GrandExchangeEvent)FloorDecoration.grandExchangeEvents.events.get(var3); Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var11.__m_3(); return 1; } else if(var0 == 3922) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var11 = (GrandExchangeEvent)FloorDecoration.grandExchangeEvents.events.get(var3); Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var11.__f_4(); return 1; } else if(var0 == 3923) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var11 = (GrandExchangeEvent)FloorDecoration.grandExchangeEvents.events.get(var3); long var5 = class203.currentTimeMs() - class15.__z_si - var11.__f; int var7 = (int)(var5 / 3600000L); @@ -309,19 +307,19 @@ public class class248 { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var10; return 1; } else if(var0 == 3924) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var11 = (GrandExchangeEvent)FloorDecoration.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.totalQuantity; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.totalQuantity; return 1; } else if(var0 == 3925) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var11 = (GrandExchangeEvent)FloorDecoration.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.unitPrice; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.unitPrice; return 1; } else if(var0 == 3926) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var11 = (GrandExchangeEvent)FloorDecoration.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.id; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.id; return 1; } else { return 2; diff --git a/rs-client/src/main/java/class249.java b/runescape-client/src/main/java/class249.java similarity index 94% rename from rs-client/src/main/java/class249.java rename to runescape-client/src/main/java/class249.java index e6ba48a937..05f3efda01 100644 --- a/rs-client/src/main/java/class249.java +++ b/runescape-client/src/main/java/class249.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -41,6 +42,7 @@ public enum class249 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field3276; } diff --git a/rs-client/src/main/java/class25.java b/runescape-client/src/main/java/class25.java similarity index 100% rename from rs-client/src/main/java/class25.java rename to runescape-client/src/main/java/class25.java diff --git a/rs-client/src/main/java/class258.java b/runescape-client/src/main/java/class258.java similarity index 100% rename from rs-client/src/main/java/class258.java rename to runescape-client/src/main/java/class258.java diff --git a/rs-client/src/main/java/class266.java b/runescape-client/src/main/java/class266.java similarity index 98% rename from rs-client/src/main/java/class266.java rename to runescape-client/src/main/java/class266.java index 7881dd6794..72071e4fc6 100644 --- a/rs-client/src/main/java/class266.java +++ b/runescape-client/src/main/java/class266.java @@ -45,6 +45,7 @@ public enum class266 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field3530; } diff --git a/rs-client/src/main/java/class27.java b/runescape-client/src/main/java/class27.java similarity index 97% rename from rs-client/src/main/java/class27.java rename to runescape-client/src/main/java/class27.java index 7acd856783..56f35f4e9d 100644 --- a/rs-client/src/main/java/class27.java +++ b/runescape-client/src/main/java/class27.java @@ -13,7 +13,6 @@ public final class class27 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__aq_k") public static AbstractIndexCache __aq_k; @ObfuscatedName("f") final int[] field225; @@ -49,7 +48,8 @@ public final class class27 { signature = "([BI)Lln;", garbageValue = "-143338910" ) - public static final Sprite method438(byte[] var0) { + @Export("convertJpgToSprite") + public static final Sprite convertJpgToSprite(byte[] var0) { BufferedImage var1 = null; try { diff --git a/rs-client/src/main/java/class277.java b/runescape-client/src/main/java/class277.java similarity index 99% rename from rs-client/src/main/java/class277.java rename to runescape-client/src/main/java/class277.java index 2a92e19d7a..4842816eaa 100644 --- a/rs-client/src/main/java/class277.java +++ b/runescape-client/src/main/java/class277.java @@ -8,7 +8,6 @@ public class class277 { @ObfuscatedSignature( signature = "Llq;" ) - @Export("__jn_by") static IndexedSprite __jn_by; @ObfuscatedName("m") diff --git a/rs-client/src/main/java/class279.java b/runescape-client/src/main/java/class279.java similarity index 96% rename from rs-client/src/main/java/class279.java rename to runescape-client/src/main/java/class279.java index 2f80b4c89c..d04cc4cf14 100644 --- a/rs-client/src/main/java/class279.java +++ b/runescape-client/src/main/java/class279.java @@ -8,7 +8,6 @@ public class class279 { @ObfuscatedSignature( signature = "[Lho;" ) - @Export("__jx_ne") static Widget[] __jx_ne; @ObfuscatedName("e") diff --git a/rs-client/src/main/java/class3.java b/runescape-client/src/main/java/class3.java similarity index 98% rename from rs-client/src/main/java/class3.java rename to runescape-client/src/main/java/class3.java index 826ab81db7..897fa6c136 100644 --- a/rs-client/src/main/java/class3.java +++ b/runescape-client/src/main/java/class3.java @@ -9,7 +9,6 @@ public class class3 implements Enumerated { @ObfuscatedGetter( intValue = 1608439891 ) - @Export("__w_qs") static int __w_qs; @ObfuscatedName("m") @ObfuscatedSignature( @@ -35,7 +34,7 @@ public class class3 implements Enumerated { @ObfuscatedGetter( intValue = -393250053 ) - public final int field17; + public final int id; @ObfuscatedName("u") public final Class field18; @ObfuscatedName("g") @@ -55,7 +54,7 @@ public class class3 implements Enumerated { ) class3(int var1, int var2, Class var3, class0 var4) { this.field13 = var1; - this.field17 = var2; + this.id = var2; this.field18 = var3; this.field19 = var4; } @@ -65,8 +64,9 @@ public class class3 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { - return this.field17; + return this.id; } @ObfuscatedName("q") diff --git a/rs-client/src/main/java/class30.java b/runescape-client/src/main/java/class30.java similarity index 93% rename from rs-client/src/main/java/class30.java rename to runescape-client/src/main/java/class30.java index ca1c58090c..77772fbde5 100644 --- a/rs-client/src/main/java/class30.java +++ b/runescape-client/src/main/java/class30.java @@ -9,7 +9,6 @@ public class class30 { @ObfuscatedGetter( intValue = -1555836449 ) - @Export("__ar_qw") static int __ar_qw; @ObfuscatedName("m") @ObfuscatedSignature( @@ -28,14 +27,14 @@ public class class30 { @Export("musicTrackArchiveId") public static int musicTrackArchiveId; @ObfuscatedName("l") - @Export("__ar_l") - public static boolean __ar_l; + @Export("inMembersWorld") + public static boolean inMembersWorld; @ObfuscatedName("bd") @ObfuscatedSignature( signature = "[Lln;" ) - @Export("__ar_bd") - static Sprite[] __ar_bd; + @Export("worldSelectBackSprites") + static Sprite[] worldSelectBackSprites; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -1474464623 @@ -65,7 +64,8 @@ public class class30 { signature = "(B)V", garbageValue = "49" ) - static void method569() { + @Export("resetMenuEntries") + static void resetMenuEntries() { Client.menuOptionsCount = 0; Client.isMenuOpen = false; Client.menuActions[0] = "Cancel"; diff --git a/rs-client/src/main/java/class303.java b/runescape-client/src/main/java/class303.java similarity index 100% rename from rs-client/src/main/java/class303.java rename to runescape-client/src/main/java/class303.java diff --git a/rs-client/src/main/java/class304.java b/runescape-client/src/main/java/class304.java similarity index 100% rename from rs-client/src/main/java/class304.java rename to runescape-client/src/main/java/class304.java diff --git a/rs-client/src/main/java/class305.java b/runescape-client/src/main/java/class305.java similarity index 93% rename from rs-client/src/main/java/class305.java rename to runescape-client/src/main/java/class305.java index b28a55c0b0..c3c1e965b5 100644 --- a/rs-client/src/main/java/class305.java +++ b/runescape-client/src/main/java/class305.java @@ -4,10 +4,8 @@ import net.runelite.mapping.ObfuscatedName; @ObfuscatedName("kb") public class class305 { @ObfuscatedName("q") - @Export("__kb_q") static final char[] __kb_q; @ObfuscatedName("w") - @Export("__kb_w") static final char[] __kb_w; static { diff --git a/rs-client/src/main/java/class306.java b/runescape-client/src/main/java/class306.java similarity index 100% rename from rs-client/src/main/java/class306.java rename to runescape-client/src/main/java/class306.java diff --git a/rs-client/src/main/java/class307.java b/runescape-client/src/main/java/class307.java similarity index 95% rename from rs-client/src/main/java/class307.java rename to runescape-client/src/main/java/class307.java index 060ec01941..dd819cd054 100644 --- a/rs-client/src/main/java/class307.java +++ b/runescape-client/src/main/java/class307.java @@ -5,19 +5,14 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("kc") public class class307 { @ObfuscatedName("m") - @Export("__kc_m") public static char[] __kc_m; @ObfuscatedName("f") - @Export("__kc_f") static char[] __kc_f; @ObfuscatedName("q") - @Export("__kc_q") static char[] __kc_q; @ObfuscatedName("w") - @Export("__kc_w") static int[] __kc_w; @ObfuscatedName("g") - @Export("__kc_g") static byte[][][] __kc_g; @ObfuscatedName("n") @ObfuscatedSignature( diff --git a/rs-client/src/main/java/class308.java b/runescape-client/src/main/java/class308.java similarity index 79% rename from rs-client/src/main/java/class308.java rename to runescape-client/src/main/java/class308.java index bd4b8675ff..61d093b669 100644 --- a/rs-client/src/main/java/class308.java +++ b/runescape-client/src/main/java/class308.java @@ -8,8 +8,8 @@ public final class class308 { @ObfuscatedSignature( signature = "Llq;" ) - @Export("__kw_n") - static IndexedSprite __kw_n; + @Export("options_buttons_2Sprite") + static IndexedSprite options_buttons_2Sprite; @ObfuscatedName("gn") @Export("regions") static int[] regions; diff --git a/rs-client/src/main/java/class309.java b/runescape-client/src/main/java/class309.java similarity index 100% rename from rs-client/src/main/java/class309.java rename to runescape-client/src/main/java/class309.java diff --git a/rs-client/src/main/java/class31.java b/runescape-client/src/main/java/class31.java similarity index 52% rename from rs-client/src/main/java/class31.java rename to runescape-client/src/main/java/class31.java index 9942be4c2f..ac2e2a8f2f 100644 --- a/rs-client/src/main/java/class31.java +++ b/runescape-client/src/main/java/class31.java @@ -37,12 +37,12 @@ public class class31 { ) @Export("changeWorld") static void changeWorld(World var0) { - if(var0.__e_144() != Client.isMembersWorld) { - Client.isMembersWorld = var0.__e_144(); - boolean var1 = var0.__e_144(); - if(var1 != class30.__ar_l) { - class72.method1780(); - class30.__ar_l = var1; + if(var0.isMembersOnly() != Client.isMembersWorld) { + Client.isMembersWorld = var0.isMembersOnly(); + boolean var1 = var0.isMembersOnly(); + if(var1 != class30.inMembersWorld) { + LoginScreenAnimation.method1780(); + class30.inMembersWorld = var1; } } @@ -61,25 +61,25 @@ public class class31 { ) static int method573(int var0, Script var1, boolean var2) { if(var0 == 6500) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ClientParameter.loadWorlds()?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ClientParameter.loadWorlds()?1:0; return 1; } else { World var3; if(var0 == 6501) { var3 = class190.method3672(); if(var3 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.id; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.properties; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.id; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.properties; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.activity; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.location; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.population; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.location; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.population; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.host; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; } @@ -87,18 +87,18 @@ public class class31 { } else if(var0 == 6502) { var3 = Fonts.method5647(); if(var3 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.id; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.properties; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.id; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.properties; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.activity; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.location; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var3.population; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.location; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var3.population; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.host; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; } @@ -108,7 +108,7 @@ public class class31 { int var5; int var7; if(var0 == 6506) { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var4 = null; for(var5 = 0; var5 < World.worldsCount; ++var5) { @@ -119,90 +119,90 @@ public class class31 { } if(var4 != null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.id; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.properties; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.id; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.properties; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.activity; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.location; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.population; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.location; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.population; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.host; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; } return 1; } else if(var0 == 6507) { - class179.Interpreter_intStackSize -= 4; - var7 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - boolean var10 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1] == 1; - var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; - boolean var6 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 3] == 1; + RouteStrategy.Interpreter_intStackSize -= 4; + var7 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + boolean var10 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1] == 1; + var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; + boolean var6 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 3] == 1; WorldMapSectionType.method248(var7, var10, var5, var6); return 1; } else if(var0 != 6511) { if(var0 == 6512) { - Client.followerOpsLowPriority = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + Client.followerOpsLowPriority = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else { int var8; ParamKeyDefinition var9; if(var0 == 6513) { - class179.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var9 = class229.getParamKeyDefinition(var8); if(var9.isString()) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ObjectDefinition.getNpcDefinition(var7).getStringParam(var8, var9.keyString); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ObjectDefinition.getNpcDefinition(var7).getIntParam(var8, var9.keyInt); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ObjectDefinition.getNpcDefinition(var7).getIntParam(var8, var9.keyInt); } return 1; } else if(var0 == 6514) { - class179.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var9 = class229.getParamKeyDefinition(var8); if(var9.isString()) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = class50.getObjectDefinition(var7).getStringParam(var8, var9.keyString); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class50.getObjectDefinition(var7).getIntParam(var8, var9.keyInt); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class50.getObjectDefinition(var7).getIntParam(var8, var9.keyInt); } return 1; } else if(var0 == 6515) { - class179.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var9 = class229.getParamKeyDefinition(var8); if(var9.isString()) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Skills.getItemDefinition(var7).getStringParam(var8, var9.keyString); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var7).getIntParam(var8, var9.keyInt); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Skills.getItemDefinition(var7).getIntParam(var8, var9.keyInt); } return 1; } else if(var0 == 6516) { - class179.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var9 = class229.getParamKeyDefinition(var8); if(var9.isString()) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = GzipDecompressor.method3702(var7).getStringParam(var8, var9.keyString); } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = GzipDecompressor.method3702(var7).getIntParam(var8, var9.keyInt); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = GzipDecompressor.method3702(var7).getIntParam(var8, var9.keyInt); } return 1; } else if(var0 == 6518) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.__client_bl?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.__client_bl?1:0; return 1; } else if(var0 == 6519) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.clientType & 3; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.clientType & 3; return 1; } else if(var0 == 6520) { return 1; @@ -210,41 +210,41 @@ public class class31 { return 1; } else if(var0 == 6522) { --Interpreter.Interpreter_stringStackSize; - --class179.Interpreter_intStackSize; + --RouteStrategy.Interpreter_intStackSize; return 1; } else if(var0 == 6523) { --Interpreter.Interpreter_stringStackSize; - --class179.Interpreter_intStackSize; + --RouteStrategy.Interpreter_intStackSize; return 1; } else if(var0 == 6524) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; return 1; } else if(var0 == 6525) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; return 1; } else if(var0 == 6526) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 1; return 1; } else { return 2; } } } else { - var7 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var7 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; if(var7 >= 0 && var7 < World.worldsCount) { var4 = ItemContainer.worlds[var7]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.id; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.properties; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.id; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.properties; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.activity; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.location; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var4.population; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.location; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var4.population; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.host; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; } diff --git a/rs-client/src/main/java/class310.java b/runescape-client/src/main/java/class310.java similarity index 100% rename from rs-client/src/main/java/class310.java rename to runescape-client/src/main/java/class310.java diff --git a/rs-client/src/main/java/class311.java b/runescape-client/src/main/java/class311.java similarity index 97% rename from rs-client/src/main/java/class311.java rename to runescape-client/src/main/java/class311.java index da433a2eab..e5f27d2836 100644 --- a/rs-client/src/main/java/class311.java +++ b/runescape-client/src/main/java/class311.java @@ -14,7 +14,6 @@ public class class311 { @ObfuscatedGetter( intValue = -2077113503 ) - @Export("__ka_e") static int __ka_e; @ObfuscatedName("f") @ObfuscatedGetter( diff --git a/rs-client/src/main/java/class313.java b/runescape-client/src/main/java/class313.java similarity index 96% rename from rs-client/src/main/java/class313.java rename to runescape-client/src/main/java/class313.java index 5dd381a8f5..1b7fea7a37 100644 --- a/rs-client/src/main/java/class313.java +++ b/runescape-client/src/main/java/class313.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -71,6 +72,7 @@ public enum class313 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field3827; } diff --git a/rs-client/src/main/java/class32.java b/runescape-client/src/main/java/class32.java similarity index 88% rename from rs-client/src/main/java/class32.java rename to runescape-client/src/main/java/class32.java index 0397ba9999..95bd7cf314 100644 --- a/rs-client/src/main/java/class32.java +++ b/runescape-client/src/main/java/class32.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("ay") public class class32 { @ObfuscatedName("u") - @Export("__ay_u") static byte[][][] __ay_u; @ObfuscatedName("gj") @ObfuscatedSignature( @@ -23,7 +22,7 @@ public class class32 { Widget var3; if(var0 >= 2000) { var0 -= 1000; - var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var3 = Huffman.getWidget(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); } else { var3 = var2?WorldMapIcon1.__t_i:class12.__n_n; } @@ -32,7 +31,7 @@ public class class32 { if(var0 != 1200 && var0 != 1205 && var0 != 1212) { if(var0 == 1201) { var3.modelType = 2; - var3.modelId = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3.modelId = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; return 1; } else if(var0 == 1202) { var3.modelType = 3; @@ -42,9 +41,9 @@ public class class32 { return 2; } } else { - class179.Interpreter_intStackSize -= 2; - int var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - int var5 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + int var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + int var5 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; var3.itemId = var4; var3.itemQuantity = var5; ItemDefinition var6 = Skills.getItemDefinition(var4); @@ -78,7 +77,7 @@ public class class32 { garbageValue = "972977798" ) static void method578(int var0) { - Login.__cu_aw = 12; + Login.loginIndex = 12; Login.__cu_aj = var0; } diff --git a/rs-client/src/main/java/class322.java b/runescape-client/src/main/java/class322.java similarity index 91% rename from rs-client/src/main/java/class322.java rename to runescape-client/src/main/java/class322.java index 7b7f01256e..b73ed654bb 100644 --- a/rs-client/src/main/java/class322.java +++ b/runescape-client/src/main/java/class322.java @@ -22,6 +22,6 @@ public class class322 { ) @Export("readSprite") public static Sprite readSprite(AbstractIndexCache var0, int var1, int var2) { - return !SpriteMask.method4392(var0, var1, var2)?null:class258.method4900(); + return !SpriteMask.loadSprite(var0, var1, var2)?null:class258.method4900(); } } diff --git a/rs-client/src/main/java/class328.java b/runescape-client/src/main/java/class328.java similarity index 100% rename from rs-client/src/main/java/class328.java rename to runescape-client/src/main/java/class328.java diff --git a/rs-client/src/main/java/class337.java b/runescape-client/src/main/java/class337.java similarity index 100% rename from rs-client/src/main/java/class337.java rename to runescape-client/src/main/java/class337.java diff --git a/rs-client/src/main/java/class39.java b/runescape-client/src/main/java/class39.java similarity index 95% rename from rs-client/src/main/java/class39.java rename to runescape-client/src/main/java/class39.java index 3d56e1aaf4..98926a8e6f 100644 --- a/rs-client/src/main/java/class39.java +++ b/runescape-client/src/main/java/class39.java @@ -266,9 +266,9 @@ public class class39 extends class21 { Rasterizer2D.Rasterizer2D_expandClip(var22, var23, var22 + var93, var23 + var21); var14.__h_508(var22, var23, var17); } else { - var76.__a_505(var22, var23); + var76.drawAt2(var22, var23); Rasterizer2D.Rasterizer2D_expandClip(var22, var23, var93 + var22, var21 + var23); - var14.__a_505(var22, var23); + var14.drawAt2(var22, var23); } Rasterizer2D.Rasterizer2D_setClip(var2, var3, var2 + var4, var3 + var5); @@ -278,8 +278,8 @@ public class class39 extends class21 { if(Client.viewportTempX > -1) { var21 = var2 + Client.viewportTempX - (var15 >> 1); var22 = var3 + Client.viewportTempY - var87; - Rasterizer2D.Rasterizer2D_fillRectangle(var21, var22, var93, 5, 65280); - Rasterizer2D.Rasterizer2D_fillRectangle(var21 + var93, var22, var15 - var93, 5, 16711680); + Rasterizer2D.Rasterizer2D_fillRectangle(var21, var22, var93, 5, 0xff00); + Rasterizer2D.Rasterizer2D_fillRectangle(var21 + var93, var22, var15 - var93, 5, 0xff0000); } var87 += 2; @@ -304,12 +304,12 @@ public class class39 extends class21 { if(Client.viewportTempX > -1) { if(var10.headIconPk != -1) { var87 += 25; - class15.headIconPkSprites[var10.headIconPk].__a_505(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); + class15.headIconPkSprites[var10.headIconPk].drawAt2(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); } if(var10.headIconPrayer != -1) { var87 += 25; - ClientPreferences.headIconPrayerSprites[var10.headIconPrayer].__a_505(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); + ClientPreferences.headIconPrayerSprites[var10.headIconPrayer].drawAt2(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); } } } @@ -318,7 +318,7 @@ public class class39 extends class21 { DevicePcmPlayerProvider.method840(var0, var0.defaultHeight + 15); if(Client.viewportTempX > -1) { var87 += Player.headIconHintSprites[1].subHeight; - Player.headIconHintSprites[1].__a_505(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); + Player.headIconHintSprites[1].drawAt2(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); } } } else { @@ -330,14 +330,14 @@ public class class39 extends class21 { if(var90.headIconPrayer >= 0 && var90.headIconPrayer < ClientPreferences.headIconPrayerSprites.length) { DevicePcmPlayerProvider.method840(var0, var0.defaultHeight + 15); if(Client.viewportTempX > -1) { - ClientPreferences.headIconPrayerSprites[var90.headIconPrayer].__a_505(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 30); + ClientPreferences.headIconPrayerSprites[var90.headIconPrayer].drawAt2(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 30); } } if(Client.hintArrowType == 1 && Client.npcIndices[var1 - var75] == Client.hintArrowNpcIndex && Client.cycle % 20 < 10) { DevicePcmPlayerProvider.method840(var0, var0.defaultHeight + 15); if(Client.viewportTempX > -1) { - Player.headIconHintSprites[0].__a_505(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 28); + Player.headIconHintSprites[0].drawAt2(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 28); } } } @@ -367,7 +367,7 @@ public class class39 extends class21 { continue; } - var95 = class72.getHitSplatDefinition(var0.hitSplatTypes[var80]); + var95 = LoginScreenAnimation.getHitSplatDefinition(var0.hitSplatTypes[var80]); var98 = var95.__i; if(var95 != null && var95.transforms != null) { var95 = var95.transform(); @@ -383,7 +383,7 @@ public class class39 extends class21 { var15 = var0.hitSplatTypes2[var80]; HitSplatDefinition var81 = null; if(var15 >= 0) { - var81 = class72.getHitSplatDefinition(var15); + var81 = LoginScreenAnimation.getHitSplatDefinition(var15); if(var81 != null && var81.transforms != null) { var81 = var81.transform(); } @@ -714,41 +714,41 @@ public class class39 extends class21 { } } else { if(var82 != null) { - var82.__a_505(var52 + var65 - var26, var66); + var82.drawAt2(var52 + var65 - var26, var66); } if(var84 != null) { - var84.__a_505(var65 + var53 - var28, var66); + var84.drawAt2(var65 + var53 - var28, var66); } if(var83 != null) { for(var74 = 0; var74 < var49; ++var74) { - var83.__a_505(var23 * var74 + (var54 + var65 - var27), var66); + var83.drawAt2(var23 * var74 + (var54 + var65 - var27), var66); } } if(var85 != null) { - var85.__a_505(var56 + var65 - var29, var66); + var85.drawAt2(var56 + var65 - var29, var66); } var86.draw(var45, var55 + var65, var69, var95.__n | -16777216, 0); if(var81 != null) { if(var30 != null) { - var30.__a_505(var65 + var57 - var38, var66); + var30.drawAt2(var65 + var57 - var38, var66); } if(var32 != null) { - var32.__a_505(var58 + var65 - var40, var66); + var32.drawAt2(var58 + var65 - var40, var66); } if(var31 != null) { for(var74 = 0; var74 < var50; ++var74) { - var31.__a_505(var74 * var35 + (var65 + var59 - var39), var66); + var31.drawAt2(var74 * var35 + (var65 + var59 - var39), var66); } } if(var33 != null) { - var33.__a_505(var60 + var65 - var41, var66); + var33.drawAt2(var60 + var65 - var41, var66); } var44.draw(var46, var61 + var65, var72, var81.__n | -16777216, 0); @@ -767,7 +767,8 @@ public class class39 extends class21 { signature = "(IIB)V", garbageValue = "3" ) - static final void method741(int var0, int var1) { + @Export("drawMenuActionTextAt") + static final void drawMenuActionTextAt(int var0, int var1) { if(Client.menuOptionsCount >= 2 || Client.isItemSelected != 0 || Client.isSpellSelected) { if(Client.showMouseOverText) { int var2 = Client.menuOptionsCount - 1; @@ -790,10 +791,10 @@ public class class39 extends class21 { } if(Client.menuOptionsCount > 2) { - var4 = var4 + BufferedFile.colorStartTag(16777215) + " " + '/' + " " + (Client.menuOptionsCount - 2) + " more options"; + var4 = var4 + BufferedFile.colorStartTag(0xffffff) + " " + '/' + " " + (Client.menuOptionsCount - 2) + " more options"; } - class2.fontBold12.drawRandomAlphaAndSpacing(var4, var0 + 4, var1 + 15, 16777215, 0, Client.cycle / 1000); + class2.fontBold12.drawRandomAlphaAndSpacing(var4, var0 + 4, var1 + 15, 0xffffff, 0, Client.cycle / 1000); } } } diff --git a/rs-client/src/main/java/class4.java b/runescape-client/src/main/java/class4.java similarity index 70% rename from rs-client/src/main/java/class4.java rename to runescape-client/src/main/java/class4.java index a52dce6aa4..bdc7d67388 100644 --- a/rs-client/src/main/java/class4.java +++ b/runescape-client/src/main/java/class4.java @@ -8,7 +8,6 @@ final class class4 implements class0 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__o_m") public static AbstractIndexCache __o_m; @ObfuscatedName("m") @@ -68,8 +67,8 @@ final class class4 implements class0 { WorldMapIcon1.method219(0, "", var3); return 1; } else if(var0 == 3101) { - class179.Interpreter_intStackSize -= 2; - class234.method4534(Canvas.localPlayer, Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize], Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + RouteStrategy.Interpreter_intStackSize -= 2; + class234.method4534(Canvas.localPlayer, Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize], Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); return 1; } else if(var0 == 3103) { if(!Interpreter.__bv_t) { @@ -110,48 +109,48 @@ final class class4 implements class0 { String var7; int var15; if(var0 == 3107) { - var15 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var15 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var7 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; WorldMapSection2.method583(var15, var7); return 1; } else if(var0 == 3108) { - class179.Interpreter_intStackSize -= 3; - var15 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var10 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; - int var9 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 2]; + RouteStrategy.Interpreter_intStackSize -= 3; + var15 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var10 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; + int var9 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 2]; Widget var13 = Huffman.getWidget(var9); Players.clickWidget(var13, var15, var10); return 1; } else if(var0 == 3109) { - class179.Interpreter_intStackSize -= 2; - var15 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var10 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + var15 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var10 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; Widget var11 = var2?WorldMapIcon1.__t_i:class12.__n_n; Players.clickWidget(var11, var15, var10); return 1; } else if(var0 == 3110) { - AbstractRasterProvider.__lp_ca = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + AbstractRasterProvider.mouseCam = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 3111) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.roofsHidden?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.roofsHidden?1:0; return 1; } else if(var0 == 3112) { - ReflectionCheck.clientPreferences.roofsHidden = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; - WorldMapSection0.method247(); + ReflectionCheck.clientPreferences.roofsHidden = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; + WorldMapSection0.savePreferences(); return 1; } else if(var0 == 3113) { var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - boolean var4 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + boolean var4 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; WorldMapCacheName.method635(var3, var4, false); return 1; } else if(var0 == 3115) { - var15 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var15 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var14 = Interpreter.method1915(ClientPacket.__gs_as, Client.packetWriter.isaacCipher); var14.packetBuffer.writeShort(var15); Client.packetWriter.__q_167(var14); return 1; } else if(var0 == 3116) { - var15 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var15 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; Interpreter.Interpreter_stringStackSize -= 2; var7 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; String var5 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; @@ -169,16 +168,16 @@ final class class4 implements class0 { return 1; } } else if(var0 == 3117) { - Client.shiftClickDrop = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + Client.shiftClickDrop = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 3118) { - Client.showMouseOverText = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + Client.showMouseOverText = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 3119) { - Client.renderSelf = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + Client.renderSelf = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 3120) { - if(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1) { + if(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1) { Client.__client_ke |= 1; } else { Client.__client_ke &= -2; @@ -186,7 +185,7 @@ final class class4 implements class0 { return 1; } else if(var0 == 3121) { - if(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1) { + if(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1) { Client.__client_ke |= 2; } else { Client.__client_ke &= -3; @@ -194,7 +193,7 @@ final class class4 implements class0 { return 1; } else if(var0 == 3122) { - if(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1) { + if(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1) { Client.__client_ke |= 4; } else { Client.__client_ke &= -5; @@ -202,7 +201,7 @@ final class class4 implements class0 { return 1; } else if(var0 == 3123) { - if(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1) { + if(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1) { Client.__client_ke |= 8; } else { Client.__client_ke &= -9; @@ -213,47 +212,47 @@ final class class4 implements class0 { Client.__client_ke = 0; return 1; } else if(var0 == 3125) { - Client.showMouseCross = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + Client.showMouseCross = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 3126) { - Client.showLoadingMessages = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + Client.showLoadingMessages = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; return 1; } else if(var0 == 3127) { - WorldMapAreaData.method705(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1); + WorldMapAreaData.method705(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1); return 1; } else if(var0 == 3128) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class206.method4028()?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class206.method4028()?1:0; return 1; } else if(var0 == 3129) { - class179.Interpreter_intStackSize -= 2; - Client.oculusOrbNormalSpeed = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - Client.__client_in = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]; + RouteStrategy.Interpreter_intStackSize -= 2; + Client.oculusOrbNormalSpeed = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + Client.__client_in = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]; return 1; } else if(var0 == 3130) { - class179.Interpreter_intStackSize -= 2; + RouteStrategy.Interpreter_intStackSize -= 2; return 1; } else if(var0 == 3131) { - --class179.Interpreter_intStackSize; + --RouteStrategy.Interpreter_intStackSize; return 1; } else if(var0 == 3132) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = SoundCache.canvasWidth; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Huffman.canvasHeight; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = SoundCache.canvasWidth; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Huffman.canvasHeight; return 1; } else if(var0 == 3133) { - --class179.Interpreter_intStackSize; + --RouteStrategy.Interpreter_intStackSize; return 1; } else if(var0 == 3134) { return 1; } else if(var0 == 3135) { - class179.Interpreter_intStackSize -= 2; + RouteStrategy.Interpreter_intStackSize -= 2; return 1; } else if(var0 == 3136) { Client.__client_mf = 3; - Client.__client_ms = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + Client.__client_ms = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; return 1; } else if(var0 == 3137) { Client.__client_mf = 2; - Client.__client_ms = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + Client.__client_ms = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; return 1; } else if(var0 == 3138) { Client.__client_mf = 0; @@ -268,57 +267,57 @@ final class class4 implements class0 { } else { boolean var8; if(var0 == 3141) { - var8 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var8 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; ReflectionCheck.clientPreferences.hideUsername = var8; - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); return 1; } else if(var0 == 3142) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.hideUsername?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.hideUsername?1:0; return 1; } else if(var0 == 3143) { - var8 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var8 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; Client.Login_isUsernameRemembered = var8; if(!var8) { ReflectionCheck.clientPreferences.rememberedUsername = ""; - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); } return 1; } else if(var0 == 3144) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Client.Login_isUsernameRemembered?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Client.Login_isUsernameRemembered?1:0; return 1; } else if(var0 == 3145) { return 1; } else if(var0 == 3146) { - var8 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var8 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; if(var8 == ReflectionCheck.clientPreferences.titleMusicDisabled) { ReflectionCheck.clientPreferences.titleMusicDisabled = !var8; - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); } return 1; } else if(var0 == 3147) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.titleMusicDisabled?0:1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = ReflectionCheck.clientPreferences.titleMusicDisabled?0:1; return 1; } else if(var0 == 3148) { return 1; } else if(var0 == 3149) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; return 1; } else if(var0 == 3150) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; return 1; } else if(var0 == 3151) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; return 1; } else if(var0 == 3152) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; return 1; } else if(var0 == 3153) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = Login.Login_loadingPercent; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = Login.Login_loadingPercent; return 1; } else if(var0 == 3154) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = GrandExchangeOffer.method101(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = GrandExchangeOffer.method101(); return 1; } else { return 2; diff --git a/rs-client/src/main/java/class40.java b/runescape-client/src/main/java/class40.java similarity index 99% rename from rs-client/src/main/java/class40.java rename to runescape-client/src/main/java/class40.java index d8e3457f5d..ad1e35f2a5 100644 --- a/rs-client/src/main/java/class40.java +++ b/runescape-client/src/main/java/class40.java @@ -835,14 +835,14 @@ public class class40 { ViewportMouse.ViewportMouse_entityCount = 0; } - class13.method163(); + class13.playPcmPlayers(); Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var3, 0); - class13.method163(); + class13.playPcmPlayers(); var12 = Rasterizer3D.Rasterizer3D_zoom; Rasterizer3D.Rasterizer3D_zoom = Client.viewportZoom; class65.scene.draw(WorldMapSection1.cameraX, GrandExchangeEvents.cameraY, class11.cameraZ, WorldMapIcon1.cameraPitch, MusicPatchNode.cameraYaw, var4); Rasterizer3D.Rasterizer3D_zoom = var12; - class13.method163(); + class13.playPcmPlayers(); class65.scene.clearTempGameObjects(); UrlRequester.method3258(var0, var1, var2, var3); UnitPriceComparator.method136(var0, var1); diff --git a/rs-client/src/main/java/class46.java b/runescape-client/src/main/java/class46.java similarity index 100% rename from rs-client/src/main/java/class46.java rename to runescape-client/src/main/java/class46.java diff --git a/rs-client/src/main/java/class48.java b/runescape-client/src/main/java/class48.java similarity index 100% rename from rs-client/src/main/java/class48.java rename to runescape-client/src/main/java/class48.java diff --git a/rs-client/src/main/java/class50.java b/runescape-client/src/main/java/class50.java similarity index 99% rename from rs-client/src/main/java/class50.java rename to runescape-client/src/main/java/class50.java index 41a84cb467..b88da2916a 100644 --- a/rs-client/src/main/java/class50.java +++ b/runescape-client/src/main/java/class50.java @@ -7,10 +7,8 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("af") public class class50 { @ObfuscatedName("m") - @Export("__af_m") public static Applet __af_m; @ObfuscatedName("f") - @Export("__af_f") public static String __af_f; @ObfuscatedName("ei") @Export("worldHost") diff --git a/rs-client/src/main/java/class54.java b/runescape-client/src/main/java/class54.java similarity index 73% rename from rs-client/src/main/java/class54.java rename to runescape-client/src/main/java/class54.java index e468e14b19..75a8e68f79 100644 --- a/rs-client/src/main/java/class54.java +++ b/runescape-client/src/main/java/class54.java @@ -9,7 +9,6 @@ public final class class54 { @ObfuscatedGetter( intValue = -1247107945 ) - @Export("__bs_nb") static int __bs_nb; @ObfuscatedName("q") @@ -39,96 +38,96 @@ public final class class54 { static void method1092(GameShell var0) { int var3; int var15; - if(Login.__cu_bk) { + if(Login.worldSelectOpen) { while(true) { if(!Decimator.method2490()) { - if(MouseHandler.MouseHandler_lastButton != 1 && (AbstractRasterProvider.__lp_ca || MouseHandler.MouseHandler_lastButton != 4)) { + if(MouseHandler.MouseHandler_lastButton != 1 && (AbstractRasterProvider.mouseCam || MouseHandler.MouseHandler_lastButton != 4)) { break; } - int var1 = Login.__cu_q + 280; + int var1 = Login.xPadding + 280; if(MouseHandler.MouseHandler_lastPressedX >= var1 && MouseHandler.MouseHandler_lastPressedX <= var1 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(0, 0); + Interpreter.changeWorldSelectSorting(0, 0); break; } if(MouseHandler.MouseHandler_lastPressedX >= var1 + 15 && MouseHandler.MouseHandler_lastPressedX <= var1 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(0, 1); + Interpreter.changeWorldSelectSorting(0, 1); break; } - int var2 = Login.__cu_q + 390; + int var2 = Login.xPadding + 390; if(MouseHandler.MouseHandler_lastPressedX >= var2 && MouseHandler.MouseHandler_lastPressedX <= var2 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(1, 0); + Interpreter.changeWorldSelectSorting(1, 0); break; } if(MouseHandler.MouseHandler_lastPressedX >= var2 + 15 && MouseHandler.MouseHandler_lastPressedX <= var2 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(1, 1); + Interpreter.changeWorldSelectSorting(1, 1); break; } - var3 = Login.__cu_q + 500; + var3 = Login.xPadding + 500; if(MouseHandler.MouseHandler_lastPressedX >= var3 && MouseHandler.MouseHandler_lastPressedX <= var3 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(2, 0); + Interpreter.changeWorldSelectSorting(2, 0); break; } if(MouseHandler.MouseHandler_lastPressedX >= var3 + 15 && MouseHandler.MouseHandler_lastPressedX <= var3 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(2, 1); + Interpreter.changeWorldSelectSorting(2, 1); break; } - var15 = Login.__cu_q + 610; + var15 = Login.xPadding + 610; if(MouseHandler.MouseHandler_lastPressedX >= var15 && MouseHandler.MouseHandler_lastPressedX <= var15 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(3, 0); + Interpreter.changeWorldSelectSorting(3, 0); break; } if(MouseHandler.MouseHandler_lastPressedX >= var15 + 15 && MouseHandler.MouseHandler_lastPressedX <= var15 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - Interpreter.method1975(3, 1); + Interpreter.changeWorldSelectSorting(3, 1); break; } - if(MouseHandler.MouseHandler_lastPressedX >= Login.__cu_q + 708 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedX <= Login.__cu_q + 708 + 50 && MouseHandler.MouseHandler_lastPressedY <= 20) { - FontName.method5636(); + if(MouseHandler.MouseHandler_lastPressedX >= Login.xPadding + 708 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedX <= Login.xPadding + 708 + 50 && MouseHandler.MouseHandler_lastPressedY <= 20) { + FontName.closeWorldSelect(); break; } - if(Login.__cu_bl != -1) { - World var13 = ItemContainer.worlds[Login.__cu_bl]; + if(Login.hoveredWorldIndex != -1) { + World var13 = ItemContainer.worlds[Login.hoveredWorldIndex]; class31.changeWorld(var13); - FontName.method5636(); + FontName.closeWorldSelect(); } else { - if(Login.__cu_br > 0 && SecureRandomFuture.__cn_bu != null && MouseHandler.MouseHandler_lastPressedX >= 0 && MouseHandler.MouseHandler_lastPressedX <= SecureRandomFuture.__cn_bu.subWidth && MouseHandler.MouseHandler_lastPressedY >= Huffman.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= Huffman.canvasHeight / 2 + 50) { - --Login.__cu_br; + if(Login.worldSelectPage > 0 && SecureRandomFuture.worldSelectLeftSprite != null && MouseHandler.MouseHandler_lastPressedX >= 0 && MouseHandler.MouseHandler_lastPressedX <= SecureRandomFuture.worldSelectLeftSprite.subWidth && MouseHandler.MouseHandler_lastPressedY >= Huffman.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= Huffman.canvasHeight / 2 + 50) { + --Login.worldSelectPage; } - if(Login.__cu_br < Login.__cu_bj && NetSocket.__fb_bm != null && MouseHandler.MouseHandler_lastPressedX >= SoundCache.canvasWidth - NetSocket.__fb_bm.subWidth - 5 && MouseHandler.MouseHandler_lastPressedX <= SoundCache.canvasWidth && MouseHandler.MouseHandler_lastPressedY >= Huffman.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= Huffman.canvasHeight / 2 + 50) { - ++Login.__cu_br; + if(Login.worldSelectPage < Login.worldSelectPagesCount && NetSocket.worldSelectRightSprite != null && MouseHandler.MouseHandler_lastPressedX >= SoundCache.canvasWidth - NetSocket.worldSelectRightSprite.subWidth - 5 && MouseHandler.MouseHandler_lastPressedX <= SoundCache.canvasWidth && MouseHandler.MouseHandler_lastPressedY >= Huffman.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= Huffman.canvasHeight / 2 + 50) { + ++Login.worldSelectPage; } } break; } if(IndexStoreAction.__ik_cn == 13) { - FontName.method5636(); + FontName.closeWorldSelect(); break; } if(IndexStoreAction.__ik_cn == 96) { - if(Login.__cu_br > 0 && SecureRandomFuture.__cn_bu != null) { - --Login.__cu_br; + if(Login.worldSelectPage > 0 && SecureRandomFuture.worldSelectLeftSprite != null) { + --Login.worldSelectPage; } - } else if(IndexStoreAction.__ik_cn == 97 && Login.__cu_br < Login.__cu_bj && NetSocket.__fb_bm != null) { - ++Login.__cu_br; + } else if(IndexStoreAction.__ik_cn == 97 && Login.worldSelectPage < Login.worldSelectPagesCount && NetSocket.worldSelectRightSprite != null) { + ++Login.worldSelectPage; } } } else { - if((MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.__lp_ca && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= Login.__cu_q + 765 - 50 && MouseHandler.MouseHandler_lastPressedY >= 453) { + if((MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.mouseCam && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= Login.xPadding + 765 - 50 && MouseHandler.MouseHandler_lastPressedY >= 453) { ReflectionCheck.clientPreferences.titleMusicDisabled = !ReflectionCheck.clientPreferences.titleMusicDisabled; - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); if(!ReflectionCheck.clientPreferences.titleMusicDisabled) { class204.method4011(UserComparator3.indexCache6, "scape main", "", 255, false); } else { @@ -153,16 +152,16 @@ public final class class54 { if(Client.gameState == 10 || Client.gameState == 11) { if(Client.language == 0) { - if(MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.__lp_ca && MouseHandler.MouseHandler_lastButton == 4) { - var3 = Login.__cu_q + 5; + if(MouseHandler.MouseHandler_lastButton == 1 || !AbstractRasterProvider.mouseCam && MouseHandler.MouseHandler_lastButton == 4) { + var3 = Login.xPadding + 5; short var4 = 463; byte var5 = 100; byte var6 = 35; if(MouseHandler.MouseHandler_lastPressedX >= var3 && MouseHandler.MouseHandler_lastPressedX <= var3 + var5 && MouseHandler.MouseHandler_lastPressedY >= var4 && MouseHandler.MouseHandler_lastPressedY <= var6 + var4) { if(ClientParameter.loadWorlds()) { - Login.__cu_bk = true; - Login.__cu_br = 0; - Login.__cu_bj = 0; + Login.worldSelectOpen = true; + Login.worldSelectPage = 0; + Login.worldSelectPagesCount = 0; } return; @@ -170,9 +169,9 @@ public final class class54 { } if(FriendLoginUpdate.__kn_x != null && ClientParameter.loadWorlds()) { - Login.__cu_bk = true; - Login.__cu_br = 0; - Login.__cu_bj = 0; + Login.worldSelectOpen = true; + Login.worldSelectPage = 0; + Login.worldSelectPagesCount = 0; } } @@ -184,13 +183,13 @@ public final class class54 { var16 = MouseHandler.MouseHandler_y; } - if(!AbstractRasterProvider.__lp_ca && var3 == 4) { + if(!AbstractRasterProvider.mouseCam && var3 == 4) { var3 = 1; } int var7; short var8; - if(Login.__cu_aw == 0) { + if(Login.loginIndex == 0) { boolean var17 = false; while(Decimator.method2490()) { @@ -199,20 +198,20 @@ public final class class54 { } } - var7 = Varps.__hv_h - 80; + var7 = Varps.loginBoxCenter - 80; var8 = 291; if(var3 == 1 && var15 >= var7 - 75 && var15 <= var7 + 75 && var16 >= var8 - 20 && var16 <= var8 + 20) { WorldMapCacheName.method635(Message.method1227("secure", true) + "m=account-creation/g=oldscape/create_account_funnel.ws", true, false); } - var7 = Varps.__hv_h + 80; + var7 = Varps.loginBoxCenter + 80; if(var3 == 1 && var15 >= var7 - 75 && var15 <= var7 + 75 && var16 >= var8 - 20 && var16 <= var8 + 20 || var17) { - if((Client.worldProperties & 33554432) != 0) { + if((Client.worldProperties & 0x2000000) != 0) { Login.Login_response0 = ""; Login.Login_response1 = "This is a Beta world."; Login.Login_response2 = "Your normal account will not be affected."; Login.Login_response3 = ""; - Login.__cu_aw = 1; + Login.loginIndex = 1; class196.method3740(); } else if((Client.worldProperties & 4) != 0) { if((Client.worldProperties & 1024) != 0) { @@ -226,14 +225,14 @@ public final class class54 { } Login.Login_response0 = "Warning!"; - Login.__cu_aw = 1; + Login.loginIndex = 1; class196.method3740(); } else if((Client.worldProperties & 1024) != 0) { Login.Login_response1 = "This is a High Risk world."; Login.Login_response2 = "The Protect Item prayer will"; Login.Login_response3 = "not work on this world."; Login.Login_response0 = "Warning!"; - Login.__cu_aw = 1; + Login.loginIndex = 1; class196.method3740(); } else { MouseHandler.method1084(false); @@ -242,11 +241,11 @@ public final class class54 { } else { int var18; short var20; - if(Login.__cu_aw != 1) { + if(Login.loginIndex != 1) { boolean var9; int var10; short var19; - if(Login.__cu_aw == 2) { + if(Login.loginIndex == 2) { var19 = 201; var18 = var19 + 52; if(var3 == 1 && var16 >= var18 - 12 && var16 < var18 + 2) { @@ -266,7 +265,7 @@ public final class class54 { switch(Login.__cu_ac) { case 1: method1089("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); - Login.__cu_aw = 5; + Login.loginIndex = 5; return; case 2: WorldMapCacheName.method635("https://support.runescape.com/hc/en-gb", true, false); @@ -274,7 +273,7 @@ public final class class54 { } } - var7 = Varps.__hv_h - 80; + var7 = Varps.loginBoxCenter - 80; var8 = 321; if(var3 == 1 && var15 >= var7 - 75 && var15 <= var7 + 75 && var16 >= var8 - 20 && var16 <= var8 + 20) { Login.Login_username = Login.Login_username.trim(); @@ -294,30 +293,30 @@ public final class class54 { return; } - var7 = Login.__cu_y + 180 + 80; + var7 = Login.loginBoxX + 180 + 80; if(var3 == 1 && var15 >= var7 - 75 && var15 <= var7 + 75 && var16 >= var8 - 20 && var16 <= var8 + 20) { - Login.__cu_aw = 0; + Login.loginIndex = 0; Login.Login_username = ""; Login.Login_password = ""; - class13.__i_af = 0; - Login.__cu_ai = ""; + class13.otpInt = 0; + Login.otp = ""; Login.__cu_ba = true; } - var7 = Varps.__hv_h + -117; + var7 = Varps.loginBoxCenter + -117; var8 = 277; - Login.__cu_aa = var15 >= var7 && var15 < var7 + class168.__fs_au && var16 >= var8 && var16 < var8 + GroundItemPile.__dr_ao; + Login.__cu_aa = var15 >= var7 && var15 < var7 + class168.optionButtonSpriteSubWidth && var16 >= var8 && var16 < var8 + GroundItemPile.optionButtonSpriteSubHeight; if(var3 == 1 && Login.__cu_aa) { Client.Login_isUsernameRemembered = !Client.Login_isUsernameRemembered; if(!Client.Login_isUsernameRemembered && ReflectionCheck.clientPreferences.rememberedUsername != null) { ReflectionCheck.clientPreferences.rememberedUsername = null; - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); } } - var7 = Varps.__hv_h + 24; + var7 = Varps.loginBoxCenter + 24; var8 = 277; - Login.__cu_ax = var15 >= var7 && var15 < var7 + class168.__fs_au && var16 >= var8 && var16 < var8 + GroundItemPile.__dr_ao; + Login.__cu_ax = var15 >= var7 && var15 < var7 + class168.optionButtonSpriteSubWidth && var16 >= var8 && var16 < var8 + GroundItemPile.optionButtonSpriteSubHeight; if(var3 == 1 && Login.__cu_ax) { ReflectionCheck.clientPreferences.hideUsername = !ReflectionCheck.clientPreferences.hideUsername; if(!ReflectionCheck.clientPreferences.hideUsername) { @@ -326,7 +325,7 @@ public final class class54 { class196.method3740(); } - WorldMapSection0.method247(); + WorldMapSection0.savePreferences(); } while(true) { @@ -341,11 +340,11 @@ public final class class54 { } if(IndexStoreAction.__ik_cn == 13) { - Login.__cu_aw = 0; + Login.loginIndex = 0; Login.Login_username = ""; Login.Login_password = ""; - class13.__i_af = 0; - Login.__cu_ai = ""; + class13.otpInt = 0; + Login.otp = ""; Login.__cu_ba = true; } else if(Login.currentLoginField == 0) { if(IndexStoreAction.__ik_cn == 85 && Login.Login_username.length() > 0) { @@ -394,55 +393,55 @@ public final class class54 { return; } - } else if(Login.__cu_aw == 3) { - var18 = Login.__cu_y + 180; + } else if(Login.loginIndex == 3) { + var18 = Login.loginBoxX + 180; var20 = 276; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { MouseHandler.method1084(false); } - var18 = Login.__cu_y + 180; + var18 = Login.loginBoxX + 180; var20 = 326; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { method1089("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); - Login.__cu_aw = 5; + Login.loginIndex = 5; return; } } else { int var22; - if(Login.__cu_aw == 4) { - var18 = Login.__cu_y + 180 - 80; + if(Login.loginIndex == 4) { + var18 = Login.loginBoxX + 180 - 80; var20 = 321; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { - Login.__cu_ai.trim(); - if(Login.__cu_ai.length() != 6) { + Login.otp.trim(); + if(Login.otp.length() != 6) { method1089("", "Please enter a 6-digit PIN.", ""); return; } - class13.__i_af = Integer.parseInt(Login.__cu_ai); - Login.__cu_ai = ""; + class13.otpInt = Integer.parseInt(Login.otp); + Login.otp = ""; class15.method184(true); method1089("", "Connecting to server...", ""); GameShell.updateGameState(20); return; } - if(var3 == 1 && var15 >= Login.__cu_y + 180 - 9 && var15 <= Login.__cu_y + 180 + 130 && var16 >= 263 && var16 <= 296) { + if(var3 == 1 && var15 >= Login.loginBoxX + 180 - 9 && var15 <= Login.loginBoxX + 180 + 130 && var16 >= 263 && var16 <= 296) { Login.__cu_ba = !Login.__cu_ba; } - if(var3 == 1 && var15 >= Login.__cu_y + 180 - 34 && var15 <= Login.__cu_y + 34 + 180 && var16 >= 351 && var16 <= 363) { + if(var3 == 1 && var15 >= Login.loginBoxX + 180 - 34 && var15 <= Login.loginBoxX + 34 + 180 && var16 >= 351 && var16 <= 363) { WorldMapCacheName.method635(Message.method1227("secure", true) + "m=totp-authenticator/disableTOTPRequest", true, false); } - var18 = Login.__cu_y + 180 + 80; + var18 = Login.loginBoxX + 180 + 80; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { - Login.__cu_aw = 0; + Login.loginIndex = 0; Login.Login_username = ""; Login.Login_password = ""; - class13.__i_af = 0; - Login.__cu_ai = ""; + class13.otpInt = 0; + Login.otp = ""; } while(Decimator.method2490()) { @@ -456,45 +455,45 @@ public final class class54 { } if(IndexStoreAction.__ik_cn == 13) { - Login.__cu_aw = 0; + Login.loginIndex = 0; Login.Login_username = ""; Login.Login_password = ""; - class13.__i_af = 0; - Login.__cu_ai = ""; + class13.otpInt = 0; + Login.otp = ""; } else { - if(IndexStoreAction.__ik_cn == 85 && Login.__cu_ai.length() > 0) { - Login.__cu_ai = Login.__cu_ai.substring(0, Login.__cu_ai.length() - 1); + if(IndexStoreAction.__ik_cn == 85 && Login.otp.length() > 0) { + Login.otp = Login.otp.substring(0, Login.otp.length() - 1); } if(IndexStoreAction.__ik_cn == 84) { - Login.__cu_ai.trim(); - if(Login.__cu_ai.length() != 6) { + Login.otp.trim(); + if(Login.otp.length() != 6) { method1089("", "Please enter a 6-digit PIN.", ""); return; } - class13.__i_af = Integer.parseInt(Login.__cu_ai); - Login.__cu_ai = ""; + class13.otpInt = Integer.parseInt(Login.otp); + Login.otp = ""; class15.method184(true); method1089("", "Connecting to server...", ""); GameShell.updateGameState(20); return; } - if(var21 && Login.__cu_ai.length() < 6) { - Login.__cu_ai = Login.__cu_ai + GzipDecompressor.__go_ck; + if(var21 && Login.otp.length() < 6) { + Login.otp = Login.otp + GzipDecompressor.__go_ck; } } } - } else if(Login.__cu_aw == 5) { - var18 = Login.__cu_y + 180 - 80; + } else if(Login.loginIndex == 5) { + var18 = Login.loginBoxX + 180 - 80; var20 = 321; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { NpcDefinition.method5162(); return; } - var18 = Login.__cu_y + 180 + 80; + var18 = Login.loginBoxX + 180 + 80; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { MouseHandler.method1084(true); } @@ -534,7 +533,7 @@ public final class class54 { } } } - } else if(Login.__cu_aw == 6) { + } else if(Login.loginIndex == 6) { while(true) { do { if(!Decimator.method2490()) { @@ -549,35 +548,35 @@ public final class class54 { MouseHandler.method1084(true); } - } else if(Login.__cu_aw == 7) { - var18 = Login.__cu_y + 180 - 80; + } else if(Login.loginIndex == 7) { + var18 = Login.loginBoxX + 180 - 80; var20 = 321; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { WorldMapCacheName.method635(Message.method1227("secure", true) + "m=dob/set_dob.ws", true, false); method1089("", "Page has opened in a new window.", "(Please check your popup blocker.)"); - Login.__cu_aw = 6; + Login.loginIndex = 6; return; } - var18 = Login.__cu_y + 180 + 80; + var18 = Login.loginBoxX + 180 + 80; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { MouseHandler.method1084(true); } - } else if(Login.__cu_aw == 8) { - var18 = Login.__cu_y + 180 - 80; + } else if(Login.loginIndex == 8) { + var18 = Login.loginBoxX + 180 - 80; var20 = 321; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { WorldMapCacheName.method635("https://www.jagex.com/terms/privacy/#eight", true, false); method1089("", "Page has opened in a new window.", "(Please check your popup blocker.)"); - Login.__cu_aw = 6; + Login.loginIndex = 6; return; } - var18 = Login.__cu_y + 180 + 80; + var18 = Login.loginBoxX + 180 + 80; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { MouseHandler.method1084(true); } - } else if(Login.__cu_aw == 12) { + } else if(Login.loginIndex == 12) { String var14 = ""; switch(Login.__cu_aj) { case 0: @@ -590,16 +589,16 @@ public final class class54 { MouseHandler.method1084(false); } - var7 = Login.__cu_y + 180; + var7 = Login.loginBoxX + 180; var8 = 276; if(var3 == 1 && var15 >= var7 - 75 && var15 <= var7 + 75 && var16 >= var8 - 20 && var16 <= var8 + 20) { WorldMapCacheName.method635(var14, true, false); method1089("", "Page has opened in a new window.", "(Please check your popup blocker.)"); - Login.__cu_aw = 6; + Login.loginIndex = 6; return; } - var7 = Login.__cu_y + 180; + var7 = Login.loginBoxX + 180; var8 = 326; if(var3 == 1 && var15 >= var7 - 75 && var15 <= var7 + 75 && var16 >= var8 - 20 && var16 <= var8 + 20) { MouseHandler.method1084(false); @@ -611,19 +610,19 @@ public final class class54 { if(IndexStoreAction.__ik_cn == 84) { MouseHandler.method1084(false); } else if(IndexStoreAction.__ik_cn == 13) { - Login.__cu_aw = 0; + Login.loginIndex = 0; } } - var18 = Varps.__hv_h - 80; + var18 = Varps.loginBoxCenter - 80; var20 = 321; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { MouseHandler.method1084(false); } - var18 = Varps.__hv_h + 80; + var18 = Varps.loginBoxCenter + 80; if(var3 == 1 && var15 >= var18 - 75 && var15 <= var18 + 75 && var16 >= var20 - 20 && var16 <= var20 + 20) { - Login.__cu_aw = 0; + Login.loginIndex = 0; } } } @@ -660,7 +659,7 @@ public final class class54 { } else { WorldMapArea var11; if(var0 == 6601) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; String var16 = ""; var11 = BufferedFile.worldMap().getMapArea(var3); if(var11 != null) { @@ -670,120 +669,120 @@ public final class class54 { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16; return 1; } else if(var0 == 6602) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; BufferedFile.worldMap().setCurrentMapAreaId(var3); return 1; } else if(var0 == 6603) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().getZoomLevel(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().getZoomLevel(); return 1; } else if(var0 == 6604) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; BufferedFile.worldMap().setZoomLevel(var3); return 1; } else if(var0 == 6605) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().isCacheLoaded()?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().isCacheLoaded()?1:0; return 1; } else { TileLocation var15; if(var0 == 6606) { - var15 = new TileLocation(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var15 = new TileLocation(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); BufferedFile.worldMap().setWorldMapPositionTarget(var15.x, var15.y); return 1; } else if(var0 == 6607) { - var15 = new TileLocation(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var15 = new TileLocation(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); BufferedFile.worldMap().__aw_531(var15.x, var15.y); return 1; } else if(var0 == 6608) { - var15 = new TileLocation(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var15 = new TileLocation(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); BufferedFile.worldMap().__al_532(var15.plane, var15.x, var15.y); return 1; } else if(var0 == 6609) { - var15 = new TileLocation(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var15 = new TileLocation(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); BufferedFile.worldMap().__ab_533(var15.plane, var15.x, var15.y); return 1; } else if(var0 == 6610) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__ae_534(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__at_535(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__ae_534(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__at_535(); return 1; } else { WorldMapArea var13; if(var0 == 6611) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var13 = BufferedFile.worldMap().getMapArea(var3); if(var13 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var13.origin().packed(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var13.origin().packed(); } return 1; } else if(var0 == 6612) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var13 = BufferedFile.worldMap().getMapArea(var3); if(var13 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (var13.maxX() - var13.minX() + 1) * 64; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = (var13.maxY() - var13.minY() + 1) * 64; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (var13.maxX() - var13.minX() + 1) * 64; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = (var13.maxY() - var13.minY() + 1) * 64; } return 1; } else if(var0 == 6613) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var13 = BufferedFile.worldMap().getMapArea(var3); if(var13 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var13.minX() * 64; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var13.minY() * 64; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var13.maxX() * 64 + 64 - 1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var13.maxY() * 64 + 64 - 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var13.minX() * 64; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var13.minY() * 64; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var13.maxX() * 64 + 64 - 1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var13.maxY() * 64 + 64 - 1; } return 1; } else if(var0 == 6614) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var13 = BufferedFile.worldMap().getMapArea(var3); if(var13 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var13.zoom(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var13.zoom(); } return 1; } else if(var0 == 6615) { var15 = BufferedFile.worldMap().__ad_536(); if(var15 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var15.x; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var15.y; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var15.x; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var15.y; } return 1; } else if(var0 == 6616) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().currentMapAreaId(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().currentMapAreaId(); return 1; } else if(var0 == 6617) { - var15 = new TileLocation(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var15 = new TileLocation(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); var13 = BufferedFile.worldMap().getCurrentMapArea(); if(var13 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; return 1; } else { int[] var14 = var13.position(var15.plane, var15.x, var15.y); if(var14 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var14[0]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var14[1]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var14[0]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var14[1]; } return 1; @@ -791,18 +790,18 @@ public final class class54 { } else { TileLocation var7; if(var0 == 6618) { - var15 = new TileLocation(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var15 = new TileLocation(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); var13 = BufferedFile.worldMap().getCurrentMapArea(); if(var13 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; return 1; } else { var7 = var13.coord(var15.x, var15.y); if(var7 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var7.packed(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var7.packed(); } return 1; @@ -810,51 +809,51 @@ public final class class54 { } else { TileLocation var12; if(var0 == 6619) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var12 = new TileLocation(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var12 = new TileLocation(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); TotalQuantityComparator.method96(var3, var12, false); return 1; } else if(var0 == 6620) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var12 = new TileLocation(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var12 = new TileLocation(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); TotalQuantityComparator.method96(var3, var12, true); return 1; } else if(var0 == 6621) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var12 = new TileLocation(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var12 = new TileLocation(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); var11 = BufferedFile.worldMap().getMapArea(var3); if(var11 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = 0; return 1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var11.containsCoord(var12.plane, var12.x, var12.y)?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var11.containsCoord(var12.plane, var12.x, var12.y)?1:0; return 1; } } else if(var0 == 6622) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__ap_537(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__as_538(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__ap_537(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().__as_538(); return 1; } else if(var0 == 6623) { - var15 = new TileLocation(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + var15 = new TileLocation(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); var13 = BufferedFile.worldMap().mapAreaAtCoord(var15.plane, var15.x, var15.y); if(var13 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var13.id(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var13.id(); } return 1; } else if(var0 == 6624) { - BufferedFile.worldMap().__am_539(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + BufferedFile.worldMap().__am_539(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); return 1; } else if(var0 == 6625) { BufferedFile.worldMap().__an_540(); return 1; } else if(var0 == 6626) { - BufferedFile.worldMap().__az_541(Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]); + BufferedFile.worldMap().__az_541(Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]); return 1; } else if(var0 == 6627) { BufferedFile.worldMap().__au_542(); @@ -862,58 +861,58 @@ public final class class54 { } else { boolean var10; if(var0 == 6628) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; BufferedFile.worldMap().perpetualFlash(var10); return 1; } else if(var0 == 6629) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; BufferedFile.worldMap().flashElement(var3); return 1; } else if(var0 == 6630) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; BufferedFile.worldMap().flashCategory(var3); return 1; } else if(var0 == 6631) { BufferedFile.worldMap().stopCurrentFlashes(); return 1; } else if(var0 == 6632) { - var10 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize] == 1; + var10 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize] == 1; BufferedFile.worldMap().setElementsEnabled(var10); return 1; } else { boolean var4; if(var0 == 6633) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1] == 1; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1] == 1; BufferedFile.worldMap().disableElement(var3, var4); return 1; } else if(var0 == 6634) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1] == 1; + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1] == 1; BufferedFile.worldMap().disableCategory(var3, var4); return 1; } else if(var0 == 6635) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().getElementsEnabled()?1:0; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().getElementsEnabled()?1:0; return 1; } else if(var0 == 6636) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().isElementDisabled(var3)?1:0; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().isElementDisabled(var3)?1:0; return 1; } else if(var0 == 6637) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = BufferedFile.worldMap().isCategoryDisabled(var3)?1:0; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = BufferedFile.worldMap().isCategoryDisabled(var3)?1:0; return 1; } else if(var0 == 6638) { - class179.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize]; - var12 = new TileLocation(Interpreter.Interpreter_intStack[class179.Interpreter_intStackSize + 1]); + RouteStrategy.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize]; + var12 = new TileLocation(Interpreter.Interpreter_intStack[RouteStrategy.Interpreter_intStackSize + 1]); var7 = BufferedFile.worldMap().__bc_545(var3, var12); if(var7 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var7.packed(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var7.packed(); } return 1; @@ -922,29 +921,29 @@ public final class class54 { if(var0 == 6639) { var8 = BufferedFile.worldMap().iconStart(); if(var8 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var8.__m_15(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var8.coord2.packed(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var8.__m_15(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var8.coord2.packed(); } return 1; } else if(var0 == 6640) { var8 = BufferedFile.worldMap().iconNext(); if(var8 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var8.__m_15(); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var8.coord2.packed(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var8.__m_15(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var8.coord2.packed(); } return 1; } else { WorldMapElement var6; if(var0 == 6693) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = ViewportMouse.getWorldMapElement(var3); if(var6.__l == null) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; @@ -954,38 +953,38 @@ public final class class54 { return 1; } else if(var0 == 6694) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = ViewportMouse.getWorldMapElement(var3); - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6.textSize; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6.textSize; return 1; } else if(var0 == 6695) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = ViewportMouse.getWorldMapElement(var3); if(var6 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6.category; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6.category; } return 1; } else if(var0 == 6696) { - var3 = Interpreter.Interpreter_intStack[--class179.Interpreter_intStackSize]; + var3 = Interpreter.Interpreter_intStack[--RouteStrategy.Interpreter_intStackSize]; var6 = ViewportMouse.getWorldMapElement(var3); if(var6 == null) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = -1; } else { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = var6.sprite1; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = var6.sprite1; } return 1; } else if(var0 == 6697) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class15.worldMapEvent.mapElement; + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class15.worldMapEvent.mapElement; return 1; } else if(var0 == 6698) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class15.worldMapEvent.coord1.packed(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class15.worldMapEvent.coord1.packed(); return 1; } else if(var0 == 6699) { - Interpreter.Interpreter_intStack[++class179.Interpreter_intStackSize - 1] = class15.worldMapEvent.coord2.packed(); + Interpreter.Interpreter_intStack[++RouteStrategy.Interpreter_intStackSize - 1] = class15.worldMapEvent.coord2.packed(); return 1; } else { return 2; @@ -1065,14 +1064,14 @@ public final class class54 { Client.__client_ik += (var6 - Client.__client_ik) / 80; } - MouseRecorder.__bu_hy = class32.getTileHeight(Canvas.localPlayer.x, Canvas.localPlayer.y, SoundSystem.plane) - Client.__client_ho; + MouseRecorder.__bu_hy = class32.getTileHeight(Canvas.localPlayer.x, Canvas.localPlayer.y, SoundSystem.plane) - Client.cameraFollowHeight; } else if(Client.oculusOrbState == 1) { if(Client.__client_ij && Canvas.localPlayer != null) { var0 = Canvas.localPlayer.pathX[0]; var1 = Canvas.localPlayer.pathY[0]; if(var0 >= 0 && var1 >= 0 && var0 < 104 && var1 < 104) { MouseHandler.oculusOrbFocalPointX = Canvas.localPlayer.x; - var2 = class32.getTileHeight(Canvas.localPlayer.x, Canvas.localPlayer.y, SoundSystem.plane) - Client.__client_ho; + var2 = class32.getTileHeight(Canvas.localPlayer.x, Canvas.localPlayer.y, SoundSystem.plane) - Client.cameraFollowHeight; if(var2 < MouseRecorder.__bu_hy) { MouseRecorder.__bu_hy = var2; } @@ -1158,7 +1157,7 @@ public final class class54 { } } - if(MouseHandler.MouseHandler_currentButton == 4 && AbstractRasterProvider.__lp_ca) { + if(MouseHandler.MouseHandler_currentButton == 4 && AbstractRasterProvider.mouseCam) { var0 = MouseHandler.MouseHandler_y - Client.__client_ht; Client.__client_hu = var0 * 2; Client.__client_ht = var0 != -1 && var0 != 1?(MouseHandler.MouseHandler_y + Client.__client_ht) / 2:MouseHandler.MouseHandler_y; diff --git a/rs-client/src/main/java/class60.java b/runescape-client/src/main/java/class60.java similarity index 97% rename from rs-client/src/main/java/class60.java rename to runescape-client/src/main/java/class60.java index f35817664d..9eeaa4ca44 100644 --- a/rs-client/src/main/java/class60.java +++ b/runescape-client/src/main/java/class60.java @@ -12,7 +12,6 @@ public class class60 { @Export("worldMap0") static WorldMap worldMap0; @ObfuscatedName("ar") - @Export("__bo_ar") static FontMetrics __bo_ar; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/class65.java b/runescape-client/src/main/java/class65.java new file mode 100644 index 0000000000..9f33160c98 --- /dev/null +++ b/runescape-client/src/main/java/class65.java @@ -0,0 +1,239 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("bl") +public class class65 extends RouteStrategy +{ + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "Lcz;" + ) + @Export("pcmPlayerProvider") + public static PcmPlayerProvider pcmPlayerProvider; + @ObfuscatedName("gf") + @ObfuscatedSignature( + signature = "Lem;" + ) + @Export("scene") + static Scene scene; + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(IIILfy;I)Z", + garbageValue = "-519225044" + ) + protected boolean vmethod3644(int var1, int var2, int var3, CollisionMap var4) { + return var2 == super.approxDestinationX && var3 == super.approxDestinationY; + } + + @ObfuscatedName("fi") + @ObfuscatedSignature( + signature = "(Lbz;II)V", + garbageValue = "406386718" + ) + static final void method1232(Actor actor, int var1) { + if(actor.__bw > Client.cycle) { + SpriteIds.method5828(actor); + } else { + int var2; + int var3; + int var4; + int var5; + int var7; + if(actor.__cr >= Client.cycle) { + if(actor.__cr == Client.cycle || actor.sequence == -1 || actor.sequenceDelay != 0 || actor.sequenceFrameCycle + 1 > WorldMapAreaData.getSequenceDefinition(actor.sequence).frameLengths[actor.sequenceFrame]) { + var2 = actor.__cr - actor.__bw; + var3 = Client.cycle - actor.__bw; + var4 = actor.__bf * 128 + actor.size * 64; + var5 = actor.__be * 128 + actor.size * 64; + int var6 = actor.__bh * 128 + actor.size * 64; + var7 = actor.__bv * 128 + actor.size * 64; + actor.x = (var3 * var6 + var4 * (var2 - var3)) / var2; + actor.y = (var3 * var7 + var5 * (var2 - var3)) / var2; + } + + actor.__cq = 0; + actor.orientation = actor.__cv; + actor.__ac = actor.orientation; + } else { + actor.movementSequence = actor.idleSequence; + if(actor.pathLength == 0) { + actor.__cq = 0; + } else { + label310: { + if(actor.sequence != -1 && actor.sequenceDelay == 0) { + SequenceDefinition var11 = WorldMapAreaData.getSequenceDefinition(actor.sequence); + if(actor.__ch > 0 && var11.__j == 0) { + ++actor.__cq; + break label310; + } + + if(actor.__ch <= 0 && var11.__s == 0) { + ++actor.__cq; + break label310; + } + } + + var2 = actor.x; + var3 = actor.y; + var4 = actor.pathX[actor.pathLength - 1] * 128 + actor.size * 64; + var5 = actor.pathY[actor.pathLength - 1] * 128 + actor.size * 64; + if(var2 < var4) { + if(var3 < var5) { + actor.orientation = 1280; + } else if(var3 > var5) { + actor.orientation = 1792; + } else { + actor.orientation = 1536; + } + } else if(var2 > var4) { + if(var3 < var5) { + actor.orientation = 768; + } else if(var3 > var5) { + actor.orientation = 256; + } else { + actor.orientation = 512; + } + } else if(var3 < var5) { + actor.orientation = 1024; + } else if(var3 > var5) { + actor.orientation = 0; + } + + byte var12 = actor.pathTraversed[actor.pathLength - 1]; + if(var4 - var2 <= 256 && var4 - var2 >= -256 && var5 - var3 <= 256 && var5 - var3 >= -256) { + var7 = actor.orientation - actor.__ac & 2047; + if(var7 > 1024) { + var7 -= 2048; + } + + int var8 = actor.walkTurnSequence; + if(var7 >= -256 && var7 <= 256) { + var8 = actor.walkSequence; + } else if(var7 >= 256 && var7 < 768) { + var8 = actor.walkTurnRightSequence; + } else if(var7 >= -768 && var7 <= -256) { + var8 = actor.walkTurnLeftSequence; + } + + if(var8 == -1) { + var8 = actor.walkSequence; + } + + actor.movementSequence = var8; + int var9 = 4; + boolean var10 = true; + if(actor instanceof Npc) { + var10 = ((Npc)actor).definition.isClickable; + } + + if(var10) { + if(actor.__ac != actor.orientation && actor.targetIndex == -1 && actor.__cj != 0) { + var9 = 2; + } + + if(actor.pathLength > 2) { + var9 = 6; + } + + if(actor.pathLength > 3) { + var9 = 8; + } + + if(actor.__cq > 0 && actor.pathLength > 1) { + var9 = 8; + --actor.__cq; + } + } else { + if(actor.pathLength > 1) { + var9 = 6; + } + + if(actor.pathLength > 2) { + var9 = 8; + } + + if(actor.__cq > 0 && actor.pathLength > 1) { + var9 = 8; + --actor.__cq; + } + } + + if(var12 == 2) { + var9 <<= 1; + } + + if(var9 >= 8 && actor.movementSequence == actor.walkSequence && actor.runSequence != -1) { + actor.movementSequence = actor.runSequence; + } + + if(var2 != var4 || var5 != var3) { + if(var2 < var4) { + actor.x += var9; + if(actor.x > var4) { + actor.x = var4; + } + } else if(var2 > var4) { + actor.x -= var9; + if(actor.x < var4) { + actor.x = var4; + } + } + + if(var3 < var5) { + actor.y += var9; + if(actor.y > var5) { + actor.y = var5; + } + } else if(var3 > var5) { + actor.y -= var9; + if(actor.y < var5) { + actor.y = var5; + } + } + } + + if(var4 == actor.x && var5 == actor.y) { + --actor.pathLength; + if(actor.__ch > 0) { + --actor.__ch; + } + } + } else { + actor.x = var4; + actor.y = var5; + --actor.pathLength; + if(actor.__ch > 0) { + --actor.__ch; + } + } + } + } + } + } + + if(actor.x < 128 || actor.y < 128 || actor.x >= 13184 || actor.y >= 13184) { + actor.sequence = -1; + actor.spotAnimation = -1; + actor.__bw = 0; + actor.__cr = 0; + actor.x = actor.pathX[0] * 128 + actor.size * 64; + actor.y = actor.pathY[0] * 128 + actor.size * 64; + actor.__bb_143(); + } + + if(Canvas.localPlayer == actor && (actor.x < 1536 || actor.y < 1536 || actor.x >= 11776 || actor.y >= 11776)) { + actor.sequence = -1; + actor.spotAnimation = -1; + actor.__bw = 0; + actor.__cr = 0; + actor.x = actor.pathX[0] * 128 + actor.size * 64; + actor.y = actor.pathY[0] * 128 + actor.size * 64; + actor.__bb_143(); + } + + IndexStoreAction.method4553(actor); + ChatChannel.method2225(actor); + } +} diff --git a/rs-client/src/main/java/class68.java b/runescape-client/src/main/java/class68.java similarity index 100% rename from rs-client/src/main/java/class68.java rename to runescape-client/src/main/java/class68.java diff --git a/rs-client/src/main/java/class80.java b/runescape-client/src/main/java/class80.java similarity index 60% rename from rs-client/src/main/java/class80.java rename to runescape-client/src/main/java/class80.java index 61022cc1b2..3c671e174b 100644 --- a/rs-client/src/main/java/class80.java +++ b/runescape-client/src/main/java/class80.java @@ -6,10 +6,8 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("ce") public class class80 { @ObfuscatedName("o") - @Export("__ce_o") static final BigInteger __ce_o; @ObfuscatedName("u") - @Export("__ce_u") static final BigInteger __ce_u; static { @@ -24,21 +22,21 @@ public class class80 { ) static void method2015() { if(Login.__cu_f) { - Login.__cu_o = null; - IndexCacheLoader.__bd_u = null; - WorldMapEvent.__ap_w = null; - Login.__cu_g = null; - Fonts.__kz_l = null; - WorldMapSectionType.__h_e = null; - KeyHandler.__an_x = null; - Login.__cu_d = null; - class308.__kw_n = null; - class30.__ar_bd = null; - Frames.__en_bc = null; - AttackOption.__cj_bo = null; - UrlRequest.__ey_bx = null; + Login.titleboxSprite = null; + IndexCacheLoader.titlebuttonSprite = null; + WorldMapEvent.runesSprite = null; + Login.leftTitleSprite = null; + Fonts.rightTitleSprite = null; + WorldMapSectionType.logoSprite = null; + KeyHandler.title_muteSprite = null; + Login.options_buttons_0Sprite = null; + class308.options_buttons_2Sprite = null; + class30.worldSelectBackSprites = null; + Frames.worldSelectFlagSprites = null; + AttackOption.worldSelectArrows = null; + UrlRequest.worldSelectStars = null; class277.__jn_by = null; - class16.field85.method1762(); + class16.loginScreenRunesAnimation.method1762(); AbstractSocket.method3488(2); UserComparator9.method3343(true); Login.__cu_f = false; diff --git a/rs-client/src/main/java/class83.java b/runescape-client/src/main/java/class83.java similarity index 92% rename from rs-client/src/main/java/class83.java rename to runescape-client/src/main/java/class83.java index 21b18571bd..e9198a0915 100644 --- a/rs-client/src/main/java/class83.java +++ b/runescape-client/src/main/java/class83.java @@ -9,16 +9,13 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("cm") public class class83 { @ObfuscatedName("m") - @Export("__cm_m") static final BigInteger __cm_m; @ObfuscatedName("f") - @Export("__cm_f") static final BigInteger __cm_f; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 533653621 ) - @Export("__cm_e") public static int __cm_e; static { @@ -60,6 +57,6 @@ public class class83 { garbageValue = "1413048059" ) public static IndexedSprite method2028(AbstractIndexCache var0, int var1) { - return !class179.method3643(var0, var1)?null:ServerPacket.method3663(); + return !RouteStrategy.loadSpriteFlat(var0, var1)?null:ServerPacket.createIndexedSprite(); } } diff --git a/rs-client/src/main/java/class98.java b/runescape-client/src/main/java/class98.java similarity index 99% rename from rs-client/src/main/java/class98.java rename to runescape-client/src/main/java/class98.java index 043142871d..2e7e07fc24 100644 --- a/rs-client/src/main/java/class98.java +++ b/runescape-client/src/main/java/class98.java @@ -219,7 +219,7 @@ public class class98 { @ObfuscatedName("m") static int method2310(int var0, int var1) { int var2; - for(var2 = (int)Math.pow((double)var0, 1.0D / (double)var1) + 1; class179.method3642(var2, var1) > var0; --var2) { + for(var2 = (int)Math.pow((double)var0, 1.0D / (double)var1) + 1; RouteStrategy.method3642(var2, var1) > var0; --var2) { ; } diff --git a/rs-client/src/main/java/net/runelite/rs/Opcodes.java b/runescape-client/src/main/java/net/runelite/rs/Opcodes.java similarity index 100% rename from rs-client/src/main/java/net/runelite/rs/Opcodes.java rename to runescape-client/src/main/java/net/runelite/rs/Opcodes.java diff --git a/rs-client/src/main/java/net/runelite/rs/Reflection.java b/runescape-client/src/main/java/net/runelite/rs/Reflection.java similarity index 100% rename from rs-client/src/main/java/net/runelite/rs/Reflection.java rename to runescape-client/src/main/java/net/runelite/rs/Reflection.java diff --git a/scripts/deploy-vanilla.sh b/scripts/deploy-vanilla.sh new file mode 100644 index 0000000000..444331fa6c --- /dev/null +++ b/scripts/deploy-vanilla.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ "$#" -ne 2 ] ; then + exit 1 +fi + +echo "Deploying vanilla version $1 ($2) to repo.runelite.net" + +mvn deploy:deploy-file -DgroupId=net.runelite.rs -DartifactId=vanilla -Dversion=$1 -Dfile=$2 -DrepositoryId=runelite -Durl=dav:http://repo.runelite.net diff --git a/scripts/pom.xml b/scripts/pom.xml new file mode 100644 index 0000000000..7898c2e8fb --- /dev/null +++ b/scripts/pom.xml @@ -0,0 +1,43 @@ + + + + 4.0.0 + + net.runelite + scripts + 1.0.0 + Scripts + + + + + org.apache.maven.wagon + wagon-webdav-jackrabbit + 2.12 + + + + diff --git a/suppressions.xml b/suppressions.xml new file mode 100644 index 0000000000..7a6d858208 --- /dev/null +++ b/suppressions.xml @@ -0,0 +1,32 @@ + + + + + + + diff --git a/travis/build.sh b/travis/build.sh new file mode 100644 index 0000000000..deba275667 --- /dev/null +++ b/travis/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +mvn clean install --settings travis/settings.xml diff --git a/travis/settings.xml b/travis/settings.xml new file mode 100644 index 0000000000..53689ebbce --- /dev/null +++ b/travis/settings.xml @@ -0,0 +1,279 @@ + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + runelite + + + true + false + true + false + + + + + + + runelite + +